[TryHackMe] Advent of Cyber '24 — Side Quest 1: Operation Tiny Frostbite [Writeup]

![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/ceca8441-470a-2455-e65a-0697c7ed3fef.png)

TryHackMeで開催されたAdbent of Cyber '24のSide QuestのWriteupです。
筆者はセキュリティ勉強歴3ヵ月弱の初心者ハッカーです。
イベントに参加した記録として初めてWriteupを書いてみます。
すべての問題を自力で解いたわけではないことと、他の方の解法を参考にしている箇所があることをご承知おきください。

# T1 Keycard
T1 KeycardはMain QuestのDay1から見つけられます。
Main Quest内のURLを見てみます。

https://github.com/Bloatware-WarevilleTHM/CryptoWallet-Search/issues/1

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/aeedc5e2-06c3-42f2-95a8-f73ca29f0593.png)
MM-WarevilleTHMの質問に対してBloatware-WarevilleTHMが答えています。
Bloatware-WarevilleTHMのアカウントを見てみましょう。

https://github.com/Bloatware-WarevilleTHM

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/600feb5a-9a52-ceb1-817d-73a60e12b9ba.png)
C2-Serverというレポジトリがありました。
Flaskでサーバーを立ち上げているようですが、`secret_key`がそのまま記載されています。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/133fa435-95b7-a90e-3172-92b8fe41ce4d.png)
調べてみると、Flaskの`secret_key`はセッションを管理するCookieの署名に使われるようです。

また、CryptoWallet-Searchというレポジトリの方にはC2サーバーのURLとして`http://papash3ll.thm`が指定されていました。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/712aa643-5cb9-18ff-d6f2-6c729f22756d.png)

`/etc/hosts`にドメインを追加してウェブサイトを見てみましょう
```bash
sudo -- sh -c "echo '<MACHINE_IP> papash3ll.thm' >> /etc/hosts"
```
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/40ff682c-3802-7871-5c5a-24a0beec3db4.png)
リポジトリにあったユーザーネームとパスワードを試してみますが、パスワードが変更されているらしくログインはできないようです。

しかし、`secret_key`がハードコーディングされていたため、これで偽のCokkieを作ればログインできそうです。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/a66d63ef-17fe-6274-2002-55ee8ee1166a.png)
`logged_in`を`True`、`username`を`admin`としてCookieを生成します。
Cokkieの生成には[flask-unsign](https://github.com/Paradoxis/Flask-Unsign)を用います。
```bash
pipx run flask-unsign --sign --cookie "{'logged_in':True, 'username':'admin'}" --secret '@09JKD0934jd712?djD'
```
生成されたCookieをsessionとしてブラウザに追加します。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/4f26826f-9e61-1981-1960-be2f68ceacc1.png)
ログインできました。
`/data`からT1 Keycardが入手できました。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/a1ab2f51-6db1-cd72-c559-67402a36d915.png)

# [Task1]What is the password the attacker used to register on the site?
Side Questの[Room](https://tryhackme.com/r/room/adventofcyber24sidequest)からマシンを立ち上げ、`http://MACHINE_IP/aoc_sq_1.zip`からzipファイルをダウンロードします。
ダウンロードしたzipファイルはT1 Keycardに書かれているパスワードで解凍できます。
~~どうしてパスワードを画像ファイルにしたのでしょうか？discordでミスタイプ者が続出していました~~

zipファイルの中身はpcapファイルだったのでWiresharkで開いてみます。
16万パケットもあります。
一つひとつのパケットを見ていくことは不可能なので、フィルターをうまく活用しましょう。

Ctrl+Fで`password`という文字列を探してみます。
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/b94f78d3-5804-4cb5-efe4-8a251a9fa319.png)
見つけました。

# [Task2]What is the password that the attacker captured?
Task1と同様に`password`を検索してみます。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/587f38cb-3aeb-4b7b-f5f5-f3391edc956d.png)
見つかりました。

# [Task3]What is the password of the zip file transferred by the attacker?
転送したzipファイルのパスワードを答える問題ですが、まずはそのzipファイルを探します。

## Find ZIP File
Wiresharkで`[File]->[Export Objects]->[HTTP]`から探してみます。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/73374657-5a3a-7900-563d-9a3ba30c5a13.png)
zipファイルは見つかりません。
ここでしばらく悩みましたが、chatGPT先生より戴いたアドバイスをもとにマジックナンバーで探してみます。
zipファイルのマジックナンバーは`50 4b 03 04`です。
![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533830/3b34733d-27ae-8054-e42a-74c9eb133124.png)
ありました。

パケットを右クリック、`Follow->TCP Stream`からストリームを表示し、`Show as`を`Raw`としてから保存します。
`zipinfo`で詳細を確認してみます。
```
Zip file size: 1247 bytes, number of entries: 1
-rw-r--r--  3.0 unx     2490 TX defN 24-Nov-13 09:08 elves.sql
1 file, 2490 bytes uncompressed, 1051 bytes compressed:  57.8%
```
sqlファイルが圧縮されているようです。
このファイルを開くことができたらTask4にも答えられそうですね。

## Find Password of ZIP File
zipファイルにはパスワードがかかっていますので、一応`rockyou.txt`で開けないか試しましたが無理でした。
少々セコイですが回答フォームからパスワードの文字数が21文字であるとわかります。
総当たり攻撃も難しそうですね。

ここでまたしばらく停滞していました。
pcapファイルから21文字の可読文字を抽出したりしましたがうまくいきませんでした。

Wiresharkと睨めっこすると、9001番ポートを用いて通信を行っている73832のTCPストリームが怪しいことはわかるのですが、通信が暗号化されています。

このストリームの直前に`ff`というelfファイルが攻撃者からターゲットにアップロードされているので、恐らくこのファイルが暗号化された通信に関わっている筈です。

`[File]->[Export Objects]->[HTTP]`から`ff`を保存しghidraでリバースエンジニアリングを試みましたが複雑すぎて諦めました。

ここでチームを組んでいた人がある発見をしました。
Task1とTask2の答えを組み合わせるとbase64で変換できるようです。
[CyberChef](https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false))を用いて変換すると、`Tiny Shell`という文字列を含む文章が得られました。

Googleで検索すると**Tiny Shell**というリバースシェルのOSSがあるようです。

https://github.com/creaktive/tsh

どうやら通信内容はAESで暗号化されているようです。
暗号化に用いられる秘密鍵は`ff`ファイルをstringsで分析すると発見できました。
```bash
$ strings ff
---(略)---
accept
SuP3RSeCrEt
../sysdeps/x86/dl-cacheinfo.h
---(略)---
```
githubでこのリバースシェルの通信内容を復号するツールがないか探してみます。

https://github.com/CaseemHaxx/Rekobee-Analyzer

ありました。
実際にはこれのクローン元となるリポジトリを発見したのですが、現在そちらは削除されているようです。

73832のTCPストリームを抽出して保存し、複号してみます。
```bash
python3 analyze.py -c filtered.pcap -s SuP3RSeCrEt -vv
```
これでZipファイルのパスワードをゲットできました。
~~同時に私の数時間に及ぶコーディングも無駄になりました。~~

# [Task4]What is McSkidy's password that was inside the database file stolen by the attacker?
Task3で発見したパスワードを用いてZipファイルを解凍すると、`elves.sql`というファイルが手に入ります。

これはただのtextファイルなので`cat`で開くとmcskidyのパスワードが得られます。

Task1からTask4までのすべてのパスワードをつなげてbase64で変換すると`AOC2024{Tiny_Tiny_Tiny_Sh3ll_can_EncrypT_bUt_it_Is_N0t_F00lpro0f}`という文字列が得られました。

# 参考
https://qiita.com/koki-sato/items/6ff94197cf96d50b5d8f#flask-%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86

# 最後に
Task3は公式Discordを見ても多くの人が躓いているようでした。
InsaneよりのHardといったところでしょうか。
私もチームメイトとの協力がなければ解けなかったと思います。

[Side Quest2](https://qiita.com/Vixmy/items/1ac8d0fd7a3451e5fa53)
[Side Quest3](https://qiita.com/Vixmy/items/5a269e32e0cd4c566adb)
[Side Quest4]()(まだ)
[Side Quest5]()(まだ)