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

根性駆動開発

備忘録とか日記とか

研究室の先輩が開催してくれた学内ctfの話

ctfとはcapture the flagの略で、セキュリティ関連からコアな知識、なぞなぞみたいなやつまで幅広くコンピュータ関連の問題を解き、フラグを見つけ、最も点を稼いだ人が勝ちというゲーム。

↓ここのサイトが始めは参考になった。

qiita.com

めちゃ内輪な話だけど研究室がセキュリティ関係で、ctfもその一環としてやるのでその話。というかwrite up。

世にも需要無い内容だけど備忘録という名目で書く。

ただ、ctfをしてから数日経っていてうろ覚えになっているところも多いので思い出し次第追記していくかもしれない。

確かに画像だ1

ステガノグラフィの問題。詳細はわすれてしまった。

確かに画像だ2

ステガノグラフィの問題その2

殆ど真っ黒のepsファイルが渡される。

stringsコマンドでこのファイルを指定すると命令らしき文字列がたくさん書かれているのがわかる。

epsとかでググってみるとpostscriptという言語で記述された画像ということがわかるのでエディタでそのファイルを開く。

postscriptではfillという命令で対象の領域を塗りつぶすことが出来るらしいのでfillと記述されている部分を削除。

再度プレビューとかでこのファイルを開くとフラグの中身がわかる。

適当にコード編集するとチラチラ文字が見え隠れするのでそれで予想することも多分出来なくはない。けど、全部見れても空白スペース間違って入れたりしてフラグが通らなくて時間がかかった。

数字の文字

8桁くらいの数字だけ渡される。

たぶんASCII文字なのでASCII デコードとかでググって出てきたASCII文字をデコードしてくれるサイトでデコードする。

するとフラグがわかる。

これは簡単だった。

forensicsのやつ

画像ファイルが渡される。 exiftoolコマンドでこの画像を指定して実行するとフラグが表示されている項目がある。

これも簡単だった。

heavyQR

QRコードが渡される。 このQRコードbinwalkコマンドで指定するとzipファイルがあることがわかる。

binwalkd -eでzipを展開し解凍するとカレーの画像とヒントのテキストが出てくる。ヒントのテキストにはFLAG_IS_{T***_M***}とある。

このカレーの画像をexiftoolコマンドで指定して実行すると表示される緯度経度の項目をgoogle mapとかで検索するとタージマハルがヒットする。なのでtaj_mahalがフラグ。

タージマハルのスペルとか知らんのでTから始まる英単語をググったりして結構苦戦した。

wibQR

部分的に情報が欠如したQRコードが渡される。 そのままでは読み取りが出来ないので修正する必要がある。

QRコード ctf みたいな検索ワードでググると似たようなwrite upがヒットする。

そのあたりに記述されている、strong-QR-decorderというライブラリが文字列として読み取った欠損アリのQRコードも読み取ってくれるので頑張って手作業でQRコードの画像を文字列に置換する。

置換した文字列を読み取るとフラグがみつかる。

スーパー作業ゲーな感じで地味に時間がかかった。 研究室の先輩はこれを自動で置換し、読み取れるようにしたツールを研究でつくったそうな。

わーい、すごーい!

フレンズっぽい大量の文字列が記述されたファイルが渡される。

たぶんbrainfu*k系の言語っぽいので適当に置換ツールでbrainf**kの命令に対応するよう変換する。

branfu*k コンパイルとかでググるとbranf**kのコードを実行してくれるサイトが出るのでそこに完成したコードをコピペして実行するとフラグがわかる。

なぜかすぐわかったし、適当に置換していって完全に実行可能になったのでこのときが一番脳がキレてたんだと思う。

crypt2

めちゃ長いよく分からない感じの文字列が書かれたファイルが渡される。

文字列の末尾が==で終わっているのでbase64エンコードされた文字列とわかる。

なので base64 -D < デコードするファイル名 > 書き込むファイル名 で変換。

このときに書き込むファイルの拡張子をtxtとかで変換し、そのファイルを開くとなにも書かれていないっぽく見えるテキストファイルが開く。

実はここに白文字でフラグが記述されている。

ファイルの拡張子をtxtにしなかった場合、そのファイルを binwalk コマンドで指定するとzipファイルがあることがわかるので、binwalk -e エンコードしたファイル でzipファイルを開けるようにする。

zipファイルを解凍すると.xmlで終わるフォルダが出てくる。 この中にあるxmlファイルと読んで行くと word microsoft うんたらみたいなキーワードが出てくるのでこのxmlのフォルダはwordファイルなんだなということが推測される。

なのでエンコードしたファイルの拡張子をdocxとかにしてあげるとwordファイルとして開くことが出来る。

開くと表示されている画像の後ろに白文字でフラグが記述されている。

一番時間かかったと思う。さんざん困って最終的に白文字オチで笑うしかなかった。

client

バイナリファイルが渡される。

実行権限を与えて実行してみると、><の文字だけ表示されて終了する。問題がネットワークの分野に分類されていたのでとりあえずwiresharkを起動、特定の通信を読みとる。(あまり憶えてない)

その通信をみるとhttp通信をしていることと、websocketが使われていることがわかる。(たしか)

clientというファイル名からwebクライアントかなにかでリクエストをしていることが予想されるのでwebsocketの通信が可能なサーバのコードを記述する。今回はnode.jsで記述した。

var app = require('http').createServer();

app.on("request", (req, res) => {
    console.log(req);
}).listen(8080);
var io = require('socket.io').listen(app);
io.sockets.on('connection', (socket) => {
    console.log(socket);
});

これでクライアントがフラグを表示してくれるようになる。

感想

友達とみんなでわいわいやりながら解いていったのでとても楽しかった。

そして回答中は先輩方がどんどんヒントを出してくれたのでソーシャルエンジニアリングが捗った()

結果は4人中2位。1人は途中からバイナリの問題しかやらんと言ってそれだけ頑張ってたので実質3人中2位。平凡。

遅刻して午後から来た友達が1位をさらっていったので悔しかったが、まあ初心者だしということでよしとしたい。

まだまだ問題はたくさんあったが、時間の関係で解ききれなかった。解ききれないくらい作問して下さった先輩方が超絶すごい。すごすぎて来年の今頃自分がそうなっている想像が出来ないのでかなり頑張らないといけなそうだった。きっと未来の僕が頑張ってくれていることだろう。