ふるつき

v(*'='*)v かに

SECCON 2018 ONLINE Ghost Kingdom Writeup

 insecure という解散間近のチームで SECCON ONLINE に参加していました。移動と食事、睡眠以外の時間はやっていたので最長記録かも。 insecure は 国内決勝の進出を決めているので気合が入っていました。

 結果はよく知らないですが、私が Ghost Kingdom を解いたのと、残りを師匠が解いたので、私はGhost Kingdom のwrite upをします。


  • ログイン・レジスタができます
  • ログイン画面には(from internet) とあります
  • ログインすると「Adminにメッセージ」「すきなページのスクリーンショットをとる」機能があります
  • 「画像をアップロード」はローカルからのログインしかできません

 師匠が スクリーンショットのところで「locahost」と打って弾かれているのをみたので「0.0.0.0は?」と言って試してもらって、スクリーンショット経由でlocalのログイン画面にたどり着くことに成功しました。

 ログイン以外の操作ができずに悩んでいたのですが、スクリーンショットをとったり、Adminにメッセージを送るのはログイン画面を経由せずともできたので解決しました(ログインが不要だったのか、スクリーンショットをとってるブラウザがログイン済みだったのかはわからなかった)。admin にメッセージを送る際に、 input[type=hidden] にCSRFトークンとしてCGISESSID が使われていること、 get パラメータで css=hogehogeと、style タグの中身を base64encode したものを渡せるということに気が付いたので、 input[value^=0] { background: url("xssme?c=0") }input[value^=1] { background: url("xssme?c=1") } というふうにCSS injection を行いました。流石にこれを生成する スクリプトは書いた。こうしてスクリーンショットを撮っているユーザの セッションを盗み取ることができたので(手元のメモには 4341c2fdb42f0e839ba08c とあります)、このSESSIONを装備してログインしました。

 画像アップロード機能が解禁され、「JPGのアップロード(拡張子しかみてない)」「画像のGIFへの変換」ができるようになりました。明らかに ImageMagick をいじめる問題だったので、頑張ってGoogleして、下のようなPostScriptを aiueo.jpg としてアップロード、変換してフラグを得ました。問題の最初にフラグの場所が書いてあったのにそれを忘れて find / -name "*flag*" とかで探し回っていたのは内緒です。

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

 特殊アーキテクチャ系はエミュレートがうまくできなかったので目で追いかけて python でシミュレートしたのですがうまくいきませんでした。なぜ。 classic pwn は解けなかった。 shooter は最終盤に SQLi を頑張ったけどテーブル名を抜くのが間に合わなかった。あれスクリプト書けるの。

あとで追記:

 SpecialInstructionsは xorshift32 の << 15<< 5 としていたため解けなかった模様。こんなんばっかでは