Secure,Crack,Programme.

何かよくわからないもの置き場。競プロとかCTFとかそこらへん?

初学者からみるCODEBLUE 2019 [CODEBLUE 2019 参加記]

こんにちは。ブログを一切更新していないので何もしていないことがバレてしまいますね。iLiss.です。何もしていないということはなくて、TSG LIVE! 4に参加してコードゴルフをしたりはしていました。

生放送です↓

 まあ結局全強であるうら氏にだいぶお世話になったのですが...

最後><>が間に合わなかったのが痛かったですね。

 

さて、話は時間を遡りまして、10/29・30にCODEBLUE 2019なるイベントがありまして、TSG内でなんとFlatt Security Founderのniconegoto氏(@niconegoto)にお世話になる機会がありまして、ご縁あってCODEBLUE 2019に参加させて頂けることに。本当にありがとうございます...

その参加記を書こうと思ってゆっくりと書き進めていたのですが、ゆっくりしすぎた結果もうこんな時期になってしまいました。Advent Calenderに書きたいことが山ほどあるから11月中に公開したいと思ってたのに...

なんとか書きあがりました。ちょっと改まった文体になりますがご了承ください。

-------

 

iLiss. (@iLiss557_Ort)と申します。

普段は大学Newbieとして忙しい大学生活の合間を縫って遊んでいたりCTFの勉強をしたりしております。セキュリティ系に関してはブログやTwitterに何かを書くレベルにも達していないため、一見するとセキュリティ系とは無縁の人物のようになっております。

 

Flatt Security様のご厚意で、この度CODEBLUE 2019に参加させて頂き、そのご縁で今回CODEBLUE 2019の参加記を掲載させていただくこととなりました。

今回の記事ですが、同じくTSGのお二方とはまた違った視点から、少しお話をすることができたらと考えております。

 

さて、 雑談から入りますと、諸事情(具体的には授業)で会場への到着が非常に遅くなってしまい、結局聴くことができた発表は1/3ほどでした。会場に到着した時点で多くの発表は終了しており、あれも聴きたかった、これも聴きたかったと多分に後悔しながら席につくのですが、その直後の発表で多大な衝撃を受けました。CODEBLUEの場、それもMain Trackで行われる発表ですから、その質については当然高いものではあるのですが、私自身このような場に参加するのが初めてですので、その効果もあったのではないかな、と思います。今回は、私が衝撃を受けた、市川遼(icchy)さんのMain Track : "アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法" について少し書かせて頂きたいと思います。

 

[Intro - 脆弱性は見つかりますか?]

発表の冒頭でicchy氏から提示されたコードは次の通り。


data := &Data{
	Controllabel1:	c1,
	Secret:		secret,
	Controllabel2:	c2,
}

buf := bytes.NewBuffer(nil)
err := gob.NewEncoder(buf).Encode(data)
if err != nil {
	return err
}
err = ioutil.WriteFile(path.Join("tmp",name),buf.Bytes(),0644)

 

さて、このコードに脆弱性が存在するらしい。私にはまだ分からないが、このsecretをある方法で覗き見することが出来るというのだ。いかがだろうか?

[intro 2 - そもそもこれってなに?]

さて、初心者視点では「これ言語何?オラクルって何??Windows Defenderとの関連は???」などと相当量の混乱が引き起こっている。

「オラクル攻撃」については解説記事を参照されたし。

 

用語解説:オラクル攻撃 (@n-i-e 氏) 

さて、このコード、検索をかけるとGoLangっぽい?という気持ちになるので、ちょっとづつ読んでみる。まず名前通りなら変更可能な変数2つがあって、その間にSecretなデータが格納されている。それがdataなるものの中に入っている。

bytes.NewBuffer(nil) : 初期状態で空の可変サイズバッファを取得

gob.NewEncoder(buf).Encode(data) : dataの内容をencodeする エンコーダはbufへ結果(?)の送信を行う 返り値はos.Errorっぽいのでエラーを吐かなければNil

ioutil.WriteFile(path.Join("tmp",name),buf.Bytes(),0644) : path.Join("tmp",name)で指定したファイルにbufの内容を書き込む 指定したファイルがないならパーミッション0644でファイルを作る 返り値はos.Error

 

ここまでで最初の部分の攻略が完了。 Defenderとの関連はこれから追っていこう。

 

[Main - Defenderを解析せよ!]

さて、それでは早速Windows Defenderを攻撃...といきたいところだが、攻撃に必要なのは相手の分析である。まずはこのWindows Defenderとかいうやつをじっくりと解析していこう。

そもそも、解析なんてどうやってやったらいいのか?とは思われるので、ちょっとだけわき道にそれる。この辺りは私のメモが不十分で少し内容に抜けが発生したり解釈違いを起こしたりしているが、ご容赦願いたい。

サイドチャネル攻撃」、ご存知だろうか?

 暗号に対する攻撃の1手法として知られるが、要はこの攻撃方法を他のものにも応用しよう、という話である。

「サイドエフェクト」なるものが存在して、そこから重要な情報を持ってくることができる、すなわちそこがオラクルとなりうる、ということ。

じゃあ考えてみよう。

Windows Defenderを解析やら攻撃やらしたい。叩けば重要な情報を得られるかもしれないが、どう叩く?

そもそもWindows Defenderの中身が分かっていればこんな面倒なことをしなくても済む。ただそんないい話は基本的に存在しない。Defenderは基本的にBlackboxであり、そうだからこそ安全である(?)のだろう。

但し我々も少しくらいは情報を握っている。

・検査プロセスを走らせる対象 : ファイルアクセス、コマンド実行

悪意のある(と思われる)コンテンツが検知されると、そのアクセスをブロックして通知する

・解析対象 : 実行ファイルとか圧縮形式とか色々

...わからん

 

実は(問題点はあるが)解析エンジンは直接呼び出すことができて、"MpCmdRun.exe"を叩くと良い。

それでも効率的に解析は難しい...

 

ところで、LinuxWindows Defenderが動くらしい... !?

PDBシンボル(このあたりを見ると分かるかもしれない)が古いバージョンのものらしいのでmpam-fe.exe(Defenderの定義ファイルの更新)を実行。

 

 さて、それでは解析。内部(アンチスパイウェア)に暗号化があるだとか、暗号化形式が分かるかもしれない、など色々言いたいことはあるが長くなるので割愛(いいのか?)

 

evalという関数がJavascriptにある。

文字列となったJavascriptコードを式として評価する関数だ。

ここに悪意ある文字列を入れて悪いことを実行しようとするとDefenderに検知される。

例えばここにEICARテストファイル(Anti-Virusテスト用の擬似ウイルスみたいなもの)を入れてみると実際にDefenderが反応する。

 

ではでは。冒頭のコードをペチペチ叩いていこう。

・叩くコードはJavascriptを使う。eval関数でEICARの評価を行い、Defenderを発火させる。叩くコードは一旦省略とさせて頂きたい。(後日追記する)

 

・Defenderを発火させるために何度も試行が必要。例えば今回の場合は変数($idx)を256通り試す必要がある。もう片方($c)が適切ならDefenderを発火できる!

・今回は二分探索が使えるようだ。Math.minをどんどん使っていこう。

・$cとinputの値によってDefender発火の有無が変わる。

では組み合わせていこう。

C1 : <script>[script]</script><body>

Secret

C2 : </body>

 

さて、組み合わせていった。これを送信して、/:nameにアクセスしてみると応答が見える。なお、Defenderが発火した場合はInternal Server Errorとなるはずである。

さて、ざっくり紹介したが、この攻撃手法、中身が分からなくても攻撃できるという嬉しい(?)利点を持つ。今までは苦しい思いをして解析する必要があったのに...

ただこの攻撃方法、この部分しかリークできない。


data := &Data{
	Controllabel1:	c1, //< script>...< /script>< body>
	Secret: secret, //この部分
	Controllabel2: c2, //< /body>
}

 

制限自体は厳しいように見えるが、実践においてはこのように機密情報を入力と同時に扱うプログラムは多く存在するため、使用方法は多岐にわたる。

 

さて、TokyoWesterns CTF 2019において、PHPNoteなる問題が出題されていた。

実はこの問題がこの攻撃手法を使うらしい...

では復習しよう...と思ったらリンクが切れていた。かなしい。

 

さて、話題を変えよう。

Anti-Virusは悪意あるプログラムを発見すると該当部分を消去したり変更したりする。

Example : 

data<script>ecal('EICAR')</script>data → data<script>                  </script>data

タグ内のコードが消えている(Spaceで置き換わっている)。Anti-Virusに検知されたのだろう。

さて、これを使って何かできないか?

 

やりたいことはこうだ。

『故意にタグを配置して、消したい部分を消してもらう』

Example : 

攻撃の前にscriptを配置、その後にEICARを貼り付けることで攻撃ログを消去する

script、EICARを複数構造体をまたいで配置することで構造体を破壊する(DoS攻撃の一つ)

 

重要なのは『スペースで置き換わっている』こと。これを利用すれば、様々なことができてしまうのである...

 

【対策】

そもそもこの攻撃手法に対する有効な対策は存在しない

この挙動は通常の挙動そのものであるからである。

もしAnti-Virusソフト側でそれに対策をしようとすると、「検知エンジンの無効化」などの対策となるのだが...

実際に同じようなことをやったのがChrome XSS Auditor。今現在は無効化されている。

では果たしてMicrosoftがそれをやるだろうか?疑問符がつく。

そうなると、あとは脆弱なコードを書かないようにするしかない。

 

------

【まとめ】

Oracleは至るところに存在する

アンチウイルスの挙動は有害となりうる

・絶対にユーザー入力間に機密データを保存しないこと!!!

-----

[さいごに : Windows Defenderは賢過ぎた?]

Windows Defender、これは非常に便利で賢いやつなのである。

他のソフトでヒットしにくいJScript、そもそも他でヒットしないDOMAPIなんかにも反応しうる万能機械だ。

 

裏を返せば、彼は我々に様々なことを教えてくれる、ということ。

 

それは結果的にBlackbox解析の効率化に繋がる。本来ユーザを守る立場であるはずのDefenderが、皮肉にもその賢さゆえに攻撃者の味方をしてしまうのである。

より賢いAnti-Virusからはより多くのオラクルが得られる。

Windows Defender、彼は賢過ぎたのかもしれない...

 

---------------------------------

さて、いかがだったでしょうか。

後半に進むにつれて乱雑さが目立ち始めたかもしれません....急ぎだったからね....

それでは今回はこのへんで。総括的な参加記はまたすぐにあがると思います...