Membangun Eksploitasi Windows Bagian 2: Fuzzing

Pada proses pembuatan eksploitasi, fuzzing merupakan salah satu langkah awal dalam mencari celah masuk (entry point) untuk menemukan kerentanan.

Pada proses pembuatan eksploitasi, fuzzing merupakan salah satu langkah awal dalam mencari celah masuk (entry point) untuk menemukan kerentanan.. Istilah lebih umumnya adalah vulnerability assessment. Istilah fuzzing berasal dari 2 kata yaitu fuzz testing yang berarti menguji sebuah masukan (input) yang entah dalam bentuk form, parameter, atau apapun dengan masukan yang anomali; karakter aneh, jumlah karakter yang banyak, kombinasi karakter-karakter unicode, dll. Istilah fuzzing berasal dari tahun 1950-an ketika komputer masih memproses kartu berlubang (punch card), yang pada saat itu programmer yang bersangkutan akan memasukkan kartu-kartu yang anomali atau rusak/bekas untuk diproses oleh komputer, apabila komputer memproses kartu yang tidak seharusnya berarti sebuah bug ditemukan.

Karena meningkatnya pemrograman sejak tahun 1950 (ya pastinya!) maka proses fuzzing tidak bisa lagi dilakukan secara manual satu per satu. Proses fuzzing biasanya menggunakan tool atau alat yang dapat mengirimkan sejumlah masukan anomali ke target yang menjadi sasaran uji kerentanan. Sebagai contoh berikut ini adalah fuzzing script untuk FTP server yang saya pakai waktu mengambil training Pentesting with Backtrack tahun 2010 lalu.

#!/usr/bin/env python
########################################################
# Very Simple FTP Fuzzer                               #
# this is a modified version from simple ftp fuzzer    #
# coded by muts                                        #
#                                                      #
# thx: oebaj, offsec, xecureit, jasakom, 0x70y #
########################################################
import sys, socket
from optparse import OptionParser
usage = "./%prog -t [target] -p [port] -u [ftp user] -P [ftp passwd] -c [command to fuzz]"
usage += "nContoh: ./%prog -t 192.168.10.10 -p 21 -u ftp -P ftp -c APPE"
parser = OptionParser(usage=usage)
parser.add_option("-p", type="string", action="store", dest="port",
        help="Port to connect")
parser.add_option("-t", type="string", action="store", dest="target",
        help="The target server")
parser.add_option("-u", type="string", action="store", dest="username",
        help="FTP username")
parser.add_option("-P", type="string", action="store", dest="password",
        help="FTP password")
parser.add_option("-c", type="string", action="store", dest="fuzz",
        help="Command to Fuzz ")
(options, args) = parser.parse_args()
def banner():
    print "ntt|------------------------------------------------------------------|"
    print "tt|            Very Simple FTP Fuzzer               |"
    print "tt|------------------------[ by modpr0be ]---------------------------|"
    print "tt|-----------------[ me[at]modpr0[dot]be ]------------------|"
    print "tt|-------------------[ originally coded by muts ]-------------------|"
    print "tt|------------------------------------------------------------------|n"
if len(sys.argv) < 4:
    banner()
    parser.print_help()
    sys.exit(1)
def cmd():
    for string in buffer:
        print "Fuzzing command " + (options.fuzz) + ": " +str(len(string))
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connect=s.connect((options.target, 21))
        s.recv(1024)
        s.send('USER '+(options.username)+'rn')
        s.recv(1024)
        s.send('PASS '+(options.password)+'rn')
        s.recv(1024)
        s.send((options.fuzz) + ' ' + string + 'rn')
        s.recv(1024)
        s.send('bye\r\n')
        s.close()
banner()
buffer = ["A"]
counter = 100
while len(buffer) <=100:
    buffer.append("A" * counter)
    counter = counter + 100
cmd()
#20109modpr0be

Pada script di atas, fungsi cmd() melakukan for loop atas salah satu parameter opsi ketika sebuah FTP client melakukan koneksi ke FTP server.

def cmd():
    for string in buffer:
        print "Fuzzing command " + (options.fuzz) + ": " +str(len(string))
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connect=s.connect((options.target, 21))
        s.recv(1024)
        s.send('USER '+(options.username)+'rn')
        s.recv(1024)
        s.send('PASS '+(options.password)+'rn')
        s.recv(1024)
        s.send((options.fuzz) + ' ' + string + 'rn')
        s.recv(1024)
        s.send('bye\r\n')
        s.close()

Ketika FTP client berkomunikasi dengan FTP server, sejatinya ada perintah-perintah yang dikirimkan dari client ke server. Daftar perintah-perintah ini dapat dilihat secara lengkap di daftar perintah FTP. Parameter opsi yang dikirimkan bisa bermacam-macam seperti APPE, USER, LIST, CWD, dll. Karena adanya perintah yang dikirimkan ke FTP server sebagai bentuk komunikasi antara FTP client dengan FTP server, maka kita dapat menganggap perintah-perintah tersebut sebagai masukan (input) ke FTP server. Sebagai contoh, FTP client dapat mengirimkan perintah CWD yang merupakan kependekan dari Current Working Directory, yaitu perintah untuk menanyakan lokasi path ketika si FTP client terkoneksi ke FTP server.

Nah karena perintah-perintah tersebut dapat kita anggap sebagai masukan, maka kita juga bisa menganggap apabila kita mengirimkan perintah yang anomali ke FTP server, berarti kita sedang melakukan fuzzing ke FTP server tersebut. Sebagai contoh, bagaimana hasilnya apabila kita mengirimkan perintah yang tidak ada pada daftar perintah yang dikenal oleh FTP server, apa respon yang dihasilkan, apa yang terjadi pada respon tersebut, dll.

Obyek fuzzing

Untuk melakukan fuzzing, kita perlu mengetahui secara pasti bagaimana obyek (target) yang akan kita fuzzing bekerja. Berdasarkan obyek yang akan menjadi target, fuzzing dapat kita bagi menjadi:

  • Fuzzing terhadap protokol jaringan (TCP/UDP)
  • Fuzzing terhadap client yang mengakses sebuah protokol (contoh: email client, FTP client, DHCP client, DNS resolver, dll)
  • Fuzzing terhadap program yang memproses sebuah masukan atau tipe file tertentu. File dapat berupa file skrip, gambar, dokumen, dll (contoh: PDF Reader, Image viewer, program Office, dll)
  • Fuzzing terhadap hardware yang memproses masukan data (contoh: fuzzing terhadap PHY radio frequency pada keyless system)
  • Fuzzing terhadap protokol yang dibuat sendiri atau memiliki aturan sendiri (tidak mengikuti kaidah protokol umum/RFC)

Aktivitas fuzzing yang paling umum adalah fuzzing terhadap protokol jaringan yang memiliki layanan seperti FTP, SMTP, SNMP, TFTP, SMB, RDP, dll. Tahun 2017 kita pernah tahu sebuah kerentanan yang dapat dieksploitasi dengan sangat sukses bernama EternalBlue, yang pada akhirnya menjadi ransomware WannaCry. Sesuai berita yang beredar, NSA memilih untuk bungkam selama 5 tahun ketika menemukan kerentanan pada protokol SMB di semua versi Windows (Windows Vista, Windows 7, Windows 8.1, Windows 10, Windows Server 2008, Windows Server 2012, dan Windows Server 2016) tersebut. Dibalik bagaimana NSA dapat menemukan kerentanan tersebut, tim hacker NSA pasti melakukan yang namanya fuzzing. Aktivitas fuzzing ini biasanya menggunakan skrip atau tool khusus yang mempercepat proses fuzzing dengan cara otomasi.

Obyek-obyek lain yang dapat menjadi target fuzzing misalnya aplikasi browser, aplikasi pembaca file PDF, aplikasi kompresi (zip, rar, dll), bahkan mesin yang membaca masukan dari file tertentu.

Tipe-tipe fuzzing

Berdasarkan masukan yang akan menjadi sumber fuzzing, biasanya masukan sebagai sumber fuzzing terbagi menjadi 3 jenis yaitu:

  • Sumber fuzzing dengan memanfaatkan masukan yang sudah ada atau biasa disebut sebagai reuse of existing input seeds.
  • Sumber fuzzing yang harus mengikuti struktur yang dikenal oleh obyek yang menerima masukan atau disebut sebagai aware of input structure.
  • Sumber fuzzing yang harus mengikuti aliran obyek ketika proses fuzzing terjadi atau disebut sebagai aware of program structure.

Sama seperti pendekatan dalam melakukan penetration testing, pada aktivitas fuzzing juga mengenal black-box, grey-box, dan white-box fuzzing. Terminologi yang digunakan pun kurang lebih sama, yang membedakan adalah area ketika melakukan fuzzing. Black-box dan grey-box fuzzing kemungkinan besar dilakukan tanpa memahami cara kerja obyek yang akan difuzzing secara mendalam dan menyeluruh. Akibatnya aktivitas fuzzing biasanya diawali dengan model “trial-error” atau coba-coba. Sementara white-box fuzzing mungkin akan dilakukan pada area pengembangan (development), menggabungkan analisis statik dan dinamik terhadap obyek.

Tool fuzzing dan penerapannya

Untuk mempercepat proses fuzzing, para peneliti dan pencari kerentanan biasanya menggunakan alat bantu atau tool. Beberapa tool fuzzing yang sering digunakan adalah:

Penggunaan tool di atas biasanya disesuaikan dengan obyek yang akan difuzzing. Sebagai contoh ketika peneliti kerentanan ingin fokus mencari kerentanan di sebuah browser, mereka akan menggunakan BFuzz, Peach Fuzzer, dan Grizzly.

Bruteforce Exploit Detector (BED)

Dari dulu ketika berhadapan dengan sebuah protokol umum seperti FTP, SMTP, POP3, biasanya saya menggunakan tool fuzzing bernama BED (Bruteforce Exploit Detector). Tool ini sudah tidak pernah diperbarui oleh pembuatnya, namun sampai hari ini tool ini tetap dapat melakukan fuzzing dengan sangat baik. Sebagai percobaan, kita bisa menjalankan BED terhadap protokol FTP (saya akan menggunakan PCManFTPD sebagai target). Berikut ini yang saya siapkan:

Pertama-tama pada mesin Kali Linux kita dapat memasang program BED dengan menjalankan sudo apt update && sudo apt install bed lalu jalankan bed melalui terminal.

Menjalankan bed pada mesin Kali Linux

Pada mesin Windows 10, jalankan PCManFTPD (PCManDFTPD2.exe) lalu catat alamat IP mesin Windows 10. Pada mesin saya tercatat dengan alamat IP 172.16.165.133. Kita bisa menguji bahwa FTP server berjalan dengan baik dengan cara melakukan koneksi ke port 21 pada alamat IP 172.16.165.133.

Setelah memastikan bahwa koneksi dapat terbentuk, kita bisa siapkan tool fuzzing BED untuk melakukan fuzzing terhadap PCManFTPD server. Saya menjalankan fuzzing dengan opsi perintah seperti ini:

kali@kali:~$ bed -s FTP -t 172.16.165.133 -p 21 -u anonymous -v ftp

Opsi perintah di atas dapat dijelaskan sebagai berikut:

  • -s FTP berarti target protokol fuzzing adalah FTP
  • -t 172.16.165.130 yang berarti target fuzzing
  • -p 21 yaitu port yang dituju
  • -u anonymous adalah user yang dipakai untuk login ke FTP server
  • -v ftp adalah password yang dipakai untuk login ke FTP server

Jalankan perintah di atas dan setelah berjalan tidak sampai 1 menit, program PCManFTPD server tertutup dengan paksa (crash) dan program BED memberikan pesan error.

Sampai sini kita dapat mengambil kesimpulan bahwa; 1) program BED sukses membuat program PCManFTPD server crash, 2) program PCManFTPD server crash ketika proses pengujian sampai pada parameter USER. Lalu bagaimana kita bisa melihat dampak yang ditimbulkan dari aktivitas fuzzing ini?

Nah ketika kita berhasil membuat sebuah program crash secara berulang-ulang, maka kondisi ini biasa sebut sebagai kerentanan denial of service. Program yang crash biasanya disebabkan oleh sesuatu dan tentu saja dapat kita analisis penyebabnya. Berbeda dengan web aplikasi; kita dapat menganalisis aktivitas request dan response ke web server menggunakan sebuah proxy, hasil aktivitas fuzzing terhadap program yang dicompile dengan compiler harus dianalisis menggunakan debugger.

Untuk dapat melihat dampak dan akibat dari crash yang terjadi, kita bisa menggunakan 2 pendekatan; pertama kita bisa menjalankan crash reporter atau crash dumper seperti procdump lalu membukanya menggunakan debugger, kedua kita bisa menempelkan (attach) program yang akan kita fuzzing dengan debugger. Pada kasus di atas, kita dapat melakukan attach program PCManFTPD2.exe menggunakan OllyDbg di mesin uji lab (Windows). Jalankan PCManFTPD2.exe dan OllyDbg (sebaiknya jalankan sebagai administrator), lalu pada OllyDbg pilih File -> Attach ..

Attach process PCManFTPD ke dalam OllyDbg

Setelah attach berhasil, pilih Run pada menu Debug dan jalankan kembali fuzzing dengan BED. Kali ini sebelum program PCManFTPD server crash, OllyDbg menangkap penyebab crash sehingga kita bisa mengetahui apa yang sebenarnya terjadi. Terlihat pada gambar berikut.

Hasil fuzzing yang ditangkap oleh debugger

Terlihat pada debugger bahwa alamat EIP (Instruction Pointer) terisi dengan alamat yang tidak valid yaitu 41414141 sehingga menyebabkan program “bingung” dan berujung pada Access violation. Terlihat pula pada jendela stack hasil fuzzing yang dikirimkan oleh BED, yaitu karakter A (hex 0x41) dalam jumlah banyak.

Bagi yang sudah pernah melihat proses pembuatan eksploit dari keadaan crash ke proses eksekusi perintah sistem (biasa dikenal dengan from DoS to remote command execution) pasti sudah dapat menebak apa yang dapat dilakukan dari keadaan di atas. Keadaan ini biasa disebut dengan stack buffer overflow yaitu keadaan ketika program stack memory terisi dengan muatan (pada kondisi di atas, muatan ini berisi karakter A) yang sangat banyak sampai posisi return pointer (titik alamat kembali ke fungsi sebelumnya) tertimpa dengan muatan yang kita kirimkan. Karena sifat program yang selalu kembali ke fungsi sebelumnya, kondisi di atas memaksa aliran program yang diatur oleh Instruction Pointer untuk mengeksekusi alamat yang tidak ada (EIP=41414141). Karena alamat untuk kembali ke fungsi sebelumnya tidak terdaftar di memory, maka program akan crash.

Fuzzing client application dengan Metasploit

Berbeda dengan proses fuzzing ke server pada contoh sebelumnya, fuzzing ke client application melihat fuzzing dari sisi server (karena targetnya adalah client). Dengan demikian peneliti kerentanan harus membuat server fuzzer yang menjadi tujuan dari client application. Sebagai contoh kita akan melakukan fuzzing terhadap FTP client, untuk itu perlu ada beberapa hal yang disiapkan:

Install FTPShell Client pada mesin uji (Windows 10), lalu jalankan Metasploit fuzzer untuk FTP client pada mesin Kali.

kali@kali:~$ sudo systemctl start postgresql.service
kali@kali:~$ sudo -E msfconsole -qx 'use auxiliary/fuzzers/ftp/client_ftp; run'
Menjalankan FTP server sebagai fuzzer untuk FTP client

Setelah server FTP server fuzzer berjalan, kita bisa segera melakukan koneksi ke FTP server fuzzer dengan FTPShell yang sudah terinstall di Windows 10 (abaikan peringatan warning pada screenshot di atas, mungkin tidak ada pada mesin Kali lain). Pada program FTPShell lakukan pengisian informasi alamat IP FTP server fuzzer (alamat IP mesin Kali), user dan password saya isi dengan ftp (bisa diisikan dengan apa saja), setelah itu lakukan koneksi dengan klik Connect. Seketika program akan crash seperti gambar berikut

Program FTPShell FTP client crash setelah terkoneksi ke Metasploit FTP server fuzzer

Seperti pada contoh sebelumnya, kita dapat melihat apa yang sebenarnya terjadi ketika FTPShell client terkoneksi dengan Metasploit FTP server fuzzer dengan menggunakan OllyDBg. Caranya sama dengan proses sebelumnya yaitu dengan cara menjalankan program FTPShell client lalu jalankan OllyDbg, attach program FTPShell client dan pilih Debug -> Run. Lalu koneksikan kembali ke FTP server fuzzer dengan sebelumnya mengisi alamat IP, user, dan password. Berikut ini yang terjadi ketika FTPShell terkoneksi ke FTP server fuzzer.

Kondisi di debugger ketika FTPShell terkoneksi ke Metasploit FTP server fuzzer

Kita melihat kondisi yang hampir sama dengan kasus sebelumnya, namun kali ini stack terlihat tidak terisi dengan karakter AAAA seperti sebelumnya. Kondisi Access Violation terjadi karena perintah MOV DWORD PTR DS:[EDX], EAX berusaha memindahkan konten register EAX ke alamat pointer dereference EDX yang tidak valid, yaitu di 0x356E4134. Kondisi Access Violation sangat dipahami karena fungsi tersebut kemungkinan besar dibanjiri oleh karakter fuzzing dari Metasploit FTP server fuzzer. Sama seperti kondisi sebelumnya, hasil dari fuzzing di atas perlu dianalisis lebih dalam agar kita dapat mengetahui apakah hasil dari fuzzing, yang biasanya membuat program crash, dapat mengarah ke remote command execution atau hanya berakhir sebagai denial of service.

Kesimpulan

Sampai disini kita dapat melihat bahwa proses fuzzing merupakan proses yang sangat penting apabila berhadapan dengan aplikasi Windows (dalam pembahasan ini adalah Windows 32 bit). Hasil dari fuzzing dapat mengeluarkan beragam kesimpulan, misalnya aplikasi tidak dapat merespon file atau koneksi anomali, aplikasi tidak dapat memproses karakter unicode, aplikasi tidak memiliki kemampuan untuk mendeteksi file yang anomali, atau bahkan aplikasi dapat menangani segala macam bentuk fuzzing, dll.

Aktivitas fuzzing sama dengan aktivitas vulnerability assessment sebuah proses ketika peneliti kerentanan mencari kemungkinan celah kerentanan pada sebuah obyek.

Pada bagian berikutnya saya akan membahas bagaimana menganalisis hasil fuzzing yang mengarah pada pembuatan eksploit (exploit development). Semoga dengan adanya tulisan ini dapat memberikan pengetahuan tentang fuzzing dari sisi eksploitasi aplikasi Windows.

Referensi

modpr0be
modpr0be

Posisi saya saat ini sebagai direktur dan pemilik PT Spentera, sebuah perusahaan yang fokus dalam bidang penetration test, incident response, intrusion analysis and forensic investigation.

Saya juga berkontribusi untuk repositori eksploit Metasploit Framework sebagai pengembang kode eksploit. Saat ini memegang sertifikasi dari Offensive Security Certified Professional (OSCP), Offensive Security Certified Expert (OSCE), ISO/IEC ISMS 27001: 2013 Lead Auditor/Auditor, GIAC Certified Intrusion Analyst (GCIA), dan Offensive Security Exploitation Expert (OSEE).

Jika ingin menghubungi saya dapat melalui email bisnis di tom at spentera dot id atau pribadi di me at modpr0 dot be

Articles: 64

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.