読者です 読者をやめる 読者になる 読者になる

HappyNote3966’s blog

備忘録、作業記録的なことを書きます。低レベル注意。ご指摘等ございましたらやんわりとお願いします(´;ω;`)

CTF for ビギナーズ in 金沢 参加記 + Write-Upもどき

 2016/11/26(土)、金沢工業大学でCTF for ビギナーズ in 金沢が開催されました。

今回はその体験記とそこで行ったCTF演習のWrite-Upを書いていきます。

f:id:HappyNote3966:20161128005011j:plain

CTF界隈でプロの人がこの目印をよくブログやTwitterに上げてるのを思い出して、自分もやろうとパシャリ。

 CTFの競技自体は学内やセキュリティキャンプ全国大会で体験してはいたけど、公式の大会に参加するのは初めてです。

 会場内では、ネットワーク周りの配線が行われていたり、運営の方があちらこちらに動き回ったり…着々と準備が進んでいました。

f:id:HappyNote3966:20161128005051j:plain

参加者も集まってきて、プロの気配も感じ取れました。

「ビギナーズ」と書かれていても、最後にCTFで競い合うことを考えると少し緊張してしまいます。

当日のスケジュールはこんな感じでした↓

  1. 開演、オリエンテーション
  2. Web講義
  3. フォレンジック講義
  4. リバースエンジニアリング、バイナリ講義
  5. CTFオリエンテーション
  6. CTF演習と答え合わせ

詳細なスケジュールはこちらをご覧下さい

2016.seccon.jp

 協賛企業は以下の通りです。他にもいろいろな方々のおかげでこのようなイベントに参加することができました。ありがとうございます! 

f:id:HappyNote3966:20161128012024j:plain

(キャンプの時もそうだったけど、有名な企業ばかりだからすごい…)

 

 私もPCのセットアップをしようとしたら、「会場内の電源タップには限りがある」とのこと。どうやら参加者に送信されたメールには「電源タップを持ってきてね」とあったらしい。完全に忘れてました。すみません。

なのでCTF for ビギナーズに参加する人は電源タップも忘れずに。

そういえば電源タップにはSECCONのシールが貼ってありました。こういう細かいところが好きです。あとSECCONシール欲しいです。

f:id:HappyNote3966:20161128005158j:plain

 

 準備が終わると、いよいよ講義が始まります。

 

オリエンテーション

 最初はオリエンテーションです。ここでは主に倫理面に関してを学びます。要点だけをまとめさせていただくと、こんな感じです。

  • CTFで行うような攻撃は、許可されたネットワーク上やサーバに対してのみ行うこと
  • それ以外のネットワークやサーバなどに対して攻撃を行うのはダメ
  • 善意の行動でも攻撃はダメ

 技術的な側面だけから見れば倫理的な部分は疎かになりがちですが、倫理面でも優れたハッカーになるべきだと思います。

 

Web講義

 続いてはWebについてです。CTF for ビギナーズリーダーのれっくすさんより講義をしていただきました。こちらもまとめさせていただきました。

 最近はWeb系の勉強を中心にやっていたので、躓くことなく演習をすることができました。SQLインジェクションは特に学んでおいてよかったと思います。パスワードなどを入力させるところでは、SQLインジェクションが成立する可能性があるので、CTFの際に使える攻撃の幅も広がりました。

 ディレクトリトラバーサルの攻撃は、好きなファイルにアクセスできるところまでは良いのですが、Linuxディレクトリ構造や設定ファイルの場所など、ある程度重要な情報が格納された場所を知らないといけないと思いました。定番の/etc/passwdや/etc/apache2/apache2.confは思い出せたけど、他のファイルの場所も覚えられたら攻撃の幅が広がるはずなのになー。

 

フォレンジック講義

お次はフォレンジックです。CTF for ビギナーズのメンバーであるバッタさんより講義をして頂きました。こちらもまとめさせていただきます。

  • フォレンジックスとは、ログや記録・状態などを詳細に調査し、痕跡や攻撃手法を解明することをいう
  • 今回はネットワークを中心としたフォレンジックを行った
  • HTTP,パケット、IPアドレス、ポート番号などの知識が必要
  • Wiresharkというネットワークの通信を解析できるツールで、パケットの中身を詳細に確認できる上、解析に便利な機能がたくさんある
  • パケットを読む際にはシナリオを意識し、通信の行われる状況を想像しながらやるのが重要
  • パーセントエンコーディングBASE64など、フラグなどの情報がエンコードされていることもある
  • 謎のファイルを調査するフローは、①ファイル形式の特定→②メタ情報の特定→③データ内容の特定
  • ファイル調査に必要なツールはたくさんあり、binwalk、ExifTool、The Sleuth Kitなどを扱えると便利

 フォレンジックは殆どやったことが無く、CTFの問題でも一番後回しにしていたジャンルでした。とにかく与えられるファイルが謎すぎて何もできなかったので、今回のツールの存在は大きかったと思います。ツールを使えることが前提の分野であるように感じました。

 stringsコマンドやfileコマンドを使うのはなんとなーく想像がつくのですが、それ以上のことが分からないことが多かったのが、今回ツールについて学んだことでフォレンジックに対する理解が深まりました。ツールでなくともLinuxのコマンドでも他に便利なものがあると知れて良かったです。

 少し気になったのが、ファイルシステムについてです。今回のフォレンジックの講義では、ファイルシステムの中に削除されたファイルがあり、その中身を読みだせるというのがありました。ファイルを削除してもデータが残るというのが興味深く、今後この辺について勉強してみよう。

 

リバースエンジニアリング・バイナリ講義

 最後の講義はリバースエンジニアリング・バイナリです。CTF for ビギナーズメンバーであるhytさんより講義をして頂きました。こちらもまとめました。

  • ReversingはPEとELFという実行ファイル形式を解析したり、スクリプトや謎ファイルも解析する
  • CPUとレジスタ、メモリの理解が必要
  • レジスタにはEAX,ESP,EBPなど様々な役割を持ったレジスタがある
  • メモリマップには機械語を格納するtextセクションやスタックなどがある
  • x86アセンブリには、代入命令、算術演算命令(四則演算など)、論理演算命令、分岐命令などがある
  • 関数を呼ぶ際にはスタック上に引数を積んでおき、call命令で呼び出した先の関数内で引数を取り出す
  • 解析プログラムにはobjdumpやIDA demo / Pro Freeがあるので、有効に活用すべし
  • リバースエンジニアリング、バイナリの上達のコツは、仕組みについて理解することと、たくさん読むこと

 バイナリ系のことについては勉強していたこともあり、理解できないところはなかったので良かったです。でもアセンブリ命令列を見てすぐさま実行内容を把握できるほど読み慣れてはいないので、今後たくさん読んでいく必要はありそうです。

 Linux上でバイナリ解析をする際にobjdumpを使いこなさなけばならないとも思いました。IDAのようなGUIベースのツールもいいのですが、GUIが使えない状況下も想定して、解析を早くできるようにしなければ。ここでもたくさん経験して慣れることが大切なのでしょうね。

 objdumpで実行してみても、本来の解析目的とは関係のないアセンブラがたくさん羅列されていました。今回は解析の範囲を指定されていたので難しくはなかったのですが、実際のCTFではその範囲も自分で考えなければならないので、必要な範囲とそうでない範囲を見極められるように頑張ります。

 

CTFオリエンテーション&CTF演習

 いよいよ戦いが始まります。時間は約80分程度、その中で以下の問題を解いていきます。フラグは共通してctf4b{(フラグの文字列)}となっています。

 

f:id:HappyNote3966:20161127221401p:plain

 

 ここからはWrite-Upとなりますが、解法が違っていたり、フラグの詳細な内容、画像があったりなかったりとクオリティの低いものとなります。完璧なWrite-Upは探せば出てきますので、気になる方はそちらの方へどうぞ。

 

今回解けた問題は以下の通りです。

  • [Misc] Warmup 10
  • [Misc] てけいさん for ビギナーズ 200
  • [Web] Fix it 100
  • [Web] Login as Admin 200
  • [Forensics] FileSystem 100
  • [Forensics] みてみよう 200
  • [Forensics] ICMP? 200
  • [Reversing] Welcome Reversing World! 100
  • [Reversing] Lecture Review 200

 順番にWrite-Upしていきます。

 

[Misc] Warmup 10

 フラグの送信ができるかどうかの確認問題のようなものです。問題文にはフラグが記載されており、コピペして送信するだけで終わりです。本当にそれだけなのですが、中にはフラグを送信できないという方もいらっしゃったので、ちゃんと正常にフラグが送信できるか確認しましょう。

 

[Misc] てけいさん for ビギナーズ 200

 Webページ上に計算式とその答えを入力するフォームがあるので、100問連続でその計算を行うえばフラグがもらえるという問題です。当然100問連続で手計算を行わない方法が正しいのですが、考えるのをやめて100問連続で手計算しました。運営側の想定解はPythonスクリプトを組み、自動化させるというものでした。

 最初はPOSTメソッドで何か送信されているのかなーとか思ってFiddlerを使ってみたのですが、送信されているパラメータの中に問題数を管理するような値が見つからず、「???」となっていました。この問題でプログラムをサクッと書けるような力が必要なのだと思い知らされました。今のままだとプログラムを作って自動化させるより手計算でやったほうが早いので、プログラミングも練習しないと…

 

[Web] Fix it 100

 たしかページにアクセスすると「このページはリダイレクトされるはずなのにされてない、さぁ直してくれ」といったニュアンスの文がありました。リダイレクトに関しては講義の時間にChromeの機能を使って遷移先を見ることができるのを覚えていたので、早速ヘッダを見ることに。

 Ctrl+Shift+Iキーを押してヘッダの情報を見てみると、遷移すべきページのURLが載っていたのでそこへアクセス。アクセス先にはフラグが表示されていました。

 

[Web] Login as Admin 200

 ユーザ名とパスワードを入力するフォームがあるだけのページでフラグを探せという問題です。ここは講義してもらったSQLインジェクションを使うところだと思ったので、以下のクエリをパスワード入力欄に書きました。 

A' OR 'A' = 'A';--

 セミコロンはSQL文を実行するため、SQL文の区切りを示しているものです。

 --はSQLのコメントに相当するもので、入力されているSQL文によって全体のSQL文の構造がおかしくなってしまうのを無理矢理打ち消しているものです。

 これでAdminでログインできたので、フラグが表示されました。

 

[Forensics] FileSystem 100

 for100という拡張子のついていない謎のファイルを与えられるので、まずはfileコマンドで調べてみます。

file for100

 

f:id:HappyNote3966:20161127221402p:plain

 .fatや、FATという文字が確認できます。つまりこのファイルがファイルシステムだと確認できます。なので今度は、このファイルシステムの中身をThe Sleuth Kitのコマンドであるflsで調べてみます。

fls for100

f:id:HappyNote3966:20161127221404p:plain

 すると、.flag.txt.swpというファイルが削除されていることが分かります(各行の数字の前についているアスタリスクは削除されたという意味)

 このファイルの中を見たいので、同じくThe Sleuth Kitのicatコマンドを使って表示してみます。.flag.txt.swpは6番目にあるらしいので、6番目を指定する数字も一緒に入力します。

icat for100 6

f:id:HappyNote3966:20161127222117p:plain

 するとctf4b{}で囲まれた文字列が出てきました。

ctf4b{ff97e486da08bfec774688ca3ef6ac42}
[Forensics] みてみよう 200

 for200という謎のファイルを与えられるので、まずはfileコマンドで中身を見てみます。 

file for200

f:id:HappyNote3966:20161127223604p:plain

 tcpdump capture fileとあります。つまりパケットのデータがキャプチャされたファイルですね。これをWiresharkで開いてみます。

f:id:HappyNote3966:20161127223819p:plain

 ICMPパケットの中にHTTPでやりとりしている部分があります。その中を見るとGETメソッドでflag.pngという画像をやりとりしていることが分かります。

 なのでFile→Export Objects→HTTP...を選びます。

f:id:HappyNote3966:20161127223605p:plain

 さっそくこのflag.pngを取り出して画像の中身を見てみたのですが、ただの真っ白な画像でした。どうやら調査が足りないらしいです。なのでこのflag.pngの詳しい中身を調べます。講義で習ったExifToolを使ってみましょう。

exiftool flag.png

 

f:id:HappyNote3966:20161127223609p:plain

 するとKeywordsの値がフラグになっていることが分かります。

ctf4b{f970e2767d0cfe75876ea857f92e319b}
[Forensics] ICMP? 200

 for200-2という謎ファイルを渡されるので、まずはfileコマンドで調査してみます。

file 200-2

f:id:HappyNote3966:20161127225509p:plain

 さきほどの問題と同じく、tcpdump capture fileであることが分かります。なのでWiresharkで見てみます。

 しかし中身はICMPのパケットしかなく、先程のようにHTTPでやり取りされている部分はありません。なので、フラグがこのICMPのパケットの中に隠されてるものだと仮定し、その格納しているパケットを探すことにします。その方法は、パケットの大きさで探す方法です。Lengthタブをクリックし、パケットサイズの一番大きいものを見つけます。すると、Lengthが352のパケットを発見しました。

f:id:HappyNote3966:20161127225511p:plain

 このパケットの中にはHTTPでやり取りされた旨のデータが入っていました。一番下の近くにあるデータはtext/plainと書いてあるので、テキストデータであることが分かります。また、"Y3"から始まる不思議な文字列がBASE64でデコードされていると思ったので、このデータを取り出します。

Wiresharkから直接それをコピペしたかったのですが、方法が分からずstringsコマンドに頼ることに。

strings for200-2

f:id:HappyNote3966:20161127225513p:plain

 stringsコマンドでBASE64エンコードされたと思われる文字列を発見し、コピーします。その後、この文字列をBASE64でデコードします。

echo 'Y3RmNGJ7NTM2ZGFjMzcxYWE2NTJmODY1YzIwYWJlN2I0MDk0ZGJ9' | base64 -d

f:id:HappyNote3966:20161127225514p:plain

 するとフラグが出てきました。

ctf4b{536dac371aa652f865c20abe7b4094db}
 [Reversing] Welcome Reversing World! 100

 bin100というファイルが与えられるので、fileコマンドで調べてみます。

file bin100

f:id:HappyNote3966:20161127231114p:plain

 ELF 32-bit LSB Executableと書かれているので、このファイルが実行形式であることが分かります。(いや、[Reversing]と書いてあるんですが念のためです)

 ただこのままだと実行できないので、このbin100を実行できるようにします。

chmod 777 bin100

f:id:HappyNote3966:20161127231116p:plain

 これで準備が整ったので、さっそく実行してみようと思います。余談ですが、CPAW CTFの序盤で、ELFの実行方法が分からずに悩んでいたことがあります。./を付けないと動かないなんて、当時は知る由もありませんでした。

./bin100

f:id:HappyNote3966:20161127231118p:plain

 実行できたのは良いのですが、Enjoy CTF!と表示されるだけでした。なので、このファイル全体に何かフラグが隠されていないかstringsコマンドで調べてみます。

strings bin100

f:id:HappyNote3966:20161127231119p:plain

 すると、フラグの文字列が現れました。

ctf4b{57r1n65_c0mm4nd_f1nd_fl46}
 [Reversing] Lecture Review 200

 bin200_1というファイルからeaxの値を求めて、その値をフラグとして送信しなさいというものでした。なので、まずobjdumpコマンドを使ってアセンブラを見てみます。

 

f:id:HappyNote3966:20161127233427p:plain

 main関数の中身です。この中を見てみると、calc関数が呼び出されていることが分かります。

f:id:HappyNote3966:20161127233429p:plain

 このcalc関数では色々な計算が行われた後にmain関数に制御を戻します。

 他の分野に時間をかけすぎて焦っていたので、素直にアセンブラを読むことはあきらめました(すみません)

 gdbを使って一気に解決したいと思います。chmod 777 bin200_1を実行した前提で進めます。

gdb -q bin200_1

f:id:HappyNote3966:20161127234509p:plain

 

まずはmain関数を見てみます。

disas main

f:id:HappyNote3966:20161127233432p:plain

 calc関数が呼ばれているようなので、同じようにして見てみます。  

disas calc

f:id:HappyNote3966:20161127233434p:plain

 このcalc関数が返ってきたところのeaxレジスタの値が知りたいので、ブレークポイントを仕掛けます。仕掛ける場所は、main関数内の、calc関数が実行された直後のアドレスです。

b *0x08048441

f:id:HappyNote3966:20161127233436p:plain

 仕掛け終わったら実行してみます。

run

f:id:HappyNote3966:20161127233439p:plain

 eaxレジスタの値が0xffffffe5になっています。この値を10進数に変換すると、-27になります。

ctf4b{-27}

 以上がWrite-Upになります。

 

 結果は9位でした。まだまだ勉強する必要がありますね。

(画面汚くてすみません)

f:id:HappyNote3966:20161128005528j:plain

 ちなみに全完を成し遂げた方もいました。プロとしか言いようがない…

 

 お土産に本とステッカーを頂きました。

f:id:HappyNote3966:20161128005703j:plain

f:id:HappyNote3966:20161128005636j:plain

 

感想

 初めて参加したCTFの競技は上位に食い込めるかすら心配でしたが、1桁台に入ることができて嬉しかったです。まだまだ勉強が必要だとしても、Linuxコマンドをまともに扱えなかったキャンプ参加時に比べて成長できたのではないかなと思います。

 また、Write-Upなるものを初めて書いたことで、解法を自分の頭の中で整理することができました。また何かのWrite-Upも書いてみたいです。それとWrite-Upを書く際に問題のページやデータなどはしっかりと保存しておくべきでした。最初の方は問題を解くのに必死で…(;´・ω・)

 心の余裕ができるぐらいにレベルを上げていきたいです。

 

 CTF for ビギナーズに参加できて、モチベーションが上がりました。人と競い合う良い機会を体験できてよかったです。運営やスタッフの皆さん、参加者の皆さん、お疲れ様でした&ありがとうございました!また金沢来てください!