Saat ini kebanyakan tulisan di blog ini sifatnya cerita yang tidak sampai ke teknis detail. Tulisan kali ini sangat praktis, mengenai memakai Zaproxy untuk hacking (mencari bug atau mengeksplotasi bug) aplikasi web. Atau lebih tepatnya lagi aplikasi yang memakai komunikasi HTTP, baik itu aplikasi berbasis mobile, desktop, maupun browser. Sekaligus ini untuk menjawab berbagai pertanyaan mengenai hacking web yang sering diajukan ke saya.
Zaproxy pada dasarnya adalah sebuah intercepting proxy dengan berbagai fitur tambahan (scanner, spider, dsb). Sebuah intercepting proxy bisa mencegat komunikasi dari client ke server (request) dan balasan dari server (response). Defaultnya, komunikasi yang dicegat akan diteruskan saja dan dicatat (di-log), tapi kita juga bisa mengubah baik request maupun response.
Sebagai catatan, Zaproxy bukan satu-satunya tools yang ada, tapi tools ini gratis, open source, cross platform (Windows, OS X, Linux) dan fiturnya lengkap. Alternatif populer adalah Burp suite, ini ada versi gratisnya, tapi fitur pentingnya berbayar (salah satu fitur paling penting yang berbayar adalah menyimpan sesi). Tools lainnya yang gratis dan bagus untuk Windows adalah Fiddler (saat ini Fiddler versi OS X dan Linux masih beta), sayangnya Fiddler tidak open source. Jika sudah menguasai salah satu tools ini, berpindah yang lain tidak terlalu sulit.
Contents
Mulai memakai zaproxy
Untuk memakai Zaproxy, langkahnya adalah: menginstall Zaproxy (ada installer untuk masing-masing sistem operasi) lalu menjalankan Zaproxy. Saat ini zaproxy versi terbaru sudah memiliki browser bawaan (JxBrowser) berdasarkan Webkit. Dengan browser ini kita tidak perlu melakukan apapun dan bisa langsung memakai zaproxy. Sebagai catatan untuk saat ini, belum semua fitur Zaproxy kompatibel dengan versi Java 9(misalnya JxBrowser).
Ketika zaproxy dibuka, Anda akan ditanya apakah sesi saat ini akan disimpan atau tidak, dan jika iya apakah diberi nama otomatis atau diberi nama manual. Sebuah sesi akan berisi semua request dan response ke semua situs dalam sesi tersebut.
Menyimpan sesi ini sangat penting, karena sering kali kita ingin melihat apakah perubahan dari waktu ke waktu. Kadang dalam proses pentesting, client ingin informasi lebih lanjut dari temuan yang pernah kita temukan sebelumnya.
Ketika baru belajar memakai tools ini, menggunakan browser bawaan zaproxy (JxBrowser) adalah cara termudah.
Tapi JxBrowser ini fiturnya terbatas, tidak ada “developer tools” yang memungkinkan kita melihat elemen html, mendebug javascript, dsb. Jadi untuk penggunaan lebih lanjut sebaiknya menggunakan browser lain, misalnya Firefox atau Chrome.
Ketika menggunakan browser lain, kita perlu mengubah setting proxy. Saya menyarankan penggunaan browser Firefox untuk ini karena Firefox mendukung multiple profile dan tiap profile bisa memiliki setting proxy yang berbeda.
Untuk memakai browser lain selain JxBrowser, kita juga perlu menginstall root certificate SSL milik zaproxy agar kita dapat mengintercept traffic HTTPS (hampir semua web saat ini memakai HTTPS). Root certificate ini juga bisa dikirim via email ke Android atau iOS dan diinstall di device untuk intersepsi Android/iOS. Langkah lengkapnya bisa dilihat di wiki Zaproxy. Penjelasan mengenai SSL bisa dibaca di tulisan saya yang lain.
Jika kita ingin mengintersepsi komunikasi device IOT yang tidak bisa diset proxynya, kita perlu membuat gateway dan melakukan redirect (misalnya dengan iptables) ke zaproxy sebagai transparant proxy (ini topik advanced).
Jika semua setting sudah benar, semua traffic akan muncul di Zaproxy. Kita bisa melakukan aktivitas yang diinginkan lalu melihat lognya. Biasanya ada banyak situs yang ingin kita abaikan, misalnya situs update Firefox atau tracking/tombol like Facebook. Ini bisa dilakukan dengan mengklik kanan pada nama situs di kiri, dan memilih “Exclude from”, lalu “Proxy”.
Tanpa melakukan apapun, kita sudah akan bisa melihat beberapa masalah umum website, misalnya jika Cookie tidak menggunakan secure flag di situs HTTPS, atau jika header XSS protection tidak diaktifkan. Ini biasanya semua kesalahan kecil yang risikonya rendah.
Setelah ini beberapa eksperimen sudah bisa dilakukan, misalnya dengan melihat log lalu memilih “Open/Resend with Request Editor”. Nanti sebuah Window akan muncul dan kita bisa mengubah-ubah request, misalnya mengganti sebuah parameter.
Spider
Untuk situs yang tidak terlalu besar, zaproxy memiliki fitur Spider. Fitur ini memungkinkan kita mendapatkan gambaran struktur sebuah situs secara otomatis dengan mengunjungi semua link pada situs tersebut.
Saat ini implementasinya pada zaproxy kurang sempurna, jika situs terlalu besar maka zaproxy akan hang karena Out of Memory. Jika memori yang kita miliki cukup besar, settingnya bisa diganti dengan mengedit setting Zaproxy.
Break pada URL
Kita bisa mengatur apakah zaproxy akan meneruskan semua request, atau berhenti di tiap request dengan menggunakan tombol di toolbar. Hijau artinya semua request akan lewat, merah artinya tiap request akan dihentikan dan bisa kita inspeksi atau kita ubah sampai kita tekan tombol “Continue”.
Tapi proses manual ini terlalu lama jika dilakukan berulang. Zaproxy juga memiliki fitur untuk “break” (berhenti) pada sebuah URL tertentu. Dengan cara ini kita bisa melakukan aktivitas biasa, lalu zaproxy akan berhenti jika URL tercapai, dan kita bisa manual mengganti requestnya, kemudian meneruskan lagi requestnya.
Sebagai catatan, kadang proses manual mereview tiap request perlu dilakukan karena kita hanya bisa mengirimkan request sekali, misalnya request registrasi yang butuh nomor ponsel unik.
Encode/Decode
Beberapa aktivitas tertentu misalnya encoding/decoding URL, base64, javascript, dan juga hashing bisa dilakukan langsung dengan klik kanan pada sebuah teks lalu memilih menu “Encode/Decode/Hash”.
Forced Browsing
Zaproxy juga memiliki fitur Dirbuster/Forced Browsing untuk menemukan direktori umum, contohnya adalah file .git yang terbuka publik (seperti pernah saya bahas di sini).
Saat ini ada repository SecList yang berisi daftar yang cukup berguna di direktori Discovery/Web_Content. Kita bisa mempercepat forced browsing jika mengetahui teknologi yang digunakan di website, misalnya jika web memakai PHP, langkah pertama adalah mencoba file PHP.fuzz.txt.
Tapi hanya karena sebagian situs memakai PHP, tidak berarti seluruh website memakai PHP, kadang ada website yang memakai berbagai teknologi, dan kadang satu URL diarahkan satu server (misalnya dengan ASP/Windows) sementara URL lain diarahkan ke server lain (yang memakai PHP di Linux).
Fuzzing
Hal penting lain yang bisa dilakukan dengan zaproxy adalah fuzzing. Intinya kita mengulangi request dengan input yang diganti dengan random, dengan pola, atau dengan sesuatu dari sebuah list. Sebenarnya Forced browsing adalah salah satu bentuk fuzzing, tepatnya Forced browsing adalah fuzzing hanya pada URL (tidak pada parameter, header, maupun data)
Misalnya kita menemukan bahwa situs mengembalikan data untuk id=1, id lain hasilnya not found, dan id=100 hasilnya adalah report lain, kita ingin enumerasi dari 1 sampai 1000 dan tidak ingin melakukan itu manual. Contoh lain kita ingin mengetes page apa saja yang mungkin ada (misalnya ada parameter index.php?page=namapage).
Dalam contoh di gambar berikut ini, saya melakukan fuzzing dengan memilih sebuah request, klik kanan, Attack, lalu fuzz, lalu memilih bagian teks yang akan diubah selama proses fuzzing. Lalu saya menambahkan payload, dalam kasus ini saya hanya ingin mencoba-coba angka yang lain, jadi saya memakai Numberzz.
Sebagian web memakai URL yang menggunakan base64, misalnya memakai id=MQ%3D%3D dan tidak memakai id=1. Modul fuzzer zaproxy memiliki “processor” yang memungkinkan kita melakukan encoding atau processing lain sebelum mengirimkan request.
Untuk fuzzing berbasis list, file-file dari SecLists yang disebutkan sebelumnya juga bisa dipakai.
Scripting
Fitur yang lebih lanjut adalah scripting. Dengan ini kita bisa mengotomasi request, mengganti response, memproses response, dsb. Biasanya request dari browser cukup standar dan jarang butuh pemrosesan khusus, tapi dari mobile device tidak standar, ada yang memakai signature (jika URL diubah akan langsung error jika signature tidak disesuaikan), ada yang diencode (misalnya dengan base64) ada yang dienkrip (misalnya dengan AES).
Skrip bisa dituliskan dalam beberapa bahasa: ECMAScript (Javascript), Python (dengan engine Jython), dan Zest (bahasa khusus dari Mozilla). Bahasa lain juga bisa ditambahkan melalui plugin.
Zaproxy juga bisa dikendalikan dari luar zaproxy itu sendiri, kita bisa membuat skrip dalam python (atau bahasa apapun) yang melakukan koneksi REST ke port zaproxy, lalu kita bisa mengendalikan zaproxy. Contohnya: kita bisa membuat sesi baru, melakukan spider scan, mendapatkan daftar URL hasil scan. Ini bisa digunakan untuk membandingkan apakah ada URL baru yang ditambahkan sejak terakhir kali scan.
Mencari Bug
Zaproxy hanyalah sebuah tool, proses mencari bug tetap harus dilakukan manusia, dan ini butuh pemahaman mengenai aplikasi, mengenai protokol. Berbagai kesalahan sederhana bisa ditemukan dan dieksploitasi dengan mudah menggunakan zaproxy, tapi tentunya sangat tergantung pada aplikasinya.
Direktori atau file yang terlupa seperti dalam kasus Git bisa ditemukan dengan mudah menggunakan “Forced Browse”. Kadang-kadang file yang ditemukan sangat penting, misalnya shell yang ditinggalkan oleh hacker sebelumnya.
Contoh lain: game yang memungkinkan kita menambah koin dengan membeli koin, tapi requestnya bisa diulangi dan kita mendapatkan koin lagi, tapi tanpa mengurangi lagi uang kita. Bug Mandiri e-Money yang pernah saya temukan dulu prinsipnya seperti itu, dan awalnya saya test dengan zaproxy. Tapi dalam kasus ini zaproxy tidak bisa digunakan untuk komunikasi dengan NFC reader, jadi harus dilakukan dengan skrip khusus.
Saat ini hanya dalam konteks web saja ada sangat banyak bug dalam berbagai kategori, mulai dari kesalahan logika, kesalahan konfigurasi server, bug library, bug XSS, bug SQL, bug serialisasi, dsb. Jadi Anda perlu memahami banyak hal jika ingin menemukan semua bug.
Buku The Tangled Web: A Guide to Securing Modern Web Applications memberikan overview yang baik mengenai berbagai teknologi yang membentuk web dan masalah security di sekitarnya. Buku Web Hacking 101 memberikan banyak contoh praktis bug yang ditemukan oleh hacker pada program bug bounty.
Penutup
Semoga dengan perkenalan ini para pemula bisa mencoba-coba sendiri mencari bug pada sebuah web. Tapi jangan terpaku pada satu tools ini saja, pelajari juga tools lain, dan yang paling penting: jangan bergantung pada tools tertentu.
Sebagai catatan, software zaproxy tidak hanya berguna untuk hacker/pentester tapi juga bagi web developer dan app developer agar lebih mengerti request yang dibuat oleh situs/aplikasi mereka. Ini bisa digunakan untuk menyelesaikan bug, identifikasi masalah security, atau sekedar untuk melihat berapa besar data yang dikirimkan/diterima.
Halo mas Yohanes, salam kenal.
Kemarin saya mencoba ikutan WarpWallet Challenge ( https://keybase.io/warp ). Dan dengan semua keterbatasan pengetahuan yang saya miliki, saya melakukannya dengan secara manual.
Katanya, ada cara lebih mudah untuk mencari tahu passphrase dengan cara Brute-Forcing menggunakan BrainFlyer ( https://github.com/ryancdotorg/brainflayer ). Namun saya tidak tahu cara menggunakan file dari Github tersebut untuk dijalankan dikomputer saya (pake windows). Walaupun sudah membaca sedikit penjelasan tutorialnya disini ( http://www.huangzhong.ca/bitcoin-brainwallet-cracking-tools ), tapi tidak paham juga.
Bisakah saya minta tolong mas Yohanes untuk membuatkan tutorial bagaimana menginstall dan menjalankan Brainflyer di Windows ?
Saran saya: pakai Linux baik di VM ataupun dengan Bash/Ubuntu on Windows.