Membuat Burp Extension

Burp adalah tool intercepting proxy proprietary yang bisa digunakan untuk melakukan penteting aplikasi web (dan juga mobile yang memakai koneksi HTTP/HTTPS). Tool ini seperti Zaproxy yang pernah saya bahas di posting yang lain, tapi Burp sifatnya tertutup (tidak open source). Tool ini sangat populer di kalangan pentester dan bounty hunter.

Burp ada versi gratis serta berbayarnya, tapi versi gratisnya memiliki keterbatasan tidak bisa menyimpan session, sehingga tidak cocok untuk pekerjaan pentest professional. Versi professionalnya 399 USD per tahun. Memang cukup mahal, tapi bagi saya tool ini cukup membantu proses pentest, jadi saya berlangganan versi pronya. Dilihat dari sudut pandang lain biaya ini tidak mahal: biaya transportasi harian 20 ribu rupiah sehari selama 300 hari sudah lebih mahal daripada harga langganan burp setahun.

Walau sudah membeli lisensi Burp, tapi saya juga masih memakai Zaproxy. Masing-masing punya kelebihan dan kekurangannya sendiri. Beberapa fitur sudah ada lama di Zaproxy (misalnya launch built in web browser) baru ada di Burp, dan juga sebaliknya. Contoh fitur lain yang tidak ada di burp adalah headless scan (ada extension untuk ini, tapi sudah tidak diupdate, dan tidak jalan di versi baru). Secara umum Burp lebih cepat dari zaproxy dan lebih stabil, selain itu banyak riset dilakukan oleh PortSwigger (perusahaan pembuat burp) yang langsung dijadikan extension Burp.

Extension di Burp bisa diakses dari menu Extender. Sebelum membuat extension, sebaiknya cek dulu BApp store untuk memastikan bahwa belum ada yang membuat extension yang kita mau. Biasanya extension bersifat open source, jadi kita bisa memodifikasi yang sudah ada jika tidak tepat seperti yang kita mau. Untuk pengguna Burp versi gratis, perhatikan juga bahwa sebagian extension perlu Burp professional.

Extension dalam Python dan Ruby

Di Burp dan Zaproxy kita bisa menambahkan extension yang ditulis dalam Java (di Zaproxy, extension ini disebut sebagai AddOns). Zaproxy juga mendukung script dalam Python/Javascript/Ruby dan berbagai bahasa lain, sedangkan Burp hanya mendukung Python dan Ruby jika kita mendownload interpreternya secara manual.

Burp tidak mengenal perbedaan Script dan Extension, jadi semuanya adalah extension. Tidak seperti Zaproxy di mana kita bisa langsung membuat script untuk satu hal saja (misalnya intercept proxy saja, atau intercept send saja), di Burp kita perlu membuat extension yang lengkap untuk melakukan satu hal tersebut.

Extension yang ditulis dalam Python atau Ruby bisa langsung mengakses kelas-kelas Java yang standard. Tapi extension dalam Python dan Ruby tidak bisa mengakses library Python/Ruby yang butuh native code. Jadi misalnya extension Python/Ruby kita butuh AES, maka kita tidak bisa menginsall package cryptography yang umumnya dipakai programmer Python.

Jadi apa solusinya jika kita butuh API tertentu (misalnya AES?). Kita bisa mengakses fungsi library Java (misalnya import javax.crypto.Cipher as Cipher). Jadinya kita seperti memprogram Java tapi dengan syntax Python. Versi Python yang didukung juga hanya versi 2.7 (karena saat ini belum ada Jython belum ada untuk Python 3 ke atas), JRuby juga hanya mendukung Ruby versi 2.5 (saat ini versi resmi Ruby sudah versi 3). Untuk script Python dan Ruby juga tidak tersedia debugger untuk menelusuri script jika ada error.

Dengan semua keterbatasan yang saya sebutkan: versi Python/Ruby yang ketinggalan, tidak bisa mengakses kelas berbagai package yang ada di Python/Ruby, dan tidak ada debugger, akan lebih mudah membuat extension dalam Java secara langsung. Jadi di tulisan ini hanya akan dibahas pembuatan extension dalam Java.

Satu kelemahan penting ketika mendevelop extension dengan Java adalah: waktu kompilasi, walau cuma butuh beberapa detik, tapi proses kompilasi ini cukup menganggu. Saya masih bisa menerima kelemahan ini karena kelengkapan semua library di Java dan adanya debugger.

Sebagai catatan: versi gratis burp juga mendukung extension, tapi tetap ada batasannya. Misalnya kita tidak bisa membuat extension untuk menyimpan session. Intinya: kita tidak bisa membuat ekstension sehingga versi free menjadi setara versi pro. Kalau membuat extension sekedar untuk mencatat URL request dan response bisa saja, tapi ini tidak bisa diload ke user interface burp ketika projectnya dibuka.

Anatomi Sebuah Burp Extension

Sebuah extension burp yang paling minimal adalah sebuah file jar yang berisi satu kelas bernama burp.BurpExtender yang mengimplementasikan interface IBurpExtender. Namanya harus tepat BurpExtender dalam package burp.

Ada satu method yang perlu diimplementasikan dalam interface IBurpExtender yaitu registerCallBacks. Di sini kita bisa mengeset nama extension kita dengan setExtensionName.

Setelah itu kita bisa mengimplementasikan beberapa Listener untuk berbagai event yang ingin kita proses, dan mendaftarkan instance kelas-kelas tersebut agar dipanggil. Contoh event adalah: ketika message masuk ke proxy, ketika message keluar proxy, ketika message HTTP akan dikirim, ketika message HTTP akan diterima dsb.

Burp menyediakan beberapa method helper untuk memproses message yang masuk. Instance helper ini didapatkan dari getHelpers(). Contoh method yang tersediaadalah: mengekstrak URL, mengekstrak header, melakukan base64 decode/encode, dsb. Supaya lebih jelas, akan saya pandu dengan extension sederhana di bagian berikutnya.

Mendevelop Extension

Ini bukan tutorial dasar bahasa Java, jadi diasumsikan Anda sudah tahu:

  • Konsep dasar bahasa Java, seperti: kelas dan interface
  • Cara mengkompilasi kode Java menjadi .class lalu mempackage menjadi .jar (akan lebih baik lagi jika paham memakai gradle atau IDE supaya proses ini otomatis)

Hal-hal lain bisa dipelajari dengan melihat berbagai contoh di Internet. Contoh kode extension yang sangat sederhana adalah seperti di gambar berikut:

Dari dalam Burp (di menu Extender->API) kita bisa mengekspor file-file interface API Burp ke sebuah direktori (dengan tombol “Save Interface files“), lalu mengkompilasi file tersebut bersama dengan file yang kita buat. Jika kita menggunakan tool seperti gradle atau Maven maka kita bisa menggunakan dependensi dari maven central (nama dependensinya net.portswigger.burp.extender:burp-extender-api:2.1 dari repository ini).

Setelah extension kita sudah jadi, kita bisa mengkompilasi filenya menjadi .class lalu mempackage-nya menjadi file jar. Terserah cara apa yang dipakai untuk membuat ini, dari mulai manual menggunakan command line “jar“, memakai gradle, maven, memakai IDE seperti IntelliJ, Netbeans, atau yang lain.

File jar kemudian bisa diload di Burp dengan menggunakan menu “Extender”. Jika ada error, kita bisa melihat informasi di tab “Errors”. Jika kita mengupdate file jar-nya, maka kita bisa melakukan control click pada nama extension untuk meload ulang extension tersebut (gunakan command-click pada macOS).

Perhatikan: jika kita memakai library tertentu, library itu perlu dipackage ke dalam file jar extension (istilahnya: fat jar, uber jar, atau big jar). Jika tidak, maka akan keluar pesan error ketika extension diload atau ketika dijalankan.

Saya tambahkan sedikit contoh yang memproses pesan http. Extension ini hanya sekedar melakukan highlight (mewarnai) pesan tertentu di Burp Proxy History (dalam kasus ini: jika URL mengandung kata compactbyte).

package burp;

public class BurpExtender implements  IBurpExtender, IProxyListener{

    IBurpExtenderCallbacks callbacks;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        callbacks.setExtensionName("Hello Extension");
        callbacks.printOutput("Hello world");
        callbacks.registerProxyListener(this);
        this.callbacks = callbacks;
    }

    @Override
    public void processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message) {
        var m = message.getMessageInfo();
        var r = callbacks.getHelpers().analyzeRequest(m);
        if (r.getUrl().getHost().contains("compactbyte")) {
            m.setHighlight("blue");
        }
    }
}

Perhatikan versi Java yang dipakai oleh Burp dan yang digunakan untuk development. Dalam contoh ini saya memakai fitur type inference yang ada di Java 10 (var tanpa tipe data, akan otomatis diketahui tipenya oleh compiler), jika Burp dijalankan dengan Java versi sebelumnya, maka extension akan error ketika diload.

Contoh hasil dari extension di atas adalah seperti gambar di bawah ini. Di BB App Store sudah ada banyak extension yang melakukan highlight dengan kondisi tertentu, tapi ada kemungkinan Anda tetap butuh coding sendiri.

Modifikasi Message

Selain sekedar menerima dan memproses message yang lewat, kadang kita ingin memodifikasi message tertentu. Contoh: menambah header, menghapus header, mengganti payload, mendekrip/enkrip payload dsb. Saya tidak akan mendetailkan bagaimana melakukan modifikasi message, hanya sekedar ingin memfokuskan bahwa modifikasi ini harus dilakukan di titik yang tepat.

Agar tidak memodifikasi message di titik yang salah, yang perlu dipahami adalah flow pemrosesan message. Cara termudah memahami ini adalah dengan melakukan logging supaya tahu method mana yang dipanggil lebih dulu.

Contohnya begini: saya ingin membuat extension yang otomatis mendecode pesan HTTP terenkripsi dari mobile app, menampilkan pesan tersebut sebagai plaintext (jadi bisa dibaca dengan mudah), tapi ketika dikirimkan ke server, harus tetap terenkripsi. Sebaliknya: pesan dari server ketika kembali ke Burp harus didekrip agar terlihat responsenya seperti apa, tapi ketika diteruskan ke aplikasi mobile, harus dienkrip lagi agar aplikasinya bisa mendekrip data asli dari server.

Dalam kasus ini, yang dipanggil ketika mobile app mengirim pesan adalah listener untuk proxy, jadi di sini message saya dekrip agar muncul versi plaintext di user interface burp. Setelah itu pesan akan dikirimkan, jadi perlu dienkrip ulang di dalam listener HTTPListener. Sebaliknya pesan dari server akan diterima dulu di HTTPListener, sehingga bisa didekrip di sini, lalu akan diteruskan ke proxy listener (jadi bisa dienkrip ulang di sini).

Debugging

Jika ingin sekedar mencetak teks (atau dikenal sebagai “printf debugging“), maka kita bisa memanggil fungsi print dari kelas IBurpExtenderCallbacks (atau menggunakan outputstream dari situ). Meski cara ini primitif, tapi sangat ampuh dalam berbagai kasus.

Untuk melakukan debugging dengan debugger, kita bisa menjalankan Burp dengan dan memberi opsi interpreter agar bisa didebug. Kita bisa menggunakan debugger apapun yang bisa melakukan koneksi JDWP (Java Debug Wire Protocol). Salah satu yang paling mudah disetup adalah Visual Studio Code (misalnya: silakan ikuti petunjuk di posting blog ini).

Saya sendiri suka memakai IntelliJ (untuk Java, banyak fitur IntelliJ yang lebih baik dari VSCode). Dengan debugger kita bisa melihat dengan mudah semua nilai variabel sehingga mempercepat proses pencarian bug.

User Interface

Terkadang sebuah extension perlu user interface untuk menampilkan sesuatu atau untuk meminta konfigurasi tertentu. Membuat user interface untuk extension ini agak merepotkan karena perlu dilakukan menggunakan API Swing. Kadang untuk aplikasi sederhana pembuata user interface ini memakan waktu, jadi beberapa orang menghindari ini dengan berbagai cara:

  • Menampilkan sesuatu di bagian comment sebuah request (jadi tidak perlu komponen baru)
  • Menampilkan message box/alert
  • Menambahkan informasi dalam bentuk teks ke bagian tab output plugin
  • Meminta pengguna mengisikan setting di file konfigurasi (biasanya JSON)

Jika memang perlu membuat user interface, saran saya adalah: gunakan IDE yang memiliki form designer (seperti IntelliJ atau Netbeans). Ini akan mempercepat proses pembuatan plugin secara signifikan. Sekitar 22 tahun yang lalu saya masih cukup sabar membuat form Swing secara manual untuk aplikasi di ITB, tapi sekarang saya akan menggunakan GUI designer kecuali aplikasinya sangat sederhana.

Penutup

Saat ini saya masih lebih suka membuat skrip di Zaproxy, tapi saya belajar juga memakai Burp karena kadang ini tool yang cocok untuk pekerjaan yang sedang dilakukan. Ilmu membuat extension ini juga berguna untuk mempelajari extension yang dibuat orang.

Membuat extension Burp ini awalnya memang sulit, sehingga extension pertama bisa butuh waktu lama Tapi membuat yang berikutnya akan lebih mudah karena sudah paham dan tentunya bisa melakukan copy paste banyak kode dari extension sebelumnya.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.