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ファイル)
解法
PPAPとは
パスワード付きZIPとパスワードを別便のメールで送っちゃうやつ
メールのパケットキャプチャーなのが想像できる。ということで、WireSharkを開いたら
「ファイル」->「オブジェクトをエクスポート」->「IMF」
4つのメールゲット!!
それぞれ中身を見ていくと「秘密鍵送るね!!」と「tls通信しようね!!」みたいな感じのやり取り。
その秘密鍵を使って、pcapの暗号化された通信を覗くのかな?ということで、ChatGPTを使ってpemをきれいに成形してもらって「1.pem」「2.pem」として保存します。
PEMとは
-----BEGIN PRIVATE KEY-----
から
-----END PRIVATE KEY-----
で終わるメールを暗号化するときのファイル
つぎにWireSharkで、このpemファイルを読み込ませて、暗号化された通信を見ていきましょう。
WireSharkの検索欄から「tls」と入力してtls通信を見ていきます。
今の状態では、暗号化されておりデータがあることしかわかりません。
そのため、適当な行で右クリックをし、「プロトコル設定」->「Transpot Layer Secure」からRSA Keyリストを選択します。
次に+ボタンから2つのpemファイルを追加します。
追加が終わると、データの存在のみ分かっていたものの、中身がわかるようになりました!!
通信内容を見ていくのですが、便利なので、「分析」->「追跡」->「TLSストリーム」としてTLS通信の中身を分かりやすく表示させます。
適当に、右下のストリーム番号を増やしていくと、7番でやけに長い通信内容があります。
メールで「ZIPとPassWord送るわ!!」みたいな会話でzipファイルがあることがわかります。
これを適当にans.txtとかにして保存してzip部分を抜き出します。
ZIPファイルが見つかったので、これ以降のストリームでPassWordがあると推測できますね。
すると、次のストリームで「The password is d48pwbc7」とパスワードがわかりました。
次に、zipとPWで解凍するとsecret.pcapが見つかります。
この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であることが確認できます。
ちゃんと認識してくれました!!
あとはH.264を抽出してmp4に直せばそれがきっとフラグのはず
WireSharkでH.264を抽出する方法として
を使用します。これは、H.264を抽出してくれる便利なWireSharkの拡張機能です。
導入方法
DownloadZipからダウンロードして解凍します。
その中の.luaファイル2つあるので、
C:\Program Files\Wireshark\plugin
の中にコピーします。
抽出ツールを使用するために、「ツール」->「Extract h264~」を選択します。
保存先が表示され正しく保存されます。
ただ、これでは.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でやりました
この動画を見ると...
と思いましたが動画の最後に無事フラグがあって安心しました。
以上の流れで回答できます。