SlideShare a Scribd company logo
受賞のご挨拶 
山崎圭吾 
(Twitter: @ymzkei5) 
Dec 08, 2014
『Bonsai XSS』 
クソ・問題・オブ・ザ・イヤー 
受賞のご挨拶 
山崎圭吾 
(Twitter: @ymzkei5) 
Dec 08, 2014
クソ・問題・オブ・ザ・イヤー授賞式
受賞者のご紹介 
 Bonsai XSS (別名:「箱庭XSSリローデッド」)さん 
SECCONオンライン予選で 
Webカテゴリとして出題。 
1つのEXEファイルの中に、 
ブラウザとWebアプリが 
共存している世界。 
「XSS」と表示されたalert 
ボックスを表示させると、 
次のステージに進む。
受賞理由について 
 動かない 
 落ちる 
 正しいフラグが出ない 
 先が長くてうんざりする 
 箱庭もう飽きた
受賞理由について 
 動かない 
 落ちる 
 正しいフラグが出ない 
 先が長くてうんざりする 
 箱庭もう飽きた 
後半は、私にはどうしようも 
ないので、前半3つについて 
説明させていただきます!
受賞理由(1): 動かない 
 初期バージョンは、Microsoft HTML Object Library 
(mshtml.dll) が別に必要だった。 
 .NET Framework に標準で含まれていると勘違い。 
 実際にはSDK を入れないと入らない子だった。 
 IEの「暗号化されていないフォームデータの送信」 
の設定が「有効にする」になっている必要があっ 
た。 
 この設定、多くのみなさんは有効だと思いますが、 
新しくAWSなどで借りた、まっさらなWindowsだと 
「無効」だった。
受賞理由(2): 落ちる 
 落ちる入力の例: 
";document.write("<textarea/ 
onfocusout=alert('XSS')>");//
受賞理由(3): 正しいフラグが出ない 
 Web以外の解き方で解いた場合に、崩れたフラグが出る 
のは意図した動作。 
 でも、そのチート対策が誤作動して、Web的に解いたのに 
崩れたフラグが表示される事案が多数発生。(´・ω・`)
( ³ω³) ファッ?!! 
どうしてこうなった?!!! 
 その真相が以下のスライドで明らかに!! 
 全世界を震撼させたその真実を見逃すな!!!!!! 
怒りのあまり
箱庭XSSの敗北の歴史(1) 
 2013年8月に横浜で開催された、『SECCON×CEDEC 
CHALLENGE』で、箱庭XSSはその産声をあげました。 
当初は、「クロスサ 
イトスクリプティン 
グ・スピードラン」 
という名前で、 
予選・本戦・決勝戦 
で、如何に早くア 
ラートボックスを表 
示できるか?という 
競技でした。
箱庭XSSの敗北の歴史(2) 
 2013年の地方大会では、「箱庭XSSリベンジ」を出題。 
 このあたりからチートや(私の)ヤラカシとの闘いが始まります。
箱庭XSSの敗北の歴史(2) 
 2013年の地方大会では、「箱庭XSSリベンジ」を出題。 
 このあたりからチートや(私の)ヤラカシとの闘いが始まります。 
メモリをダンプする 
とフラグが丸見え。
箱庭XSSの敗北の歴史(3) 
 SECCON 2013 オンライン予選では、「箱庭XSS Final」。
箱庭XSSの敗北の歴史(3) 
 SECCON 2013 オンライン予選では、「箱庭XSS Final」。 
メモリダンプで解こうとすると、正し 
いフラグ「アイ・アム・アラート出し 
たいマン」のはずが、「アイ・アム・ 
アラートマン」になるギミック付きで 
意気揚々と出題。 
・・・したものの、
箱庭XSSの敗北の歴史(3) 
 SECCON 2013 オンライン予選では、「箱庭XSS Final」。 
サニタイズ脳の敗北 
(このパターン自分で別の問 
題で出題してたのに。。) 
http://dec12-kaz.hatenablog.com/entry/2014/01/26/170218
箱庭XSSの敗北の歴史(3) 
 SECCON 2013 オンライン予選では、「箱庭XSS Final」。 
さらには・・・別口で、 
ショートカットキーが有効だっ 
たので、[CTRL]+[O] で、 
javascript:alert('XSS') を開けた。。
箱庭XSSの敗北の歴史(4) 
 2014年7月の、日本語でのオンライン予選で出題し 
た、「箱庭XSSリターンズ」。
箱庭XSSの敗北の歴史(4) 
 2014年7月の、日本語でのオンライン予選で出題し 
た、「箱庭XSSリターンズ」。 
ポップアップした 
ウィンドウでボタン 
を押すだけでクリア
箱庭XSSの敗北の歴史(4) 
 2014年7月の、日本語でのオンライン予選で出題し 
た、「箱庭XSSリターンズ」。 
それどころか1発目で 
ループさせると一気 
に全クリア。orz
箱庭XSSの敗北の歴史(4) 
 2014年7月の、日本語でのオンライン予選で出題し 
た、「箱庭XSSリターンズ」。 
さらには・・・ 
 デコンパイルして、 
ブラックリストを 
取り除いている正 
規表現をつぶす。 
 WM_HTML_GETOB 
JECTメッセージで 
ハンドルを乗っ 
取って好きな 
HTML動かす。
その時、歴史が動いた 
 ここまでの敗北の歴史を踏まえて、私は、 
決意し(てしまっ)たのです。 
よし! 今までのチートやヤラカシが再現しな 
い、 
最強の「箱庭XSS」を作ろう! 
・・・と。
何をしたか(1) 
 難読化ツール×2種類。packer的なもの間に挟む。
何をしたか(1) 
 難読化ツール×2種類。packer的なもの間に挟む。 
を難読化ツールAにかけたEXE
何をしたか(1) 
 難読化ツール×2種類。packer的なもの間に挟む。 
を難読化ツールAにかけたEXE 
を内部に持っていてinvokeするEXE
何をしたか(1) 
 難読化ツール×2種類。packer的なもの間に挟む。 
を難読化ツールAにかけたEXE 
を内部に持っていてinvokeするEXE 
を難読化ツールBにかけたEXE
何をしたか(1) 
 難読化ツール×2種類。packer的なもの間に挟む。 
を難読化ツールAにかけたEXE 
を内部に持っていてinvokeするEXE 
を難読化ツールBにかけたEXE 
様々な環境で 
「動かない」と 
言われ、夜中の 
更新で半分に減 
らしました。
難読化ツール 
のイメージ
何をしたか(2) 
 WebBrowserコントロールのハンドルを乗っ取られ 
てHTMLを書き換えられた場合に検知できるように、 
Webページ表示時と、アラートボックス実行時の 
DOM構造を、MSHTMLを使って比較・検証。 
 mshtml.dllが無い環境で「動かない」原因に。。 
 document.writeと、イベントハンドラを組み合わせた 
場合などに、DOM構造が変化してしまいチート扱い 
に。。 
夜中の更新で、こ 
の検証部分、ざっ 
くり消しました。
何をしたか(3) 
 ブラックリストを生成・検証する部分を二重化し 
て、片方が改ざんされても検出できるように。 
 異常を検出した場合にも、プログラムを止めずにそのまま 
動かし、フラグだけ正しくないものが出る仕掛けに。 
 kernel32.dll のIsDebuggerPresent() でデバッガ検知。 
 プログラムをステップ実行されるという噂も聞い 
たので、タイマーで時の流れをチェック。5秒以上 
止まったり、タイマー自体が止められた場合に異 
常検知。 
このせいで特定のイベント 
ハンドラなどでアプリが固 
まった後に異常として検知。
何をしたか(4) 
 WebBrowserコントロールは、ステージごとにdispose。 
 このせいで、ドラッグ&ドロップのイベントハンドラが使 
われた場合などに通常のtry~catchでは捕まえられないレ 
ベルのエラーが…。 
 フラグは動的に生成。正しいフラグは「SECCON{…}」 
で囲まれて表示されることで確認できるように。 
 WebBrowserコントロールがIE7互換で動くように。 
 「最初から」ボタンの挙動でフラグ生成に使う変数を 
特定されたくなかったので、プログラムを再起動する 
ことに。
 ポップアップウィンドウの表示を抑止。 
 [CTRL]+[C]、[CTRL]+[V]以外のショートカットキーを無効化。 
ステータスメニューも無効化。 
 外部から直接、alert() 後に呼ばれる関数を呼び出されない 
ように、動的に生成した秘密の文字列をチェック。 
 現在のステージにふさわしい数のブラックリストの文字列 
があるかどうかチェック。 
 サブルーチンを細かく分割、ダミーも散りばめる。 
 もはや難読化前のコードすら自分で見ても意味が分からない状 
態に。 
何をしたか(5)
異常を検知した時の動作(1) 
 チート対策機能が発動した場合の表示 
正常時異常検知時
異常を検知した時の動作(1) 
 チート対策機能が発動した場合の表示 
この違い、 
分かりますか・・・? 
正常時異常検知時
異常を検知した時の動作(1) 
 チート対策機能が発動した場合の表示 
文字の色が 
変わります。 
正常時異常検知時
異常を検知した時の動作(2) 
 全部で何ステージありましたか? 
 (正解) 29ステージです。 
 バイナリ的に解かれるなどのチートを検知すると、 
30ステージ目が表示されるギミックがありました。 
これがチートの誤検知 
と組み合わさって、さ 
らに訳の分からない事 
態に。。
皆さまからの推薦の声 
 XSS Bonsai、エラーは出るし、落ちるし、halfway FLAGは通ら 
ないし、ひどい。正攻法でやるのが間違いなのか……。 
 いい加減にしろよbonsaiXSS 
 「盆栽のことは嫌いになっても、XSSのことは嫌いにならな 
いでください!」 
 bonsai xss is broken. 
 Whoever made this just wants to see the world burn. 
#seccon #bonsai 
他にもIRCで数々の罵 
倒や怨鬼の声が。
結論 
 チートなんて気にせず、解いてくれる人が、楽し 
く、ストレス無く解ける問題を作ることに注力す 
べきだった。 
 ここまでして、チート誤検知までまねいて対策し 
たのに、結局、バイナリアンたちには、いとも簡 
単に解かれてしまった。あいつら最強だ。 
 海外の方々の罵倒の数々を理解できなくて済んだ 
ので、英語がニガテで良かった。(´・ω・`)
安全第一 
凡ミスは、盆栽XSSみたいなミスのことではありません。 
参加者の方にも、 
SECCON運営の方にも、 
多大なご迷惑をおかけして、 
まことに 
申し訳ございませんでした。 
ご理解の程、 
よろしくお願い申し上げます。

More Related Content

【XSS Bonsai】 受賞のご挨拶 by @ymzkei5 【SECCON 2014】 - Dec 08, 2014