[OverTheWire] – Behemoth3

behemoth3 dapat diakses menggunakan : “ssh behemoth3@behemoth.labs.overthewire.org” dengan password yang didapatkan pada behemoth2 yaitu ‘nieteidiel’.

 

disclaimer : writeup ini dibuat dengan bahan bacaan dari  writeup  : https://github.com/USCGA/writeups/tree/master/overthewire/behemoth/level3

 

pada level ini, terdapat file bernama behemoth3. Ketika file tersebut dieksekusi, maka hasilnya adalah sebagai berikut :

 

 

selanjutnya saya menggunakan ltrace untuk melihat garis besar proses eksekusi file tersebut dan hasilnya sebagai berikut :

 

 

pada hasil ltrace tersebut, terlihat bahwa secara garis besar proses eksekusi file tersebut adalah : dilakukan scan terhadap user input, lalu dilakukan print string “welcome, <string input>” lalu string “aaaand goodbye again.”. Untuk memastikan proses tersebut, saya melakukan disassemble terhadap function main file tersebut menggunakan gdb :

 

dari hasil disassemble tersebut, terlihat bahwa hasil disassemble function main tersebut sesuai seperti proses yang terjadi di ltrace. Dari hal tersebut, file tersebut terlihat seperti memiliki format string vulnerability yang selengkapnya dapat dibaca di sini. Selanjutnya, saya mencoba untuk melakukan input format specifier “%p” yang digunakan untuk melihat pointer pada stack. Hasilnya adalah sebagai berikut :

 

 

terlihat bahwa output yang dikeluarkan merupakan alamat memory pada pointer. Selanjutnya, dari artikel mengenaik format string vulnerability yang telah disertakan sebelumnya, kita dapat melihat format nya sebagai berikut :

<address><address+2>%<number>x%<offset>$hn%<other number>x%<offset+1>$hn

sehingga, untuk mencari offset, kita dapat mengubah input kita menjadi ‘AAAA %p %p %p’ untuk melihat offset dari ‘AAAA’ dah hasilnya sebagai berikut :

 

Dari hasil tersebut, terlihat 0x41414141 yang merupakan input kita yaitu ‘AAAA’ (nilai A adalah 41 dalam hex). Terlihat bahwa 0x41414141 muncul pada urutan pertama sehingga kita mendapatkan offsetnya yaitu 1. Sehingga  :

Offset = 1, Offset+1 = 2

Sebelumnya, dari hasil disassemble function main, kita dapat melihat bahwa dari proses print, terdapat pemanggilan function puts yang dapat dijadikan target kita. Dari hal tersebut, kita dapat memasukkan shellcode sehingga pemanggilan proses selanjutnya dapat kita ubah sesuai keinginan kita yaitu masuk ke dalam shell. Hasil disassemble terhadap function puts adalah sebagai berikut :

 

 

Terlihat bahwa terdapat jump pada 0x80497ac yang dapat dijadikan target kita untuk kita overwrite.

Address : 0x80497ac

Sehingga selanjutnya kita dapat menggunakan tools getenvaddr yang dapat didapatkan di sini untuk mencari alamat dari environment variable yang akan kita isi dengan shellcode. Selanjutnya kita dapat melakukan compile terhadap tools getenvaddr di folder temporary behemoth dengan cara berikut ini :

 

Shellcode dapat kita buat dengan cara berikut ini :

 

setelah itu, kita dapat memasukkan shellcode tersebut pada file dengan cara berikut ini :

Setelah dijalankan, kita mendapatkan alamat memory 0xffffdf52.  Alamat tersebut selanjutnya akan kita bagi menjadi 2 bagian yaitu ‘0xfd52’ dan ‘0xffff’. kedua bagian tersebut akan menjadi ‘number’ yang akan ditranslasikan menjadi hex yang akan menjadi alamat memory setelah kita melakukan overwrite yaitu ke shell. Selanjutnya, untuk mendapatkan number kita menggunakan cara seperti berikut :

 

saya melakukan penghitungan tersebut menggunakan python, pertama-tama 0xdf52 akan kita kurangi dengan 8 karena alamat 0xfffdf52 memiliki besar 8 bytes. setelah itu kita mendapatkan number pertama kita yaitu 57162. Selanjutnya kita mendapatkan number2 dengan melakukan pengurangan 0xfff dengan 0xdf52 dan didapatkan 8365. Sehingga :

number = 57162, number2 =  8365

selanjutnya, kita dapat membuat script yang berisi hal-hal yang sudah kita dapatkan dengan hasil sebagai berikut :

secara garis besar, script tersebut akan melakukan hal sebagai berikut : pertama-tama memory address dari puts yaitu 0x80497ac dan 0x80497ac +2 akan diubah menjadi little endian . Setelah itu, kita akan memasukkan nilai offset dan offset+1 serta kedua number yang telah kita dapatkan. Selanjutnya, semua hal tersebut akan digabungkan menjadi format yang sesuai dengan format yang ada yaitu :

<address><address+2>%<number>x%<offset>$hn%<other number>x%<offset+1>$hn

Setelah itu, kita dapat menjalankan script tersebut dengan cara berikut ini :

(python payload.py ; cat | /behemoth/behemoth3)

setelah itu, kita berhasil mendapatkan shell dari behemoth. Lalu, dengan melakukan cat /etc/behemoth_pass/behemoth4, kita berhasil mendapatkan password untuk ke behemoth4 yaitu : ietheishei

Leave a Reply

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