Linux File Transfer Methods
Last updated
Last updated
Linux es un sistema operativo versátil que proporciona múltiples herramientas para transferir archivos. Comprender los métodos de transferencia de archivos en Linux puede ayudar a los atacantes y defensores a mejorar sus habilidades para atacar redes o prevenir ataques sofisticados.
En una intervención de respuesta ante incidentes realizada hace algunos años, encontramos múltiples actores maliciosos en seis de los nueve servidores web investigados. El atacante aprovechó una vulnerabilidad de inyección SQL y utilizó un script de Bash que, al ejecutarse, intentaba descargar otro malware para conectar al servidor con el C2 (command and control).
El script Bash intentaba tres métodos para descargar malware: primero cURL
, luego wget
y, si fallaban, usaba Python. Todos estos métodos utilizaban HTTP para la comunicación.
Aunque Linux puede comunicarse mediante FTP o SMB como Windows, la mayoría del malware usa HTTP y HTTPS. En esta sección, revisaremos varios métodos para transferir archivos en Linux, como HTTP, Bash y SSH.
Tenemos acceso a la máquina NIX04 y necesitamos descargar un archivo desde nuestra máquina Pwnbox. Veremos cómo podemos lograr esto utilizando varios métodos de descarga de archivos.
Dependiendo del tamaño del archivo, podemos usar un método que no requiera comunicación en red. Si tenemos acceso a una terminal, podemos codificar un archivo en una cadena Base64, copiar su contenido al terminal y realizar la operación inversa. Veamos cómo hacerlo usando Bash.
Usamos cat
para imprimir el contenido del archivo y codificarlo en Base64 usando una tubería |
. Usamos la opción -w 0
para crear una sola línea, y terminamos el comando con un punto y coma ;
y la palabra clave echo
para empezar una nueva línea, facilitando la copia.
El contenido codificado sería algo como esto (truncado por simplicidad):
Copiamos este contenido, lo pegamos en la máquina Linux de destino y usamos base64
con la opción -d
para decodificarlo.
Finalmente, podemos confirmar si el archivo fue transferido correctamente usando el comando md5sum
.
Nota: También puedes subir archivos usando la operación inversa. Desde tu máquina comprometida, usa
cat
para codificar un archivo en Base64 y decodifícalo en tu Pwnbox.
Dos de las herramientas más comunes en las distribuciones de Linux para interactuar con aplicaciones web son wget
y curl
. Estas herramientas están instaladas en muchas distribuciones de Linux.
Para descargar un archivo usando wget
, necesitamos especificar la URL y la opción -O
para establecer el nombre del archivo de salida.
cURL
es muy similar a wget
, pero la opción para el nombre del archivo de salida es en minúsculas -o
.
Debido a la forma en que funciona Linux y cómo operan las tuberías (pipes
), la mayoría de las herramientas que usamos en Linux pueden replicar operaciones sin archivos, lo que significa que no tenemos que descargar un archivo para ejecutarlo.
Nota: Algunos payloads, como
mkfifo
, escriben archivos en el disco. Aunque la ejecución del payload puede ser "sin archivos" cuando usas una tubería, dependiendo del payload elegido, puede que se creen archivos temporales en el sistema operativo.
Tomemos el comando cURL
que usamos anteriormente y, en lugar de descargar el script LinEnum.sh
, ejecutémoslo directamente usando una tubería.
De manera similar, podemos descargar un archivo de script Python desde un servidor web y canalizarlo al intérprete de Python. Hagamos esto usando wget
.
En ciertas situaciones, puede que no tengamos acceso a herramientas conocidas de transferencia de archivos. Mientras tengamos Bash versión 2.04 o superior instalado (compilado con --enable-net-redirections
), podemos usar el archivo de dispositivo /dev/tcp
para realizar descargas simples.
SSH (o Secure Shell) es un protocolo que permite el acceso seguro a computadoras remotas. SSH viene con la utilidad SCP para transferencias de archivos remotas, que, por defecto, usa el protocolo SSH.
SCP
(secure copy) es una utilidad de línea de comandos que permite copiar archivos y directorios entre dos hosts de manera segura. Podemos copiar archivos desde nuestra máquina local a servidores remotos y viceversa.
SCP es muy similar al comando cp
(copy), pero en lugar de proporcionar una ruta local, necesitamos especificar un nombre de usuario, la dirección IP o nombre DNS del host remoto, y las credenciales del usuario.
Antes de comenzar a descargar archivos desde nuestro objetivo Linux hacia nuestro Pwnbox, vamos a configurar un servidor SSH en nuestro Pwnbox.
Habilitar el servidor SSH
Ahora podemos comenzar a transferir archivos. Necesitamos especificar la dirección IP de nuestro Pwnbox, el nombre de usuario y la contraseña.
Nota: Puedes crear una cuenta de usuario temporal para transferencias de archivos y evitar usar tus credenciales o claves principales en una computadora remota.
En situaciones como la explotación binaria o el análisis de capturas de paquetes, necesitamos subir archivos desde nuestra máquina objetivo hacia nuestro host atacante. Los métodos que usamos para descargas también funcionarán para subidas. Veamos cómo podemos subir archivos de varias maneras.
Como mencionamos en la sección de métodos de transferencia de archivos de Windows, podemos usar uploadserver
, un módulo extendido del módulo HTTP.Server
de Python, que incluye una página de subida de archivos. Para este ejemplo en Linux, veamos cómo configurar el módulo uploadserver
para usar HTTPS y asegurar la comunicación.
Lo primero que necesitamos hacer es instalar el módulo uploadserver
.
Ahora necesitamos crear un certificado. En este ejemplo, usamos un certificado autofirmado.
El servidor web no debería alojar el certificado. Recomendamos crear un nuevo directorio para alojar el archivo de nuestro servidor web.
Ahora, desde nuestra máquina comprometida, subamos los archivos /etc/passwd
y /etc/shadow
.
Usamos la opción --insecure
porque usamos un certificado autofirmado en el que confiamos.
Dado que las distribuciones de Linux suelen tener Python o PHP instalados, iniciar un servidor web para transferir archivos es algo sencillo. Además, si el servidor que comprometimos es un servidor web, podemos mover los archivos que queremos transferir al directorio del servidor web y acceder a ellos desde la página web, lo que significa que estamos descargando el archivo desde nuestro Pwnbox.
Es posible levantar un servidor web utilizando varios lenguajes. Una máquina Linux comprometida puede no tener un servidor web instalado. En tales casos, podemos usar un mini servidor web. Aunque estos servidores no son muy seguros, son flexibles, ya que la ubicación del webroot y los puertos de escucha se pueden cambiar rápidamente.
Nota: Cuando iniciamos un nuevo servidor web usando Python o PHP, es importante considerar que el tráfico entrante podría estar bloqueado. Estamos transfiriendo un archivo desde nuestra máquina objetivo hacia nuestro host de ataque, pero no estamos subiendo el archivo.
Es posible encontrar empresas que permiten conexiones salientes con el protocolo SSH (TCP/22), y si es el caso, podemos usar un servidor SSH con la utilidad scp
para subir archivos. Vamos a intentar subir un archivo a la máquina objetivo usando el protocolo SSH.
Nota: Recuerda que la sintaxis de
scp
es similar a la decp
ocopy
.
Estos son los métodos más comunes de transferencia de archivos utilizando herramientas integradas en sistemas Linux, pero hay más. En las siguientes secciones, discutiremos otros mecanismos y herramientas que podemos usar para realizar operaciones de transferencia de archivos.