4ensiX

4ensiX

FPと言ったものはFPを選んだが表示はTPになっていることに気づいた。

Strange PCAP - HackTM CTF 2020 Forensic writeup

前回記事に引き続け!

zarat.hatenablog.com

Strange PCAP

問題文

We managed to get all the data to incriminate our CEO for selling company secrets. Can you please help us and give us the secret data that he has leaked?

Author: Legacy

与えられたファイルを開く

「Strange.pcapng」はパケットキャプチャファイルであるのでWiresharkで見ていく。

f:id:Zarat:20200301213455p:plain
とりあえずWiresharkで開いてみた
これはUSBのパケットキャプチャであることが分かる。

接続されたデバイスを確認

wiresharkを使って例えば「usb.bcdDevice」とフィルタをかけると「GET DESCRIPTOR Response DEVICE」のパケットのみ表示されて、それぞれのパケットの「DEVICE DESCRIPTOR」を見ると接続されたUSBデバイスに関する情報がある。今回は5つのUSBデバイスがあるようだ。

f:id:Zarat:20200301213837p:plain
usb.bcdDeviceでフィルタ
接続要求時のsrcは1.1.0 1.2.0 1.3.0 1.15.0 1.16.0、使用しているときのデータ転送では、アドレスが1.15.1であったり、1.16.2であったりと微妙にアドレスが異っているのはよく分からない。 取りあえず、「1.15.0と1.15.1とかは同じ 」という気持ちでやっていく。

Flash Driveの通信を調査

USBデバイスを確認したときに、usb.device_addressが16の「1.16.0」はusb.idProductが「Flash Drive」となっていた。

f:id:Zarat:20200301214347p:plain
Flash Drive
フラッシュドライブなら何かデータ転送してそうなので、「usb.device_address == 16」とフィルタを設定して調べる。
f:id:Zarat:20200301214649p:plain
usb.device_addresの指定
パッと見づらいのでデータ転送してそうな「Data In LUN」してる「usb.src == "1.16.2"」のフィルタをかける(適当)。
f:id:Zarat:20200301214909p:plain
1.16.2からの通信を見る
とりあえず、Lenが多い順にずらっと見ていくと読める文字があったりするがよく分からない。ここで順に見ていくと、No.1224のパケットが気になった。
f:id:Zarat:20200301215152p:plain
No.1224のパケット
「PK」ってあるし、「Flag.txt」とあるのでzipファイルの転送ぽい気がする。このパケットの「SCSI Payload」をエクスポートしてみる。ここでは、「data.zip」としてエクスポートしてみた。

$ file data.zip
data.zip: Zip archive data, at least v2.0 to extract
$ unzip data.zip
Archive:  data.zip
[data.zip] Flag.txt password:
   skipping: Flag.txt                incorrect password

zipファイルであることは確認できたが、暗号化されているようだ。暗号化されているということはパスワードもどこかにありそうな気がする。ということで探す。

zipのパスワードを捜索

なんとなく、暗号化zipをUSBから取り出したなら次はキーボードからパスワードを入力するのではという推測からNo.1224以降のパケットを中心に見ていく。
USBデバイスからの通信であり、「URB_INTERRUPT in」のメッセージ確認できるパケットに注目すると「usrb.src == "1.15.1"」の通信の多くがパスワード入力ぽい気がする。
ここで、入力データは「Leftover Capture Data」というセクションに保存されており、「usb.capdata」とフィルタすることで取り出すことができる。tsharkで以下のように指定することで欲しい情報を取り出した。

$ tshark -r Strange.pcapng -Y 'usb.src == "1.15.1" && usb.capdata && usb.data_len == 8' -T fields -e usb.capdata > keycapdata.txt

ここからキーボード入力の文字に変換するスクリプト作成のために色々と資料を探した。
資料

CTF Series : Forensics — tech.bitvijays.com
USB Hid Keyboard Scan Codes

GitHub - TeamRocketIst/ctf-usb-keyboard-parser: This is the updated script from https://teamrocketist.github.io/2017/08/29/Forensics-Hackit-2017-USB-ducker/

しかし、他のWriteupを見ているととても良いスクリプトを見つけたのでこれの紹介と共に利用する。
お手本USBパーサー

Strange PCAP – b00t – A cybersecurity blog

ここで利用されているもの使ってパスワードを取り出す。

$ python usbkeyread.py
7vgj4SSL9NHVuK0D6d3F[ENTER]

ここで良いスクリプトと言ったのは、判別できるキーボードが多いからである。Enterの入力まで綺麗に確認できた。これがパスワードだと仮定して入力する。

$ unzip data.zip
Archive:  data.zip
[data.zip] Flag.txt password:
  inflating: Flag.txt             
$ ls
Flag.txt  Strange.pcapng  data.zip  keycapdata.txt  usbkeyread.py
$ cat Flag.txt
HackTM{88f1005c6b308c2713993af1218d8ad2ffaf3eb927a3f73dad3654dc1d00d4ae}

見事flagゲット。
flag: HackTM{88f1005c6b308c2713993af1218d8ad2ffaf3eb927a3f73dad3654dc1d00d4ae}
やろうと思えばデータの転送からパスワードを入力まで筒抜けなわけですね。

その他参考資料

hanya-orz.hatenablog.com