Windows-Remote-Management-Protocols
RDP (Remote Desktop Protocol)
RDP es el protocolo propietario de Microsoft para acceso de escritorio remoto gráfico, expuesto por defecto en el puerto TCP 3389. Es uno de los servicios más comunes de encontrar abierto en hosts Windows, tanto en estaciones de trabajo como en servidores.
Footprinting del servicio
❯ nmap -sV -sC 172.16.67.10 -p3389 --script rdp*
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-06 15:45 CET
Nmap scan report for 172.16.67.10
Host is up (0.036s latency).
PORT STATE SERVICE VERSION
3389/tcp open ms-wbt-server Microsoft Terminal Services
| rdp-enum-encryption:
| Security layer
| CredSSP (NLA): SUCCESS
| CredSSP with Early User Auth: SUCCESS
|_ RDSTLS: SUCCESS
| rdp-ntlm-info:
| Target_Name: SQLSRV01
| NetBIOS_Domain_Name: SQLSRV01
| NetBIOS_Computer_Name: SQLSRV01
| DNS_Domain_Name: SQLSRV01
| DNS_Computer_Name: SQLSRV01
| Product_Version: 10.0.17763
|_ System_Time: 2021-11-06T13:46:00+00:00
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.26 secondsrdp-enum-encryption: muestra qué capas de seguridad soporta el servidor.CredSSP (NLA)indica que la Network Level Authentication está activa (requiere autenticarse antes de establecer la sesión gráfica completa, una mejora de seguridad frente a versiones antiguas de RDP).rdp-ntlm-info: filtra el nombre del host y la versión del sistema operativo (Product_Version: 10.0.17763corresponde a Windows Server 2019/Windows 10 1809) sin necesidad de autenticarse — muy útil para fingerprinting temprano.
Escaneo detallado con traza de paquetes, útil para depurar problemas de conectividad o entender el handshake inicial de RDP a bajo nivel:
❯ nmap -sV -sC 172.16.67.10 -p3389 --packet-trace --disable-arp-ping -n
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-06 16:23 CET
SENT (0.2506s) ICMP [192.168.60.5 > 172.16.67.10 Echo request (type=8/code=0) id=8338 seq=0] IP [ttl=53 id=5122 iplen=28 ]
SENT (0.2507s) TCP 192.168.60.5:55516 > 172.16.67.10:443 S ttl=42 id=24195 iplen=44 seq=1926233369 win=1024 <mss 1460>
SENT (0.2507s) TCP 192.168.60.5:55516 > 172.16.67.10:80 A ttl=55 id=50395 iplen=40 seq=0 win=1024
SENT (0.2517s) ICMP [192.168.60.5 > 172.16.67.10 Timestamp request (type=13/code=0) id=8247 seq=0 orig=0 recv=0 trans=0] IP [ttl=38 id=62695 iplen=40 ]
RCVD (0.2814s) ICMP [172.16.67.10 > 192.168.60.5 Echo reply (type=0/code=0) id=8338 seq=0] IP [ttl=127 id=38158 iplen=28 ]
SENT (0.3264s) TCP 192.168.60.5:55772 > 172.16.67.10:3389 S ttl=56 id=274 iplen=44 seq=2635590698 win=1024 <mss 1460>
RCVD (0.3565s) TCP 172.16.67.10:3389 > 192.168.60.5:55772 SA ttl=127 id=38162 iplen=44 seq=3526777417 win=64000 <mss 1357>
...SNIP...
Service scan sending probe TerminalServerCookie to 172.16.67.10:3389 (tcp)
...SNIP...
Service scan match (Probe TerminalServerCookie matched with TerminalServerCookie line 13640): 172.16.67.10:3389 is ms-wbt-server. Version: |Microsoft Terminal Services|||
...SNIP...
NSE: TCP 192.168.60.5:36630 < 172.16.67.10:3389 |
00000000: 30 81 d0 a0 03 02 01 06 a1 81 c8 30 81 c5 30 81 0 0 0
00000010: c2 a0 81 bf 04 81 bc 4e 54 4c 4d 53 53 50 00 02 NTLMSSP
00000020: 00 00 00 14 00 14 00 38 00 00 00 35 82 8a e2 b9 8 5
...SNIP...- Con
--packet-tracese ve exactamente qué envía y recibe Nmap: el "cookie"mstshash=nmapen la negociación inicial, y luego una respuesta NTLMSSP en bruto — la misma información que luegordp-ntlm-infointerpreta y muestra de forma legible.
RDP Security Check
Herramienta en Perl (requiere el módulo CPAN Encoding::BER) que audita en detalle qué protocolos de seguridad y niveles de cifrado acepta el servidor RDP.
Instalación de la dependencia:
❯ sudo cpan
...
cpan[1]> install Encoding::BER
...Clonar y ejecutar la herramienta:
❯ git clone https://github.com/CiscoCXSecurity/rdp-sec-check.git && cd rdp-sec-check❯ ./rdp-sec-check.pl 172.16.67.10
Starting rdp-sec-check v0.9-beta ( http://labs.portcullis.co.uk/application/rdp-sec-check/ ) at Sun Nov 7 16:50:32 2021
[+] Scanning 1 hosts
Target: 172.16.67.10
IP: 172.16.67.10
Port: 3389
[+] Checking supported protocols
[-] Checking if RDP Security (PROTOCOL_RDP) is supported...Not supported - HYBRID_REQUIRED_BY_SERVER
[-] Checking if TLS Security (PROTOCOL_SSL) is supported...Not supported - HYBRID_REQUIRED_BY_SERVER
[-] Checking if CredSSP Security (PROTOCOL_HYBRID) is supported [uses NLA]...Supported
[+] Checking RDP Security Layer
[-] Checking RDP Security Layer with encryption ENCRYPTION_METHOD_NONE...Not supported
[-] Checking RDP Security Layer with encryption ENCRYPTION_METHOD_40BIT...Not supported
[-] Checking RDP Security Layer with encryption ENCRYPTION_METHOD_128BIT...Not supported
[-] Checking RDP Security Layer with encryption ENCRYPTION_METHOD_56BIT...Not supported
[-] Checking RDP Security Layer with encryption ENCRYPTION_METHOD_FIPS...Not supported
[+] Summary of protocol support
[-] 172.16.67.10:3389 supports PROTOCOL_SSL : FALSE
[-] 172.16.67.10:3389 supports PROTOCOL_HYBRID: TRUE
[-] 172.16.67.10:3389 supports PROTOCOL_RDP : FALSE
[+] Summary of RDP encryption support
[-] 172.16.67.10:3389 supports ENCRYPTION_METHOD_NONE : FALSE
[-] 172.16.67.10:3389 supports ENCRYPTION_METHOD_40BIT : FALSE
[-] 172.16.67.10:3389 supports ENCRYPTION_METHOD_128BIT : FALSE
[-] 172.16.67.10:3389 supports ENCRYPTION_METHOD_56BIT : FALSE
[-] 172.16.67.10:3389 supports ENCRYPTION_METHOD_FIPS : FALSE
[+] Summary of security issues
rdp-sec-check v0.9-beta completed at Sun Nov 7 16:50:33 2021- En este caso, el servidor solo acepta
PROTOCOL_HYBRID(CredSSP/NLA), lo cual es en realidad una buena señal de seguridad — significa que exige autenticación antes de exponer la superficie de la sesión gráfica completa, mitigando varios ataques históricos contra RDP. - Si un servidor mostrara
PROTOCOL_RDP: TRUEo cifradoENCRYPTION_METHOD_NONE/40BITsoportado, sería un hallazgo de hardening importante a reportar (cifrado débil u opcional).
Iniciar una sesión RDP desde Linux
❯ xfreerdp /u:jsmith /p:"P455w0rd!" /v:172.16.67.10
[16:37:47:135] [95319:95320] [INFO][com.freerdp.core] - freerdp_connect:freerdp_set_last_error_ex resetting error state
...SNIP...
[16:37:47:599] [95319:95320] [WARN][com.freerdp.crypto] - Certificate verification failure 'self signed certificate (18)' at stack position 0
[16:37:47:599] [95319:95320] [WARN][com.freerdp.crypto] - CN = SQLSRV01
[16:37:47:600] [95319:95320] [ERROR][com.freerdp.crypto] - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[16:37:47:600] [95319:95320] [ERROR][com.freerdp.crypto] - @ WARNING: CERTIFICATE NAME MISMATCH! @
[16:37:47:600] [95319:95320] [ERROR][com.freerdp.crypto] - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[16:37:47:600] [95319:95320] [ERROR][com.freerdp.crypto] - The hostname used for this connection (172.16.67.10:3389)
[16:37:47:600] [95319:95320] [ERROR][com.freerdp.crypto] - does not match the name given in the certificate:
[16:37:47:600] [95319:95320] [ERROR][com.freerdp.crypto] - SQLSRV01
Certificate details for 172.16.67.10:3389 (RDP-Server):
Common Name: SQLSRV01
Subject: CN = SQLSRV01
Issuer: CN = SQLSRV01
Thumbprint: b7:5f:00:ca:91:00:0a:29:0c:b5:14:21:f3:b0:ca:9e:af:8c:62:d6:dc:f9:50:ec:ac:06:38:1f:c5:d6:a9:39
The above X.509 certificate could not be verified, possibly because you do not have
the CA certificate in your certificate store, or the certificate has expired.
Do you trust the above certificate? (Y/T/N) y- El aviso de "certificado autofirmado" y "nombre no coincide" es normal y esperable en la mayoría de los servidores RDP internos, que no suelen tener un certificado emitido por una CA de confianza — no es en sí mismo un hallazgo, aunque el
Common Name(aquíSQLSRV01) sí revela el hostname real del servidor.
Otras variantes útiles de xfreerdp:
❯ xfreerdp /u:jsmith /p:"P455w0rd!" /v:172.16.67.10 /d:DOMAIN/d:: especifica el dominio, necesario cuando la cuenta es de Active Directory y no una cuenta local.
❯ xfreerdp /u:jsmith /pth:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c /v:172.16.67.10/pth:: permite autenticarse con un hash NTLM (pass-the-hash) en vez de la contraseña en texto plano, siempre que NLA esté habilitado y el hash sea válido.
Iniciar una sesión RDP desde Windows
Cliente gráfico nativo de Windows (mstsc.exe), disponible en cualquier instalación estándar:
C:\> mstsc /v:172.16.67.10Especificar usuario y forzar modo de administración de consola (útil para conectarse a la sesión de consola/administración, no a una sesión de usuario estándar):
C:\> mstsc /v:172.16.67.10 /adminGuardar credenciales previamente con cmdkey para que mstsc no las solicite en el momento de conectar (común en escenarios de post-explotación, donde ya se cuenta con credenciales válidas):
C:\> cmdkey /generic:TERMSRV/172.16.67.10 /user:jsmith /pass:P455w0rd!
C:\> mstsc /v:172.16.67.10- Esta técnica también es usada como mecanismo de persistencia/lateral movement, ya que las credenciales quedan guardadas en el Credential Manager del host para conexiones RDP futuras sin volver a pedir contraseña.
WinRM (Windows Remote Management)
WinRM es la implementación de Microsoft del protocolo estándar WS-Management, y es el transporte que utiliza PowerShell Remoting. Escucha por defecto en el puerto TCP 5985 (HTTP) y 5986 (HTTPS).
Footprinting del servicio
❯ nmap -sV -sC 172.16.67.10 -p5985,5986 --disable-arp-ping -n
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-06 16:31 CET
Nmap scan report for 172.16.67.10
Host is up (0.030s latency).
PORT STATE SERVICE VERSION
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.34 seconds- El puerto
5985se identifica como un simple servidor HTTP (Microsoft HTTPAPI) porque WinRM corre sobre HTTP/SOAP — Nmap no reconoce el protocolo WinRM específicamente a menos que se use un script NSE dedicado o se pruebe autenticación directamente.
Conexión desde Linux con Evil-WinRM
❯ evil-winrm -i 172.16.67.10 -u jsmith -p 'P455w0rD!'
Evil-WinRM shell v3.3
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\jsmith\Documents>- Evil-WinRM entrega una consola de PowerShell completa sobre WinRM, con funciones extra pensadas para pentesting: subir/descargar archivos (
upload/download), cargar scripts de post-explotación en memoria (Bypass-4MSI,Invoke-Binary), y autocompletado de rutas remotas.
Conexión con hash NTLM (pass-the-hash) en vez de contraseña:
❯ evil-winrm -i 172.16.67.10 -u jsmith -H 8846f7eaee8fb117ad06bdd830b7586cConexión sobre HTTPS (puerto 5986), útil cuando el servidor exige transporte cifrado:
❯ evil-winrm -i 172.16.67.10 -u jsmith -p 'P455w0rD!' -SConexión desde Windows / PowerShell
PowerShell Remoting nativo, usando Enter-PSSession para una sesión interactiva:
PS C:\> Enter-PSSession -ComputerName 172.16.67.10 -Credential (Get-Credential)Especificando credenciales directamente sin el prompt interactivo (útil en scripts o cuando ya se tienen las credenciales en variables):
PS C:\> $securePass = ConvertTo-SecureString "P455w0rD!" -AsPlainText -Force
PS C:\> $cred = New-Object System.Management.Automation.PSCredential("jsmith", $securePass)
PS C:\> Enter-PSSession -ComputerName 172.16.67.10 -Credential $credEjecutar un comando puntual sin abrir una sesión interactiva completa (útil para automatización o para minimizar el tiempo de conexión):
PS C:\> Invoke-Command -ComputerName 172.16.67.10 -Credential $cred -ScriptBlock { whoami }Sesión persistente reutilizable para varias operaciones (más eficiente que abrir una Invoke-Command nueva cada vez):
PS C:\> $session = New-PSSession -ComputerName 172.16.67.10 -Credential $cred
PS C:\> Invoke-Command -Session $session -ScriptBlock { Get-Process }
PS C:\> Remove-PSSession $sessionCliente de línea de comandos winrs (más antiguo, sin depender de PowerShell — útil como alternativa "living off the land" si PowerShell está restringido por políticas de ejecución):
C:\> winrs -r:172.16.67.10 -u:jsmith -p:P455w0rD! "whoami"WMI (Windows Management Instrumentation)
WMI es la infraestructura de gestión de Microsoft para acceder a información y ejecutar operaciones sobre componentes del sistema operativo, tanto local como remotamente. Se apoya en DCOM/RPC (puerto TCP 135 + puertos dinámicos altos) para las conexiones remotas.
Ejecución remota desde Linux con wmiexec.py (Impacket)
❯ /usr/share/doc/python3-impacket/examples/wmiexec.py jsmith:"P455w0rD!"@172.16.67.10 "hostname"
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
[*] SMBv3.0 dialect used
SQLSRV01wmiexec.pyejecuta el comando indicado de forma remota vía WMI y devuelve la salida — es una de las formas "sin archivos" (fileless) más usadas para obtener ejecución de comandos en un host Windows con credenciales válidas, ya que no deja un binario en disco como sí lo hacenpsexec.py/smbexec.py.
Modo interactivo (pseudo-shell), en vez de un solo comando puntual:
❯ /usr/share/doc/python3-impacket/examples/wmiexec.py jsmith:"P455w0rD!"@172.16.67.10Con hash NTLM en vez de contraseña:
❯ wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c jsmith@172.16.67.10Consulta y ejecución desde Windows
Cliente de línea de comandos wmic (deprecado desde Windows 10 21H1 en adelante a favor de PowerShell, pero aún presente en muchos sistemas):
C:\> wmic /node:172.16.67.10 /user:jsmith /password:P455w0rD! computersystem get nameEjecutar un proceso remoto con wmic:
C:\> wmic /node:172.16.67.10 /user:jsmith /password:P455w0rD! process call create "cmd.exe /c whoami > C:\Windows\Temp\out.txt"- A diferencia de PowerShell Remoting,
process call createno devuelve la salida directamente al ejecutar — hay que redirigir a un archivo y luego leerlo por otro medio (por ejemplo, contypevía WMI de nuevo, o accediendo al shareC$).
Equivalente moderno en PowerShell con los cmdlets CimInstance (recomendados sobre los antiguos Get-WmiObject, ya deprecados):
PS C:\> Get-CimInstance -ComputerName 172.16.67.10 -Credential $cred -ClassName Win32_ComputerSystemEjecutar un comando remoto vía WMI desde PowerShell:
PS C:\> Invoke-CimMethod -ComputerName 172.16.67.10 -Credential $cred -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine="cmd.exe /c whoami > C:\Windows\Temp\out.txt"}