ハッキング大会CTFの紹介とSECCON2015 Online予選 Writeup

#はじめに
はじめまして．チーム"RenchinFTPlabo"といいます．
あるイベントに参加した岩手県立大学の学部4年生3人でチームを組みました．チーム名は内輪ネタです．
チームとして初めて参加したSECCON Online予選では1100点を取って171位でした．
![ranking.png](https://qiita-image-store.s3.amazonaws.com/0/104398/552f73b5-089d-a504-b4e9-0f5604159d21.png)

今日は流行りのCTFについて，先日開催されたSECCON 2015 Online予選の問題のWriteupを混ぜながら紹介します．
とても長いですが，お付き合いいただけたらと思います．

#CTFとは
Capture The Flag：旗取り
旗は情報を意味しており，参加者同士で隠された情報の奪い合いをします．
情報を手に入れるためには幅広い技術・知識を必要とし，ハッキング大会・ハッキング技術コンテストとして人材の育成・発掘として活用されています．

##参加するメリット
幅広い知識が求められるため，調べながら解くことで新たな知識・技術を身に着けることができます．
また，攻撃を実際に行うことで，脆弱性の脅威を身をもって実感でき，普段の開発により気をつけるなどといった意識の向上も見込めます．

##参加における注意点
イベントの性質上，攻撃技術を学ぶことになります．
CTF内で大会規約に従い，決められたサーバに攻撃することは構わないのですが，大会外において許可なくサーバに攻撃してしまうと法律で罰せられます．
学校内のサーバに対し攻撃をすると，それが善意の脆弱性調査のためであっても，退学処分が下されることも考えられます．
CTFで得られる経験はとても大きいですが，その経験を間違った使い方をしないように十分に注意してください．

##ルール
###Jeopardy方式
アメリカのクイズ番組「ジョパディ！」が由来で，各問題に得点が与えられており，正解することでその得点を得ることができ，試合終了時の総得点を競い合います．
問題はそれぞれ独立しているため，100点問題を解かずに500点問題に挑戦することも可能ですが当然難易度があがります．
他者に解かれた問題にも挑戦することができ，得点も得ることができますが，最初に正解した人にはボーナス点が与えられる大会もあります．ランキングで1桁目の端数が発生しているのはこのためです．

今回取り上げるCTFは，このJeopardy方式です．

###Attack-Defense方式
サーバの攻防戦です．参加者それぞれにサーバが与えられ，相手のサーバをハックしたり，自分のサーバのサービスを防衛・維持することでポイントを稼ぎます．
その性質上，オンサイトの大会で用いられることが多く，予選はJeopardy方式，決勝はAttack-Defense方式というCTF大会が多くあります．
RenchinFTPlaboのメンバーはAttack-Defense方式には参加したことがなく未知の世界です．


##問題ジャンル
現実においてセキュリティの分野がとても幅広いように，問題も幅広い分野から出題されます．

###Binary
バイナリファイルが与えられ，そのファイルからflagを探し出します．
バイナリを逆アセンブルしてアセンブラを読んだり，Androidのapkをリバースエンジニアリングしプログラムを解析します．

###Crypto
暗号問題です．岩手県立大学のセキュリティ論で学ぶのは主にこの分野です．
簡単な換字式暗号から，実際にコンピュータで使われている暗号を用いた暗号文の複合といった問題が出題されます．
###Network
ネットワークパケットのキャプチャを解析し，その中からフラッグを探し出します．
ネットワークの基礎知識から，各プロトコルに対する深い知識が求められます．
###Web
ウェブアプリケーションの脆弱性を突き，フラッグを手に入れます．
Binary問題と違いソースコードが見れないことが多く，エスパー問題とも呼ばれます．

これら以外にもイメージファイルを解析するForensics，プログラムの脆弱性を突き権限昇格をすることでflagを手に入れるpwn，セキュリティ雑学をもとにしたクロスワードパズルなど，本当に幅広い分野から出題されます．

ちなみに日本の著名ななCTF大会であるSECCONはQRコード問題が例年出題されており中の人たちのお気に入りみたいです．

##Writeup
競技終了後に参加チームが解法を公開することが多く，これをWriteupと言います．
情報の共有を行うことで解けなかったチームの参考となったり，備忘録として残すといった使い方がされています．
また，似たような問題が他大会で出題されることも多く，解法が参考になることが多いため積極的に活用していきたいものです．

#SECCON 2015 Online Writeup
ここからは先週末に開催されたSECCON 2015のOnline予選で解けた問題のうち数問のWriteupを書きます．
出題された問題はgithubで公開されています．
https://github.com/SECCON/SECCON2015_online_CTF

##Excercise50:Start SECCON CTF
>ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

>ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}

>quiz
Cipher:A}FFDNEVPFSGV}KZPN}GO
Plain: ?????????????????????

一番最初のエクササイズ問題ですね．
上2つの例から規則を読み取り，最後の暗号文を平文に戻します．
ex1を見ると，全ての文字(A-Z{})と暗号化後の文字の対応付けができているので，簡単ですね．
答えは以下のようになります．

```
SECCON{HACKTHEPLANET}
```

##Binary100:Reverse-Engineering Android APK 1
>じゃんけんに1000回連続で勝ち続けよ
[添付]rps.apk

与えられたAndroidアプリのパッケージをリバースエンジニアリングする問題です．
プログラムに隠されたflagをソースから抜き取るか，プログラムのソースを書き換えチートします．

Writeupは長くなったので別記事で書きました．
[SECCON 2015 Online Writeup - Reverse-Engineering Android APK 1 - Tanakaxaの日記]
(http://tanakaxa.hatenablog.jp/entry/2015/12/07/121028)

##Web/Network100:Connect the server
>login.pwn.seccon.jp:10000

え，これだけ…とりあえずブラウザから突撃するとダウンロードなる謎のファイルが降ってきました．

```ダウンロード
CONNECT 300

Welcome to SECCON server.

The server is connected via slow dial-up connection.
Please be patient, and do not brute-force.
S E C C O N { S o m e t i m e s _ w h a t _ y o u _ s e e _ i s _ N O T _ w h a t _ y o u _ g e t } 
login: 

Login timer timed out.
Thank you for your cooperation.

HINT: It is already in your hands.

Good bye.

```

中身はこんな感じでflagらしきものが見えますが…「こんな簡単に解けるわけないだろHAHAHA」とスルーしました．
flag部分には謎の空白が挿入されており，上のコードからはわかりませんが普通の半角スペースではないようです．

flag部分をスルーして内容を見るとログインを要求されたがタイムアウトしているらしいことが分かります．ログイン機能に触るためにnetcatで接続を試みました．

```
# nc login.pwn.seccon.jp 10000
CONNECT 300

Welcome to SECCON server.

The server is connected via slow dial-up connection.
Please be patient, and do not brute-force.

login: 

Login timer timed out.
Thank you for your cooperation.

HINT: It is already in your hands.

Good bye.

```
結果，先ほどのファイルと比べてフラグらしき文字列が表示されなくなっただけで特に進展はありませんでした.
netcatしてわかったのはサーバからのレスポンスが一文字ずつ表示されるという点だけでした.
結局のところそれっぽいユーザ名を入れてもうんともすんとも言わないので、タイムアウト時のヒントに目を向けてみます．
「君はすでに答えを手に入れている」
もしかしてと思いダウンロードしたファイルにある怪しい部分からゴミを取り除き，投げてみたら得点が加算されました．えぇ…

SECCON終了後に公開されたコードで再調査しました．
長くなりそうなので別に書きました．
[SECCON 2015 Online予選 Connect the serverの再調査](http://qiita.com/RenchinFTPlabo/items/fca39c614bd705d96678)

##Unknown100:Command-Line Quiz
>telnet caitsith.pwn.seccon.jp
User:root
Password:seccon
すべての *.txt ファイルを読め

問題文にはtelnetでサーバに接続しろと書かれていたので早速GO
接続してlsしてみるとstage1～5.txtとflags.txtと怪しげな文書が…
初期状態ではstage1.txtだけが閲覧可能でほかのテキストファイルにはアクセスできない状態でした
ということでstage1.txtを読んでみる．

```
$ telnet caitsith.pwn.seccon.jp
Trying 153.120.171.19...
Connected to caitsith.pwn.seccon.jp.
Escape character is '^]'.

CaitSith login: root
Password: 
$ ls
bin         flags.txt   linuxrc     stage1.txt  stage4.txt  usr
dev         init        proc        stage2.txt  stage5.txt
etc         lib         sbin        stage3.txt  tmp
$ head stage1.txt
What command do you use when you want to read only top lines of a text file?

Set your answer to environment variable named stage1 and execute a shell.

  $ stage1=$your_answer_here sh

If your answer is what I meant, you will be able to access stage2.txt file.
$ head stage2.txt
head: stage2.txt: Operation not permitted
```
ファイルを先頭から読むコマンドを環境変数に設定してシェルを動かせばいいらしい．
ググって見つけたheadコマンドを代入してシェルを実行してみる

```
$ export stage1=head
$ stage1=$stage1 sh
$ head stage2.txt 
What command do you use when you want to read only bottom lines of a text file?

Set your answer to environment variable named stage2 and execute a shell.

  $ stage2=$your_answer_here sh

If your answer is what I meant, you will be able to access stage3.txt file.
```

stage1突破，stage2.txtが読めるようになりました．
stage2.txtは末尾から読むコマンドだそうな，ということでtailコマンドが正解です．

```
$ export stage2=tail
$ stage2=$stage2 sh
$ head stage3.txt 
What command do you use when you want to pick up lines that match specific patterns?

Set your answer to environment variable named stage3 and execute a shell.

  $ stage3=$your_answer_here sh

If your answer is what I meant, you will be able to access stage4.txt file.
```

お次はstage3，問題はファイル内の指定文字列を含む行を抜き出すコマンド
はい，grepコマンド(とチムメンが即答)．stage3も終了

```
$ export stage3=grep
$ stage3=$stage3 sh
$ head stage4.txt
What command do you use when you want to process a text file?

Set your answer to environment variable named stage4 and execute a shell.

  $ stage4=$your_answer_here sh

If your answer is what I meant, you will be able to access stage5.txt file.

```

そんなわけでstage4到達，こんどはテキストを処理するコマンドとのこと．
問題文がアバウトで全く答えが掴めなかったので，テキスト処理関係のコマンドをひたすら打ち込んでみます．

```
$ export stage4=awk
$ stage4=$stage4 sh
$ head stage5.txt 
OK. You reached the final stage. The flag word is in flags.txt file.

flags.txt can be read by only one specific program which is available
in this server. The program for reading flags.txt is one of commands
you can use for processing a text file. Please find it. Good luck. ;-)
```

正解はawk(オーク)コマンドでした．
テキストを一行ずつ読んで，読んだ行を空白で区切られたデータと解釈して処理を施すコマンドのようです．
テキストの置換処理に使われることが多いようですが，ほかにも色々できるらしいです(雑魚並感)
何はともあれラストまで来ました，やったぜ．
問題文曰くflags.txtを読み込めるコマンドが一つだけあるらしい，さっぱりわからなかったのでこれも適当に打ち込む．が通らない…というかコマンドの打ち方が適当すぎました．コマンドの使い方をきちんと勉強しながら再挑戦．

```
$ sed -n -e 1,5p flags.txt 
OK. You have read all .txt files. The flag word is shown below.

SECCON{CaitSith@AQUA}
```

あったあった，というわけで正解はsedコマンドでした．
知らないコマンドを使うときは使い方をきちんと調べましょうという話でした．

##Stegano100:Steganography1
>Find image files in the file
MrFusion.gpjb
Please input flag like this format-->SECCON{*** ** **** ****}
[添付]MrFusion.gpjb

ステガノグラフィとは秘密にしたいデータを，他のデータに埋め込み隠ぺいすることです．
この問題では拡張子がgpjbというよくわからないファイルが与えられます．
fileコマンドを使うとGIFファイルとのことなので，拡張子を変えて開くとフラグの頭文字列が確認できました．
![MrFusion.gif](https://qiita-image-store.s3.amazonaws.com/0/104398/40b1b16b-142a-f079-d92e-d188b870e1e6.gif)
次にバイナリエディタでファイルを可視化し目grepしてみましょう．
![stirling.png](https://qiita-image-store.s3.amazonaws.com/0/104398/4a81ed56-b1ef-2a26-a4b9-45b347816c10.png)
![bitsimage.png](https://qiita-image-store.s3.amazonaws.com/0/104398/af967b42-ad07-c39a-b641-8206696369df.png)
白い部分は00 00 00...の繰り返しです．また綺麗な縦模様に見える部分も同じようなパターンの繰り返しになっています．
スクロールしていくとデータらしき模様がたびたび見られ，複数のファイルが埋め込まれているのではないかと予想ができます．
また，たまたまチームメンバーとの会話の中で，gpjbという拡張子がgif,png,jpg,bmpの頭文字ではないかということに気付きました．[^1]
ここまで予想ができれば，あとは抜き出すだけです．
ファイルにはマジックナンバーと呼ばれる形式を識別するためのフォーマット識別子があります．

|ファイル種|マジックナンバー|
|:--|:--|
|gif|47 48 46 38|
|png|89 50 4E 47|
|jpg|FF D8 FF E0|
|bmp|42 4D|

マジックナンバーを検索しそれより前のバイナリ情報をすべて削除し次々に保存します．
結果，以下のように画像が取り出され，全ての画像を合成するとflagが出現します．
![fusion.png](https://qiita-image-store.s3.amazonaws.com/0/104398/311b9a2b-f313-7091-698e-fe6718ee5f1a.png)

```
SECCON{OCT 21 2015 0728}
```

##Stegano100:Steganography3
>デスクトップのキャプチャに成功した！
秘密のメッセージを読み取ってほしい
[添付]desktop_capture.png

![desktop_capture (1).png](https://qiita-image-store.s3.amazonaws.com/0/104398/498fe54c-51af-4c52-0b20-a4fe661174fe.png)
画像には

- 謎のプログラム
- キャプチャした画像を開いたペイント
- [アメリカ版Yahoo!知恵袋](https://answers.yahoo.com/question/index?qid=20120214160953AAa0DAp)を開いたブラウザ

知恵袋には大人は解けないけど子供にはすぐ解ける計算式という内容が書かれていました．(0+0=2,8+8=4...数字に含まれる円の数です)
何が何だかわからないのでとりあえずOCRでバイナリを文字として抽出し，バイナリエディタにコピペ，Linuxで実行します．

```
root@vm:~# ./flag
Rmxvb2QgZmlsbA0k
```
出てきた文をBase64ででコードすると[Flood fill]…

もしやと思い画像に黒いインクを流し込んでみると…
![desktop_capture (2).png](https://qiita-image-store.s3.amazonaws.com/0/104398/c02f2e76-01d9-d496-d08b-7c22e15ebc95.png)

見事に英数字の○の部分だけが浮かび上がり，フラグが出現しました．
プログラム，知恵袋の内容，ペイントウィンドウすべてに意味があり感動です．
どうやったらこのような問題を思いつくのでしょうか…

```
SECCON{the_hidden_message_ever}
```

#SECCON 2015 Online予選を終えて
【@tanakaxa】24時間を通して多くの問題を見ながら，様々な知識を身に着けることができたと実感しています．
しかしながらセキュリティらしい問題を一問も解けなかったことがとても残念です．

【shallowricefield】Writeupとして書いた以外にもQR puzzleを人力で1時間50分かけて解いたり，4042という問題に挑戦しました．
とりあえず点が取れてよかったという感じです．TrendMicroCTFでは0点勢だったので100点は何とか取りたかったのです．
しかし，特に頭を使って問題を解いたわけではなく脳筋式で全得点を獲得しているのでこの点は要改善だとは思います．
今後もCTFへの参加が決まっているようなものなのでその時にリベンジします．

【@endlessbaum】今回は短い時間しか参加できず，あまり力になれませんでした．次は頑張りたいです．

#おわりに
どうですか？皆さんも解けそうな問題がありませんか？
CTFでは冒頭にあげたようにWebアプリケーションに攻撃(XSS，SQLインジェクション，OSコマンドインジェクション…)を仕掛けるWeb問題などもあり，Web開発者が攻撃に触れることで，Web開発で気を付けなければいけないことに気付き今後の開発に活かすこともできるでしょう．

この記事を読みCTFに興味を持ってくれた皆さんはぜひオンラインで気軽に参加できる[ksnctf](http://ksnctf.sweetduet.info)や[場阿忍愚(バーニング)CTF](http://burningctf.yamatosecurity.com)に挑戦してみてください．

セキュリティについて考える仲間が一人でも増えてくれたらうれしいです．
興味がある方はぜひ代表(仮)の@tanakaxaまで！一緒に挑戦していきましょう！

明日は@kachoさんです．よろしくお願いします．

[^1]: 「あのファイルの拡張子なんだったけ？」「jpeg並び替えたみたいなやつ」[jpeg…あっ]