Powershell Empire 1/2
Misschien heb je al weleens van Powershell Empire gehoord? Misschien heb je er zelfs al eens mee gewerkt. Powershell Empire is een framework speciaal voor Windows-based computers welke Powershell ondersteunen. Dus van Windows 7 tot de nieuwste Windows Server versies. Powershell is in sommige opzichten redelijk vergelijkbaar met Metasploit. Powershell Empire is een post-exploitation tool welke ook werkt met listeners, stagers en agents en waarbij we ook gebruik kunnen maken van onze geliefde Meterpreter. In tegenstelling tot Metasploit is Powershell Empire alleen geschikt voor Windows computers maaruhh lekker belangrijk. De meeste targets zijn toch Windows computers, dus laten we lekker van start gaan.
Powershell Empire geeft de mogelijk om commando’s uit te voeren in het geheugen van de computer. Doordat het meeste niet op de HD van de computer uitgevoerd wordt betekend dit ook dat veel AV scanners de commando’s niet als malicious zullen aanmerken. Daarnaast krijgen we via Powershell gemakkelijk volledige .NET toegang, kunnen we applicaties whitelisten, kunnen we de Win32 API gebruiken en nog heel veel meer. Powershell is een zeer krachtige tool voor beheerders en zoals altijd komt met veel kracht ook veel verantwoordelijkheid. Powershell heeft alles in huis om een hacker gelukkig te maken. Het is zeker niet de exploit maar wel een perfecte enabler.
Het installeren van Powershell Empire
Het installeren van Powershell Empire is redelijk eenvoudig en straightforeward. De installatie van Powershell Empire gebeurt op een Linux-based machine, bij voorkeur Kali Linux. Allereerst moeten de bestanden downloaden:
git clone https://github.com/EmpireProject/Empire.git |
Vervolgens ga ja naar de setup folder alwaar je het installatiebestand uitvoert:
./install.sh |
Tijdens de setup wordt je gevraagd om het “Server Negotiation” wachtwoord in te willen.

Nadat je het wachtwoord ingevuld hebt is de installatie voltooid en kun je je Powershell Empire opstarten door terug naar de Empire root folder te gaan waar je het “./empire” script aanroept.

Zoals je ziet laat Powershell Empire net als Metasploit zien hoeveel modules er geladen zijn maar ook hoeveel listeners en agents er momenteel actief zijn.
Listeners, Stagers, Agents en meer per-informatie
Laten we, voor we verder gaan even wat informatie verduidelijken.
Listener
Een “listener” is inderdaad zoals het klinkt, een “luister module”. Als een listener actief is dan wacht deze op een inkomende verbinding. Als er verbinding met een listener word gemaakt dan kan de listener op zijn beurt weer informatie retour sturen zoals b.v. een exploit.
Agent
Een “agent” is een stukje software welke de verbinding tussen de client en de server in stand houdt.
Stager
Een “stager” is malicious code welke via een actieve agent uitgevoerd kan worden op de geïnfecteerde PC.
Maar Powershell Empire zegt toch dat er een X aantal modules geladen zijn? Wat zijn dan modules? Een module is een stukje software welke het mogelijk maakt om de malicious commando’s uit te voeren zoals het escaleren van privileges, het onderscheppen van credentials, het downloaden van tools etc.
Laten we bovenstaande eens omschrijven in de flow zoals deze normaliter uitgevoerd wordt.
1. Op onze server starten we een listener welke luistert op een specifiek IP adres en een specifieke poort. Zowel HTTP als HTTPS listeners zijn mogelijk. De HTTPS listeners kunnen gebruik maken van de door Powershell Empire gegenereerde self-signed certificaten. Powershell Empire listeners kunnen opgezet worden met additionele eigenschappen zoals Name, WorkingHours, KillDate, DefaultJitter etc. Uiteraard kunnen er meerdere listeners tegelijkertijd actief zijn.
2. Als de listener gestart is moeten we ervoor zorgen dat we verbinding krijgen. Hier zorgt de stager voor (zoals de Payload in Metasploit). Powershell Empire kent verschillende stagers in een modulair formaat (*./lib/stagers/ **). Er zijn verschillende stagers zoals dll’s, macro’s, oneliners en meer. De stager initieert de verbinding middels een key-exchange. Powershell Empire gebruikt hier het Encrypted Key Exchange (EKE) key-exchange protocol voor.
De client initieerd de verbinding middels een kleine launcher (een standaard proxy-aware IEX download-cradle) om het script “./data/stager.ps1” te downloaden en uit te voeren. De URI-bron voor dit verzoek wordt geconfigureerd onder ./setup_database.py onder de parameter STAGE0_URI.
het stager.ps1 script wordt per aanvraag willekeurig gegenereerd en vervolgens XOR gecodeerd met de AES-staging-sleutel uit de databaseconfiguratie. Dit betekent dat de key-negotiation-stager per server verschillend is maar voor elke serverinstantie statisch zal zijn. De staging-sleutel wordt met het launcher verzonden om de stager te ontsleutelen.
In het geheugen genereert de stager een willekeurig RSA private / public sleutelpaar waarbij hij de AES-staging-sleutel gebruikt om de encrypted RSA public key naar de STAGE1_URI-resource te verzenden (ook te specificeren in ./setup_database.py). Een willekeurig SESSIONID met 12 tekens wordt eveneens gegenereerd. Het SESSIONID is de initiële naam die de agent gebruikt om in te checken. Hierna retourneert de server de epoch-tijd van de server en een willekeurige AES sessiesleutel welke gecodeerd is met de openbare sleutel van de agent.
Nu decodeert de agent waardes, verzamelt hij de basisinformatie van het systeem en verzendt deze informatie naar de server in een bericht welke versleuteld is met een nieuwe AES-sessiesleutel naar de STAGE2_URI. De server retourneert tenslotte het gepatchte ./data/agent.ps1 script, die kan worden beschouwd als de standaard-API.

Om een stager te gebruiken, vanuit het hoofdmenu, listeners menu of het agents menu gebruik je “usestager” (welke je eventueel aanvult met de TAB toets) om een verzameling van beschikbare stagers te krijgen.
3. Als de sessie opgebouwd is wordt er een agent gestart om de connectie in stand te houden. Je kunt verbinding maken met de agent om te communiceren met de cliënt. Om interatie te krijgen met een agent gebruik je “interact %agent-name%”. Om de agent te sluiten gebruik je “kill %agent-name”. Het “info” commando zal in het agents menu meer informatie over de agent verschaffen.
4. Nu is het tijd om echt iets te gaan doen. Via de agent ga je een module laden. De module geeft je de werkelijke tools en functies om iets op de cliënt te doen. Om de beschikbare modules te bekijken gebruik je het “usemodule” commando welke je eventueel weer met de TAB toets kunt completeren. Je kunt ook modules zoeken d.m.v. het %searchmodule %modulenaam%” commando.
5. Naast modules die bepaalde functionaliteiten verschaffen kun je ook Powershell Scripts (PS1) importeren en gebruiken. Dit doe je met het “scriptimport” commando Als het script is geïmporteerd zullen alle functies van het script beschikbaar zijn. Communiceren met het script doe je met het “scriptcmd” commando.
Nu we een beetje weten hoe het proces in elkaar steekt en waarvoor de verschillende Powershell Empire onderdelen dienen gaan we eens rondneuzen in Powershell Empire.
Rondneuzen in Powershell Empire
Het eerste belangrijke commando binnen Powershell Empire is uiteraard het “help” commando.
help |
Het uitvoeren van het help commando in de root van Powershell Empire geeft het volgende resultaat:

Dit overzicht geeft een goed idee wat we allemaal kunnen doen.
Binnen Powershell Empire kunnen we commando’s altijd automatisch afmaken met de TAB toets. Zo zal “liste” met de TAB toets afgemaakt worden naar “listeners”. Als er meerdere mogelijkheden zijn kunnen we deze ook met de TAB toets doorlopen. Zo zal “lis” afgemaakt worden als “list” en bij de volgende TAB zullen alle opties gegeven worden (list en listeners).
We gebruiken het “back” commando om terug te gaan naar het vorige menu (meestal het hoofdmenu). Om meteen terug te keren naar het hoofdmenu kun je ook het “main” commando gebruiken.
Het aanpassen van opties doe je met “edit” en het instellen van opties doe je net als in Metasploit met “set”.
Om Powershell Empire te sluiten gebruik je simpelweg het “exit” commando.
Dat zijn de algemene commando’s. Nu wordt het tijd om echt eens wat te gaan doen. Laten we een listener starten.
Start een Powershell Empire Listener
Zoals we hierboven hebben gezien moeten we allereerst een listener aanmaken waarop we een binnenkomende verbinding kunnen ontvangen. Om te kijken hoeveel listeners er actief zijn kun je het “list” commando gebruiken. Dit commando resulteert eveneens ook alle actieve agents.
Om naar het listener menu te gaan gebruik je:
listeners |

Wat opvalt is dat Powershell Empire mooi laat zien waar je je bevind binnen het framework. Powershell Empire plaatst een blauwe indicator achter de prompt om aan te geven sta we ons nu in het “listeners” menu bevinden. Deze verduidelijking is overeenkomstig met Metasploit.
Momenteel zijn er nog geen listeners actief. We kunnen een listener starten met het “uselistener” commando. Maar er zijn verschillende soorten listeners. Deze kunnen we vinden door het commando “uselistener” af te maken met een spatie + TAB:

Voor dit voorbeeld gebruiken we weer de alom bekende Meterpreter. Om de Meterpreter listener te starten gebruiken we:
uselistener meterpreter |
De prompt geeft nu duidelijk aan dat we in het Meterpreter listener menu zitten. Om te zien wat we hier kunnen doen gebruiken we weer het “help” commando:

Ok, het “info” commando geeft ons dus meer inzage in de opties die we in kunnen stellen, en die opties stellen we in met het “set” commando. Welke opties hebben we?

Let erop dat Powershell Empire hoofdletter gevoelig is. Foutief gebruik van een hoofdletter of kleine letter kan een foutmelding genereren. Laten we de opties eens instellen;
set Host 192.168.178.170 set Name meterpreter-listener-1 set Port 4443 |

Nu de opties zijn ingesteld kunnen we de listener starten. Dit doen we met het volgende commando:
execute |
ook het hoofdmenu zal nu aangeven dat we 1 actieve listener hebben:

Tot deel 2…
Tot zover het eerste deel van deze twee-delige Powershell Empire post. In de volgende post zoomen we dieper in op de Powershell Empire Stagers, Agents en Modules. Tot volgende week!