Kang Bakso

gambar

Deskripsi

Di staging environment, owner ini lupa akan akun admin dashboard POSnya. Jadi mau gak mau ya dia harus daftar ulang lagi.

Analisa Target

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 untuk saya install di browser extension saya, dan yang terlihat di wappalyzer hanya ini saja:
gambar

  • 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

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
Dan ternyata memang tidak ada dan bisa diconfirm kalau debuggernya tidak menyala

Kenapa saya mengecheck ini?
Jika dicheck pada notes HackTricks ini yang membahas tentang werkzeug, yang jika debugnya nyala maka kita bisa mengakses /console dan mencoba melakukan RCE disana
gambar
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

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

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 yang dapat langsung di install dengan cara berikut:
gambar
Setelah melakukan installasi, kita akan menggunakan ini untuk melakukan POST Request ke login page dengan menggunakan wordlist dari rockyou.

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.
  1. -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.
  1. -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.
  1. -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.
  1. -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.
  1. -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.
  1. -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.
  1. Filter:
  • Server merespons dengan "Username does not exist." jika username tidak valid.
  • Hasil dengan string ini dihilangkan.
  1. 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

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
Berarti command nya akan terlihat seperti berikut:

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 untuk melakukan bruteforce dengan tanpa menggunakan custom wordlist, hanya mengandalkan default wordlist dari dirsearch.

gambar

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 website ini:
gambar

Dan ternyata ketika dicheck kembali pada README.md pada repository tersebut didapatkan default password website target kita ini:
gambar

Analisa Dashboard User

Dari informasi ini, kita coba langsung login dengan username yang kita dapatkan dan password yang kita dapatkan:
gambar

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

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

Dan karena kita sudah menjadi admin, kita langsung akses /api/flag dan didapatkan flagnya:
gambar
Flag: vbvng@ngBaxxo-Mari2Sini_AkvMwBli

Jika diperhatikan cookie ini
gambar

Kita bisa mencoba melakukan bruteforcing secret key nya, dengan cara menggunakan trik dari hacktricks dengan menggunakan tools flask-unsign
gambar

Berarti command nya akan jadi seperti ini

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.