# 554,8554 - Pentesting RTSP {{#include ../banners/hacktricks-training.md}} ## 基本情報 From [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol): > The **Real Time Streaming Protocol** (**RTSP**) は、ストリーミングメディアサーバーを制御するためにエンターテインメントおよび通信システムで使用されるネットワーク制御プロトコルです。このプロトコルは、エンドポイント間のメディアセッションを確立し、制御するために使用されます。メディアサーバーのクライアントは、サーバーからクライアントへのメディアストリーミング(Video On Demand)やクライアントからサーバーへのメディアストリーミング(Voice Recording)をリアルタイムで制御するために、再生、録画、一時停止などのVHSスタイルのコマンドを発行します。 > > ストリーミングデータ自体の伝送はRTSPのタスクではありません。ほとんどのRTSPサーバーは、メディアストリームの配信のためにリアルタイムトランスポートプロトコル(RTP)とリアルタイム制御プロトコル(RTCP)を併用しています。ただし、一部のベンダーは独自のトランスポートプロトコルを実装しています。たとえば、RealNetworksのRTSPサーバーソフトウェアは、RealNetworksの独自のReal Data Transport(RDT)も使用しています。 **デフォルトポート:** 554,8554 ``` PORT STATE SERVICE 554/tcp open rtsp ``` ## Key Details **RTSP**はHTTPに似ていますが、メディアストリーミング専用に設計されています。これは、ここにある簡潔な仕様で定義されています: [RTSP – RFC2326](https://tools.ietf.org/html/rfc2326) デバイスは**未認証**または**認証済み**のアクセスを許可する場合があります。確認するために、「DESCRIBE」リクエストが送信されます。基本的な例は以下の通りです: `DESCRIBE rtsp://: RTSP/1.0\r\nCSeq: 2` 正しいフォーマットには、一貫した応答のためにダブルの"\r\n"が含まれることを忘れないでください。「200 OK」の応答は**未認証アクセス**を示し、「401 Unauthorized」は認証が必要であることを示し、**Basic**または**Digest authentication**が必要かどうかを明らかにします。 **Basic authentication**の場合、ユーザー名とパスワードをbase64でエンコードし、リクエストに次のように含めます: `DESCRIBE rtsp://: RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==` この例では、資格情報として「admin」と「1234」を使用しています。以下は、そのようなリクエストを送信するための**Pythonスクリプト**です: ```python import socket req = "DESCRIBE rtsp://: 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 ``` #### RTSPストリームの表示 [ffplay](https://ffmpeg.org/ffplay.html)を使用して 有効なRTSPパス(例:`/mpeg4`、`/live.sdp`)を発見し、アクセスを確認したら(認証なしまたは資格情報を使用)、`ffplay`を使用してフィードをストリーミングできます: ```bash ffplay -rtsp_transport tcp rtsp:///mpeg4 -x 2560 -y 1440 ``` - `-rtsp_transport tcp`: より信頼性の高いストリーミングのためにUDPの代わりにTCPを使用 - `-x`, `-y`: 動画解像度を制御するためのオプションフラグ - 必要に応じて``とパスを置き換える ### [ブルートフォース](../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}}