554,8554 - Pentesting RTSP

Reading time: 7 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

出典: wikipedia:

Real Time Streaming Protocol (RTSP) は、エンターテインメントや通信システムでストリーミングメディアサーバーを制御するために設計されたネットワーク制御プロトコルです。プロトコルはエンドポイント間でメディアセッションを確立・制御するために使用されます。メディアサーバーのクライアントは、VHSスタイルのコマンド(play、record、pause など)を発行して、サーバーからクライアントへのメディアストリーミング(Video On Demand)やクライアントからサーバーへの送信(Voice Recording)をリアルタイムで制御します。

ストリーミングデータ自体の送信は RTSP の役割ではありません。ほとんどの RTSP サーバーは、メディアストリーム配信に Real-time Transport Protocol (RTP) と Real-time Control Protocol (RTCP) を併用します。ただし、ベンダーによっては独自のトランスポートプロトコルを実装している場合があります。例えば、RealNetworks の RTSP サーバーソフトウェアは、RealNetworks の独自プロトコルである Real Data Transport (RDT) を使用していました。

既定のポート: 554,8554

PORT    STATE SERVICE
554/tcp open  rtsp

重要なポイント

RTSPHTTP に似ていますが、メディアストリーミング向けに特化して設計されています。仕様は次のドキュメントに定義されています:

RTSP – RFC2326

デバイスは**未認証(unauthenticated)または認証あり(authenticated)**のアクセスを許可している場合があります。確認するには "DESCRIBE" リクエストを送ります。基本的な例は以下のとおりです:

DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2

正しいフォーマットにはダブルの "\r\n" が含まれることを忘れないでください。これにより一貫したレスポンスが得られます。"200 OK" は未認証アクセスを示し、"401 Unauthorized" は認証が必要であることを示します。どの方式(BasicDigest authentication)が必要かも分かります。

Basic authentication の場合、ユーザー名とパスワードを base64 でエンコードして、以下のようにリクエストに含めます:

DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==

この例では資格情報に "admin" と "1234" を使用しています。以下はそのようなリクエストを送るための Python script です:

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)

Basic authentication の方がシンプルで推奨されます。Digest authentication は、"401 Unauthorized" レスポンスで提供される認証情報を注意深く扱う必要があります。

この概要では、RTSP ストリームへのアクセス手順を簡略化し、初期の試行における簡便性と実用性のために Basic authentication に焦点を当てます。

列挙

有効なメソッドやサポートされている URLs に関する情報を取得し、必要に応じて brute-force でアクセスを試みてコンテンツに到達できるか確認します。

bash
nmap -sV --script "rtsp-*" -p <PORT> <IP>

ffplay を使って RTSP ストリームを表示する

有効な RTSP パス(例: /mpeg4, /live.sdp)を見つけ、アクセス権(未認証または資格情報によるもの)を確認したら、ffplay を使ってフィードをストリーミングできます:

bash
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
  • -rtsp_transport tcp: より信頼性の高いストリーミングのために UDP の代わりに TCP を使用する
  • -x, -y: ビデオ解像度を制御する任意のフラグ
  • 必要に応じて <IP> とパスを置き換える

Brute Force

その他の便利なプログラム

Bruteforceするには: https://github.com/Tek-Security-Group/rtsp_authgrinder

Cameradar

  • アクセス可能な任意のターゲット上でオープンな RTSP ホストを検出する
  • ホストの公開情報(hostname、port、camera model など)を取得する
  • ストリームのルート(例: /live.sdp)を取得するために自動化された dictionary attacks を起動する
  • カメラの username と password を取得するために自動化された dictionary attacks を起動する
  • それらからサムネイルを生成して、ストリームが有効か確認し、内容を素早くプレビューする
  • 正しくエンコードされているか確認するために Gstreamer パイプラインを作成しようとする
  • Cameradar が取得できたすべての情報のサマリを出力する

参照

32100 Udp - Pentesting Pppp Cs2 P2p Cameras

参考

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする