SECCON Beginners CTF 2023で、CTFに人生初参戦で4完できましたので、Writeupと称されるセキュリティコンテストの参戦記を投稿します。
実際の解答につながる肝心なところは記述しませんので、安心してお読みください。
SECCON Beginners CTFは、セキュリティコンテストの中でもビギナー向けとされていて、年1回開催されるもの(のはず)です。今年度は、2023年6月3日(土)14時〜2023年6月4日(日)14時の間の、24時間で行われました。
なお、競プロer7人でチームを組み、Rank108 / 778 teams という最終成績でした。
チームメイトのWriteupリンク
1. 筆者のバックグラウンド
- AtCoderアルゴ水(メイン言語 PyPy)、ヒューリスティック黄(メイン言語 Rust)
- JDLA-G検定/E資格保有
- すでに失効しているが、Cisco CCNA、Cisco DevNet資格保有歴あり
- ネットワーク系のSIに長年従事(最近はあまり現役ではない)
- インターネットサーバやセキュリティにもある程度知識あり
- 個人開発で、スマホアプリ〜フロントエンド〜バックエンド、さまざまな言語・フレームワークの利用経験あり
CTFは何となく存在をしっていましたが、全くやったことはありませんでした。開催3日前の時点で、CpawCTFの超初心者向けである最初の問題の解き方すら、わかっていませんでした。。。
2. 参戦までにやったこと
- CpawCTFのLevel2までを、開催3日前に取り組み初めて、当日の午前までかけて終わらせました。
- 書籍「入門セキュリティコンテスト」をざっと読みました。なお本書は入門向けといいつつ、とてもレベルが高く、少なくとも今回大会で解いたEasyまでの問題よりも、高いレベルの問題を題材としています。
3. 参戦記
本番では以下の3.4までの4問に正答でき、残り1問は解答前に時間切れとなりました。
以降の表題で「AC」とあるのは、競プロ用語で「Accepted(正答)」の意味です。
3.1. web Forbidden(2023-06-03 15:42 AC)
この問題もそうですが、基本的には、脆弱性があるサーバーが動作しているURLと、その実装がほぼそのまま含まれるtarボールが提供されます。
tarボールをダウンロードして、ローカル環境に展開することが第一歩となります。以下のような形で、Webアプリの実装、Webサーバを含めたDocker用のファイルが展開されます。
最初に肝心なのは、個々の問題の「ルール」 = 何をするとFLAGが入手できるのか、を理解することです。
この問題の場合、特にapp/index.js
を見ることで以下の「ルール」が理解できます。
- node.jsのexpressというフレームワークを利用している
- block関数(リクエストパスに'
/flag
'が含まれていたらForbiddenを返す)をかいくぐって、/flag
ファイルを取得すれば勝ち
「ルール」を理解したら、自分の知識・ググり力・実際に動作を試してみる、といったことを駆使して、ルールを満たす「答え」を探します。
幸いにして、2時間かからずに、「答え」を得ることができました。
3.2. misc YARO(2023-06-03 17:08 AC)
本問題の「ルール」は、YARAというシグネチャーマッチング型のマルウェア検出ツールがサーバにインストールされている前提で、サーバにあるマルウェア(=FLAGファイル)の中身を見つけることです。YARAは、正規表現をつかうことで、自由度の高いマッチングが可能です。
他の問題でも頻出の形式として、サーバとの通信に、決められたポートでのテキスト送受信ができるnc
コマンドを利用します。nc
コマンドで、サーバ側のYARAへ指示を行います。
しかしながら、YARAは「マッチした or しない」のみを返すため、正規表現で幅広くマッチさせた場合、実際のFLAGの中身がどうだったかは答えてくれません。この課題を解消するために、nc
コマンドを繰り返し使う必要があり、nc
ライクな通信をPythonプログラムから実行するプログラムを作りました。以下の記事が大変役立ちました。
プログラム作りは、競プロのレベルからすると簡単であり、1時間と少しで、本問題を解くことができました。
以降の土曜日のうちは、夕食の後、チームメイトが苦戦している別問題に取りつきましたがチームメイトが無事ACしたのと、競プロ参戦のため、CTFの進捗はありません。
せっかく初の6完なのにUnratedかー😭
— toast-uz (@ToastUz) June 3, 2023
ctfやっていれば良かった
3.3. web aiwaf(2023-06-04 10:08 AC)
ここからは2日目である日曜日の起床・朝食後の取り組みです。
本問題の「ルール」は、パストラバーサルという著名なハッキングを行うことです。
しかしながら、なんとOpenAIに対して、「このリクエストはパストラバーサルかどうか?」というプロンプトがサーバ側で走り、パストラバーサルであるとOpenAIが答えたらアクセスを遮断する、という「aiwaf」が組み込まれています。
時代の先端をいく問題であり、とても楽しめました。
aiwafの"waf"とは、Wab Application Firewallの略です
そこで、自分もChatGPTを立ち上げて、リクエストがパストラバーサルになるかどうか、なるとしたらどういう理由からか、をいちいち確認しながら、この「aiwaf」の回避方法を探しました。
そして、ついに、ChatGPTを騙せるパストラバーサル方法を発見したのですが、最初に発見したクエリーは、OpenAIではパストラバーサルと判断されてしまい、正答にはなりませんでした。ChatGPTとOpenAIのAPIとは、微妙に異なる動作をするのですね。
その後、さまざまな試行錯誤のうち、明らかに騙せる方法を思いつくことができ、無事ACしました。
3.4. crypto Conquer(2023-06-04 10:51 AC)
本問題の「ルール」は、Pythonプログラムで定義された「暗号化」と、暗号データをもとに、元のデータであるFLAGを復号するというものです。
暗号化のアルゴリズムを良く読むと、ほぼ可逆な暗号化になっていたため、逆手順となるプログラムを記述することで、無事FLAGを得ることができました。
この問題は、競プロに慣れている人なら、解きやすかったかもしれません。暗号化にXOR操作を多用してあったため、AtCoderのARCに頻出なXOR操作の性質の理解が役立ちましした。
3.5. web phisher2(時間切れ)
残り時間で本問題に挑みましたが、やや時間不足でした。
この問題の「ルール」は一風変わっています。URLアクセス先をサーバプログラムに送り込むのですが、サーバ側では、Web画面イメージをOCRしたのも、Web画面をスクレイピングしたもの、の2通りが解釈されます。そして、前者は正常に見せつつ、後者は不正なURLに誘導する、という状況をつくることが求められます。その不正サイトのアクセスにおいて、リクエストパラメータにFLAGが含まれるようになっており、不正サイト側でリクエストパラメータを記録することで、FLAGが得られます。
最終的にACはできなかったので、上記の「ルール」が正しいかは未検証でしたが、その後upsolveして、正しいことを検証しました。
2
の無い初代phisher
が昨年度に主題されていることググればわかるとともに、昨年度はこう解いたというWriteup情報もあるため、参考になります。
試行錯誤により、上記の不正サイトへのアクセスはできるようになったものの、アクセス先のWebサーバを準備する時間は無く、タイムアップとなりました。
以下では、
input_url
には別サイトを含むものの、ocr_url
には正常サイトしか認識されていない、という状態を作ることに成功しています。
4. おわりに
セキュリティコンテストは、インフラ〜アプリおよびフロント〜バックに幅広く経験を持つ、自分のようなバックグラウンドを持つ人間にとって、向いている競技だと思いました。
また、チームを組んでの戦いが、普段の競技プログラミングとは違って、とても楽しかったです。競プロでもPGBATTLEのようなチーム戦はあるのですが、基本的に競技中の相談は禁止であるため、CTFとはだいぶ雰囲気が違います。
なお、ゆるい雰囲気ながら、事前情報整備や、本番中のコミュニケーションのやり方など、チームリーダーの運営が、とても優れていたと思います。
また、機会あれば、挑戦したいと思います。