Mitm6 – Exploit IPv6
IPv6 staat by-default aan v.a. Windows Vista en meestal wordt het niet gebruikt. Hmmmm, een onbeheerd netwerkprotocol zullen ze gedacht hebben. Een non-monitored datastream zullen ze gedacht hebben. Een non-firewalled netwerk zullen ze gedacht hebben. Met “ze” refereer ik uiteraard aan pentesters en hackers en het is “ze” uiteraard gelukt om deze fantastische kans niet onbenut te laten. Dat is het ideale slachtoffer voor een goede exploit zullen ze gedacht hebben! En jawel. Daar is Mitm6!
In deze post ga ik je uitleggen wat Mitm6 is, hoe het werkt en waarom het zo succesvol is. De conclusie kan ik je al wel verklappen. Zet IPv6 maar gewoon uit als je het niet gebruik en dit mogelijk is (Windows 2012+ server kunnen hier hinder van ondervinden)! Lees maar mee waarom dat het advies is…
IPv6 wordt steeds meer en meer misbruikt en dat is eigenlijk niet zo gek. Het is vaak een onbeheerde netwerkstroom die niet beveiligd en niet gemonitored wordt. Daarnaast staat IPv6 default aan op alle Microsoft werkstations en servers na Windows Vista.
Zoals jullie weten is IPv6 de opvolger van IPv4. Het nadeel van IP4v is dat er een gelimiteerd aantal IP adressen beschikbaar zijn en deze zijn langzaam aan het opraken. Om dit tegen te gaan zijn technieken als private IP adressen en NAT in het leven geroepen maar nog steeds geven deze niet voldoende ademruimte om alle devices in de toekomst van IP adressen te kunnen voorzien. IPv6 kent veel, heel veel meer adressen. Met IPv6:
- Is NAT techniek overbodig
- Netwerkfragmentatie wordt door het apparaat opgepakt i.p.v. door de router (snelheidswinst)
- Gebruikt multicast over broadcast (dus pakketjes hoeven niet meer door elke host bewerkt te worden)
- IPSec is een ingebouwde techniek i.p.v. een additionele module (versleutelde headers = veiliger)
- Een DHCP(6) server is mogelijk maar niet per definitie nodig
- Werken we volledig op laag 2 van het OSI model
- Kan een node meerdere adressen hebben (unicast link-local, global unicast, link-local etc.).
En zo zijn er nog heel wat meer voordelen aan IPv6. Maar IPv6 maakt het netwerklandschap wel een stuk complexer. Zo zijn er momenteel nog weinig getrainde professionals die weten hoe IPv6 goed geïmplementeerd moet worden en ook krijgen we te maken met een overgangsfase. Gedurende deze overgangsfase zijn zowel IPv4 en IPv6 actief. Dit brengt extra onderhoud, kosten en security risico’s met zich mee.
IPv6 Attack Vector
Zoals je al hebt kunnen lezen is IPv6 vaak onbeheerd en niet gemonitored. Daarnaast is het protocol minder “volwassen” dan IPv4 en werken security producten (firewalls / NIDS) niet altijd goed samen met IPv6 verkeer. Het protocol is echter vaak wel actief en dus kan het misbruikt worden. Maar hoe dan?
Een van de eerste hacking tools voor IPv6 is “THC-IPV6” gemaakt door Marc van Hauser ook wel bekend van de “THC-hydra” software. Vandaag de dag zijn er vele andere tools maar THC-IPV6 blijft een van de betere tools met maar liefst meer dan 60 sub-tools. MiTM, Fuzzing, Flooding, you name it.
IPv6 ken nieuwe technieken en daarmee ook nieuwe problemen en mogelijkheden. Denk aan SLAAC, DHCPv6, Hop Counting, Dual Stack, PMTUD Attacks, Neighbor Cache Attack, Teredo Attack etc. Er is veel te leren en ontdekken over IPv6. De eerste IPv6 hack was waarschijnlijk de SLAAC Attack welke al in 2011 beschreven is door “Alex Waters”. De SLAAC Attack gebruikt een rogue IPv6 router om een man-in-the-middle te worden van al het IPv6 verkeer. Deze aanval is gebaseerd op een IPv6 overlay network (dus IPv6 over een IPv4 infrastructuur) en is later geautomatiseerd door de “suddensix” tool.
De aanval (Mitm6) die we vandaag gaan bekijken is een afgeleide van de SLAAC Attack maar zonder alle dependencies, het bouwen van een overlay network en de instabiliteit die hierbij komt kijken. Met andere woorden, een betere en simpelere tool die bestaat uit 2 verschillende fases. In de eerste fase zal Mitm6 DNS replies spoofen en op die manier een IPv6 MiTM worden. In de tweede fase zal de WPAD (Windows Proxy Auto Discovery) feature gebruikt worden om credentials te bemachtigen en te authentiseren tegen diverse services op het netwerk.
Mitm6 / Man-in-The-Middle 6
De Mitm6 aanval bestaat ondertussen al ruim 2 jaar (januari 2018) en is gepubliceerd door “Dirk-jan Mollema”, onze Nederlandse collega van Fox IT. In de eerste fase zal een rogue DHCPv6 en een rogue DNS server opgezet worden om clients te voorzien van hun eigen IPv6 adres en om vervolgens de rogue DNS server als DNS server in te stellen zodat DNS packets gespoofd kunnen worden. Vervolgens kan in de tweede fase WPAD en een rogue proxy gebruikt worden om NTLM credentials te achterhalen. De server welke het WPAD bestand host wordt middels DNS geresolved. Als DNS geen informatie retour gaf zouden vervolgens andere protocollen gebruikt worden om dit te doen zoals het door mij geliefde Link-Local Multicast Name Resolution ( LLMNR) protocol. DNS zal vervolgens het WPAD bestand retourneren en om authenticatie vragen (dit is een vereiste om het WPAD bestand te kunnen benaderen). Windows leverde (<2016 / MS16-077) deze authenticatie zonder dat de gebruiker hier iets voor hoeft te doen. De aanvaller ontvangt deze authenticatiegegevens in de vorm van NTLM-hashes welke weer kan worden gebruikt om te verifiëren bij services welke vatbaar zijn voor NTLM-relaying. Omdat deze verouderde methode niet meer werkt wordt in fase 2 een WPAD file aangereikt zonder authenticatie. In deze WPAD file staat de machine van de aanvaller als proxy server. Vervolgens zal de gebruiker met de proxy verbinden om te browsen. De proxy zal vervolgens de “HTTP 407 Proxy Authentication required” flag retourneren waarna de client toch automatisch zal authentiseren en we alsnog beschikken over de NTLM hash. Laten we eens beter in-detail bekijken hoe de Mitm6 aanval in zijn werk gaat. Laten we allereerst de Mitm6 repository downloaden van https://github.com/fox-it/mitm6.
git clone https://github.com/fox-it/mitm6.git |
Vervolgens gaan we de requirements (Scapy / Twisted en netifaces) installeren:
cd mitm6 pip install -r requirements.txt |
Tenslotte installeren we Mitm6:
python setup.py install |
Vervolgens kun je Mitm6 starten. Onderstaande commando zal een overzicht geven van alle help fucties:
mitm6 -h |
Er zijn dus voldoende opties. Standaard zal de default interface gebruikt worden om de rogue DHCP + DNS server op te zetten maar je kunt ook zelf een interface specificeren via de “-i” flag. Je kunt een specifieke domeinnaam opgeven waarvoor de DNS server moet functioneren (default het eerste domein welke een request doet). IP ranges, advertisement opties, verbose logging etc. Er zijn meer dan voldoende opties aanwezig om Mitm6 op de juiste / gewenste manier te starten en te laten filteren. Zo kun je middels blacklists en whitelists Mitm6 alleen laten functioneren voor de gewenste nodes.
Let op, Mitm6 moet wel gedraaid worden als root user omdat het de “Raw Packet Capture” optie van Scapy gebruikt.
Laten we Mitm6 eens draaien:
mitm6 -v |
In bovenstaande voorbeeld hebben we geen domeinen gespecificeerd en dus replied de DNS server op alle requests. Toevoeging van de “-v” (verbose) flag genereerd meer logging. Elke host in het netwerk waarop IPv6 geactiveerd is zal periodiek IPv6 configuratiegegevens opvragen. Mitm6 replied op deze pakketten en geeftr de clients een IP adres binnen de IPv6 Link-Local range. In een normaal IPv6 netwerk worden deze addressen door de hosts zelf toegekend. Het voordeel van het toekennen van een adres is dat hiermee ook de DNS server ingesteld kan worden naar die van de “aanvaller”. Ook al heeft de client een IPv4 DNS server ingesteld staan dan nog zal Windows de IPv6 DNS server prefereren en alleen terugvallen op de IPv4 DNS server als de IPv6 DNS server geen gehoor geeft. Daarmee wordt de IPv6 DNS server feitelijk de primaire DNS server. En zoals je hieronder ziet stuurt Mitm6 replies op alle DNS requests ook al heeft de host een primare IPv4 DNS server ingesteld.
*Note – Dit werkt alleen op Windows machines. Linux / MacOS en andere systemen gebruiken momenteel (nog) geen DHCPv6 om IPv6 adressen toe te kennen.
Wat opvalt is dat Mitm6 zichzelf niet als gateway instelt en dus ervoor zorgt dat de impact op het netwerk klein is. IPv6 hosts zullen dus niet proberen te communiceren met IPv6 hosts buiten het lokale netwerk of VLAN.
Op dit moment is het mogelijk om als DNS MiTM fake redirects te sturen naar de verbonden clients of om het netwerk plat te gooien (DOS). Maar dat is niet wat we graag willen doen. We willen NTLM hashes van de host verkrijgen. Dit gaan we doen in de tweede fase.
Om dit te doen hebben we de “ntlmrelayx” tool nodig. Ntlmrelayx is onderdeel van de impacket Python library welke weer een verbeterde opvolger is van de “smbrelayx” tool. Ntlmrelayx maakt het mogelijk om over IPv6 te relayen, de WPAD file te presenteren en proxy requests te detecteren en om vervolgens de client te vragen om authenticatie.
Belangrijk is dat op de achtergrond de Mitm6 tool gewoon blijft draaien. Pas ook op met netwerken die gebruik maken van een WPAD file. Deze gaan volledig kapot omdat na het starten van de aanval onze rogue WPAD file gebruikt zal worden.
Allereerst gaan we de Ntlmrelayx tool installeren.
git clone https://github.com/SecureAuthCorp/impacket.git |
En vervolgens starten we de installatie:
cd impacket pip install . |
OF als je Python PIP gebruikt kun je impacket ook als volgt installeren:
pip install impacket |
Vervolgens kunnen we het “ntlmrelayx.py” script aanroepen (in examples directory). Ntlmrelayx komt met een berg opties (ntlmrelayx -h):
Vervolgens gaan we de volgende flags gebruiken:
- -6 = Luister en acteer op zowel IPv4 als IPv6 netwerken.
- -wh = ntlmrelayx retourneert de server welke het WPAD bestand host. Omdat we geen inhoud in het WPAD bestand nodig hebben (mitm6 antwoord overal op) moeten we een niet bestaande host in het netwerk kiezen.
- -t = Opgave van de client waar de credentials naar ge-relayed moeten worden. Zonder de “-t” flag worden de credentials terug naar de client ge-relayed.
Dit ziet er als volgt uit:
ntlmrelayx.py -6 -wh wpadfakeserver.jbaselier.nl |
We zien nu dat ntlmrelayx probeert om de ontvangen NTLM hashes te relayen naar alle gevonden targets. Dit is niet wat we willen we willen namelijk proberen te relayen naar een specifieke target, de domain controller. We kiezen ervoor om primair over LDAP te relayen en ook dat we bij een succesvolle relay (en authenticatie) het domain mappen en naar de lootfolder sturen. We geven nu de volgende 2 (met eventueel de laatste 2 als optionele) opties mee:
- -t = Nu geven we een server op om de ontvangen credentials naar te relayen. De basis aanval is gebaseerd op SMB maar in dit voorbeeld gebruiken we LDAP. Met andere woorden, we gaan proberen te authenticeren op de server middels de ontvangen credentials via LDAP.
- -l = Dit is onze loot-dir
- -socks = Start een socks based proxy om de connectie over te relayen
- -debug = Laat debug informatie zien
ntlmrelayx.py -6 -wh wpadfakeserver.jbaselier.nl -t ldaps://192.168.178.100 -l tmp -socks -debug |
Dit ziet er als volgt uit. Ntlmrelayx start op met alle services en kan ontvangen credentials doorsturen middels SMB, LDAP, LDAPS, SMTP etc. Wij kiezen ervoor om ontvangen credentials over LDAPS te relayen naar de domain controller.
Als de authenticatie succesvol is zal ntlmrelayx zichzelf authentiseren en via LDAP andere informatie achterhalen welke deze in de loot folder plaatst.
De inhoud van de lootfolder ziet er na authenticatie als volgt uit:
De informatie in b.v. het rapport “domain_users_by_group.html” ziet er dan als volgt uit:
Uitermate interessant om domeinen te onderzoeken. Let b.v. op het wachtwoord welke in de omschrijving van het account vermeld staat. Nooit slim op te doen!
Als een domain admin zich aanmeld op dezelfde PC is het script ook in staat om een nieuwe user in AD aan te maken met domain admin rechten. Op die manier wordt je met een beetje geduld (en geluk) gemakkelijk domain admin.
Conclusie
Deze hele aanval konden we dus uitvoeren omdat IPv6 aan staat op de clients en dus gebruikt wordt. Met Mitm6 zorgden we er vrij gemakkelijk voor dat onze host als DNS server voor IPv6 aangemerkt kon worden voor het domein. Omdat echter ook IPv4 hier gebruik van maakt stelt dit ons in staat om vrijwel al het verkeer te manipuleren. Ntlmrelayx maakte het gemakkelijk om gebruikers een WPAD file aan te bieden. Wanneer de gebruiker vervolgens naar het internet gaat zal de proxy om authenticatie vragen en bingo… de gegevens zijn binnen (in een nuttshell).
Er zijn veel varianten op deze aanval zoals de S4U2Self en S4U2Proxy attack. Deze aanvallen maken het mogelijk om ons via ntlmrelayx authentiseren als ons eigen computeraccount. Computer accounts kunnen normaliter een beperkt aantal eigenschappen van hun eigen object in AD aanpassen zoals het “msDS-AllowedToActOnBehalfOfOtherIdentity” attribuut. Dit attribuut bepaald welke gebruikers zich kunnen authentiseren op deze computer. Nu kunnen we ons rechten geven om gebruikers impersonation toe te passen op die computer waarna we kunnen inloggen als een gebruiker met elevated rechten.
Ik hoop dat deze post een beetje aantoont hoe gevaarlijk het kan zijn op IPv6 onbeheerd aan te laten staan. Deze aanvallen zijn lastig tegen te gaan. Uiteraard kun je het wel moeilijker maken door WPAD uit te schakelen via group policy (“WinHttpAutoProxySvc”). Daarnaast kun je LDAP en LDAPS relaying versterken door LDAP Signing en LDAP Channel Binding toe te passen.
Hoewel “Hacking IPv6” niet nieuw is vond ik de combinatie van Mitm6 en ntlmrelayx wel erg interessant. Jij ook? Gimme some love…pls! Deel mijn post op je website of social media kanalen en/of stuur me even een leuk berichtje. Leuke comments, shares en likes geven met altijd weer zin om nog meer te gaan schrijven! Bedankt alvast!