先ほど SECCON 2014 のオンライン予選が終了しました。チームは wasamusume として出ました。結果は暫定 17 位、残念ながら全国進出とはなりませんでした。
それでは解いた問題の write-up です。
ソーシャルハック?
ネットワークの 300 点問題です。問題は「犯人を追い詰めろ!」という文とリンクがあって、そこにアクセスすると「ウェブマネーを買ってきて下さい」とか言われる感じですw
返答として URL を送ると、画像を送れと言われるので画像っぽい URL を返します。そうするとその URL にアクセスします。なので、こちらは nc とかで 80 番で待ち受けておけば、アクセスが来ます。リクエストヘッダに VNC のパスワードが書いてあるので、そこに接続すると画面上にフラグが表示されています。
なんか、 UltraVNC だとデフォルトのポートで繋がらなかったり、繋がっても Too many authentication failures と言われたりでアレでしたが、最終的には接続できました。
FLAG{giveMeYourWebM0n3y}
あみだくじ
プログラミングの 300 点問題です。時間内には解けませんでした。問題は amida という実行ファイルがあるだけです。
amida を実行すると、以下のような文字が出力されます。
No.1 1 2 3 4 5 6 7 8 |-| |-| | | |-| | | | | | |-| | | | | | | | |-| |-| | |-| | | | | | |-| |-| |-| |-| | |-| | | | | |-| | |-| |-| |-| |-| | | | | | | | | |-| | | | | |-| | | |-| |-| | | |-| | | | | |-| | |-| | | | | | |-| | | | |-| | | |-| | | | |-| | | |-| | | | | | |-| | | |-| | |-| |-| |-| |-| | | | | | | | | | |-| | * ?
どうやら、 * の部分にたどり着くためにはどの数字を選べば良いか、と言うことみたいです。ですので、そのソルバを Python で書きました。途中でスタートとゴールの場所が変わったりするので、そのたびに修正しながら実行していきます。 100 問くらいまでで全てのパターンが出るようで、あとは自動的に解いていきます。 1000 問解くとようやくフラグが出ます。
FLAG{c4693af1761200417d5645bd084e28f0f2b426bf}
箱庭 XSS リターンズ
ウェブの 300 点問題です。これも僕は解いていませんが、チームとしては正攻法ではないっぽい方法で解いたようなので、僕が考えたところまでの考え方を書いておきます。
この問題の難しい点は、一度使った単語(ここでは 1 文字または連続する英数字)は使用不可能になる点です。しかも使用不可能になった単語は、他の単語に含まれる形であっても削除されてしまいます。なので、そうならないようにする必要があります。
今回はいろいろ考えた末、以下の JavaScript をベースに変化させていけば良いだろうと考えました。
$=+[];$={___:$++,__$:$++,_$_:$++,_$$:$++,$__:$++,$_$:$++,$$_:$++,$$$:$++};($.___)["constructor"]["constructor"]("($.___)[\"constructor\"][\"constructor\"](\""+"\\"+$.__$+$.$__+$.__$+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$$_+$.$__+"\\"+$.$_$+$.___+"\\"+$.$__+$._$_+"\\"+$.__$+$._$$+$.___+"\\"+$.__$+$._$_+$._$$+"\\"+$.__$+$._$_+$._$$+"\\"+$.$__+$._$_+"\\"+$.$_$+$.__$+"\")()")()
見やすくすると以下のようになっています。
(0)["constructor"]["constructor"]("(0)[\"constructor\"][\"constructor\"](\"alert('XSS')\")()")()
これはさらに短くできて、以下のようになります。
(0)["constructor"]["constructor"]("alert('XSS')")()
ではなぜ (0)[“constructor”][“constructor”] が二重になっているのかというと、 alert の文字列を記号化したかったからです。constructor は長い文字列なので変化のパターンが大量にあります。しかし alert は短いため変化のパターンが少ないです。よって記号化することで考慮しなくてよいようにした、ということです。あとは “constructor” を、例えば “\x63onstructor” や “\u0063onstruc\u0074or” 等と変化させれば大量に JavaScript を生成できます。
JavaScript を大量に生成できたのは良かったのですが、知ってるイベントハンドラが少なすぎて最後まで行けませんでした。また全て記号化できれば良かったのですが、文字列から配列のように 1 文字取り出すのが動かなかったので今回は使えませんでした。
と言うわけで、以上 write-up 的な何かでした。もっと解けるように知識付けていかないと行けない感じですね。頑張ります。
ピンバック: SECCON 2014 OnlineのWrite up | かーみーのチラ裏