ふるつき

v(*'='*)v かに

セキュリティミニキャンプ沖縄

セキュリティミニキャンプin沖縄に参加しました

 二日間行われた専門講座に行ってきました。その時の技術的な内容について随分端折って書きます。細かい話は後日応用と一緒にやりたいと思っている。

マルウェア動的解析の自動化

 私が書くような内容は何もなくてスライドを見てくれって感じですが、一応書きます。やったこととか感想とか。

 やったことは、DECAF(Qemuの改造でデバッグのために便利にしてる)を使って、Out-of-VMなアプローチからマルウェアを解析するということ。実際にはマルウェアではなくてマルウェアっぽい動きをする(アンチデバッグな機能を持った)PEなのですが。  これを、主にAPIコールのフック→書き換えを使ってアンチデバッグの回避というイタチごっこをやっていました。これの内容自体はセキュリティキャンプ(全国)でやったものらしくて、そちらではIDAを用いてバイナリを解析してどのAPIをフックするかというところからだったらしいですが、ミニなのでPEのソースコードは与えられていました。IDAでも頑張りましたが。  どうやってフックするかといいますと、DECAFのプラグインを作ります。Cで書きます。お手本のプラグインがあって、そいつを拡張しました。どういうふうに拡張するかというと、フックできるAPIの種類を増やします。もともとはIsDebuggerPresentしかフックできなかったものを、Sleepもフックできるようにする。  やるだけ作業という感じで、IsDebuggerPresent用のものを全部コピーして、IsDebuggerPresent→Sleepに置換して、あと必要な部分(引数とか)を書き換えたらそれでフックできます。そして、DECAFに用意されているAPIを叩いて、呼ばれた時の引数を書き換えたりします。  というのが、Sleep以外にもいくつかあって、それをどんどん攻略していく形になるのだと思うのですが、阿呆なハマり方をしたりして、そんなにたくさんはできませんでした。GetTickCountの戻り値を書き換えたあたりで時間切れ。

車載LANを流れるメッセージの解析

 車載LANのプロトコルであるところのCANの仕組みや、Pythonを使っての読み書きをやりました。CANはデータリンク層あたりだった気がするのでレイヤ低めです。ELM327をつかうと、実際に流れている電気信号をシリアルコンソールに流してくれるっぽいので、さらにそれをpythonのCANライブラリ(python-obd)を使って読みました。  ライブラリが充実してるしpythonだしてコーディングは難しくなくて、だいたい文字列処理をうまくやるだけでした。

組込みシステム解体新書(入門編)

   とあるルータのボードを解析したりしてました(解析=どのへんが電源でどのへんが処理部で……をみわける)。さらに、そのルータにはご丁寧にデバッグ用のピンがさしてあったのでCPU(?)のデータシートと付きあわせて、どのピンがどの動作に関わっているかを調べました(テスタのはしをちょんちょんしてピンと足がつながっているか確かめます)。そして、デバッグ用のICを経由してPCにつなぎ、JTAG(組み込みなCPUのオンボードデバッグのための規格)から神になる……はずでしたがうまく行かず。う〜ん。これも課題ですね。

ファジング実践

 ファジングはFuzzと呼ばれるエラーを引き起こしそうなデータを投げつける、ブラックボックステストのようなものです。これでいくらかの脆弱性を探します。  今回は、Peachというツールを使って、lighttpdというapacheみたいな奴の古いバージョンに見られた脆弱性を殴りに行きました。もともと用意されている設定ファイルでは弱くて脆弱性殴れないので、設定ファイルをいじってサンプル強くして殴りに行きました。HTTPのリクエスト投げてたのですが、設定でいろいろ(UAとか、Acceptとか)なヘッダの要素(?)を増やしてから殴りなおすと、lighttpdがCPUを100%占有して固まりました。  たくさんのデータを投げてたので、データの数や種類を変えて、そのような事態を起こす原因となったデータを絞り、その中身を見てどのような部分が脆弱性を産んだのか調べて治す……のですが、今回は絞るとこまででした。

感想とか

 めちゃめちゃいろんな学びだったのにこんなに短くなってしまってまともにかけてないの悲しい。今回は特にハードっぽいところへの怖さ(知らぬがゆえの恐怖)が随分なくなったのでよかったです。

SECCON福島「サイバー甲子園」に行ってきたよ

 SECCON福島大会サイバー甲子園に参加してきました。ptr-yudaiと共にinsecureというチームで出場しました。

まとめ

 2位でした。これによって、SECCON intercollegeの参加権を獲得しました。

write up

数問解きましたので憶えている範囲でのwrite upを行います。問題名とか適当です。

[unknown] 100pt invisible flag

pngが渡されます。問題文は「pngが壊れているのかな?」みたいな文章でした。開いてみると確かに真っ黒でしたが開けたので壊れたわけではないはず→stegsolveで解けました。FLAGはSECCON{INVISIBLE_FOR_HUMAN}でした。画像だったので手打ち。

f:id:Furutsuki:20151108174021p:plainf:id:Furutsuki:20151108174029p:plain

[unknown] 100pt PDF

なんかPDFがあります。「黒塗りには気をつけよう」みたいな問題文。PDFを見るとなんかいろいろ文章があるんですが、ところどころ黒塗りになっています。SECCON{______}みたいなのを見つけたので、そこを選択してコピー&ペッと適当な場所に。するとFLAG書いてありました。上から黒く塗っても意味ないよという話。SECCON{kuronuri_chuui}

[crypt] 100pt ?

ptr-yudaiに言われて解いた。rot_13するだけ問題。

[binary] 200pt reversed porland

ptr-yudaiに「解ける?」って言われて苦戦してた。こういうのに時間を取られるからだめ。問題としては、逆ポーランド記法で書かれた長い数式(しかも数が大きい)が渡されて、それをごにょごにょする。

  1. 数式の各数値は2〜36進数で記述されていて-?\w+([0-9]+)って感じになってる(つまり、数値をあらわす数桁の後に弧で括られた基数がある)。まずはこれを揃える。都合よくpythonのint関数は36進数まで対応している(なぜなら、0-9A-Zで36だから)。ところで-がつくやつをちゃんとパースしなかった結果最終的な数値がアでアだった。

  2. 直したら数式を計算する。ポーランド記法にしてschemeに突っ込めばいいやと思ってたけど甘かった。結局pythonのコード引っ張ってきた。

  3. 結果を16進にする。そして1byteずつに区切って英字としてみる。

pythonのソルバ書いたのであげときます。

SECCON福島大会 サイバー甲子園 Programming 200pt

[binary] 300pt baseball

甲子園ということで本家に肖りて、野球の問題。ncで接続した先のゲームをシミュレーションする。これに時間を取られている間にptr-yudaiが問題を解きまくってた。

SECCON福島大会 サイバー甲子園の Programming 300pt問題

雑感とか

  • CTF前はHSPばかり書く一週間を過ごしていたので解けなかった

ctf for ビギナーズ 奈良(Attack&Defense)

 Defense書けない。

 それはそれとして、かのNAISTで行われた学生限定のctf4b、Attack&Defense大会に参加してきました。わたしはある@turn_dnさんと二人でチームでした。NOPという名前です。

 どこかでスコア見たらわかりますが、下の方になってしまいました。つら。そういう愚痴とかも含めて書きたい。時系列じゃないです

  • 空気を震わせるのはセキュアじゃないのでSlackたてたけどインタネットに繋げなくて活用せずつら
  • とりあえずpiにraspberryで入るのはできた。homeにcommandとかいうふぁいるがあったから、実行したらフラグ出た
  • ただし、どこに投げればいいかわからなくて温めてた(回答フォームのチームの並びがipと一致してることに気がついてなかった)。おかげでFirstAC(?)逃すのあったつらい
  • 自分のところのpiのpass替えたけどなんかそのへんよくわからない感じでよくわかってない
  • piではいるとcatとかviとか全然つかえないのつらいっつってcommandに何が書いてあるのかわからなかった。終わり前にmawkを使えば良いということがわかったけれど、特に情報もない/etc/passwdをみるなどしていた。
  • Webの方は、とりあえず画像アップローダphp上げられそうなのは直してもらった。
  • 本来きっと顕現がないであろう場所に入れる&10 * 100ptの情報が拾える場所発見。とりあえず情報拾って書き換えとく(やっぱり投げれない)
  • 投げる場所がわかった(全チームに投げていった)ので投げた。FirstAC。Webは最初だったらしい
  • せっかくなのでwgetで落としてpythonで整形するスクリプト書いてたけどだめだめだった。遅い&精度だめだめ。(ctf4b奈良A&Dで悔しい思いをした話 - ヾノ*>ㅅ<)ノシ帳こことか見てると凹む)それでもいくらかはなんとか
  • UserAgentでXSSできることを発見。使い方がわからずに「ひま〜〜」とかはつどうさせてた。だれか踏んづけてたら嬉しい。
  • SQLiできるっぽいところも見つけた。使い方がわからない。 @turn_dnさんへの報告をわすれる。だめじゃこりゃ
  • raspiのsshを落とされたらしい。ログインできずつら
  • ずっとログインできずDefenseポイントももらえずWebもいじれず死
  • WebのConfigファイルが消えてエラー吐いてた。なんでや。

 終わってから思ったこと - ひとつのチームから1100pt以上絞れないのつらい - ssh落とされるとすることなくてつらい - 二人だと手が足りなくてつらい - MVCPHPSQLもだめでつらい - SecurityCampに行った人がたくさんでダメでしょっていってる(いわない - 最後の方DefensePtがインフレしたのバカを見る人が多くて辛い - 本当にNOPしてたほうがつよかったつらい - Webのadminみつけられなかったつらい - pythonかけないつらい

 ほかにもつらいことあったら書く。気付きは結構早い方だったと思うししっかりものにできれば勝てるような感じだった。それもあって、腑に落ちないというか燻ってるので再チャレンジしたい