i3CTF WriteUP  ppap [Network]

# i3CTF ppap 解法

> 忘れちゃったけど、なんかやったことある...
と、なってしまったので雑に自分のために

## 問題
We have obtained top secret data on "tare", an important person. I want you to uncover tare's secret in this file.

+zipファイル(pcapファイル)

## 解法
:::note info
PPAPとは
パスワード付きZIPとパスワードを別便のメールで送っちゃうやつ
:::
メールのパケットキャプチャーなのが想像できる。ということで、WireSharkを開いたら
「ファイル」->「オブジェクトをエクスポート」->「IMF」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/5a1bbaf0-91f2-eb5f-9308-80ccdb922572.png)

4つのメールゲット!!

それぞれ中身を見ていくと「秘密鍵送るね!!」と「tls通信しようね!!」みたいな感じのやり取り。

その秘密鍵を使って、pcapの暗号化された通信を覗くのかな？ということで、ChatGPTを使ってpemをきれいに成形してもらって「1.pem」「2.pem」として保存します。

:::note info
PEMとは
-----BEGIN PRIVATE KEY-----
から

-----END PRIVATE KEY-----
で終わるメールを暗号化するときのファイル
:::

つぎにWireSharkで、このpemファイルを読み込ませて、暗号化された通信を見ていきましょう。

WireSharkの検索欄から「tls」と入力してtls通信を見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/832efe3d-4f2d-a555-6702-73d842677028.png)

今の状態では、暗号化されておりデータがあることしかわかりません。

そのため、適当な行で右クリックをし、「プロトコル設定」->「Transpot Layer Secure」からRSA Keyリストを選択します。
次に＋ボタンから2つのpemファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/369e9e6c-59a3-808f-d1ea-68f8d8d4d637.png)

追加が終わると、データの存在のみ分かっていたものの、中身がわかるようになりました！！

通信内容を見ていくのですが、便利なので、「分析」->「追跡」->「TLSストリーム」としてTLS通信の中身を分かりやすく表示させます。

適当に、右下のストリーム番号を増やしていくと、7番でやけに長い通信内容があります。

詳しく見ると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/35e23ad6-156c-04fe-30d5-1116b6208f62.png)

メールで「ZIPとPassWord送るわ！！」みたいな会話でzipファイルがあることがわかります。

これを適当にans.txtとかにして保存してzip部分を抜き出します。

ZIPファイルが見つかったので、これ以降のストリームでPassWordがあると推測できますね。

すると、次のストリームで「The password is d48pwbc7」とパスワードがわかりました。

次に、zipとPWで解凍するとsecret.pcapが見つかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/7f6682df-994c-ea83-57ff-7975ec3d2a3d.png)


このsecret.pcapを見ると「RTP」プロトコルが目立ちます。

これは動画配信とか見るときに使用されるプロトコルですね。


さっきのメールの続きがあるかもしれないと思い見てみると
「it appears that H.264 is used for encoding the video.」
H.264でエンコーディングされたやつっぽいので、WireSharkで正しく認識できるように設定していきます。

secret.pcapで「編集」->「設定」->「protocols」->「H.264」でpayload types(s)を96に設定してあげることで認識してくれます。これは、「a=rtpmap:96 H264」という部分から、ペイロードタイプが96であることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/f5bc37ed-ed09-6813-50ae-3883c7c7c1d9.png)

ちゃんと認識してくれました！！


あとはH.264を抽出してmp4に直せばそれがきっとフラグのはず

WireSharkでH.264を抽出する方法として

https://github.com/volvet/h264extractor

を使用します。これは、H.264を抽出してくれる便利なWireSharkの拡張機能です。

<details><summary>導入方法</summary>

DownloadZipからダウンロードして解凍します。
その中の.luaファイル2つあるので、
```
C:\Program Files\Wireshark\plugin
```
の中にコピーします。
</details>

抽出ツールを使用するために、「ツール」->「Extract h264~」を選択します。

これを実行すると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/983de356-d343-91df-ddd0-bb0769af1f96.png)

保存先が表示され正しく保存されます。

ただ、これでは.264というファイルのままで中身を確認することができません。

なので、これをmp4に変換します。

ffmpegが入っている環境で以下のプログラムを実行します。
ChatGPTは便利ですね。


```
import subprocess

def convert_264_to_mp4(input_file, output_file):
    """
    .264ファイルを.mp4に変換する関数
    """
    try:
        # ffmpegコマンドの実行
        subprocess.run(
            ['ffmpeg', '-i', input_file, '-c:v', 'libx264', '-preset', 'fast', '-crf', '23', output_file],
            check=True
        )
        print(f"変換成功: {input_file} -> {output_file}")
    except subprocess.CalledProcessError as e:
        print(f"エラー: {input_file}の変換に失敗しました。\n{e}")

if __name__ == "__main__":
    # 入力ファイルと出力ファイルのパスを指定
    input_file = "video.264"  # 変換元ファイル
    output_file = "video.mp4"  # 変換後のファイル
    convert_264_to_mp4(input_file, output_file)
```
> ちなみにffmpeg入れるのはUbuntuのほうが簡単そうなのでWSLでやりました

この動画を見ると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810599/7ae8ea2d-21d5-ed15-91da-6a6a3bdbc4e8.png)

:angry: 

と思いましたが動画の最後に無事フラグがあって安心しました。

以上の流れで回答できます。