NMap – Commando’s en Scripts
NMap staat voor “Network MAPper” en is een opensource netwerkscanner. NMap is van origine gemaakt als poortscanner voor Linux systemen. Tegenwoordig is NMap niet meer weg te denken uit het arsenaal van hackers en security researches. NMap is zoveel meer dan een gewone poortscanner. NMap kan gebruikt worden op vele systemen en wordt voornamelijk gebruikt voor het inventariseren van computersystemen over een netwerk. Hoe dit te werk gaat lees is in deze post!
NMap bestaat al sinds 1997 en is geschreven voor Gordon Lyon. Naast het feit dat NMap tegenwoordig onder meerdere besturingssystemen draait zoals Windows, Linux en Mac bestaat er ook een GUI. Deze GUI heette van origine NMapFE (NMap Front End) maar is later omgedoopt tot het bekende ZenMap.
Nmap wordt vaak gebruikt voor:
- Het identificeren van open poorten
- Netwerk inventarisatie en network mapping
- Security testing van network devices zoals firewalls
- Identificeren van nieuwe servers
- Vinden van vulnerabilities in het netwerk
In deze post zoomen we dieper in op verschillende NMap commando’s.
NMap informatie en Flags
Om de NMap commando’s beter te leren en te begrijpen gaan we eerst kijken met wat voor soort informatie NMap overweg kan en leren we de definitie van een aantal belangrijke flags. NMap flags zijn net als NMap commando’s op elk besturingssysteem hetzelfde. Ook ZenMap maakt gebruik van dezelfde structuur. Als je dus eenmaal de flags en commando’s weet kun je overal een succesvolle NMap scan uitvoeren.
Maar eerst wat algemene informatie:
- NMap kan IP adressen, ranges en hostnames scannen
- NMap kan overweg met IPv4 en IPv6
- NMap kan (vooral v.a. versie 7) gebruikt worden om DOS aanvallen te lanceren
- NMap kan doelcomputers exploiten
Veelgebruikte schakelopties (flags):
–help = Geeft meer informatie over de NMap commando opbouw en de verschillende schakelopties.
-iL = InputList. Met deze schakeloptie kun je een bestand opgeven met meerdere targets.
-p = Poort definitie. Met deze schakeloptie kun je het poortbereik opgeven welke gescand mag worden. De “-p-“ definitie betekend “alle 65535 mogelijke poorten”
-F = Fast. Deze Snelle scan scant de 100 meest gebruikte poorten.
-sS = SynScan. Met een synscan wordt alleen gekeken naar de SYN stap (1e stap) van de TCP 3-way-handshake en is juist hierdoor een stuk sneller en minder goed detecteerbaar. Uiteraard kunnen de resultaten minder accuraat zijn.
-sT = TCP connect scan. Hierbij moet de TCP 3-way-handshake volledig zijn en is een langzamere scan.
-Pn = Scan Anyway. NMap controleert niet of de host online is maar voert alle gevraagde scanopdrachten uit. Sommige hosts reageren niet op een PING en kunnen met de -Pn switch toch nuttige informatie retourneren.
-A = OS Scan. NMap probeert te achterhalen welk OS er op de host draait.
-sV = Service scan. NMap probeert te achterhalen welke services er op de cliënt draaien. Door het toevoegen van de “–version-intensity” flag aan dit commando kan de scan agressiever (trager en minder onopvallend) of lichter worden ingesteld. –version-intensity 5 is een agressieve scan en –version-intensity 0 is een banner grabbing scan.
-f = Fragmented Scan. Deze scan fragmenteert NMap pakketjes zodat deze minder makkelijk gedetecteerd worden. Dit wordt vaak gebruikt met een custom MTU welke opgegeven wordt met de “–mtu” switch.
-oA = Output All. Deze schakeloptie zal de resultaten van de scan opslaan in de 3 ondersteunende NMap formaten, namelijk een NMap Output File (-oN), XML file (-oX) en een Grep file (-oG).
NMap Commando’s
Zoals de NMap help ons laat weten is de commando opbouw als volgt:
nmap [Scan Type(s)] [Options] {target specification} |
Een normale NMap scan op een subnet:
nmap 192.168.1.0/24 |
Scan een IPv6 host:
nmap -6 2607:f0d0:1002:51::4 |
Een normale NMap scan op een range IP adressen:
nmap 192.168.1.1-100 |
Voer een NMap scan uit tegen meerdere hosts vanuit een hostsfile:
nmap -iL mijn-hosts.txt |
Exclude hosts van scannen:
nmap 192.168.1.1-100 --exclude 192.168.1.20-30 |
Scan een enkele poort:
nmap -p 21 192.168.1.100 |
Scan en toon alleen de open poorten:
nmap --open 192.168.1.100 |
Scan een range aan poorten:
nmap -p 1-100 192.168.1.100 |
Scan welke hosts in een netwerk up-and-running zijn:
nmap -sP 192.168.1.0/24 |
Toon de reden waarom een poort in een bepaalde status staat:
nmap --reason 192.168.1.100 |
Scan de 100 meest voorkomende poorten:
nmap -F 192.168.1.100 |
TCP scan:
nmap -sT 192.168.1.100 |
TCT SYN scan:
nmap -sS 192.168.1.100 |
TCT FIN scan:
nmap -sF 192.168.1.100 |
TCP Null Scan:
nmap -sN 192.168.1.100 |
TCP Xmas Scan (FIN, PSH, URG):
nmap -sX 192.168.1.100 |
Scan specifieke UDP poorten:
nmap -sU -p 123,161,162 192.168.1.100 |
Scan met het IP PING Protocol:
nmap -PO 192.168.1.100 |
Scan met het UDP PING Protocol:
nmap -PU 192.168.1.100 |
Scan of host beschermd is achter een firewall:
nmap -sA 192.168.1.100 |
Voer alle scanopdrachten uit zonder pre-controle of de host online is (ignore discovery). Bijvoorbeeld als de host zich achter een firewall bevindt:
nmap -Pn 192.168.1.100 |
Scan voor OS detectie:
nmap -A 192.168.1.100 |
Scan voor service detective:
nmap -sV 192.168.1.100 |
Scan voor UDP services:
nmap -sU 192.168.1.100 |
Scan voor service detectie agressief:
nmap -sV -version-intensity 5 192.168.1.100 |
Toon interfaces en routes van gescande hosts:
nmap --iflist 192.168.1.100 |
Output alle scanresultaten naar XML
nmap -oX outputfile.xml 192.168.1.100 |
Output alle scanresultaten naar XML, Grepp en NMap fileformaten:
nmap -oA outputfile 192.168.1.100 |
Je kunt een timing optie meegeven aan je NMap scans. Deze waarde gaat van 0 tot 5. Hoe hoger de waarde des te sneller de scan. Een snelle scan kan minder accurate resultaten opleveren maar is uiteraard sneller en minder opvallend. Een snelle scan uitvoeren doe je als volgt:
nmap -T 192.168.1.0/24 |
Met de -D flag kun je zogenaamde decoys instellen. Voor de host lijkt het net alsof alle decoys het apparaat scannen. De host zal dus meerdere poortscans vinden maar weet niet van welke host deze werkelijk afkomstig is.
nmap -n -D192.168.1.10, 172.16.1.44, 10.5.1.4, 192.168.1.144, 10.1.1.203 |
Als we het over spoofing hebben dan kunnen we ook het source MAC adres spoofen met de “–spoof-mac” flag. Om een ander source MAC adres op te geven gebruik je:
nmap --spoof-mac B7:B6:B5:B4:B3:B2:B1:B0 192.168.1.100 |
Om NMap een random MAC adres te laten verzinnen gebruik je “0” als MAC adres:
nmap --spoof-mac 0 192.168.1.100 |
Voorbeeld:
Als we dan een aantal commando’s combineren dan zou het volgende commando heel goed mogelijk zijn:
nmap --spoof-mac 0 -Pn -p 80 -oX outputfile.xml -oG outputfile.gnmap 192.168.1.0/24 |
Bovenstaande scan scant 254 IP adressen voor webservers (poort 80 = -p 80) in het 192.168.1.x subnet zonder deze te pingen (scan wordt uitgevoerd ongeacht of host online is = -Pn). Tijdens de scan spooft NMap het MAC adres in een willekeurig MAC adres (–spoof-mac 0) en de resultaten worden geoutput naar 2 bestanden, XML en GNMap (-oX outputfile.xml -oG outputfile.gnmap).
NMap Scripts
De kern van de Nmap Scripting Engine is een integreerbare Lua-interpreter. Lua is een lightweight language ontworpen voor uitbreidbaarheid. Het biedt een krachtige en goed gedocumenteerde API voor interfacing met andere software zoals Nmap.
Het tweede deel van de Nmap Scripting Engine is de NSE Library, die Lua en Nmap met elkaar verbindt. Deze laag regelt zaken als de initialisatie van de Lua-interpreter, parallelle scriptuitvoering, het ophalen van scripts, afhandelen van uitzonderingen en meer. Het bevat ook hulpprogramma-bibliotheken om scripts krachtiger en handiger te maken.
Bottomline is dat we NMap Scripts kunnen gebruiken om geavanceerde scans uit te voeren. De NMap Scripting Engine (NSE) is een zeer krachtige en flexibele oplossing waarmee gebruikers hun eigen scripts kunnen schrijven.
Scrips kunnen je o.a. helpen bij geavanceerde netwerk inpectie, betere OS detectie, detectie van vulnerabilities, detectie van backdoors en exploitation van vulnerabilities.
Er zijn honderden scripts verkrijgbaar. NMap zelf heeft al meer dan 400 ingebouwde scripts aan boord en op het internet zijn er nog veel meer te vinden. Let er echter wel op dat je nooit een script uitvoert van een onbetrouwbare bron. Deze scripts kunnen een ongewenste werking hebben en in het ergste geval je eigen machine of netwerk exploiten.
NMap scripts eindigen allemaal op de “*.nse” extensie. Het zoeken naar alle NSE scripts op onze machine doen we als volgt:
locate *.nse |
Om te zoeken naar een specifiek script zoals b.v. een vulnerability script doen we als volgt:
locate *vuln*.nse |
Om te zoeken vanuit NMap, en om meteen meer informatie over het script te lezen gebruiken we:
--script-help "*vuln*" |
Ook kunnen we zoeken naar een specifiek script met specifieke keywords. Om dit te doen kun je het AND commando gebruiken:
--script-help "smtp-* and *vuln*" |
Het scannen middels een script wordt normaliter tegelijkertijd uitgevoerd in combinatie met een poortscan. Dit omdat scripts normaal gesproken wel of niet gedraaid worden n.a.v. de status van een bepaalde poort. Het is echter wel mogelijk om zonder een poortscan een script te draaien. Om dat te doen gebruik je de schakeloptie “-sn”. Er wordt dan alleen hostdetectie toegepast. Als je hiervoor kiest kunnen alleen hostscripts uitgevoerd worden. Om een scriptscan uit te voeren zonder poortdetectie en hostdetectie gebruik je de schakelopties -Pn en -sn samen met -sC (of -script). In dit geval zal NMap elke host scannen met het script zonder deze te controleren. Ook zijn in dit geval alleen de hostscripts beschikbaar. Je zou deze techniek kunnen gebruiken bij scripts zoals het whois-ip script, die alleen het adres van het externe systeem gebruikt en dus niet vereist dat het systeem up is.
Een script wordt normaliter uitgevoerd met de volgende syntax:
nmap --script <scriptnaam> <host ip> |
Het uitvoeren van een script ziet er dus als volgt uit:
nmap --script smtp-open-relay 192.168.1.100 |
Er zijn 4 NSE hoofdcategorieën, namelijk:
- Prerule Scripts – Deze scripts worden gedraaid voor de overige NMap scans gedraaid worden, dus nog voor NMap informatie heeft gevonden over betreffende hosts.
- Host Scripts – Deze scripts worden uitgevoerd nadat de normale NMap scans gedraaid zijn op een specifieke host zoals poortscans en hostscans.
- Service Scripts – Deze scripts worden gedraaid tegen een specifieke service (het hiervoor gebruikte SMTP script is dus een service script).
- Postrule Scripts – Deze scripts worden uitgevoerd nadat NMap alle scans op alle hosts heeft uitgevoerd.
Vervolgens worden scripts onderverdeeld in diverse categorieën zoals:
- Authentication Scripts – auth
- Host Discovery Scripts – broadcast
- Brute-Force Scripts – brute
- Network Discovery Scripts – discovery
- DOS Scripts – dos
- Exploitation Scripts – exploit
- Vulnerability Scripts – vuln
Er zijn echter nog meerdere categorieen.
Hiervoor hebben we een script gedraait zonder aanvullende argumenten. Sommige scripts vereisen echter additionele argumenten. Deze kunnen we toevoegen met de “–script-args” en “–script-args-file” flags. Dit zou er als volgt uit kunnen zien:
nmap --script mysql-audit --script-args "mysql-audit.username='root', \mysql-audit.password='wachtwoordje1', mysql-audit.filename='nselib/data/mysql-cis.audit'" |
Om dit script te laten draaien tegen een specifieke poort gebruik je de “-p” flag:
nmap -p 3306 --script mysql-audit --script-args "mysql-audit.username='root', \mysql-audit.password='wachtwoordje1', mysql-audit.filename='nselib/data/mysql-cis.audit'" |
Om alle scripts uit een specifieke categorie te gebruiken we de “–script” flag in combinatie met de categorienaam:
nmap --script broadcast 192.168.1.100 |
We kunnen de “–script” flag ook gebruiken om bijvoorbeeld alle SMTP scripts te draaien tegen een specifieke host:
nmap --script “smtp-*” 192.168.1.100 |
Je kunt ook meerdere scripts opgeven middels een komma of door middel van een Boolean expressie:
nmap --script "smtp-*", "*ssh-*” 192.168.1.100 nmap --script "smtp-*" and "*ssh-*” 192.168.1.100 |
Met de Boolean expressies kun je ook scripts uitsluiten:
nmap --script "not *ssh-*” 192.168.1.100 |
Om alle scripts uit de discovery categorie te gebruiken met uitzondering van de SSH scripts zou je het volgende kunnen doen:
nmap --script "(discovery) and not ssh-*” 192.168.1.100 |
Een paar voorbeeldjes
Voer een traceroute uit en geef bij iedere hop de geolocatie:
nmap --traceroute --script traceroute-geolocation.nse -p 80 jarnobaselier.nl |
Complete informatie van een IP adres:
nmap --script=asn-query,whois,ip-geolocation-maxmind jarnobaselier.nl |
Ontdek webtoepassingen. Dit script is een van de agressievere testen en brute-forces een webserverpad af om te ontdekken welke webtoepassingen er gebruikt worden gebruikt.
nmap --script http-enum 192.168.1.100 |
Local SMB brute-forcing:
nmap -sV -p 445 --script smb-brute 192.168.1.100 |
Detecteer Heartbleed SSL vulnerability op heel subnet:
nmap -sV -p 443 --script=ssl-heartbleed 192.168.1.0/24 |
Conclusie
Zoals je ziet is NMap een uiterst flexibele, krachtige tool welke uitermate geschikt is om een OS te fingerprinten maar welke ook ingezet kan worden om krachtigere scans uit te voeren. NMap is een van de weinige tools die niet maf ontbreken in de gereedschapskist van elke ICTer, security researcher en hacker…uiteraard!