Windows File Transfer Methods

Introducción

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.

Operaciones de descarga

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.

Codificación y Decodificación Base64 en PowerShell

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.

Verificar el Hash MD5 de la clave SSH en Pwnbox

Codificar la clave SSH a Base64 en Pwnbox

Podemos copiar este contenido y pegarlo en una terminal de PowerShell en Windows, usando algunas funciones de PowerShell para decodificarlo.

Decodificar en PowerShell

Confirmar que los Hashes MD5 coincidan

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.

Descargas Web en PowerShell

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

OpenRead

Devuelve los datos de un recurso como un Stream.

OpenReadAsync

Devuelve los datos de un recurso sin bloquear el hilo que lo llama.

DownloadData

Descarga datos de un recurso y los devuelve como un array de Bytes.

DownloadDataAsync

Descarga datos sin bloquear el hilo que lo llama.

DownloadFile

Descarga datos a un archivo local.

DownloadFileAsync

Descarga datos a un archivo local sin bloquear el hilo.

DownloadString

Descarga una cadena de un recurso y la devuelve.

DownloadStringAsync

Descarga una cadena sin bloquear el hilo.

Exploremos algunos ejemplos de estos métodos para descargar archivos usando PowerShell.

Método DownloadFile de 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.

Ejemplo

Método DownloadString - Método Sin Archivos

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.

Ejemplo

PowerShell Invoke-WebRequest

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.

Ejemplo

Errores comunes en PowerShell

Error de Parsing de Internet Explorer

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:

Descargas SMB

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.

Crear el Servidor SMB

Copiar un Archivo desde el Servidor 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:

Crear el Servidor SMB con un Usuario y Contraseña

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:

Montar el Servidor SMB con Usuario y Contraseña

Nota: También puedes montar el servidor SMB si recibes un error al usar el comando copy filename \\IP\sharename.

Descargas FTP

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:

Instalando el Módulo del Servidor FTP en Python3 - pyftpdlib

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.

Configurando un Servidor FTP con Python3

Una vez configurado el servidor FTP, podemos realizar transferencias de archivos utilizando el cliente FTP preinstalado en Windows o PowerShell Net.WebClient.

Transferir Archivos desde un Servidor FTP Usando PowerShell

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.

Crear un Archivo de Comandos para el Cliente FTP y Descargar el Archivo Objetivo

Operaciones de Subida

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.

Codificación y Decodificación Base64 en PowerShell

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.

Codificar un Archivo Usando PowerShell

Para verificar la integridad del archivo, podemos calcular su hash MD5:

Decodificar una Cadena Base64 en Linux

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:

Subidas Web con PowerShell

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.

Instalar un Servidor Web Configurado para Subidas

Luego, iniciamos el servidor:

Script de PowerShell para Subir un Archivo al Servidor de Subida en Python

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.

Subida Web con Base64 en PowerShell

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:

Cargas SMB

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.

Configuración del Servidor WebDav

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.

Instalando los módulos de Python WebDav

Usando el módulo de Python WebDav

El comando anterior ejecutará el servidor WebDav en el puerto 80 con acceso anónimo al directorio /tmp.

Conectando al recurso compartido WebDav

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.

Subiendo Archivos usando SMB

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:

Cargas FTP

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.

Cargar Archivos con PowerShell

Podemos subir un archivo usando PowerShell con el siguiente comando:

Crear un Archivo de Comandos para el Cliente FTP y Subir un Archivo

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:

  1. Se conecta al servidor FTP (open 192.168.49.128).

  2. Inicia sesión con el usuario anonymous.

  3. Cambia al modo binario.

  4. Sube el archivo hosts desde C:\Windows\System32\drivers\etc\hosts.

  5. Cierra la conexión.

Pasos ejecutados en el cliente FTP

Last updated