[Security] CpawCTFを全クリした話

# はじめに

タイトル通り、これは筆者が [CpawCTF](https://ctf.cpaw.site/) をクリアした時の話です。

## そもそもCTFとは

- Capture The Flag の頭文字をとって "CTF" です。日本語に訳するなら「旗取りゲーム」といった感じでしょうか
- といっても本当に木の棒と布で作った旗を取るのではなく、システムに隠された「フラグ(=何かしらの目印のついた文字列)」を探し出すゲームです
    - 例えばCpawCTFの場合は `cpaw{hogehoge}` といった形式でフラグが与えられます。この文字列を回答欄に入力すればクリアになります
- ここで言うCTFはサイバーセキュリティ分野で使われる言葉で、システムやソフトウェアなどの脆弱性を突いてフラグを見つけることができればクリアというようなものです
- CTFは国内外で様々なコンテストが開催されているそうです。CpawCTFはその中でも常設型とでも言えるものだと思います。つまり時間制限等はなく、好きなタイミングで好きなだけ時間を使って問題を考えることができます。(その辺のレギュレーションはコンテストごとに様々なのだろうと想像しています)

## CpawCTFとは

- 日本語の初心者向けCTFサイトを調べると真っ先に候補に出てくるサイトです
    - リンクは記事の最初に貼ってあります
- 初心者向けと謳っているだけあって、CTF未経験者の筆者でも何とか全クリできるレベルのものでした。少しでもIT系の知識をかじったことがあれば解けると思います(自力で調べたり考えたりなどの手間は必要ですが)
- 出題分野はWeb系の問題から暗号解読に関する問題など様々。全10種類
    - 詳細は[公式サイト](http://q9.ctf.cpaw.site/)に書いてあります

## なぜCpawCTFを解こうと思ったのか

- セキュリティに興味があるからです
- もう少し経緯を話すと、以下のような感じです
    - 入社前から元々セキュリティに興味があり、ブルーバックスの一般向けの本などを読んでいました
    - そんな折に、研修の一環で初めてCTFに触れて興味を持ち始めました
        - 新入社員向けの技術研修の中にセキュリティについての講義があり、その中にCTFを体験してみよう！というワークショップがありました
    - そして何か初心者でもできそうなCTFはないかと探して、最終的にCpawCTFに辿り着きました

# 本題

## クリアの証

- まずは記事タイトルが偽りではないことの証明(？)として、クリア時のスクリーンショットを掲載します

![スクリーンショット 2024-07-11 20.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726845/5aad00ff-47b4-5b73-ee19-a61a20cfb4b7.png)

↑全ての問題の Solved 欄に OKがついています。


## 進め方

- 愚直に1問目から順番に解いて行きました。ジャンルとかはあまり意識しなかったです
- 進めるペースは1日5~10分ほどでした
    - モチベが高い日やあとちょっとで解けそうという時は、少し時間を延長したりもしました
- 1問ごとにかける時間は問題によってバラツキがありました。数秒で解けるような問題もあれば、1週間近くかかった問題もありました
- 問題の解き方を直接解説しているようなサイトもありましたが、それらは一切参照しませんでした。その代わり、Google検索やChatGPT等はほぼ無制限に使っていました
    - ChatGPTを使う際には、流石に問題文を丸投げするようなことはしませんでした
    - ChatGPTは教師として非常に優秀で、問題を解くヒントを得ながらついでにその周辺知識を学習することができました

## 全問クリアしてみた雑感

### 遊びとしてどうか

- ただただ楽しかったです。難易度の上がり方も絶妙で、理不尽な問題はほとんどなかったような気がします
- ルールが「とりあえずフラグを見つけさえすれば良い」という非常にシンプルなものだったので、ゲームとして遊びやすかったです
- 対象に関する知識が乏しくてもフラグさえ見つけられればクリアできるというある種の「甘さ」があったため、初心者でも遊びやすく感じました

### セキュリティの勉強としてどうか

- 目の前に解かなければならない問題があるため、自然と頭と手が動きました。ゲーミフィケーションの強みが出ていたと思います
- ただし、問題を解くだけだとクリアに直接必要な知見しか得られず、断片的な知識しか貯まらないような気がします
    - 体系的な知識のインプットは別で用意したほうがいいかも
- とはいえ自分で頭を捻って問題が解けると気持ちよく、その時に得た知識は定着しやすい印象があります
- 今後セキュリティの知識をインプットする際に、少しでも以前cpawCTFで触れた知識があると吸収速度が速くなるような気がします
    - いちいち知らない単語でつっかえたり、調べたりする手間が省けて効果的に学習できるような気がします

## 特に印象に残った問題

- 個人的にはパケットキャプチャファイルを解析する問題が印象深かったです。筆者はパケットキャプチャファイルという言葉すら知らなかったので、その解析となると本当に未知の領域でした
    - 初めての経験ながら、キャプチャファイルと睨めっこしながらフラグを探り当てるのは宝探しみたいで楽しかったです
    - もちろんWireSharkを使うのも初めてでした

- 画像に仕込まれているドットをモールス信号として解釈したり、パワポ資料の図形をどかして裏にあるフラグを探したりなど、頭の柔軟さを問われるような問題もありました。この手の問題は解けた時すごく気持ちよかったです

### 問題を解いた時のログ

- 一部の問題は、解いた時のログを残していました。折角なので公開しようと思います
- 分からなかった人へ解説する意図ではなく、あくまで記念に記録を残しておこうというものです。回答解説が見たい方は、ウェブ上にもっと優れた文書があると思うので探してみてください

※当然のように問題のネタバレを含むので、自力で解いてみたいという人は今すぐブラウザバックお願いします

----

※問題文は CpawCTFの公式サイトで見てください

- Q21.[Reversing]reversing easy!
    - stringsコマンドをしたら答え出てきた
    - elfファイルの解析方法
        - 参考: https://kashiwaba-yuki.com/ctf-elf-training

- Q22. SQL stage1
    - 問題文にあるテーブルをとりあえず表示してみたら答え発見
    - ぱろっくさんの絵文字がお茶目でかわいい
    - さりげなく次の問題への導入も隠されていた

![スクリーンショット 2024-06-21 21.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726845/d563aea7-2fb8-2742-d7d5-80bd59395a95.png)

- Q23.[Reversing]またやらかした！
    - ghidraをインストールして逆コンパイル
    - デコンパイル結果をコピペして、再度実行 (decompile_rev200.c)
    - どうもlocal_7cとlocal_44が大事っぽいので、この結果を出力してみた
    - 出てきた文字列は、0x69のような4つの英数字の組が16個並んでいた
    - 16進数表記のASCIIコードに対応してそうだったので、変換してみた
    - 変換したら、local_44に答えらしきものが出てきた

- Q24. SQL stage2
    - Q.22のURLにアクセスした後、SQLインジェクションではお馴染みの以下の文字列を入力したら即クリアになった

```sql
' OR '1'='1
```

![スクリーンショット 2024-07-04 18.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726845/0cc9f898-9a1c-a5c2-f6f1-8225f13de97f.png)
↑やけにクセと主張の強いクリア画面

- Q26.[PPC]Remainder theorem
    - 問題文通り剰余定理の話
    - 脳死で以下のようなpythonスクリプトを組んで解いてみたが、もっと良い解き方はあるかもしれない
    - (正直いうと出題意図をあまり理解してない)

```python
x = 0
y = 0

while True:
    a = 1584891*x + 32134
    b = 3438478*y + 193127
    if a == b:
        print(a)
        break
    elif a > b:
        y += 1
    else:
        x += 1
```

- Q28.[Network] Can you login？
    - pcapファイルを解析したところ、何かしらのサイトにログインしている様子
    - パスワードとユーザーネームはわかるが、直接フラグらしきものはなし
    - このpcapでアクセスしているサイトに自分でアクセスして、ユーザー名とパスワードを打ち込む？
        - ユーザー名: cpaw_user
        - パスワード: 5f4dcc3b5aa765d61d8327deb882cf99
    - ↑をどこのサイトに打ち込めば良いか分からん
        - [ns1.gslb2.sakura.ne.jp](http://ns1.gslb2.sakura.ne.jp/) -> つながらず
        - q28.ctf.cpaw.site -> 関係ないページにいくだけ
        - 118.27.110.77 -> これもcpawのサイトに行くだけ
    - 上のIPアドレスに対しLinuxでftpコマンド叩いてみた -> フラグを含むファイルをDLできた

```jsx
$ ftp 118.27.110.77
Connected to 118.27.110.77.
220 Welcome to Cpaw CTF FTP service.
Name (118.27.110.77:hogehoge): cpaw_user
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

```

```jsx
ftp> ls -la
229 Entering Extended Passive Mode (|||60007|)
150 Here comes the directory listing.
drwxr-xr-x    2 ftp      ftp            42 Mar 17  2021 .
drwxr-xr-x    2 ftp      ftp            42 Mar 17  2021 ..
-rw-r--r--    1 ftp      ftp            39 Sep 01  2017 .hidden_flag_file
-rw-r--r--    1 ftp      ftp            36 Sep 01  2017 dummy
226 Directory send OK.
ftp> get .hidden_flag_file
local: .hidden_flag_file remote: .hidden_flag_file
229 Entering Extended Passive Mode (|||60024|)
150 Opening BINARY mode data connection for .hidden_flag_file (39 bytes).
100% |***********************************|    39      221.42 KiB/s    00:00 ETA
226 Transfer complete.
39 bytes received in 00:00 (5.60 KiB/s)
```

- Q29.[Crypto] Common World
    - chatGPTに聞いたところ、 (e,N)というのはRSA暗号で使われてるやつらしい
        - 公開鍵が (e,N)、秘密鍵が (d,N)
        - e: 公開指数, d: 秘密指数, N: モジュラス
        - Nが大きな素数p, q の積
    - ここまでは分かった。dとeがそれぞれ何で、暗号化と複合化の時にこれらの数字をどうすれば良いかはまだ理解できていない
    - 数学的な話も理解したいが、時間がかかりそう。問題を解くにあたってはいったん結論だけ見てみよう
    - 参考: [RSA暗号を理解して有名な攻撃を試してみる](https://zenn.dev/anko/articles/ctf-crypto-rsa#%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%99%E3%81%8E%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84-(low-public-exponent-attack))
        - ↑仕組みと攻撃方法を詳しく書いてある。ひとまず攻撃方法のところを見ると以下で行ける模様 -> 本当にいけた

```python
import gmpy2
m = gmpy2.iroot(c, e)[0]
```

# おわりに

いかがでしたでしょうか。
最後のログを読んでくださった方なら薄々気づいているかもしれませんが、「何となくやったら解けちゃった」的な問題も結構あります。なので、セキュリティの勉強をする上ではもう少し体系的な勉強(=座学)が必要になるかな、と感じています。ひとまず[『ホワイトハッカー入門』](https://www.amazon.co.jp/%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E5%85%A5%E9%96%80-%E9%98%BF%E9%83%A8%E3%81%B2%E3%82%8D%E3%81%8D/dp/4295010022)を読み始めました(←※記事書いている間に読み終わりました。次は何を読もうか……？)。
ともあれ、CTF未経験の自分でもそこそこ問題を解けるのだなと自信がつきました。加えて、セキュリティの勉強をするとっかかりにもなったかなと感じています。CpawCTFにチャレンジしてみて良かったと改めて感じています。
ちなみに、このCpawCTFは続編のCpawCTF2があるそうです。もう少しセキュリティの知識がついたら解いてみようかなと思っています。