mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
86 lines
4.2 KiB
Markdown
86 lines
4.2 KiB
Markdown
# 554,8554 - Pentesting RTSP
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## 基本信息
|
||
|
||
来自 [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
|
||
|
||
> **实时流媒体协议** (**RTSP**) 是一种网络控制协议,旨在用于娱乐和通信系统,以控制流媒体服务器。该协议用于在端点之间建立和控制媒体会话。媒体服务器的客户端发出类似于VHS的命令,如播放、录制和暂停,以便实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录制)的媒体流。
|
||
>
|
||
> 流数据的传输本身不是RTSP的任务。大多数RTSP服务器使用实时传输协议(RTP)与实时控制协议(RTCP)结合进行媒体流传输。然而,一些供应商实现了专有的传输协议。例如,RealNetworks的RTSP服务器软件也使用RealNetworks的专有实时数据传输(RDT)。
|
||
|
||
**默认端口:** 554,8554
|
||
```
|
||
PORT STATE SERVICE
|
||
554/tcp open rtsp
|
||
```
|
||
## 关键细节
|
||
|
||
**RTSP** 类似于 HTTP,但专门为媒体流设计。它在一个简单的规范中定义,可以在这里找到:
|
||
|
||
[RTSP – RFC2326](https://tools.ietf.org/html/rfc2326)
|
||
|
||
设备可能允许 **未认证** 或 **已认证** 访问。要检查,可以发送一个 "DESCRIBE" 请求。下面是一个基本示例:
|
||
|
||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2`
|
||
|
||
请记住,正确的格式包括一个双 "\r\n" 以确保一致的响应。"200 OK" 响应表示 **未认证访问**,而 "401 Unauthorized" 则表示需要认证,揭示是否需要 **Basic** 或 **Digest authentication**。
|
||
|
||
对于 **Basic authentication**,您将用户名和密码编码为 base64,并将其包含在请求中,如下所示:
|
||
|
||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==`
|
||
|
||
此示例使用 "admin" 和 "1234" 作为凭据。以下是一个 **Python 脚本** 用于发送这样的请求:
|
||
```python
|
||
import socket
|
||
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
|
||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
s.connect(("192.168.1.1", 554))
|
||
s.sendall(req)
|
||
data = s.recv(1024)
|
||
print(data)
|
||
```
|
||
**基本认证** 更简单且更受欢迎。 **摘要认证** 需要仔细处理在 "401 Unauthorized" 响应中提供的认证细节。
|
||
|
||
此概述简化了访问 RTSP 流的过程,重点关注 **基本认证**,因为它在初始尝试中简单且实用。
|
||
|
||
## 枚举
|
||
|
||
获取有关有效方法和支持的 URL 的信息,并尝试强行访问(如有必要)以获取内容。
|
||
```bash
|
||
nmap -sV --script "rtsp-*" -p <PORT> <IP>
|
||
```
|
||
#### 使用 [ffplay](https://ffmpeg.org/ffplay.html) 查看 RTSP 流
|
||
一旦你发现了有效的 RTSP 路径(例如,`/mpeg4`,`/live.sdp`)并确认了访问权限(未认证或使用凭据),你可以使用 `ffplay` 来流式传输该视频源:
|
||
```bash
|
||
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
|
||
```
|
||
- `-rtsp_transport tcp`:使用 TCP 而不是 UDP 以获得更可靠的流媒体
|
||
- `-x`,`-y`:可选标志以控制视频分辨率
|
||
- 根据需要替换 `<IP>` 和路径
|
||
|
||
### [暴力破解](../generic-hacking/brute-force.md#rtsp)
|
||
|
||
### **其他有用的程序**
|
||
|
||
进行暴力破解:[https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
|
||
|
||
[**Cameradar**](https://github.com/Ullaakut/cameradar)
|
||
|
||
- 检测任何可访问目标上的开放 RTSP 主机
|
||
- 获取它们的公共信息(主机名、端口、摄像头型号等)
|
||
- 启动自动字典攻击以获取它们的流路径(例如 /live.sdp)
|
||
- 启动自动字典攻击以获取摄像头的用户名和密码
|
||
- 从中生成缩略图以检查流是否有效,并快速预览其内容
|
||
- 尝试创建 Gstreamer 管道以检查它们是否正确编码
|
||
- 打印 Cameradar 能获取的所有信息的摘要
|
||
|
||
## 参考文献
|
||
|
||
- [https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol)
|
||
- [http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/](http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/)
|
||
- [https://github.com/Ullaakut/cameradar](https://github.com/Ullaakut/cameradar)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|