Friday, November 8, 2013

HITBKUL 2013 CTF - Daemon1's writeup

Beberapa waktu yang lalu tim kami mengikuti ctf pada acara hackinthebox di malaysia dimana ctf ini adalah yang pertama kali bagi kami secara team. Pada lomba tersebut diberikan banyak tantangan, dimana peserta harus memecahkan tantangan tersebut untuk mendapatkan poin health, money, ataupun power yang dapat digunakan untuk menyerang tim lainnya. Untuk ulasan lebih detail tentang perlombaan silahkan baca artikel dari salah satu team kami disini.

Artikel ini sengaja ditulis dengan bahasa indonesia, agar memotivasi kawan-kawan untuk mencoba bermain ctf dari pada melakukan *cough* *cough*

Berikut ini adalah tantangan pertama yang diberikan yaitu daemon1, daemon1 merupakan file binary elf32 dimana peserta diberikan tantangan untuk melakukan reverse engineering terhadap file tersebut. File tersebut dapat diunduh pada link berikut ini.

Hasil analisa cepat dengan mempergunakan strace dapat dilihat pada gambar berikut:


Dari hasil strace diatas, dapat diketahui program melakukan listen pada port 5555 dan menunggu untuk menerima paket serta dipanggil juga fungsi time.


Pada gambar diatas, terlihat pada fungsi setsockopt menerapkan timeout terhadap packet yang diterima oleh recv. Oleh karena itu user input secara manual akan lebih sulit untuk dilakukan. Kemudian saya mencoba lagi mengirimkan paket dengan menambahkan enter dengan cepat, dan menunjukkan hasil yang berbeda.


Program mempergunakan fungsi read setelah menerima paket dari recv dan akan kembali melakukan accept.

Kemudian saya mempergunakan IDA ( Interactive Disassembler ) untuk melakukan static analisis untuk melihat apa yang dilakukan program sebelum dan sesudah setelah dilakukan beberapa test diatas.


Gambar diatas menunjukkan bahwa pada awal program berjalan, program memanggil fungsi time yang menunjukkan waktu ketika program berjalan, kemudian diikuti dengan melakukan random seed terhadap waktu tersebut. Program memanggil fungsi sub_80487d4 dengan menempatkan pointer  salah satu variable serta nilai 20h atau 32 kedalam salah satu parameter fungsi tersebut.

Pada fungsi sub_80487d4 program melakukan generate random value yang akan dikalkulasikan untuk dimasukkan kedalam suatu array yang memiliki index sebanyak 32. berikut ini hasil pseudocode dengan mempergunakan ida:


Ok, dari gambar diatas dapat dilihat bahwa terdapat array byte_8049080 yang berisikan nilai sebagai berikut:


Jika digambarkan dalam kode c, nilai byte pertama dari 32 byte key yang digenerate kurang lebih akan seperti berikut ini:


Mudah ditebak bukan? setelah tahu bagaimana proses random value tadi digenerate, program akan melakukan eksekusi fungsi socket dimana program akan menerima 2 paket secara berturut-turut (recv, read). Ketika paket yang dikirim tidak sesuai maka program mengulangi melakukan recv dan read kembali.


Paket yang diterima dicek apakah ada atau tidak, jika tidak maka akan dipanggil fungsi fclose untuk memutuskan komunikasi dengan program tersebut. Paket pertama yang dikirimkan dapat diisi terserah selama panjang paket yang dikirimkan kurang dari +-290byte, paket ini digunakan untuk mentrigger program untuk melanjutkan eksekusinya dengan memanggil fungsi read.

Pada bagian ini, saya mempergunakan gdbserver + ida untuk melakukan dynamic analysis untuk mempermudah pencarian packet kedua yang dikehendaki oleh program.


Gambar diatas menunjukkan instruksi cmp yang melakukan compare terhadap byte pertama dari hasil fuzzing paket kedua. Jika byte pertama berisikan '#' atau 0x23 diikuti dengan jumlah buffer dibelakangnya sebanyak 52byte maka program akan melanjutkan eksekusinya ke step berikutnya. Jika tidak maka program akan kembali melakukan (recv, read) kembali.

Ketika dikirimkan dengan buffer tersebut, program akan mengirimkan paket response berupa string "you need a better luck!"


Artinya sebelum memberikan response tersebut, ada proses yang terjadi sebelumnya yg terlewatkan. Berikut ini adalah blok proses sebelum melakukan memberikan response "you need a better luck!".


Dapat dilihat, terdapat instruksi cmp dl, al dimana ketika dilakukan proses dynamic analysis buffer ke 2 pada byte ke 53 dibandingkan dengan byte pertama dari 32byte string yang digenerate pada awal program berjalan.


Jika buffer yang dikirimkan benar, maka program akan melanjutkan eksekusi kemudian program akan membaca file 'flag.txt' yang tersedia diserver dan mengirimkannya pada client yang melakukan request dengan buffer yang benar :)


Berikut ini code yang digunakan untuk memecahkan challenge daemon 1, untuk tulisan challenge selanjutnya nunggu yang nulis ada waktu luang ya :P happy reversing! :)