1. Elige por dirección, confianza y requisitos
Una transferencia tiene cinco piezas: origen, destino, iniciador, transporte y verificación. En un pull, el objetivo solicita un archivo a tu máquina; en un push, el origen lo envía a un servicio autorizado. Antes de copiar, decide qué lado puede escuchar, qué puerto permite la red y qué autenticación exige la política.
HTTP temporal
Útil para un archivo pequeño y no sensible dentro de una red aislada. Python http.server no aporta autenticación ni TLS.
SCP
Preferible si ya existe SSH autorizado: cifra, autentica y funciona en ambos sentidos sin abrir otro servicio.
SMB
Adecuado cuando existe un recurso administrado y auditado. Usa cuenta individual, firma o cifrado según política.
PowerShell y BITS
Alternativas nativas de Windows para HTTP(S); BITS aporta gestión del trabajo, pero depende del servicio y del servidor.
- Origen y destino son 192.168.56.10 y 192.168.56.20 dentro de una red host-only propia
- Solo se moverán muestra.txt y resultado-lab.txt, ambos creados para el ejercicio
- El archivo final no reemplazará uno existente: primero se guarda con sufijo .part
- El hash SHA-256 de origen se conoce antes de iniciar la copia
- Existe una hora de cierre y un responsable para autorizar cambios de firewall o servicios
2. Prepara un archivo inocuo y una verificación independiente
La máquina del analista usa 192.168.56.10 y el objetivo de laboratorio192.168.56.20. Sustituye estas direcciones únicamente por las de tu red privada autorizada. Crea el archivo fuera de cualquier carpeta con datos reales y calcula su hash antes de iniciar un servidor.
mkdir -p "$HOME/cubix-transfer-lab/salida" "$HOME/cubix-transfer-lab/entrada"printf 'Cubix transfer lab\n' > "$HOME/cubix-transfer-lab/salida/muestra.txt"stat -c '%A %U:%G %s bytes %n' "$HOME/cubix-transfer-lab/salida/muestra.txt"sha256sum "$HOME/cubix-transfer-lab/salida/muestra.txt"mkdir -p "$HOME/cubix-transfer-lab/salida" "$HOME/cubix-transfer-lab/entrada"printf 'Cubix transfer lab\n' > "$HOME/cubix-transfer-lab/salida/muestra.txt"stat -f '%Sp %Su:%Sg %z bytes %N' "$HOME/cubix-transfer-lab/salida/muestra.txt"shasum -a 256 "$HOME/cubix-transfer-lab/salida/muestra.txt"$Lab = Join-Path $env:USERPROFILE 'cubix-transfer-lab'New-Item -ItemType Directory -Force -Path (Join-Path $Lab 'salida'),(Join-Path $Lab 'entrada') | Out-NullSet-Content -LiteralPath (Join-Path $Lab 'salida\muestra.txt') -Value 'Cubix transfer lab' -Encoding utf8Get-Item -LiteralPath (Join-Path $Lab 'salida\muestra.txt') | Select-Object FullName,Length,LastWriteTimeGet-FileHash -LiteralPath (Join-Path $Lab 'salida\muestra.txt') -Algorithm SHA256Los archivos creados por PowerShell y por printf pueden tener bytes distintos por codificación o final de línea; no compares hashes entre recetas. Compara siempre el hash del archivo concreto servido con el recibido. Un nombre igual no demuestra integridad.
3. HTTP temporal: Python, curl y wget
python -m http.server sirve el directorio indicado y, si no especificas --bind, puede escuchar en todas las interfaces. En este laboratorio se vincula solo a la interfaz host-only del analista. No lo uses para archivos sensibles ni redes compartidas: no tiene autenticación ni TLS. Déjalo en primer plano para ver solicitudes y detenlo con Ctrl+C al terminar.
python3 --versionpython3 -m http.server 8000 --bind 192.168.56.10 --directory "$HOME/cubix-transfer-lab/salida"py --versionpy -m http.server 8000 --bind 192.168.56.10 --directory "$env:USERPROFILE\cubix-transfer-lab\salida"En el objetivo Linux, descarga primero a .part. curl --fail devuelve error ante códigos HTTP 400 o superiores y --show-error conserva el diagnóstico. Wget es una alternativa; su opción-O crea o trunca el destino al comenzar, por lo que también usa un nombre parcial. Renombra solo después de que el hash coincida con el origen.
curl --fail --show-error --location --max-time 30 --output /tmp/muestra.txt.part http://192.168.56.10:8000/muestra.txtsha256sum /tmp/muestra.txt.partmv /tmp/muestra.txt.part /tmp/muestra.txtwget --tries=1 --timeout=10 --output-document=/tmp/muestra.txt.part http://192.168.56.10:8000/muestra.txtsha256sum /tmp/muestra.txt.partmv /tmp/muestra.txt.part /tmp/muestra.txt$Part = Join-Path $env:TEMP 'muestra.txt.part'curl.exe --fail --show-error --location --max-time 30 --output $Part http://192.168.56.10:8000/muestra.txtGet-FileHash -LiteralPath $Part -Algorithm SHA256Move-Item -LiteralPath $Part -Destination (Join-Path $env:TEMP 'muestra.txt')4. SCP sobre SSH: cifrado, autenticación y ambos sentidos
SCP requiere un servidor SSH ya autorizado en el lado remoto y una cuenta válida. Desde OpenSSH 9.0,scp usa SFTP por defecto. En el primer contacto, compara la huella de la clave del host por un canal independiente; no uses StrictHostKeyChecking=no ni aceptes una clave cambiada sin investigación. La opción -p conserva fechas y modos, así que omítela si la política exige permisos nuevos del destino.
ssh -Vscp "$HOME/cubix-transfer-lab/salida/muestra.txt" labuser@192.168.56.20:/tmp/muestra.txt.partssh labuser@192.168.56.20 'sha256sum /tmp/muestra.txt.part'Get-Command scp.exe,ssh.exescp.exe "$env:USERPROFILE\cubix-transfer-lab\salida\muestra.txt" labuser@192.168.56.20:/tmp/muestra.txt.partssh.exe labuser@192.168.56.20 'sha256sum /tmp/muestra.txt.part'Para comprobar el sentido inverso, crea en el objetivo un archivo ficticio y envíalo a la carpeta de entrada del analista. Este paso requiere que el analista tenga un servidor SSH autorizado; si solo dispone de cliente, inicia el scp desde el analista y usa la sintaxis remota como origen.
printf 'Resultado ficticio del laboratorio\n' > /tmp/resultado-lab.txtsha256sum /tmp/resultado-lab.txtscp labuser@192.168.56.20:/tmp/resultado-lab.txt "$HOME/cubix-transfer-lab/entrada/resultado-lab.txt.part"sha256sum "$HOME/cubix-transfer-lab/entrada/resultado-lab.txt.part"mv "$HOME/cubix-transfer-lab/entrada/resultado-lab.txt.part" "$HOME/cubix-transfer-lab/entrada/resultado-lab.txt"5. SMB: usa un recurso administrado, no uno improvisado
SMB permite leer y escribir mediante una ruta UNC como \\192.168.56.10\CubixLab. Esta guía asume que un administrador ya creó el recurso con carpetas salida e entrada, una cuenta individual, auditoría y permisos mínimos. No habilites SMB1, acceso guest ni una regla global de firewall para completar el ejercicio. Introduce la credencial de forma interactiva; nunca la pongas en la línea de comandos, una URL, un script o el historial.
Test-NetConnection 192.168.56.10 -Port 445$Credential = Get-Credential -Message 'Cuenta individual del laboratorio SMB'New-PSDrive -Name X -PSProvider FileSystem -Root '\\192.168.56.10\CubixLab' -Credential $CredentialCopy-Item -LiteralPath 'X:\salida\muestra.txt' -Destination "$env:TEMP\muestra.txt.part"Get-FileHash -LiteralPath "$env:TEMP\muestra.txt.part" -Algorithm SHA256Copy-Item -LiteralPath "$env:TEMP\resultado-lab.txt" -Destination 'X:\entrada\resultado-lab.txt'Remove-PSDrive XRemove-Variable CredentialEn Linux, smbclient ofrece una interfaz de cliente sin montar el recurso. -U recibe el usuario y solicita la contraseña; no añadas %contraseña. Verifica el hash y limita las operaciones a los dos archivos de laboratorio.
smbclient //192.168.56.10/CubixLab -U 'LAB/auditor' -c 'get salida/muestra.txt /tmp/muestra.txt.part'sha256sum /tmp/muestra.txt.partsmbclient //192.168.56.10/CubixLab -U 'LAB/auditor' -c 'put /tmp/resultado-lab.txt entrada/resultado-lab.txt'6. Alternativas nativas cuando Windows no tiene la primera herramienta
Comprueba disponibilidad antes de cambiar de técnica. curl.exe evita la ambigüedad del aliascurl en Windows PowerShell antiguo. Invoke-WebRequest existe desde PowerShell 3 y-OutFile guarda la respuesta. BITS es apropiado para un endpoint HTTP(S) o SMB administrado y puede ofrecer diagnóstico del trabajo, pero depende del servicio BITS y de las políticas del equipo.
Get-Command curl.exe,Invoke-WebRequest,Start-BitsTransfer,scp.exe -ErrorAction SilentlyContinue | Select-Object Name,Source$PSVersionTable.PSVersion$Part = Join-Path $env:TEMP 'muestra.txt.part'Invoke-WebRequest -UseBasicParsing -Uri 'http://192.168.56.10:8000/muestra.txt' -OutFile $Part -TimeoutSec 30Get-FileHash -LiteralPath $Part -Algorithm SHA256Import-Module BitsTransfer$Part = Join-Path $env:TEMP 'muestra.txt.part'Start-BitsTransfer -Source 'http://192.168.56.10:8000/muestra.txt' -Destination $Part -DisplayName 'Cubix lab transfer'Get-FileHash -LiteralPath $Part -Algorithm SHA256Si BITS entra en estado de error, consulta Get-BitsTransfer -AllUsers solo con autorización administrativa; desde una cuenta normal usa Get-BitsTransfer para tus propios trabajos. No fuerces credenciales almacenadas ni relajes validación TLS para hacerlo funcionar.
7. Cuando falla: diagnostica de abajo arriba
Cambiar de herramienta sin localizar la capa suele repetir el mismo fallo. Empieza por el nombre o la IP, continúa con ruta y puerto, confirma el servicio, revisa la respuesta del protocolo y termina en permisos e integridad. Ejecuta una sola prueba por vez y conserva el mensaje completo.
Connection refused
La ruta llega al host, pero nada acepta ese puerto o el servicio escucha en otra interfaz. Revisa el bind y el proceso del servidor.
Timeout
Puede existir ruta incorrecta, firewall, NAT, VPN o proxy. No abras puertos sin ventana de cambio; verifica la topología.
404 Not Found
El servidor respondió: el problema es el nombre o el directorio servido. Comprueba mayúsculas y ruta relativa.
401, 403 o access denied
El servicio exige identidad o niega el objeto. Confirma cuenta, ACL y alcance; no pruebes credenciales ajenas.
Host key changed
Detén SCP. Confirma reconstrucción o rotación con el propietario antes de modificar known_hosts.
Hash distinto
No renombres ni uses el archivo. Repite desde el origen conocido y compara tamaño, codificación y transferencia completa.
ip route get 192.168.56.10curl --verbose --max-time 10 http://192.168.56.10:8000/muestra.txt --output /dev/nullssh -vv -o BatchMode=yes -o ConnectTimeout=10 labuser@192.168.56.20 truestat -c '%A %U:%G %s %n' /tmp /tmp/muestra.txt.partTest-NetConnection 192.168.56.10 -Port 8000 -InformationLevel DetailedTest-NetConnection 192.168.56.20 -Port 22 -InformationLevel DetailedTest-NetConnection 192.168.56.10 -Port 445 -InformationLevel Detailednetsh winhttp show proxyGet-Acl -LiteralPath $env:TEMP | Format-List Owner,AccessUn error TLS se corrige usando el nombre esperado y una CA confiable, no con -k,--no-check-certificate o -SkipCertificateCheck. Si EDR, AppLocker, firewall o proxy bloquean la transferencia, registra producto, regla, hora y operación; solicita el canal corporativo aprobado. Ese bloqueo es una señal defensiva válida, no un obstáculo que esta guía deba sortear.
8. Ejercicio verificable y limpieza
Completa dos recorridos: muestra.txt del analista al objetivo yresultado-lab.txt del objetivo al analista. Usa HTTP para el primero y SCP o el recurso SMB administrado para el segundo. Registra método, iniciador, origen, destino, tamaño, hash, hora y resultado. El ejercicio termina cuando ambos hashes coinciden y los servicios temporales están detenidos.
- Los únicos archivos transferidos fueron muestra.txt y resultado-lab.txt
- Cada descarga usó un nombre .part hasta verificar SHA-256
- Python escuchó solo en 192.168.56.10 y terminó con Ctrl+C
- SCP verificó la clave del host y no desactivó StrictHostKeyChecking
- SMB usó cuenta individual, recurso autorizado y credencial interactiva
- No se desactivó EDR, firewall, proxy, TLS, firma SMB ni otro control
- Los fallos se clasificaron por capa antes de elegir una alternativa
- La bitácora conserva hashes y mensajes, pero no credenciales ni contenido sensible
find "$HOME/cubix-transfer-lab" -maxdepth 2 -type f -printsha256sum "$HOME/cubix-transfer-lab/salida/muestra.txt" "$HOME/cubix-transfer-lab/entrada/resultado-lab.txt"find "$HOME/cubix-transfer-lab" -maxdepth 2 -type f -printshasum -a 256 "$HOME/cubix-transfer-lab/salida/muestra.txt" "$HOME/cubix-transfer-lab/entrada/resultado-lab.txt"Get-ChildItem -LiteralPath "$env:USERPROFILE\cubix-transfer-lab" -File -Recurse | Select-Object FullName,LengthGet-FileHash -LiteralPath "$env:USERPROFILE\cubix-transfer-lab\salida\muestra.txt" -Algorithm SHA256Glosario
Transferencia pull
Flujo en el que el sistema de destino inicia la descarga desde un servidor conocido.
Transferencia push
Flujo en el que el sistema de origen inicia el envío hacia un destino autorizado.
Bind
Asociación de un servicio a una dirección local y un puerto concretos para recibir conexiones.
HTTP temporal
Servidor web de vida corta usado para entregar archivos no sensibles dentro de un laboratorio aislado.
SCP
Utilidad de copia de OpenSSH que transfiere archivos sobre una conexión SSH autenticada y cifrada.
SFTP
Protocolo de transferencia de archivos que funciona sobre SSH y que OpenSSH usa actualmente como base predeterminada de scp.
SMB
Protocolo de compartición de archivos usado por Windows y Samba para acceder a recursos remotos.
Ruta UNC
Ruta de red de Windows con la forma doble barra inversa, servidor y recurso compartido.
Archivo parcial
Destino temporal, normalmente con sufijo .part, que evita confundir una descarga incompleta con el archivo final.
Hash SHA-256
Huella criptográfica usada aquí para comprobar que origen y destino contienen exactamente los mismos bytes.
Proxy
Intermediario que recibe y reenvía solicitudes y que puede cambiar autenticación, rutas o políticas de una transferencia.