Windows File Transfer Methods
Last updated
Last updated
El sistema operativo Windows ha evolucionado en los últimos años, y las nuevas versiones incluyen diferentes utilidades para las operaciones de transferencia de archivos. Comprender cómo funciona la transferencia de archivos en Windows puede ser útil tanto para atacantes como para defensores. Los atacantes pueden utilizar varios métodos de transferencia de archivos para operar y evitar ser detectados. Por otro lado, los defensores pueden aprender cómo funcionan estos métodos para monitorearlos y crear las políticas correspondientes que eviten comprometer su seguridad. Utilicemos como ejemplo el artículo del blog de Microsoft sobre el ataque Astaroth, el cual representa una amenaza persistente avanzada (APT).
El artículo comienza hablando de amenazas sin archivos. El término "sin archivos" sugiere que una amenaza no viene en un archivo, sino que utiliza herramientas legítimas incorporadas en el sistema para ejecutar un ataque. Esto no significa que no haya una operación de transferencia de archivos. Como se discutirá más adelante en esta sección, el archivo no está "presente" en el sistema, sino que se ejecuta en memoria.
El ataque Astaroth generalmente siguió estos pasos: un enlace malicioso en un correo electrónico de spear-phishing condujo a un archivo LNK. Al hacer doble clic, el archivo LNK provocó la ejecución de la herramienta WMIC con el parámetro "/Format", lo que permitió la descarga y ejecución de código JavaScript malicioso. Este código JavaScript, a su vez, descargó cargas útiles abusando de la herramienta Bitsadmin.
Todas las cargas útiles estaban codificadas en base64 y fueron decodificadas utilizando la herramienta Certutil, lo que resultó en la creación de varios archivos DLL. La herramienta regsvr32 se utilizó para cargar uno de los DLL decodificados, que luego descifró y cargó otros archivos hasta que finalmente el payload Astaroth fue inyectado en el proceso Userinit. A continuación se muestra una representación gráfica del ataque.
Este es un excelente ejemplo de múltiples métodos de transferencia de archivos y de cómo los actores maliciosos utilizan esos métodos para evadir las defensas.
En esta sección, se hablará del uso de algunas herramientas nativas de Windows para realizar operaciones de descarga y subida de archivos. Más adelante, en este módulo, discutiremos los binarios "Living Off The Land" en Windows y Linux, y cómo usarlos para realizar operaciones de transferencia de archivos.
Tenemos acceso a la máquina MS02, y necesitamos descargar un archivo desde nuestra máquina Pwnbox. Veamos cómo podemos lograr esto utilizando múltiples métodos de descarga de archivos.
Dependiendo del tamaño del archivo que queramos transferir, podemos usar diferentes métodos que no requieren comunicación en red. Si tenemos acceso a una terminal, podemos codificar un archivo en una cadena base64, copiar su contenido desde la terminal y realizar la operación inversa, decodificando el archivo para restaurar el contenido original. Veamos cómo hacer esto con PowerShell.
Un paso esencial en este método es asegurarse de que el archivo codificado y decodificado sea correcto. Podemos usar md5sum, un programa que calcula y verifica checksums MD5 de 128 bits. La función hash MD5 actúa como una huella digital compacta de un archivo, lo que significa que un archivo debe tener el mismo hash MD5 en todas partes. Intentemos transferir una clave SSH de ejemplo, que puede ser cualquier otro archivo, desde nuestra máquina Pwnbox al objetivo Windows.
Podemos copiar este contenido y pegarlo en una terminal de PowerShell en Windows, usando algunas funciones de PowerShell para decodificarlo.
Nota: Este método es conveniente, pero tiene limitaciones, como la longitud máxima de cadena en la línea de comandos de Windows (8,191 caracteres). Además, shells web pueden fallar si se intentan enviar cadenas extremadamente grandes.
La mayoría de las empresas permiten tráfico HTTP y HTTPS saliente a través del firewall para la productividad de los empleados. Aprovechar estos métodos de transporte para transferencias de archivos es conveniente, aunque los defensores pueden usar soluciones de filtrado web para evitar el acceso a ciertas categorías de sitios web o bloquear la descarga de tipos de archivos específicos.
PowerShell ofrece varias opciones para la transferencia de archivos. En cualquier versión de PowerShell, la clase System.Net.WebClient
puede usarse para descargar un archivo mediante HTTP, HTTPS o FTP. Aquí está la tabla con los métodos de WebClient para descargar datos:
Método | Descripción |
---|---|
| Devuelve los datos de un recurso como un Stream. |
| Devuelve los datos de un recurso sin bloquear el hilo que lo llama. |
| Descarga datos de un recurso y los devuelve como un array de Bytes. |
| Descarga datos sin bloquear el hilo que lo llama. |
| Descarga datos a un archivo local. |
| Descarga datos a un archivo local sin bloquear el hilo. |
| Descarga una cadena de un recurso y la devuelve. |
| Descarga una cadena sin bloquear el hilo. |
Exploremos algunos ejemplos de estos métodos para descargar archivos usando PowerShell.
Podemos usar Net.WebClient
y el método DownloadFile
con los parámetros correspondientes a la URL del archivo a descargar y el nombre de salida.
En ataques sin archivos, en lugar de descargar un script de PowerShell al disco, podemos ejecutarlo directamente en memoria usando Invoke-Expression
o el alias IEX
.
Desde PowerShell 3.0, el cmdlet Invoke-WebRequest
también está disponible, aunque es notablemente más lento para descargar archivos. Se puede usar con alias como iwr
, curl
o wget
.
Si el motor de Internet Explorer no está disponible o la configuración inicial no se ha completado, podemos agregar el parámetro -UseBasicParsing
.
Error de Canal Seguro SSL/TLS
Si el certificado no es confiable, podemos evitar el error con el siguiente comando:
El protocolo Server Message Block (SMB), que opera en el puerto TCP/445, es común en redes empresariales donde se ejecutan servicios de Windows. Este protocolo permite a las aplicaciones y usuarios transferir archivos hacia y desde servidores remotos.
Podemos usar SMB para descargar archivos fácilmente desde nuestro Pwnbox. Para ello, necesitamos crear un servidor SMB en Pwnbox con smbserver.py de Impacket, y luego utilizar comandos como copy
, move
, PowerShell Copy-Item
, u otra herramienta que permita la conexión a SMB.
Para descargar un archivo del servidor SMB al directorio de trabajo actual, podemos usar el siguiente comando:
Las versiones más recientes de Windows bloquean el acceso de invitados no autenticados, como podemos ver en el siguiente mensaje de error:
Para transferir archivos en este escenario, podemos establecer un nombre de usuario y contraseña usando nuestro servidor SMB de Impacket y montar el servidor SMB en la máquina Windows objetivo:
Nota: También puedes montar el servidor SMB si recibes un error al usar el comando
copy filename \\IP\sharename
.
Otra forma de transferir archivos es utilizando FTP (File Transfer Protocol), que utiliza los puertos TCP/21 y TCP/20. Podemos usar el cliente FTP o PowerShell Net.WebClient para descargar archivos desde un servidor FTP.
Podemos configurar un servidor FTP en nuestro host de ataque utilizando el módulo pyftpdlib de Python3. Se puede instalar con el siguiente comando:
Luego podemos especificar el número de puerto 21, ya que por defecto pyftpdlib utiliza el puerto 2121. La autenticación anónima está habilitada por defecto si no establecemos un usuario y contraseña.
Una vez configurado el servidor FTP, podemos realizar transferencias de archivos utilizando el cliente FTP preinstalado en Windows o PowerShell Net.WebClient.
Cuando obtenemos una shell en una máquina remota, puede que no tengamos una shell interactiva. En ese caso, podemos crear un archivo de comandos FTP para descargar un archivo. Primero, necesitamos crear un archivo que contenga los comandos que queremos ejecutar y luego usar el cliente FTP para ejecutar esos comandos y descargar el archivo.
También hay situaciones, como el crackeo de contraseñas, análisis, exfiltración, etc., en las que necesitamos subir archivos desde nuestra máquina objetivo a nuestro host de ataque. Podemos utilizar los mismos métodos que empleamos para la descarga, pero esta vez para subir archivos.
Vimos cómo decodificar una cadena base64 utilizando PowerShell. Ahora, vamos a realizar la operación inversa: codificar un archivo para poder decodificarlo en nuestro host de ataque.
Para verificar la integridad del archivo, podemos calcular su hash MD5:
En el host de ataque, copiamos la salida de PowerShell y utilizamos el comando base64
para decodificarla y recuperar el archivo.
Para confirmar que el archivo se transfirió correctamente, calculamos su hash MD5 en Linux:
PowerShell no tiene una función incorporada para operaciones de subida de archivos, pero podemos utilizar los cmdlets Invoke-WebRequest o Invoke-RestMethod para construir una función de subida. También necesitaremos un servidor web que acepte subidas de archivos.
Para nuestro servidor web, podemos usar uploadserver, un módulo extendido de Python HTTP.server que incluye una página para subir archivos. A continuación, lo instalamos y arrancamos el servidor web.
Luego, iniciamos el servidor:
Usamos el script PSUpload.ps1 para realizar la operación de subida de archivos. Este script acepta dos parámetros: -File
, para especificar la ruta del archivo, y -Uri
, para la URL del servidor donde subiremos el archivo.
Otra forma de utilizar PowerShell y archivos codificados en base64 para subir archivos es mediante Invoke-WebRequest o Invoke-RestMethod junto con Netcat. Utilizamos Netcat para escuchar en un puerto especificado y enviar el archivo como una solicitud POST.
Codificamos el archivo en base64 y lo enviamos:
En el host de ataque, capturamos los datos base64 con Netcat:
Finalmente, decodificamos la cadena base64 para recuperar el archivo original:
Las empresas suelen permitir el tráfico saliente utilizando los protocolos HTTP (TCP/80) y HTTPS (TCP/443), pero generalmente no permiten el protocolo SMB (TCP/445) fuera de su red interna debido a posibles ataques. Sin embargo, podemos usar SMB sobre HTTP con WebDav, que es una extensión de HTTP. WebDav permite que un servidor web actúe como un servidor de archivos, lo que permite la creación colaborativa de contenido y puede usar tanto HTTP como HTTPS.
Cuando utilizas SMB, primero intenta conectarse mediante el protocolo SMB, y si no encuentra un recurso compartido SMB, intentará conectarse mediante HTTP.
Para configurar un servidor WebDav, necesitamos instalar dos módulos de Python: wsgidav y cheroot. Luego ejecutamos la aplicación wsgidav en el directorio objetivo.
El comando anterior ejecutará el servidor WebDav en el puerto 80 con acceso anónimo al directorio /tmp
.
En el host de Windows, podemos conectarnos al recurso compartido usando la palabra clave DavWWWRoot
, que es reconocida por Windows Shell para indicar que te conectas a la raíz de un servidor WebDav.
Este comando mostrará el contenido del recurso compartido en el servidor WebDav.
Para subir archivos al recurso compartido WebDav desde un host Windows, podemos usar el comando copy
:
O también podemos especificar un directorio específico en el servidor:
También es posible subir archivos usando FTP de manera similar a cómo se descargan archivos. Antes de empezar, podemos usar el módulo de Python pyftpdlib para iniciar un servidor FTP con permisos de escritura.
Iniciando el servidor FTP
Esto inicia un servidor FTP en el puerto 21 que permite cargas anónimas.
Subiendo Archivos con PowerShell a un Servidor FTP
Luego, desde un host de Windows, podemos usar una función de PowerShell para subir un archivo al servidor FTP.
Podemos subir un archivo usando PowerShell con el siguiente comando:
Podemos crear un archivo de comandos para que el cliente FTP ejecute la carga del archivo de manera automatizada.
Este archivo de comandos ejecuta los siguientes pasos:
Se conecta al servidor FTP (open 192.168.49.128
).
Inicia sesión con el usuario anonymous
.
Cambia al modo binario.
Sube el archivo hosts
desde C:\Windows\System32\drivers\etc\hosts
.
Cierra la conexión.