SECCON Beginners CTF 2019 Writeup(お墓)
こんにちは、よもぎです。
SECCON Beginners CTF 2019やってみました。
チームひかえしつとしては13問解けたみたいです。私が解いたのはMiscの2問だけです。 チームメイトすごい。
solve数の高い問題でしかないんですが、Writeupしていきたいと思います。
Misc
containers
Let's extract files from the container.
ファイルをダウンロードしてみて、とりあえず file
コマンドと strings
コマンドを実行してみる。
ココらへんは適当に考えずにやってみました。
$file e35_containers e35_containers: data $strings e35_containers CONTAINER.FILE0. IHDR sRGB gAMA pHYs aIDATx^ ajlK-[ 0TG~5 ;-M\ IEND #中略 FILE38. IHDR sRGB gAMA pHYs sIDATx^ 8==oD m:gl `M_8 `iG~4 F4> Nl2T ~vWa hG~4 IEND VALIDATOR.import hashlib print('Valid flag.' if hashlib.sha1(input('Please your flag:').encode('utf-8')).hexdigest()=='3c90b7f38d3c200d8e6312fbea35668bec61d282' else 'wrong.'.ENDCONTAINER
とりあえずhex editorで開いてみると、pngとか書かれていた。 これも特に考えずやってみたって感じだったけれども、上のstringsの結果から自明だよねってあとから思った。
解くだけならこの後からで十分
$foremost e35_containers Processing: e35_containers |*| $cd output/ $ls audit.txt png/ $cd png/ $ls 00000000.png 00000008.png 00000018.png 00000028.png 00000038.png 00000048.png 00000058.png 00000001.png 00000010.png 00000020.png 00000030.png 00000040.png 00000050.png 00000060.png 00000002.png 00000011.png 00000021.png 00000032.png 00000042.png 00000052.png 00000061.png 00000003.png 00000013.png 00000023.png 00000033.png 00000043.png 00000053.png 00000005.png 00000015.png 00000025.png 00000035.png 00000045.png 00000055.png 00000007.png 00000016.png 00000027.png 00000037.png 00000046.png 00000056.png $convert +append 00*.png output.png $ls 00000000.png 00000008.png 00000018.png 00000028.png 00000038.png 00000048.png 00000058.png 00000001.png 00000010.png 00000020.png 00000030.png 00000040.png 00000050.png 00000060.png 00000002.png 00000011.png 00000021.png 00000032.png 00000042.png 00000052.png 00000061.png 00000003.png 00000013.png 00000023.png 00000033.png 00000043.png 00000053.png output.png 00000005.png 00000015.png 00000025.png 00000035.png 00000045.png 00000055.png 00000007.png 00000016.png 00000027.png 00000037.png 00000046.png 00000056.png $open output.png
で出てきた
dump
Analyze dump and extract the flag!!
まず、あーね?って言って file
コマンドを実行すると、pcapファイルとわかる。
$file fc23_dump fc23_dump: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)
GET /webshell.php?cmd=hexdump%20%2De%20%2716%2F1%20%22%2502%2E3o%20%22%20%22%5Cn%22%27%20%2Fhome%2Fctf4b%2Fflag HTTP/1.1\r\n
デコードすると
GET /webshell.php?cmd=hexdump -e '16/1 "%02.3o " "\n"' /home/ctf4b/flag HTTP/1.1\r\n
tcpストリームを追跡して、ファイルに出力すると、
HTTP/1.1 200 OK Date: Sun, 07 Apr 2019 11:55:27 GMT Server: Apache/2.4.18 (Ubuntu) Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 2035 <html> <head> <title>Web Shell</title> </head> <pre> 037 213 010 000 012 325 251 134 000 003 354 375 007 124 023 133 327 007 214 117 350 115 272 110 047 012 212 122 223 320 022 252 164 220 052 275 051 204 044 100 050 011 044 024 101 120 274 166 244 010 010 050 315 002 110 023 024 244 012 330 005 351 012 012 #中略 050 030 005 243 140 024 214 202 121 060 012 106 301 050 030 005 243 140 024 214 202 121 060 012 106 301 050 030 005 344 000 000 050 241 022 115 000 060 014 000 </pre> </html> 0
こんな感じのファイルが得られるので、これをpythonで読み込んでバイナリで出力する。 pythonわからない
open_data = open('tcp_stream1_edited.txt', 'r') lines = open_data.readlines() ans = bytearray([]) for line in lines: splited = line.split(' ') for item in splited: num = (int(item[0]) * 8 + int(item[1])) * 8 + int(item[2]) ans.append(int(num)) with open('output', 'wb') as fout: fout.write(ans)
$python3 dump.py $tar -zxvf output ./._flag.jpg flag.jpg $open flag.jpg
から、フラグゲット
ここからは解けなかった問題
Web
Himitsu
抱え込まないでくださいね。 https://himitsu[.]quals[.]beginners[.]seccon[.]jp
裏で動いているソースコードが配布されていた。 slimという軽量フレームワークが使われていたらしい。
記事を作成すると、その記事=秘密ごとにURLが作成され、 そのURLを人と共有することで秘密が共有できるという感じ。
あと、reCAPTCHAしたら管理者に”秘密を打ち明ける”ことができるみたい。
で、puppeteerによるクローラーの一部も一緒に配布されていたのだけれども、 この"秘密を打ち明ける" というのが多分クローラーがアクセスしてくれるってことだと思う。
投稿記事のtitle部分に
a</a><script>alert('1');</script><a herf=\" \">a
のようなコードを書けば、別の記事でこの記事にリンクを貼るときに、 alert('1');
が実行されるが、
別の記事からリンクを貼るときに、titleに関するバリデーションが働いて、< > " '
のいずれかの文字が入っていたら弾かれてしまう。
でもこのバリデーションは回避できる。 記事URLはユーザー名・投稿日時・タイトルをMD5ハッシュに食わせているので、投稿日時とタイトルを決めておけば、予めリンクを生成できる。 先にリンクを貼っておくページを作れば、titleに関するバリデーションは効かず、その後でコードインジェクションするtitleの記事を投稿すればいい。
みたいなところまではできたけど、できたのはこれだけ。
コードを埋め込めるので、それをクローラーに踏ませて、/mypageかなんかのURLで生成されるhtmlをどっか用意したサーバーに送らせることで解けそうだと思いました。 クローラーはadminユーザーでクローリングしているので、/mapageで生成されるhtmlにはflagへのリンクが含まれているはず。
crypto
Go RSA
公開鍵を無くすと解けなくなっちゃうなあと思いました。でも解けるんですよね。 解けたチームメイトに教えてほしい。
bit flip
これは時間かけたけどわかりませんでした。 これも解けたチームメイトに教えてほしい
おわりに
MiscとCryptoしか解いてないからそれ以外も解きたい、って言っていたのにMiscしか解けなかったのん