Di staging environment, owner ini lupa akan akun admin dashboard POSnya. Jadi mau gak mau ya dia harus daftar ulang lagi.
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:
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"
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
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
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
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
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:
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:
ffuf
-w rockyou.txt
-w
menentukan wordlist yang akan digunakan untuk fuzzing.-u http://20.2.249.185:13371/login
-u
menentukan URL target yang akan difuzzing.http://20.2.249.185:13371/login
.-X POST
-X
menentukan HTTP method yang digunakan.-d "username=FUZZ&password=wrongpassword"
-d
menentukan data yang akan dikirim dalam body POST request.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.-H "Content-Type: application/x-www-form-urlencoded"
-H
menambahkan header ke dalam HTTP request.Content-Type: application/x-www-form-urlencoded
: Menentukan format data yang dikirimkan dalam body.username
dan password
ke server.-fr "Username does not exist."
-fr
adalah filter response berdasarkan string tertentu.-fr "Username does not exist."
menyaring respons yang berisi string tersebut.Contoh Eksekusi dan Alur Kerja
rockyou.txt
sebagai username
.http://20.2.249.185:13371/login
menggunakan POST.username=<wordlist entry>&password=wrongpassword.
"Username does not exist."
jika username tidak valid."Username does not exist."
, berarti username tersebut valid.ffuf
.Hasil Akhir
rockyou.txt
."Username does not exist."
.Karena ada kendala tertentu di laptop saya saya menggunakan Termux
untuk melakukan bruteforce
Dan didapatkan username valid sebagai berikut:
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:
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."
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
.
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:
Dan ternyata ketika dicheck kembali pada README.md
pada repository tersebut didapatkan default password website target kita ini:
Dari informasi ini, kita coba langsung login dengan username yang kita dapatkan dan password yang kita dapatkan:
Saya login as alice:BaksoJaya2024!
, dan jika kita mencoba melakukan view-source
atau melihat pada response dari Burpsuite
didapatkan hidden path, yaitu /api/flag
:
Tetapi dengan menggunakan user alice
kita tidak bisa mendapatkan flagnya, dengan mencoba login satu persatu, dan pada user kautsar
kita mendapatkan dashboard yang berbeda:
Dan karena kita sudah menjadi admin, kita langsung akses /api/flag
dan didapatkan flagnya:
Flag: vbvng@ngBaxxo-Mari2Sini_AkvMwBli
Jika diperhatikan cookie ini
Kita bisa mencoba melakukan bruteforcing secret key nya, dengan cara menggunakan trik dari hacktricks dengan menggunakan tools flask-unsign
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.