CTF初参戦4完！〜SECCON Beginners CTF 2023 Writeup〜

SECCON Beginners CTF 2023で、CTFに人生初参戦で4完できましたので、Writeupと称されるセキュリティコンテストの参戦記を投稿します。

実際の解答につながる肝心なところは記述しませんので、安心してお読みください。

SECCON Beginners CTFは、セキュリティコンテストの中でもビギナー向けとされていて、年1回開催されるもの（のはず）です。今年度は、2023年6月3日（土）14時〜2023年6月4日（日）14時の間の、24時間で行われました。

なお、競プロer7人でチームを組み、Rank108 / 778 teams という最終成績でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/3514083c-234f-6d0d-0d06-ff76aca08577.png)

### チームメイトのWriteupリンク

- [【writeup】中学生たちと挑む、初めてのハッキングコンテスト【SECCON Beginners CTF 2023](https://qiita.com/BinomialSheep/items/6c767697ebaca3afec9c)

# 1. 筆者のバックグラウンド

- AtCoderアルゴ水（メイン言語 PyPy）、ヒューリスティック黄（メイン言語 Rust）
- JDLA-G検定/E資格保有
- すでに失効しているが、Cisco CCNA、Cisco DevNet資格保有歴あり
- ネットワーク系のSIに長年従事（最近はあまり現役ではない）
- インターネットサーバやセキュリティにもある程度知識あり
- 個人開発で、スマホアプリ〜フロントエンド〜バックエンド、さまざまな言語・フレームワークの利用経験あり

CTFは何となく存在をしっていましたが、全くやったことはありませんでした。開催3日前の時点で、CpawCTFの超初心者向けである最初の問題の解き方すら、わかっていませんでした。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/217fabd5-df7b-c8a7-1ec2-048b0d400dc9.png)


# 2. 参戦までにやったこと

- [CpawCTF](https://ctf.cpaw.site/)のLevel2までを、開催3日前に取り組み初めて、当日の午前までかけて終わらせました。
- 書籍「[入門セキュリティコンテスト](https://amzn.asia/d/enO8cXV)」をざっと読みました。なお本書は入門向けといいつつ、とてもレベルが高く、少なくとも今回大会で解いたEasyまでの問題よりも、高いレベルの問題を題材としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/738b7c29-c7fc-ddd2-5bf6-171dde8e9a10.png)

# 3. 参戦記

本番では以下の3.4までの4問に正答でき、残り1問は解答前に時間切れとなりました。

> 以降の表題で「AC」とあるのは、競プロ用語で「Accepted（正答）」の意味です。

## 3.1. web Forbidden（2023-06-03 15:42 AC）

この問題もそうですが、基本的には、脆弱性があるサーバーが動作しているURLと、その実装がほぼそのまま含まれるtarボールが提供されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/47c0d8fb-70b5-7fac-5a46-c7bd0c3b1b03.png)

tarボールをダウンロードして、ローカル環境に展開することが第一歩となります。以下のような形で、Webアプリの実装、Webサーバを含めたDocker用のファイルが展開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/c47a43d5-fd04-863e-1094-bcc6c923266f.png)

最初に肝心なのは、個々の問題の「ルール」 = 何をするとFLAGが入手できるのか、を理解することです。

この問題の場合、特に`app/index.js`を見ることで以下の「ルール」が理解できます。

- node.jsのexpressというフレームワークを利用している
- block関数（リクエストパスに'`/flag`'が含まれていたらForbiddenを返す）をかいくぐって、`/flag`ファイルを取得すれば勝ち

「ルール」を理解したら、自分の知識・ググり力・実際に動作を試してみる、といったことを駆使して、ルールを満たす「答え」を探します。

幸いにして、2時間かからずに、「答え」を得ることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/443a4ee3-81f4-79c3-b65c-6d07b8204c93.png)

## 3.2. misc YARO（2023-06-03 17:08 AC）

本問題の「ルール」は、YARAというシグネチャーマッチング型のマルウェア検出ツールがサーバにインストールされている前提で、サーバにあるマルウェア（=FLAGファイル）の中身を見つけることです。YARAは、正規表現をつかうことで、自由度の高いマッチングが可能です。

他の問題でも頻出の形式として、サーバとの通信に、決められたポートでのテキスト送受信ができる`nc`コマンドを利用します。`nc`コマンドで、サーバ側のYARAへ指示を行います。

しかしながら、YARAは「マッチした or しない」のみを返すため、正規表現で幅広くマッチさせた場合、実際のFLAGの中身がどうだったかは答えてくれません。この課題を解消するために、`nc`コマンドを繰り返し使う必要があり、`nc`ライクな通信をPythonプログラムから実行するプログラムを作りました。以下の記事が大変役立ちました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/333b6368-e889-df90-2df3-1257f125130d.png)

プログラム作りは、競プロのレベルからすると簡単であり、1時間と少しで、本問題を解くことができました。

以降の土曜日のうちは、夕食の後、チームメイトが苦戦している別問題に取りつきましたがチームメイトが無事ACしたのと、競プロ参戦のため、CTFの進捗はありません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">せっかく初の6完なのにUnratedかー😭<br>ctfやっていれば良かった</p>&mdash; toast-uz (@ToastUz) <a href="https://twitter.com/ToastUz/status/1665005074949734400?ref_src=twsrc%5Etfw">June 3, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 3.3. web aiwaf（2023-06-04 10:08 AC）

ここからは2日目である日曜日の起床・朝食後の取り組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/1141d2eb-cd46-31bc-007e-c80648eb1210.png)

本問題の「ルール」は、パストラバーサルという著名なハッキングを行うことです。

しかしながら、なんとOpenAIに対して、「このリクエストはパストラバーサルかどうか？」というプロンプトがサーバ側で走り、パストラバーサルであるとOpenAIが答えたらアクセスを遮断する、という「aiwaf」が組み込まれています。

時代の先端をいく問題であり、とても楽しめました。

> aiwafの"waf"とは、Wab Application Firewallの略です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/107827bd-f1f4-8e81-ca16-fa998d4c3ffd.png)

そこで、自分もChatGPTを立ち上げて、リクエストがパストラバーサルになるかどうか、なるとしたらどういう理由からか、をいちいち確認しながら、この「aiwaf」の回避方法を探しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/5ba11543-951d-a4a6-b7da-e8dc01f63653.png)

そして、ついに、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`には正常サイトしか認識されていない、という状態を作ることに成功しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/fbf2d879-eb31-4f7c-319d-5aac6dada5bc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/cecad40d-5e0a-84c1-3975-baa34b37afe8.png)

# 4. おわりに

セキュリティコンテストは、インフラ〜アプリおよびフロント〜バックに幅広く経験を持つ、自分のようなバックグラウンドを持つ人間にとって、向いている競技だと思いました。

また、チームを組んでの戦いが、普段の競技プログラミングとは違って、とても楽しかったです。競プロでもPGBATTLEのようなチーム戦はあるのですが、基本的に競技中の相談は禁止であるため、CTFとはだいぶ雰囲気が違います。

なお、ゆるい雰囲気ながら、事前情報整備や、本番中のコミュニケーションのやり方など、チームリーダーの運営が、とても優れていたと思います。

また、機会あれば、挑戦したいと思います。