CTF初心者がいきなり問題を作ってみた
初めての記事なので見難いところがあったらすみません!
作問する事になったきっかけ
偉い人「何でもいいからCTFの問題を一人一問絶対作る用に。」
とか突然言われて初めて作ってみた時の所感です。
SECCON予選開始30分で問題を解ける気がせず気分転換に風呂入ってそのままスマブラやって寝たなんて言えない
そもそもCTFって何よ?
一応分からない人向けにざっくり説明すると、CTFっていうのはCapture the Flagって言って旗取りゲームです。
情報セキュリティの技術を競うゲームです。
CTFは主に下記のテーマで出題されることが多いです。
- リバースエンジニアリング
- フォレンジックス
- Pwnable
- Web
- ネットワーク
各詳細は偉大なWikipediaさんに任せるとして、僕はネットワークジャンルで作問する事にしました。
ネットワークパケットを解析して、その中に隠されたFlag(旗)を見つけてもらうって感じのジャンルです。
どんな問題を作ろう?
0から問題を捻り出すのは時間的に無理があったので過去のWriteupをググりました。Writeupってのは実際に問題を解いた人がその問題の解き方をまとめたものです。
その中でも「CTF for ビギナーズ2015」のネットワークジャンルの問題とWriteupについて詳しくまとめられている記事があったのでとてもパクr参考にさせて頂きました!
問題と詳しい解説については記事を見て頂くとして、この問題の解法をざっくり説明するとこんな感じ
- pcapファイルをWireshark(パケット解析ソフト)で開く
- パケットを見ていくとFTPの通信を発見する
- FTPは暗号化されていないので通信内容が見えるのでは?と推測
- 見てみると1.txtと2.zipと3.txtをサーバーからダウンロードしてるのがわかる
- 1.txtは「ctf4b{This_communication_is」、3.txtは「_encrypted.}」とそれぞれflagの一部が書いてあることがわかる
- 2.zipはそのままでは何が入ってるのか分からないので、Zipファイルを取り出す必要がある
- Wiresharkの「Follow TCP Stream」という機能でZipファイルをゲット
- 展開すると「_not」という文字を確認
- 文字を組み合わせると「ctf4b{This_communication_is_not_encrypted.}」というflagを発見
- やったね!
これを似た感じで再現してみたって感じです。
環境準備
ファイルをやり取りするために、Virtual BOXでVMマシンを2台用意します。
何でもいいです。僕はxfceが好きなのでxubuntuにしました。
適当にVirtual Box上で2台デプロイします。
最初はホストとの通信用にDHCPでそれぞれ同じIPが振られてますが、VM間で通信するためにもう一つNICを作ります。下記サイトを参考にしました。
もしVM間で通信できなかったら、VMがグローバルツールにあるアダプターを使っているか確認してみてください。↓
↓の例だとVMに振るIPは33seg
VM間で通信が出来るようになったら片方のVMにFTPサービスを入れて設定します。
Linux - Ubuntu 14.04 - ftp サーバインストール
https://freebsd.sing.ne.jp/linux/02/02/05.html
後は実際に送るテキストファイルにFlagの一部を入れます。さっきのビギナーズ2015の問題の例だと、2.txtはZIPにしてますね!ここはアレンジし易いところだと思います。
僕は2.txtをzip化して拡張子を消して何のファイルかそのままでは分からない用にしました!
パケットをキャプチャする
準備が出来たらどっちのVMでもいいのでWiresharkを入れてキャプチャします。
普通にブラウザから落としていいと思います。使ってるNICを指定してキャプチャスタートします。
キャプチャが始まったらFTPコマンドでサーバにファイルをアップロードしていきます。あらかじめサーバにファイルを置いておいてダウンロードでもいいと思います。
ファイル転送が終わったらキャプチャをストップして、パケットを確認します。
下記のような感じでキャプチャファイルのpcapファイルを作りました。
後は自分で実際にpcapファイルからflagを取得出来るかを確認します。
作ってみた感想
- FTPコマンドを使ったことがなかったので苦労した
- Virtual Boxのネットワークアダプター周りが少し詳しくなった気がする
- パケットが全体で100個くらいしかないので、他の通信を色々混ぜれば難しく出来そう
- Writeupを読み漁るのは大事っぽい
人によってはバイナリや暗号問題の方が簡単に作れるって人もいるかもしれませんね(っていうかそっちの方が多いかも...)。
次はFTP以外ので何か作ってみたいと思います。ではでは!