RTSP协议分析与安全实践

RTSP协议,全称实时流协议(Real Time Streaming Protocol),前文已经简单介绍了RTSP相关协议;

RTSP和RTP(RTCP)

这里再提一下RTSP和RTP/RTCP、RSVP的关系;如图:

请添加图片描述

RTSP和HTTP

  • 相似性:RTSP和HTTP协议都使用纯文本来发送消息,而且RTSP协议的语法也类似于HTTP。 RTSP一开始就是这样设计的,主要是为了能兼容使用之前编写的HTTP协议分析代码。
  • 区别:RTSP是有状态的,需要知道当前处于什么状态,也就是说RTSP的命令总是按照顺序发送,某个命令总在另一个命令之前发送。无论处于什么状态,RTSP都不会断开连接。而HTTP则无状态,发送一个命令后,连接就会断开,命令之间没有依赖性。另外,RTSP协议使用554端口,HTTP使用80端口。

RTSP交互过程

RTSP Client RTSP Server OPTIONS request--询问S有哪些方法可用 OPTIONS response--S回应信息中包括提供的所有可用方法 DESCRIBE request--要求得到S提供的媒体初始化描述信息 DESCRIBE response--S回应媒体初始化描述信息,主要是sdp SETUP request--设置会话的属性,以及传输模式,提醒S建立会话 SETUP response--S建立会话,返回会话标识符,以及会话相关信息 PLAY request--(with Session ID)C请求播放 PLAY response--S回应该请求的信息 Streaming Data (RTP over UDP/TCP) PAUSE request (with Session ID)--C请求关闭会话 PAUSE response TEARDOWN request (with Session ID) TEARDOWN response RTSP Client RTSP Server

RTSP交互过程的请求数据解析

由于RTSP跟HTTP的相似,除了在wireshark上捕获RTSP请求,burpsuite一类http流量的测试工具也可以捕获RTSP流量;
请添加图片描述

OPTIONS

请求服务器提供的可用方法;

OPTIONS rtsp://192.170.1.1/xxx RTSP/1.0
CSeq: 34
User-Agent:VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器返回对应的可用方法,常见包含OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER

RTSP/1.0 200 OK
CSeq: 34
Date: Tue, May 07 2024 07:32:10 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER //服务器提供的可用的方法

DESCRIBE

请求会话描述信息(SDP)

DESCRIBE rtsp://192.170.1.1/xxx RTSP/1.0
CSeq: 35
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
Accept: application/sdp

详细SDP信息参考SDP协议解析

RTSP/1.0 200 OK
CSeq: 35
Date: Tue, May 07 2024 07:32:11 GMT
Content-Type: application/sdp
Content-length: 414
Content-Base: rtsp://192.170.1.20/xxx/v=0
o=StreamingServer 3331435948 1 IN IP4 192.170.1.20
s=RTSP Session
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=range:npt=0-
m=video 0 RTP/AVP 96
a=control:trackID=0
a=rtpmap:96 H264/90000
a=fmtp:96  packetization-mode=1; profile-level-id=4D0033; sprop-parameter-sets=J00AM+dAPAET8s1AQEB8AAADAAQAAAMAyMQAAfoYAAF7k///wKA=,KO48gA==;
m=audio 0 RTP/AVP 97
a=control:trackID=1
b=as:32
a=rtpmap:97 L16/16000/1

SETUP

客户端提醒服务器建立会话,并确定传输模式;通过trackID参数进行控制,0表示rtp包,1表示rtcp包

SETUP trackID=1 RTSP/1.0
CSeq: 37
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
Session: 1012;timeout=65

服务端返回会话标识,Session值;

RTSP/1.0 200 OK
CSeq: 37
Date: Tue, May 07 2024 07:32:11 GMT
Transport: RTP/AVP/TCP;unicast;destination=192.170.1.20;source=192.170.1.20;interleaved=2-3
Session: 1012;timeout=65

PLAY

播放请求;

PLAY rtsp://192.170.1.20/xxx/ RTSP/1.0
CSeq: 38
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
Session: 1012;timeout=65
Range: npt=0.000-

返回流数据;

RTSP/1.0 200 OK
CSeq: 38
Date: Tue, May 07 2024 07:32:11 GMT
Range: npt=0.000-
Session: 1012
RTP-Info: url=rtsp://192.170.1.20/;seq=0$../....H.....tx'k..K4{s>/..f..BI.....22 .(`.o%....$.........tz.....E= ...........#$.......H.....tx(.<.$....`..H.....tx<.. ..F!.....1d.....%2.h 6...h%q.|.te.zs........u.5..X...)y..x...t.C....6s..SE..F.....m[..... .'b/.^.GbV..^n.E.5=7....g..v.ZD;..-z.-..S%...
....4M..>E6.TK....I2pC.....aE.epb.....{.. ....~..h*.7...MY...."..x....Om....|T.7...TI,B+DO+z.b.Z...E..3.-.|T..,.....P%.G.../...V.H.Y.....><......... ..]...1_qq......+[............?.c^....\...y.........*8T....3L.....>3_x.=.84.WG!r..k....V.......x#..a}./J..?t...C...2...W...U....X.[.CB...?v...e..

TEARDOWN

客户端发起关闭请求;

TEARDOWN rtsp://192.170.1.20/xxx/ RTSP/1.0
CSeq: 38
Session: 1012
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器回应关闭会话;

RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 38
Session: 1012

SDP协议

SDP(Session Description Protocol)是一个描述多媒体通信会话的格式,用来在会话发起者和参与者之间交换会话的参数和能力。SDP 本身并不传送媒体数据,它只描述了媒体流的元数据,比如媒体类型(音频、视频、文本等)、格式、传输协议和网络地址。

v=0
o=StreamingServer 3331435948 1 IN IP4 192.170.1.20
s=RTSP Session
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=range:npt=0-
m=video 0 RTP/AVP 96
a=control:trackID=0
a=rtpmap:96 H264/90000
a=fmtp:96  packetization-mode=1; profile-level-id=4D0033; sprop-parameter-sets=J00AM+dAPAET8s1AQEB8AAADAAQAAAMAyMQAAfoYAAF7k///wKA=,KO48gA==;
m=audio 0 RTP/AVP 97
a=control:trackID=1
b=as:32
a=rtpmap:97 L16/16000/1
  1. v=(版本) - 指定SDP的版本号,目前通常为0。

  2. o=(所有者/创建者和会话ID) - 描述会话的所有者,包含用户名、会话ID、会话版本、网络类型、地址类型和所有者地址。

  3. s=(会话名称) - 会话的名字。

  4. c=(连接信息) - 网络类型、地址类型和连接地址。

  5. t=(时间描述) - 会话的开始和结束时间。

  6. a=(属性) - 会话属性描述(可选),可以是媒体属性或会话属性,不同的属性有不同的含义。

  7. m=(媒体描述) - 描述媒体类型、端口、协议和格式。

  8. i=*(会话信息) - 提供有关会话的额外信息(可选)。

    i=A Seminar on the session description protocol
    
  9. u=(URI) - 描述与会话相关的更多信息的URI(可选)。

    u=http://www.example.com/seminars/sdp.pdf
    
  10. e=(电子邮件地址) - 提供会话联系人的电子邮件地址(可选)。

    e=j.doe@example.com
    
  11. p=(电话号码) - 提供会话联系人的电话号码(可选)。

    p=+1 617 555-6011
    
  12. b=(带宽信息) - 指定会话或媒体的带宽信息(可选)。

    b=CT:384
    
  13. r=*(重复时间) - 会话的重复时间(可选)。

    r=604800 3600 0 90000
    
  14. z=*(时区调整) - 会话的时区偏移量(可选)。

    z=2882844526 -1h 2898848070 0
    
  15. k=*(加密密钥) - 指定媒体加密的密钥(可选且不推荐使用)。

    k=clear:1234
    

以上是SDP协议中的一些主要字段。SDP是非常灵活的,可以包含多个媒体描述m和多个属性a,每个描述可以有自己的设置,如编解码器、带宽限制和其他媒体特定属性,业务上可以在这个参数上自定义使用。

RTSP安全测试

python脚本

import cv2# RTSP URL of the video stream
rtsp_url = 'rtsp://192.168.137.81:554/xxx'# Create a VideoCapture object
cap = cv2.VideoCapture(rtsp_url)# Check if the video stream is opened correctly
if not cap.isOpened():print("Error: Could not open video stream.")
else:print("Video stream opened successfully.")# Loop to display the frames
while cap.isOpened():# Capture frame-by-frameret, frame = cap.read()# If frame is read correctly ret is Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# Display the resulting framecv2.imshow('RTSP Stream', frame)# Press 'q' on the keyboard to exitif cv2.waitKey(1) & 0xFF == ord('q'):break# When everything is done, release the VideoCapture object
cap.release()
# Closes all the frames
cv2.destroyAllWindows()

VLC等连接工具

请添加图片描述

burpsuite等http流量请求抓包工具

请添加图片描述

RTSP安全实践

使用RTSPS

观察RTSP的交互过程后,我们可以发现RTSP没有任何权限验证,也没有加解密过程(即使有加密,也是明文传输加密密钥)。因此,RTSP并不是一个安全的协议,与http类似,RTSP有自己的安全版本RTSPS,通过SSL/TLS进行通道加密,以确保传输数据的保密性和完整性。然而,RTSP常用于嵌入式设备摄像头中,这类IoT的场景由于性能等原因的限制,无法使用RTSPS。那么,针对这类场景,有哪些相对安全的方案可以使用呢?

身份验证

因为RTSP是基于HTTP实现的,所以也可以使用HTTP相关的认证服务,包括不限于

  • HTTP基础认证(Basic Authentication)
  • HTTP Digest 认证
  • WS-Security(Web Services Security,简称WSS)

基本就是在服务之前添加一个认证授权,但是在局域网环境下,在配网阶段或者服务第一次开启的时候,需要让用户配置一个账号密码;

私有加密

获取RTSP流量后,主要包括视频和音频流。如果对数据进行加密处理,即使被获取,也无法解析播放。

常见的加密或数据处理方法包括:

  • 数据偏移(非加密)
  • 新增一个字段(非加密)
  • 使用AES加密或其他常见的加密方案

虽然在私有加密中出现了多个非加密的方案,但由于视频流需要实时率,加上嵌入式设备的数据处理能力有限,视频流的数据量较大,因此前两种方法是常见的处理方案。

即使采用AES加密视频流数据,加密key也需要在发送端和接收端存储,且通常是固定的key。一旦被分析提取,其效果等同于未加密。在性能允许的情况下,相对安全的方案是通过用户在身份验证过程中配置的账号密码来衍生对应的加密key。这样,两端都有key并且key不是固定的,但在实际场景下这种方案较难实现。

其他

  • 限制连接数
  • 网络隔离

这里是有一些特定场景的限制,具体也要看业务需求;当然局域网服务本身就很难实现的不存在风险一说,这里也只是为了在有限的条件下达到最好的效果,如果还有其他更好的方案也可以交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android,RPC原理,C语言实现Binder跨进程通信Demo

RPC原理图 Binder C语言层的Demo演示 新建目录 把两个文件拷贝到我们的Demo下面 1.binder_server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <linux/types.h> #include <stdbool.h> #include <string.h> #…

多路h265监控录放开发-(12)完成全部开始录制和全部停止录制代码

xviewer.h 新增 public: void StartRecord();//126 开始全部摄像头录制 void StopRecord();//126 停止全部摄像头录制 xviewer.cpp 新增 //视频录制 static vector<XCameraRecord*> records;//126void XViewer::StartRecord() //开始全部摄像头录制 126 {StopRecord…

cache2go源码分析

前言 cache2go是一个优秀的开源项目&#xff0c;具有过期功能的并发安全的golang缓存库。 源码分析 定义结构 定义一个缓存表 type CacheTable struct {sync.RWMutex// 一个表名name string// 全部缓存项items map[interface{}]*CacheItem// 清理时间触发cleanupTimer *ti…

基于JSP的“塞纳河畔左岸”的咖啡馆管理系统

开头语&#xff1a; 塞纳河畔左岸的咖啡&#xff0c;我手一杯品尝的你美~ 哎哟&#xff0c;不错哦&#xff01;我们今天来介绍一下咖啡馆管理系统&#xff01; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对咖啡馆管理系统感兴趣或有相关需求&#xff0c;欢迎联…

AGV机器人的调度开发分析(1)- 内核中的路线规划

准备开始写一个系列&#xff0c;介绍下AGV机器人的调度的开发和应用。 按照openTCS的核心内容&#xff0c;国内多家广泛应用于AGV的调度。那么架构图如下&#xff1a; Kernel中有一个是Routing&#xff0c;这是路由规划模块&#xff0c;需要实现的细节功能包括如下&#xff1a…

PDF 文件的加密与去密

一、参考内容 GitHub&#xff1a;PDF 文件的加密与去密

两个函数实现C语言日志记录(Linux/Ubuntu 24.04环境)

日志记录的结果如下所示&#xff1a; ------------ 2024_06_23_15_12_48.txt ------------ [2024-06-23 15:12:48][0.258337] web server root path: /home/buda/code/buda/vue/dist [2024-06-23 15:12:48][0.91629] web server listen port: 8888 [2024-06-23 15:12:48][0.5…

Django 模版转义

1&#xff0c;模版转义的作用 Django模版系统默认会自动转义所有变量。这意味着&#xff0c;如果你在模版中输出一个变量&#xff0c;它的内容会被转义&#xff0c;以防止跨站脚本攻击&#xff08;XSS&#xff09;。例如&#xff0c;如果你的变量包含HTML标签&#xff0c;这些…

长亭谛听教程部署和详细教程

PPT 图片先挂着 挺概念的 谛听的能力 hw的时候可能会问你用过的安全产品能力能加分挺重要 溯源反制 反制很重要感觉很厉害 取证分析 诱捕牵制 其实就是蜜罐 有模板直接爬取某些网页模板进行伪装 部署要求 挺低的 对linux内核版本有要求 需要root 还有系统配置也要修改 …

网络编程篇:HTTP协议

一.预备知识 在客户端访问服务端时&#xff0c;要用ipport&#xff0c;但是在日常用户访问服务端的时候&#xff0c;并不会直接使用ip&#xff0c;而是使用域名&#xff0c;比如&#xff1a;百度(www.baidu,com)。 …

智能优化算法改进策略之局部搜索算子(八)--Powell方法

1、原理介绍 Powell方法[1]是一种无约束优化算法&#xff0c;又称为方向加速法&#xff0c;用于寻找多变量函数的极小值。其基本思想是在迭代中逐次产生Q共轭方向组&#xff0c;本质上它属于不需计算导数的共轭方向法。每次迭代后&#xff0c;算法会更新搜索方向&#xff0c;并…

Java内存泄漏检测和分析介绍

在Java中&#xff0c;内存泄漏检测和分析是一个重要的任务&#xff0c;可以通过以下几种方式进行&#xff1a; 1. 使用VisualVM VisualVM是一个可视化工具&#xff0c;可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息&#xff0c;并且可以对内…

英伟达下一代DLSS或利用人工智能

英伟达的黄仁勋在2024年Computex展会上的问答环节中&#xff0c;提前透露了公司未来几代深度学习超采样&#xff08;DLSS&#xff09;技术的发展方向。在回答有关DLSS的问题时&#xff0c;黄仁勋表示&#xff0c;未来我们将看到通过纯粹的人工智能生成的纹理和对象。他还提到&a…

构建下一代数据解决方案:SingleStore、MinIO 和现代 Datalake 堆栈

SingleStore 是专为数据密集型工作负载而设计的云原生数据库。它是一个分布式关系 SQL 数据库管理系统&#xff0c;支持 ANSI SQL&#xff0c;并因其在数据引入、事务处理和查询处理方面的速度而受到认可。SingleStore 可以存储关系、JSON、图形和时间序列数据&#xff0c;以满…

SaToken系列--指定token存储的数据源

一、背景 由于特殊需求&#xff0c;需要在一个项目里面使用两个redis数据源&#xff0c;一个是本项目A的使用的&#xff0c;另一个数据源是用于satoken使用的。相当于需要使用其他项目B的登录校验&#xff0c;因此需要接入B的satoken&#xff0c;而B的satoken使用的token存储的…

快速排序.

给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n 。 第二行包含 n 个整数&#xff08;所有整数均在 1∼109 范围内&#xff09;&#xff0c;表示整个数…

c#调用dll

动态调用dll 调用dll&#xff0c;通常是在c# 的项目中&#xff0c;的引用上点右键–添加引用。在弹出的窗口中点浏览&#xff0c;定位到dll上。但是c#要调用的dll要是c#写的&#xff0c;如果是c等写的&#xff0c;会提示不是有效的程序集或com组件。 因此&#xff0c;不能通过…

AI 大模型企业应用实战(13)-Lostinthemiddle长上下文精度处理

1 长文本切分信息丢失处理方案 10检索时性能大幅下降相关信息在头尾性能最高检索 ->> 排序 ->使用 实战 安装依赖&#xff1a; ! pip install sentence-transformers 演示如何使用 Langchain 库中的组件来处理长文本和检索相关信息。 导入所需的库使用指定的预训…

(4) cmake编译静态库和动态库

文章目录 静态库整体代码动态库编译整体代码执行结果(静态) 静态库整体代码 static.h #pragma onecevoid static_demo();static.cpp #include "static.h" #include <iostream>void static_demo(){std::cout<<"static demo"<<std::end…

CesiumJS【Basic】- #007 绘制直线段以避免地球曲率的影响

文章目录 绘制直线段以避免地球曲率的影响1 目标2 实现绘制直线段以避免地球曲率的影响 1 目标 绘制直线段以避免地球曲率的影响 2 实现 在CesiumJS中,直线的弯曲是由地球曲率引起的,因为地球是一个球体而不是一个平面。因此,如果您要在地球上绘制两点之间的直线,它将会…