Retas.io Hellbound VM Write-up

Retas.io Hellbound VM Write-up

Langsung saja to the point, mesin ini susah titik. Dari awal launching labs sudah ada 3 mesin yaitu Zombie, Hellbound dan Anonymouz maka mesin inillah yang menurut saya cukup hard karena ya mungkin kurangnya pengalaman dalam bereksploitasi dan feeling yang kuat. Hingga write up ini ditulis penulis juga masih belum mendapatkan flag root user, masih nyetuck di www-data. Beruntung saja user flag readable sama si www-data dengan ini sudah bisa submit flag user.

Seperti biasa kita melakukan koneksi pada akun openvpn kita, starting our hacking machine dan mulai menyerang IP si Hellbound.

Pada hasil nmap cukup meresahkan karena yang terbuka hanya ada 1 port saja yaitu port 80 / service web saja, tidak seperti pada mesin-mesin sebelumnya yang pernah saya kerjakan minimal ada 2 port, umumnya port 22 dan 80 yang terbuka.

nmap hellbound result

Langsung saja kita buka port web service tersebut dan jangan lupa lakukan dirsearch / fuzzing untuk mencari informasi lainnya yang kemungkinan bisa didapatkan.

Pada saat dibuka tidak ada respons sama sekali, hanya tulisan forbidden / dilarang, lalu kita tunggu saja hasil fuzzing untuk mendapatkan directory umum yang kemungkinan bisa dieksploitasi.

fuzzing result

Dari hasil fuzzing terdapat 2 directory yaitu login (hmm sepertinya menarik), dan member. Untuk hasil lainnya didapatkan 2 file dari configurasi server yaitu composer.json dan composer.lock (sepertinya tidak menarik).

composer file

Ketika kita membuka directory login sesuai dengan namanya kita diberikan sebuah form untuk login kesebuah aplikasi web, tapi disini kita tidak mendapatkan informasi credential untuk digunakan masuk, lalu untuk directory member kita akan di-redirect ke directory login, di sini sudah mencoba beberapa cara yang sepertinya berhasil seperti no-redirect, bruteforce, default user pass, SQL-Injection bypass login dkk namun hasilnya nihil, oke kita nyetuck lagi.

login page

Seperti biasa jika nyetuck kita kembali ke tahap awal apakah ada yang tertinggal atau tidak, ternyata jika kita membuka file composer.json kita mendapatkan sedikit informasi mengenai website ini dan benar saja kita mengetahui jika web ini menggunakan mongodb sebagai backend databasenya (saya menarik kata-kata sebelumnya yang tidak menarik tadi, lol.). Oke wait, sepertinya ada exploit yang dapat digunakan, yup benar mongodb adalah nosql dan pada nosql sendiri dikenal ada sebuah injeksi kurang lebih sama seperti SQL injection namun karena pada mongodb maka namanya adalah NoSQL Injection, saya menggunakan resource dari internet ini sebagai panduan untuk melakukan exploitasi.

no sql injection

Dan benar saja kita dapat masuk tanpa harus mengetahui username / password pada aplikasi web dengan menggunkan NoSQL Injection. Dengan menggunakan credentials yang tidak valid serta sedikit merubah request ke server.

logged in as member

Dari sini kita sudah bisa masuk ke dalam webapp dan pada halaman tersebut tidak ada yang menarik selain form untuk melakukan comment. Sampai sini stuck kembali, kita rehat dan mengerjakan VM lainnya karena memang sudah bener-bener mentok mau gimana lagi, di sini saya mulai membuat sebuah solver untuk mendapatkan username dan password dari webapp ini dengan bash, namun setelah 2 hari-an bikin ternyata credentials yang ditemukan tidak berguna pada langkah selanjutnya, untuk solvernya bisa dilihat di sini jika timbul rasa penasaran.

Setelah beberapa hari saya mengirimkan support kepada pihak retas untuk minta clue pada challenges VM ini dan mendapatkan clue berupa “Ada admin yang mengecek web tersebut”

first clue

Dari sini langsung kepikiran XSS namun ketika memasukan tag-tag yang umum dipakai untuk XSS ternyata diblock, di sini saya mulai spend waktu yang cukup lama untuk mencari bagaimana melakukan XSS stored pada web ini, karena XSS ini tidak reflected maka saya mencari tag apa yang dapat dipakai, dimulai dengan mencari tag html yang dapat dipakai sepertinya adalah langkah yang baik. Dengan sedikit otomasi saya membuat one liner untuk list tag yang dapat dipakai.

File list sendiri berisikan tag-tag yang ada pada html, saya mendapatkannya melalui website portswigger

testing for unfiltered html tag

Dari hasil tersebut terdapat tag-tag html yang dapat digunakan, langsung saja kita coba satu persatu payload pada web portswigger dengan tag yang dapat dipakai, serta jangan lupa rubah payload untuk mengakses port local machine kita. Setelah beberapa lama payload berikut dapat digunakan.

Dan kita mendapatkan hasil berupa request http dari server.

xss callback

Dari sini kita dapat membuat payload XSS untuk melakukan hal lain pada user yang tanpa sengaja membuka payload kita. Seperti pada umumnya kita mencoba melakukan steal cookie, namun hasilnya nihil tidak ada cookie yang dapat didapatkan serta kembali pada hasil request dari server bahwa dashboard berada pada port 8080 namun pada port 8080 sendiri tidak dapat diakses dari luar, di sini saya mengalami stuck yang sangat lama sekali dan berfikiran untuk berhenti bermain di mesin ini. Setelah beberapa minggu akhirnya tanya lagi tentang clue pada admin Instagram retasidn dan saatnya membuat payload lain.

second clue

Setelah mencoba menggunakan BeEF untuk mendapatkan akses tunnel proxy terhadap user yang menjalankan script BeEF yang berujung gagal karena request akan terputus setelah 3-5 detik, kita mencari informasi lainnya untuk melakukan sejenis tunneling dengan XSS atau melakuakn explorasi web terhadap client yang menjalankan payload XSS tersebut dan mendapatkan cara berikut yaitu menggunakan XMLHttpRequest

Lalu membuat payload seperti ini.

generate xss payload

Isi dari file get.php, atau payload yang melakukan XMLHttpRequest ke halaman index dan melemparkan hasil dari request tersebut ke local port machine kita di port 8000

Pada local machine kita jangan lupa melakukan listen terhadap port 8000 agar hasil request index.php pada dashboard admin di port 8080 dan ketika dijalankan kita mendapatkan informasi berikut.

Kita sudah mendapatkan isi dari index pada dashboard admin, karena pada dikirim ke url maka isinya ter-encode dengan urlencode, lanjut decode dan analisa.

dashboard admin page

Dari hasil sedikit analisa, file index.php mempunyai GET request dengan parameter ping untuk melakukan ping pada suatu host, sepertinya ini bisa dilakukan command injection, saatnya kita coba menjalankan command-command umum pada linux server. Tentunya sama seperti XSS tadi, kita melakukan open port untuk menerima hasil dari response command injection yang dijalankan, jika terdapat balasan dari server berarti command tersebut berjalan dengan baik. Sebagai referensi, berikut adalah resource yang cukup menarik untuk mencoba beragam jenis payload command injection.

pipe rce

Dari sini terbukti bahwa kita dapat melakukan command injection menggunakan pipe (|) dilanjutkan dengan command yang akan dilakukan, kebetulan karena wget dapat dijalankan, saya mendownload sebuah script untuk menjalankan reverse shell dengan menggunakan command yang ada, generate melalui shell now sh, lalu simpan dilocal, pada command injection kita lakukan download file tersebut dan menjalankannya dengan bash.

reverse shell xss

Setelah mendapatkan reverse shell dan saatnya kita baca flag di homedirnya user joko, untungnya flagnya readable oleh www-data sehingga cukup melegakan setelah perjalanan panjang untuk mendapatkan shell dari server, selanjutnya kita melakukan rooting. namun untuk saat ini saya rehat bentar dari mesin ini karena memang effort yang digunakan cukup banyak dan ribet.

user flag

To be continued