# Kang Bakso ![gambar](https://hackmd.io/_uploads/r1t33i8NJl.png) ## Deskripsi Di staging environment, owner ini lupa akan akun admin dashboard POSnya. Jadi mau gak mau ya dia harus daftar ulang lagi. ## Analisa Target - target: http://20.2.249.185:13371/ [ sudah diganti jadinya beda sama yang di screenshot karena down yang di screenshot ] ### Check Teknologi Yang Dipakai Target Hal pertama yang saya lakukan adalah untuk mengecheck terlebih dahulu stack apa yang dipakai oleh target kita kali ini, saya menggunakan [wappalyzer](https://www.wappalyzer.com/) untuk saya install di browser extension saya, dan yang terlihat di wappalyzer hanya ini saja: ![gambar](https://hackmd.io/_uploads/H1cTpsLV1l.png) - jsDelivr - Bootstrap(5.3.0) Yang dimana ini hanya frontend nya saja, tapi kalau kita check kembali pada response dari target, ternyata target memakai stack "Server: Werkzeug/3.1.3 Python/3.11.11" ![gambar](https://hackmd.io/_uploads/H1zPRjL4kg.png) ### Common vulnerability jika menggunakan python **Debugger menyala atau tidak?** Hal pertama yang ada dipikiran saya adalah untuk mengecheck terlebih dahulu apakah debugnya nyala atau tidak, jadi saya langsung coba aksess debugger nya dengan mengakses endpoint `/console` ![gambar](https://hackmd.io/_uploads/S1XhCiIVkl.png) Dan ternyata memang tidak ada dan bisa diconfirm kalau debuggernya tidak menyala **Kenapa saya mengecheck ini?** Jika dicheck pada notes [HackTricks](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/werkzeug) ini yang membahas tentang werkzeug, yang jika debugnya nyala maka kita bisa mengakses /console dan mencoba melakukan RCE disana ![gambar](https://hackmd.io/_uploads/BkaGe2IN1l.png) Tetapi jika PIN nya protected kita perlu mendapatkan LFI Vulnerability untuk mendapatkan requirement value yang mana nantinya akan kita pakai untuk generate PIN nya, seperti yang dilihat dibawah kita memerlukan value dari beberapa file seperti pada gambar dibawah ini ![gambar](https://hackmd.io/_uploads/BJp_lnU4Jl.png) ### Mengecheck behaviour dari login page nya Jika kita perhatikan kembali disini, kita bisa melihat adanya vulnerability **"Username Enumeration"** karena ketika kita memasukan value yang random pada username dan password, dia akan memberikan error **Username does not exist.** dan bukan **username/password does not exist**, jadi kita bisa melakukan bruteforce username dan mendapatkan username yang valid berbekal dari informasi ini ![gambar](https://hackmd.io/_uploads/SJ1qb2UV1g.png) ### Username Enumeration Dengan melakukan bruteforcing pada login page dengan berbekal informasi diatas yang dimana kita bisa melakukan enumeration pada login page dan bisa mendapatkan username yang valid, lalu bagaimana caranya? Ada sebuah tools bernama [ffuf](https://github.com/ffuf/ffuf) yang dapat langsung di install dengan cara berikut: ![gambar](https://hackmd.io/_uploads/BkXPfhIEkl.png) Setelah melakukan installasi, kita akan menggunakan ini untuk melakukan POST Request ke login page dengan menggunakan wordlist dari [rockyou](https://github.com/zacheller/rockyou). ```bash ffuf -w rockyou.txt -u http://20.2.249.185:13371/login -X POST -d "username=FUZZ&password=wrongpassword" -H "Content-Type: application/x-www-form-urlencoded" -fr "Username does not exist." ``` Penjelasan: 1. **`ffuf`** - **Fungsi**: Tool untuk fuzzing URL, parameter, header, dan lainnya dalam aplikasi web. - Singkatan dari **Fuzz Faster U Fool**, dirancang untuk melakukan brute force secara efisien. 2. **`-w rockyou.txt`** - **Opsi**: `-w` menentukan wordlist yang akan digunakan untuk fuzzing. - **rockyou.txt**: - Salah satu wordlist paling populer, berisi kumpulan kata sandi umum. - Digunakan untuk mencoba berbagai kemungkinan username atau password. - File ini berisi ribuan entri yang akan dimasukkan satu per satu ke posisi FUZZ dalam payload. 3. **`-u http://20.2.249.185:13371/login`** - **Opsi**: `-u` menentukan URL target yang akan difuzzing. - Dalam kasus ini: - Target URL adalah `http://20.2.249.185:13371/login`. - Semua permintaan akan dikirim ke endpoint login. 4. **`-X POST`** - **Opsi**: `-X` menentukan HTTP method yang digunakan. - **POST**: - Menunjukkan bahwa permintaan dikirim sebagai HTTP POST request. - Biasanya digunakan untuk mengirimkan data (seperti form login) ke server. 5. **`-d "username=FUZZ&password=wrongpassword"`** - **Opsi**: `-d` menentukan data yang akan dikirim dalam body POST request. - **Isi**: - `username=FUZZ`: Kata `FUZZ` adalah placeholder yang akan digantikan oleh setiap entri dalam wordlist (`rockyou.txt`) selama proses brute force. - `password=wrongpassword`: Password tetap yang digunakan selama fuzzing untuk mengecek username. Di sini, password dianggap salah secara sengaja. 6. **`-H "Content-Type: application/x-www-form-urlencoded"`** - **Opsi**: `-H` menambahkan header ke dalam HTTP request. - **Header**: - `Content-Type: application/x-www-form-urlencoded`: Menentukan format data yang dikirimkan dalam body. - Format ini digunakan untuk mengirimkan data form seperti `username` dan `password` ke server. 7. **`-fr "Username does not exist."`** - **Opsi**: `-fr` adalah filter response berdasarkan string tertentu. - **Tujuan**: - `-fr "Username does not exist."` menyaring respons yang berisi string tersebut. - Jika respons berisi pesan ini, itu berarti username salah, sehingga respons ini akan diabaikan. - Hanya respons tanpa string tersebut yang akan dianggap sebagai hasil valid. **Contoh Eksekusi dan Alur Kerja** 1. **Input**: - Fuzzing akan mencoba semua entri di `rockyou.txt` sebagai `username`. Setiap request dikirim ke URL `http://20.2.249.185:13371/login` menggunakan POST. - Data POST: `username=<wordlist entry>&password=wrongpassword.` 2. **Filter**: - Server merespons dengan `"Username does not exist."` jika username tidak valid. - Hasil dengan string ini **dihilangkan**. 3. **Output**: - Jika server memberikan respons tanpa string `"Username does not exist."`, berarti username tersebut valid. - Username valid akan muncul di hasil `ffuf`. **Hasil Akhir** - Command ini bertujuan untuk: - **Mengidentifikasi username valid** dengan mencoba semua entri di wordlist `rockyou.txt`. - Hasil valid adalah username yang menghasilkan respons server tanpa pesan error `"Username does not exist."`. Karena ada kendala tertentu di laptop saya saya menggunakan `Termux` untuk melakukan bruteforce ![WhatsApp Image 2024-12-11 at 12.58.54_8a46dc96](https://hackmd.io/_uploads/ByPIw38E1x.jpg) Dan didapatkan username valid sebagai berikut: - alice - bob - kautsar ### Bruteforcing Password Selanjutnya saya mencoba melakukan bruteforcing kepada password nya dengan cara yang sama seperti diatas tinggal mengganti `FUZZ` nya ke parameter password, tetapi sangat disayangkan saya tidak menemukan password nya sama sekali, bisa dilihat disini ketika menggunakan username yang valid, error nya berbeda dari sebelumnya, dan bisa dimanfaatkan untuk bruteforce: ![gambar](https://hackmd.io/_uploads/Sk_mu28NJe.png) Berarti command nya akan terlihat seperti berikut: ```bash ffuf -w rockyou.txt -u http://20.2.249.185:13371/login -X POST -d "username=alice&password=FUZZ" -H "Content-Type: application/x-www-form-urlencoded" -fr "Incorrect password." ``` ### Melakukan directory bruteforce **Kenapa harus melakukan directory brutefore?** Karena kita tidak mendapatkan apa apa dari proses diatas dan akhirnya jalannya buntu, langkah terakhir kita coba melakukan bruteforcing pada directorynya, mungkin akan mendapatkan sesuatu yang menarik, saya menggunakan [dirsearch](https://github.com/maurosoria/dirsearch) untuk melakukan bruteforce dengan tanpa menggunakan custom wordlist, hanya mengandalkan default wordlist dari `dirsearch`. ![gambar](https://hackmd.io/_uploads/Skd2dnL4Je.png) Dari sini kita mendapatkan `.git`, yang dimana ternyata developernya melupakan untuk menghapus `.git` pada env production, yang akhirnya berakibat fatal, jika kita coba akses `.git/config`, kita bisa mendapatkan [repository](https://github.com/devbakso/Bakso-Web-Apps) website ini: ![gambar](https://hackmd.io/_uploads/BkWRKn8EJg.png) Dan ternyata ketika dicheck kembali pada `README.md` pada repository tersebut didapatkan default password website target kita ini: ![gambar](https://hackmd.io/_uploads/SyLW52IV1l.png) ### Analisa Dashboard User Dari informasi ini, kita coba langsung login dengan username yang kita dapatkan dan password yang kita dapatkan: ![gambar](https://hackmd.io/_uploads/B1Vqq3LVJl.png) Saya login as `alice:BaksoJaya2024!`, dan jika kita mencoba melakukan `view-source` atau melihat pada response dari `Burpsuite` didapatkan hidden path, yaitu `/api/flag`: ![gambar](https://hackmd.io/_uploads/r15Jo3IEkl.png) Tetapi dengan menggunakan user `alice` kita tidak bisa mendapatkan flagnya, dengan mencoba login satu persatu, dan pada user `kautsar` kita mendapatkan dashboard yang berbeda: ![gambar](https://hackmd.io/_uploads/ry-8o2I4yg.png) Dan karena kita sudah menjadi admin, kita langsung akses `/api/flag` dan didapatkan flagnya: ![gambar](https://hackmd.io/_uploads/Syc0oh8Ekl.png) Flag: **vbvng@ngBaxxo-Mari2Sini_AkvMwBli** ### Flask cookie bruteforce [hanya sekedar tips] Jika diperhatikan cookie ini ![gambar](https://hackmd.io/_uploads/SykxfTUVyx.png) Kita bisa mencoba melakukan bruteforcing secret key nya, dengan cara menggunakan trik dari [hacktricks](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/flask#flask-unsign) dengan menggunakan tools `flask-unsign` ![gambar](https://hackmd.io/_uploads/SyA4MTI4yx.png) Berarti command nya akan jadi seperti ini ```bash flask-unsign --wordlist /usr/share/wordlists/rockyou.txt --unsign --cookie 'eyJyb2xlcyI6WyJ1c2VyIl0sInVzZXJfaWQiOjIsInV1aWQiOiI1YzQ2ZmMyMC1jNzNkLTQ5NTEtYmNkMi0wNDFmZjhmMzY3NGQifQ.Z1lBwA.Clk8cQWi-OMfQZMua6OCC0WAtBE' --no-literal-eval ``` Dan jika berhasil akan didapatkan secret keynya, tetapi dipercobaan kali ini tidak bisa didapatkan.