よもぎのメモ帳

備忘録的な感じで技術的なことをストックしていきます。

SECCON Beginners CTF 2019 Writeup(お墓)

f:id:y0m0g1:20190526151702p:plain
社畜ちゃん台詞メーカーより

こんにちは、よもぎです。

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   

で出てきた f:id:y0m0g1:20190526152844j:plain


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)

wiresharkでみるとHTTPリクエストは4つ

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  

から、フラグゲット

f:id:y0m0g1:20190526153214j:plain


ここからは解けなかった問題

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しか解けなかったのん