chouett0's note

掃きだめ的なsomething

セキュリティキャンプ 2017全国大会の課題のwriteup

はじめに

www.ipa.go.jp

 つい先日セキュリティキャンプ に応募したのでその時の内容を忘れないために自分用にまとめ。今回選択したのが、選-A-1, 選-A-2, 選-A-4の3つ。どれもマルウェアとか関連の講義で、一番興味沸いたので選択した感じです。去年は応募締め切り忘れてて合否以前だったので行きたい...

 

全体的な感想

  もともとあんまり知識も技術もなかったのでどれも苦労してたけど、特に苦労というかこれでよかったのか感が否めないのが選-A4の問題で、printf()関数の内部処理を説明しろみたいな内容で、これ完全に某Hello World本じゃねとか思ったのでこれもしその内容と同じ内容書いてたら落とされそうだなといった感じでした。というかもともとLinuxのバイナリ解析自体経験が皆無だったのでそこが一番敷居が高かったかも。

他は割と調べたことをまとめていく感じだったのでまぁいいかなといったところでした。

 

選-A-1.パケットの解析と攻撃の識別

添付したファイルに記録された通信を検知しました。この通信が意図するものは何か、
攻撃であると判断する場合は何の脆弱性を狙っているか。

 添付したファイル、というのがパケットをキャプチャしたログでこの中から攻撃をした痕跡を見つけてその方法を見つけろという内容でした。幸運にもパケット自体はさほどなかったのでよかったんですが、初見では普通のHTTPでの通信にしか見えなくて10分くらい悩んでたんですが、何気なくHTTPリクエストの中身を見てみるとContent-typeの内容がやたら長い...怪しいなと思ってGoogle先生にC&PしてみるとApache Structs2の脆弱性を狙った攻撃だということがわかりました。(そういえばTwitterにそんな内容流れてた気がする)

じゃあその攻撃を再現してみようということで仮想機にApache Strutsの2.3.31とTomcat 8をインストールして、ホストマシンでBurp stuite立ち上げて添付ファイルの攻撃コードっぽい文字を含めて送信してみるとちゃんと攻撃が成功(今回の場合はcatで/etc/passwdファイルの内容の出力)したのでこれで間違い内容でした。後でほかのコマンドに変更してみたらちゃんと実行できるようなのでこれが実際に使われたら洒落にならない...

と、いろいろ遊んでいると攻撃コード内にcmd.exeなる文字列が含まれている、もしやこれってOS関係なく動くのか?と思い、早速実験用のWinマシンに同じ環境構築してみると流石にそのままでは動かないものの、Windowsのコマンドに変更して実行させると確かに使えるようなのでほんと怖い。というかそもそもこれ自体がOS特有の脆弱性ではなくアプリケーションのものだから当たり前っちゃ当たり前なんですけどね。

 

選-A-2.機械学習の弱点

 最初にprintf()関数の内部処理の解析が一番難しかったと言いましたが、ある意味これが一番頭悩ませたかもしれない内容で、一応機械学習は経験あるんですがその経験とWebで調べてみた内容含めてもあまり文章量が増えず、一番できていなかった気がします。

そしてここに書く内容もほぼないのでほんとこの問題何を見る問題だったのか疑問しかないです。

 

選-A-4.printf()関数について

C言語のprintf()関数またはUNIXのfork()というシステムコールについて、
これらはどのようなものですか? 数値や文字列を表示する・プロセスを作るというだけではなく、
深堀りして考え、疑問を持ち、手を動かして調べてわかったことを教えてください。

 たぶん3つの中で一番この問題に時間使ってた気がします。

バイナリ解析は好きなので眺めてるのは全く苦にはならなかったんですが、どこまで深く潜ればよいのかがイマイチわからず、しかもこれって某本の内容と同じになるんだよなぁと思いながらやってました。

最終的な考察としては、vfprintf()関数とかを呼び出していってwrite()関数でシステムコールを呼び出している、という感じでその呼び出しに今回の環境ではsysenterという命令を用いているようでした。このsysenterというのも、同じような命令にINT 0x80とあともう一つあるようで、最適化や環境によって変化するらしいです。

 流石にこれだけだとパクリだろうといわれて落とされかねないので、一応Windows環境でコンパイルしたPEファイルの解析も行いました、どうやらlongjmp?という関数を使っているらしく、ペアであるsetjmp関数を使用した位置へ強制ジャンプするもののようでした。結局その内部処理は追えなかったものの、それより上層の関数を調べた結果Windowsにもwrite()関数と同義のものがるらしく、そこでシステムコールを呼び出しているようでした。

 

まとめ

 今回が初参加だったのでどのレベルの内容を書けばよいのかがイマイチわからず、選考通るか不安しかないですが、まぁまだ先があるので来年に期待しようかなといった感じです。特に機械学習の弱点については一番自信ないのでそこで落とされそう…

今回のまとめはほんとに概要しか書けなかったのでそのうち個別にでも内容かけたらいいなぁと思います。