概述
视频安全是一个老生常谈的话题,但是仍然应该被持续引起重视。记得15年看玄武实验室的红蓝对抗宣传视频,TK教主一声令下,使用我们新研究的技术(Badbarcode)。视频我已经找不到了,实际上也是通过内网中翻到的照片才知道目标使用条形码扫描器。这也说明在红蓝对抗中,视频安全可不止是个口子,或者是后渗透中权限维持(交叉编译mips后门)的一种方法,它更是一种信息收集的方法(物理入侵效果更为显著)。
本篇介绍视频云平台信息泄露篇的拓展和未授权访问篇
上篇提到了视频安防平台key的泄露,那么深入思考和联想,其实摄像头大多使用RTSP的协议族群。同样的,在视频厂商对客户的定制化需求二开过程中存是否在着泄露问题?
我们对RTSP协议在github进行了搜索,发现确实存在此问题。
分布情况
github分布
使用特定搜索语法得到67,564个rstp视频流相关仓库代码,其中文本类型第一,C++第二,C第三,Roff Manage第三。
fofa分布
protocol="rtsp" && country="CN"
目前FOFA系统最新数据(一年内数据)显示中国范围内共有4,405,638个RSTP服务对外开放。
区域分布统计
原理分析
RTSP(Real Time Streaming Protocol)是由Real Network和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议。RTSP对流媒体提供了诸如暂停,快进等控制,而它本身并不传输数据,RTSP的作用相当于流媒体服务器的远程控制。服务器端可以自行选择使用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。
RTSP五步会话原理如下
step1:
C->S:OPTION request //询问S有哪些方法可用
S->C:OPTION response //S回应信息中包括提供的所有可用方法
step2:
C->S:DESCRIBE request //要求得到S提供的媒体初始化描述信息
S->C:DESCRIBE response //S回应媒体初始化描述信息,主要是sdp
step3:
C->S:SETUP request //设置会话的属性,以及传输模式,提醒S建立会话
S->C:SETUP response //S建立会话,返回会话标识符,以及会话相关信息
step4:
C->S:PLAY request //C请求播放
S->C:PLAY response //S回应该请求的信息
S->C:发送流媒体数据
step5:
C->S:TEARDOWN request //C请求关闭会话
S->C:TEARDOWN response //S回应该请求
wireshark实战抓包,获取最开始的几步认证即可。
OPTIONS rtsp://207.62.193.8:8554 RTSP/1.0
CSeq: 1
User-Agent: Lavf58.29.100
RTSP/1.0 200 OK
Server: StarDot H264 Server
CSeq: 1
Public: DESCRIBE,OPTIONS,PLAY,SETUP,TEARDOWN
DESCRIBE rtsp://207.62.193.8:8554 RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf58.29.100
RTSP/1.0 200 OK
Server: StarDot H264 Server
CSeq: 2
Cache-Control: no-cache
Content-Length: 289
Content-Type: application/sdp
利用与检测方式
观察一个比较完整rtsp格式
rtsp://user:[email protected]/xxx/xxx
因此检测的时候主要分几种类型:
1、rtsp未授权访问
2、404需要爆破路径
参考提取:https://blog.csdn.net/weixin_30445169/article/details/99396374
3、401需要账密认证
参考github泄露以及常见弱口令字典
写了一个针对上面三种情况的rtsp协议检测工具。
工具思路:
1、先对所有地址进行存活检测。
2、对于存活的地址,如果返回200,则存在未授权访问,返回401则进行帐密爆破,返回404则先进行路径爆破,路径爆破成功则进行帐密爆破。
3、字典可在github上面收集+常见弱口令
构造socket包
func genOPTIONS(url string, seq int, ua string) string {
msgRet := "OPTIONS " + url + " RTSP/1.0rn"
msgRet += "CSeq: " + strconv.Itoa(seq) + "rn"
msgRet += "User-Agent: " + ua + "rn"
msgRet += "rn"
return msgRet
}
func genDESCRIBLE(url string, seq int, ua string) string {
msgRet := "DESCRIBE " + url + " RTSP/1.0rn"
msgRet += "CSeq: " + strconv.Itoa(seq) + "rn"
msgRet += "User-Agent: " + ua + "rn"
msgRet += "Accept: application/sdprn"
msgRet += "rn"
return msgRet
}
socket通信
func Handler(serv models.Service) int {
ua := "LibVLC/2.0.3 (LIVE555 Streaming Media v2011.12.23)"
addr := fmt.Sprintf("%v:%v", serv.Ip, serv.Port)
conn, err := net.DialTimeout("tcp", addr, vars.Timeout)
if err != nil {
return 0
}
conn.SetReadDeadline(time.Now().Add(vars.Timeout))
conn.SetWriteDeadline(time.Now().Add(vars.Timeout))
seq := 1
msg := genOPTIONS(serv.Url, seq, ua)
data := make([]byte, 255)
_, err = conn.Write([]byte(msg))
_, err = conn.Read(data)
if err != nil {
return 0
}
seq += 1
msg = genDESCRIBLE(serv.Url, seq, ua)
_, err = conn.Write([]byte(msg))
_, err = conn.Read(data)
if err != nil {
return 0
}
if strings.Contains(string(data), "200 OK") {
return 200
}
if strings.Contains(string(data), "401 Unauthorized") {
return 401
}
if strings.Contains(string(data), "404 Not Found") {
return 404
}
return 0
}
运行截图
通过VLC media player可直接访问
实战中的思路总结
rtsp
发现各个地区均存在不同程度的rtsp未授权访问、弱口令的情况。
另外加入其他的关键字配合搜索在github往往有意外的惊喜;由于泄露了不少是内网的地址,在内网渗透中换个思路“寻求外界的帮助”往往可以有有所突破。
扫描工具项目地址:https://github.com/darkarmorlab/rtspscan/releases/tag/v1.0
应用层
除了rtsp协议,一些web应用也存在未授权访问、弱口令的情况。
未授权
弱口令:admin/12345
单个摄像头设备的漏洞分析和利用方式此处就不展开了,但是往往把这种不经意发现的未授权和目标做一些关联会让你渗透更加顺畅。
PS:某关基去掉了自己的标识,但是在它公网同网段发现了此类IOT设备,后续渗透中也证明了是他们的资产。
本文始发于微信公众号(玄甲安全实验室):实战中的那些视频安全(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论