Infiltrating Windows
Last updated
Last updated
Desde que muchos de nosotros podemos recordar, Microsoft ha dominado los mercados doméstico y empresarial en términos de computación. En los tiempos modernos, con la introducción de características mejoradas de Active Directory, mayor interconectividad con los servicios en la nube, el Subsistema de Windows para Linux y mucho más, la superficie de ataque de Microsoft también ha crecido.
Por ejemplo, solo en los últimos cinco años, se han reportado 3,688 vulnerabilidades en productos de Microsoft, y este número sigue creciendo diariamente.
En los últimos años, varias vulnerabilidades del sistema operativo Windows han sido objeto de algunos de los ataques más explotados de nuestro tiempo. A continuación, se describen algunas de ellas:
Con estas vulnerabilidades en mente, Windows no desaparecerá pronto. Por lo tanto, es esencial ser proficientes en identificar vulnerabilidades, explotarlas y navegar por entornos Windows. Una comprensión sólida de estos conceptos puede ayudarnos a asegurar nuestros entornos contra ataques.
Este módulo asume que ya has realizado la fase de enumeración de hosts y comprendes qué servicios son comúnmente vistos en los hosts. Aquí, se presentan algunos trucos rápidos para determinar si un host es probablemente una máquina con Windows.
Una forma de identificar un host Windows es mediante el uso de ICMP para verificar si el host está activo. La respuesta típica de un host Windows tendrá un TTL de 32 o 128. En el siguiente ejemplo, al hacer ping a un host Windows 10, podemos ver que la respuesta tiene un TTL de 128.
Otra forma de validar si el host es Windows es usar NMAP. Este tiene una capacidad incorporada para ayudar con la identificación de sistemas operativos. Utilizando la opción -O
y la opción -v
para obtener una salida detallada, podemos realizar un escaneo de identificación de OS.
En la salida, podremos ver algo como:
NMAP adivina el sistema operativo basándose en varias métricas derivadas de la pila TCP/IP y lo compara con una base de datos de huellas de OS. En este caso, determina que el host es una máquina con Windows 10, entre las revisiones 1709 y 1909.
Si el escaneo no da muchos resultados, intenta nuevamente con las opciones -A
y -Pn
. Estos escaneos pueden revelar más información en ciertos casos.
Los ejemplos anteriores son solo algunas formas para ayudar a identificar y determinar si un host es una máquina Windows. No es una lista exhaustiva, y hay muchos otros métodos de verificación que puedes usar.
Cuando se trata de crear payloads para hosts Windows, tenemos muchas opciones disponibles. Los archivos DLL, scripts en lote (batch), paquetes MSI e incluso scripts de PowerShell son algunos de los métodos más comunes. Cada tipo de archivo puede cumplir diferentes propósitos, pero lo que todos tienen en común es que son ejecutables en un host.
DLLs Una Dynamic Linking Library (DLL) es un archivo de biblioteca utilizado en sistemas operativos Microsoft que provee código y datos compartidos por varios programas. Como pentester, podemos inyectar un DLL malicioso o secuestrar una biblioteca vulnerable para elevar privilegios a SYSTEM o evitar los Controles de Cuenta de Usuario (UAC).
Batch
Los archivos por lotes o batch files son scripts basados en texto utilizados por administradores de sistemas para realizar múltiples tareas mediante el intérprete de línea de comandos. Tienen la extensión .bat
. Estos archivos pueden automatizar la ejecución de comandos en un host, como abrir un puerto o conectarse a una caja atacante.
VBS VBScript es un lenguaje de scripting basado en Visual Basic de Microsoft. Se usa principalmente en servidores web para habilitar páginas dinámicas. Aunque está desactualizado, aún es usado en ataques de phishing y otras tácticas que buscan que el usuario realice una acción, como habilitar macros en documentos.
MSI
Los archivos .MSI
son bases de datos de instalación para el instalador de Windows. Los atacantes pueden crear un payload como un archivo MSI y usar msiexec para ejecutarlo en el host, obteniendo acceso elevado o una shell inversa.
PowerShell PowerShell es un entorno de shell y lenguaje de scripting en los sistemas operativos de Microsoft. Ofrece múltiples opciones para obtener una shell o ejecutar comandos en un host, convirtiéndose en una herramienta útil en pruebas de penetración.
A continuación, se presentan algunos métodos de generación de payloads y formas de transferirlos a la víctima. Aquí se discutirán a un nivel alto, ya que el enfoque está en la generación de payloads y en obtener una shell en el objetivo.
Existen muchas opciones efectivas para generar payloads que puedan utilizarse en hosts Windows. Algunas de ellas ya se han mencionado previamente, como Metasploit-Framework y MSFVenom, que son herramientas muy útiles ya que son independientes del sistema operativo.
Además de los vectores como drive-by en la web, correos de phishing o "dead drops", los hosts de Windows nos ofrecen varias vías adicionales para la entrega de payloads. A continuación, se incluye una lista de herramientas y protocolos útiles para intentar transferir un payload al objetivo:
Impacket: Impacket es un conjunto de herramientas escrito en Python que nos permite interactuar directamente con los protocolos de red. Algunas de las herramientas más interesantes que nos ofrece son psexec, smbclient, wmi, Kerberos, y la capacidad de levantar un servidor SMB.
Payloads All The Things: Es un excelente recurso para encontrar oneliners rápidas que ayuden a transferir archivos entre hosts de manera eficiente.
SMB: SMB puede proporcionar una ruta fácil de explotar para transferir archivos entre hosts, especialmente cuando los hosts de la víctima están unidos a un dominio y utilizan shares para alojar datos. Como atacantes, podemos usar estos recursos compartidos de archivos SMB junto con C$ y admin$ para alojar y transferir nuestros payloads, e incluso exfiltrar datos a través de estos enlaces.
Ejecución remota vía MSF: En muchos de los módulos de explotación de Metasploit está incorporada una función que construye, prepara y ejecuta automáticamente los payloads.
Otros protocolos: Al examinar un host, protocolos como FTP, TFTP, HTTP/S, y otros pueden permitirte cargar archivos en el host. Enumera y presta atención a las funciones que están abiertas y disponibles para su uso.
Las herramientas como Ping, Netcat, escaneos de Nmap, e incluso Metasploit son buenas opciones para empezar a enumerar posibles víctimas. En este ejemplo, utilizaremos un escaneo con Nmap. La enumeración es una de las fases más críticas de cualquier cadena de explotación, ya que entender el objetivo aumenta las posibilidades de obtener acceso.
Hemos descubierto algunas cosas sobre el host. Está ejecutando Windows Server 2016 Standard 6.3, conocemos el nombre del equipo y sabemos que no está en un dominio y ejecuta varios servicios. Con esta información, podemos buscar posibles rutas de explotación.
El IIS podría ser un camino potencial, o podríamos intentar acceder al host mediante SMB usando una herramienta como Impacket. También existe la posibilidad de que el host sea vulnerable a una ejecución remota de código (RCE). MS17-010 (EternalBlue) es una vulnerabilidad conocida que afecta a los sistemas desde Windows 2008 hasta Server 2016. Vamos a validar si el host es vulnerable utilizando un módulo auxiliar en Metasploit.
Podemos ver que nuestro objetivo es probablemente vulnerable a EternalBlue. Ahora podemos configurar el exploit y el payload, y probarlo.
3. Seleccionar Exploit y Payload, luego entregarlos
Para este caso, utilizamos la función de búsqueda en Metasploit (MSF) para encontrar un exploit relacionado con EternalBlue. El resultado anterior muestra varias opciones, y elegimos el exploit ms17_010_psexec, que es la tercera opción, ya que hemos tenido éxito con esta versión en el pasado.
Asegúrate de configurar correctamente las opciones del payload antes de ejecutar el exploit. Los campos RHOSTS, LHOST y LPORT son esenciales. En este ejemplo, dejamos el payload en la configuración predeterminada, que es windows/meterpreter/reverse_tcp.
En esta ocasión, usamos un payload básico windows/meterpreter/reverse_tcp. También puedes modificar el payload para un tipo de shell diferente u obfuscar más el ataque, como se ha mostrado anteriormente en la sección de payloads.
¡Éxito! Hemos logrado explotar la vulnerabilidad y obtener una sesión en el sistema con privilegios de SYSTEM. Ahora podemos usar Meterpreter para ejecutar más comandos, recopilar información del sistema, robar credenciales o utilizar módulos de post-explotación.
Al ejecutar el comando shell de Meterpreter, se inició otro proceso en el host y entramos en una shell del sistema. El prompt C:\Windows\system32>
nos indica que estamos en una shell de cmd.exe. Para confirmar, puedes ejecutar el comando help dentro de la shell. Si hubiéramos accedido a PowerShell, el prompt se vería así: PS C:\Windows\system32>
. El prefijo PS nos indica que es una sesión de PowerShell.
En Windows tenemos dos opciones predeterminadas para shells: CMD y PowerShell. Veamos cuándo conviene usar cada una:
CMD
CMD es la shell original de MS-DOS integrada en Windows. Está diseñada para interacciones básicas y operaciones de TI en el host. A continuación, se detallan algunas situaciones en las que es preferible utilizar CMD:
Sistemas antiguos: Si estás en un host antiguo (por ejemplo, Windows XP), puede que PowerShell no esté disponible.
Interacciones simples: Si solo necesitas realizar interacciones básicas con el sistema.
Automatización sencilla: Para ejecutar archivos por lotes o herramientas nativas de MS-DOS.
Políticas de ejecución: Si crees que las políticas de ejecución de scripts pueden interferir en tu capacidad para ejecutar comandos o scripts.
Bajo perfil: CMD no guarda un registro de los comandos ejecutados, por lo que puede ser más difícil rastrear tus acciones.
PowerShell
PowerShell es una herramienta más avanzada que entiende los comandos de MS-DOS y amplía sus capacidades. Algunos de sus beneficios son:
Cmdlets y scripts personalizados: Si planeas usar cmdlets o scripts personalizados basados en .NET.
Interacción con objetos: PowerShell maneja objetos .NET en lugar de solo texto.
Servicios en la nube: Es ideal para interactuar con servicios y hosts basados en la nube.
Alias y scripts avanzados: Si planeas usar scripts que establecen y utilizan Aliases.
El Windows Subsystem for Linux (WSL) permite ejecutar un entorno virtual de Linux en Windows. Este sistema podría abrir nuevas formas de acceder a un host. Los atacantes han aprovechado WSL y PowerShell Core en Linux para evitar mecanismos de detección como el Firewall de Windows y Windows Defender.
Este enfoque es relativamente nuevo, pero se ha visto que algunos ataques utilizan Python3 y binarios de Linux en conjunto con PowerShell. Actualmente, las funciones de red ejecutadas desde WSL no son filtradas por el firewall de Windows, lo que lo convierte en un punto ciego.
Cada shell tiene sus pros y contras. CMD es más básico pero menos rastreable, mientras que PowerShell ofrece mayor versatilidad y potencia, especialmente en sistemas modernos o cuando se interactúa con servicios en la nube.