前回記事に引き続け!
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で見ていく。 これはUSBのパケットキャプチャであることが分かる。
接続されたデバイスを確認
wiresharkを使って例えば「usb.bcdDevice」とフィルタをかけると「GET DESCRIPTOR Response DEVICE」のパケットのみ表示されて、それぞれのパケットの「DEVICE DESCRIPTOR」を見ると接続されたUSBデバイスに関する情報がある。今回は5つのUSBデバイスがあるようだ。 接続要求時の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」となっていた。 フラッシュドライブなら何かデータ転送してそうなので、「usb.device_address == 16」とフィルタを設定して調べる。 パッと見づらいのでデータ転送してそうな「Data In LUN」してる「usb.src == "1.16.2"」のフィルタをかける(適当)。 とりあえず、Lenが多い順にずらっと見ていくと読める文字があったりするがよく分からない。ここで順に見ていくと、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}
やろうと思えばデータの転送からパスワードを入力まで筒抜けなわけですね。