[OverTheWire] – Behemoth 0-2

Behemoth 0 -> 1

Behemoth 0 dapat diakses dengan “ssh behemoth0@behemoth.labs.overthewire.org” dengan password default behemoth0. Tujuan dari setiap level pada wargame ini adalah untuk mengakses shell dan mendapatkan password untuk melanjutkan ke level berikutnya. 

Pada Behemoth0, terdapat sebuah file ELF bernama behemoth0 pada folder /behemoth. Ketika file tersebut dijalankan, maka outputnya adalah sebagai berikut :

Seperti biasanya, saya mencoba untuk melihat strings apa saja yang terdapat pada file tersebut dan terdapat beberapa hasil yang menarik seperti berikut :

Tetapi ketika saya mencoba untuk melakukan input string-string di atas, tidak ada input yang benar sehingga saya mencoba untuk melakukan disassemble terhadap fungsi main dari file tersebut

Pada alamat memori 0x8048621 terdapat function strcmp yang berfungsi untuk melakukan compare antara string input dengan string password yang sebenarnya. Selain itu, strcmp sangat rentan terhadap ltrace, sehingga saya mencoba menggunakan ltrace dan meng-execute file tersebut kembali

Dari hasil tersebut, terlihat bahwa strcmp melakukan compare antara input “thisisinput” dengan password sebenarnya yaitu “eatmyshorts”. Sehingga, jika kita mencoba untuk memasukkan password “eatmyshort” kita dapat mencoba untuk mendapatkan password untuk ke level selanjutnya

 

Behemoth 1 – > 2

Behemoth 1 dapat diakses dengan “ssh behemoth1@behemoth.labs.overthewire.org” dengan password yang didapatkan sebelumnya pada behemoth0.

pada behemoth1, terdapat file ELF bernama behemoth1, seperti pada behemoth0, saya mencoba untuk melakukan ltrace dengan hasil sebagai berikut:

dari hasil ltrace tersebut, terdapat function scan input yaitu gets. di mana function gets sangat rentan terhadap buffer overflow. Sehingga, saya mencoba untuk mencari offset dari buffernya dengan cara berikut ini

cara tersebut akan melakukan input huruf ‘A’ dari 1 sampai 100 untuk melihat di mana eksekusi file tersebut yang akan mengalami Segmentation Fault , hasilnya muncul pada bagian berikut ini :

kita mendapatkan offset sebesar 71, sehingga kita dapat membuat payload pada folder temporary dan ketika dijalankan dengan gdb, maka hasilnya juga akan menghasilkan segfault seperti berikut

dan jika kita menambah input seperti ‘BBBB’ seharusnya akan terdapat overflow seperti berikut

dari hasil tersebut, terdapat overflow alamat memory menjadi 0x42424242 di mana 42 adalah value hex dari B. Dengan demikian, kita dapat menyimpulkan bahwa fungsi gets akan mengalami overflow setelah kita input lebih dari 71 input. Kita dapat memanfaatkan hal tersebut karena, setelah 71 input tersebut, stack memory akan memberikan return address agar execution file tersebut tetap berjalan.

Dari hal tersebut, kita dapat me-redirect ke program lainnya yaitu akses shell yang berisi password dari behemoth2 karena tujuan utama wargame ini adalah untuk mendapatkan akses shell yang digunakan untuk mendapatkan password ke level berikutnya. Setelah itu, saya dapat mengubah payload menjadi sebagai berikut :Pada payload tersebut. terdapat ‘\x90’ yang merupakan nilai hex dari NOP untuk melakukan NOP Slide . Kita dapat membuat perintah tersebut sebanyak yang kita mau, tetapi karena nantinya kita akan melihat posisi perintahnya pada stack memory, saya menggunakan angka 50 untuk memudahkan saya dalam melihat stack nantinya (artinya, isi perintah tersebut secukupnya sehingga kita dapat melihat efeknya dalam stack dengan mudah). Setelah itu, saya mencoba untuk menjalankan payload tersebut menggunakan gdb dengan hasil sebagai berikut :

dari hasil tersebut, terlihat bahwa stack kita terisi dengan perintah NOP yang ditandai dengan nilai 90 secara repetitive. Selanjutnya, saya dapat mengubah alamat 0xffffd6e0 ke dalam bentuk little edian dengan cara berikut ini: (berdasarkan baris terakhir yang lengkap dalam stack)

Setelah itu, karena kita ingin mendapatkan akses ke dalam shell untuk mendapatkan password selanjutnya, kita dapat mendapatkan commandnya dengan cara berikut ini :

setelah itu, kita dapat melengkapi payload kita dengan hasil sebagai berikut :

Dari payload tersebut, terlihat bahwa saya meletakkan NOP instruction sebelum shellcode. Hal tersebut dilakukan karena pada NOP Sliding / NOP slide, kita menginginkan suatu eksekusi program beralih ke instruksi yang akan dijalankan selanjutnya. Sehingga, karena kita ingin untuk mendapatkan akses dari shell, kita harus meletakkan shellcode setelah NOP instruction.  Setelah payload tersebut dijalankan, hasilnya adalah sebagai berikut :

password dari behemoth2 adalah eimahquuof.

Leave a Reply

Your email address will not be published. Required fields are marked *