RDP Port (3389)
Introduction
Remote Desktop Protocol (RDP) es un protocolo propietario desarrollado por Microsoft que permite a un usuario tener una interfaz gráfica para conectarse a otro equipo a través de una red. También es una de las herramientas de administración más populares, ya que permite a los administradores de sistemas controlar sus sistemas remotos como si estuvieran físicamente allí. Además, los proveedores de servicios administrados (MSPs) suelen usar esta herramienta para gestionar cientos de redes y sistemas de clientes.
Sin embargo, aunque RDP facilita enormemente la administración remota de sistemas distribuidos, también introduce una puerta de entrada adicional para ataques.
Por defecto, RDP utiliza el puerto TCP/3389. Podemos identificar si el servicio RDP está activo en un host objetivo usando Nmap:
RDP Login
Misconfigurations
Dado que RDP utiliza credenciales de usuario para la autenticación, uno de los vectores de ataque más comunes contra este protocolo es el password guessing (adivinanza de contraseñas). Aunque no es habitual, podríamos encontrarnos con un servicio RDP sin contraseña si existe una mala configuración.
Un detalle importante al hacer ataques de fuerza bruta contra sistemas Windows es tener en cuenta la política de contraseñas del sistema. En muchos casos, una cuenta de usuario puede bloquearse o deshabilitarse después de varios intentos fallidos. Para evitarlo, podemos aplicar una técnica específica llamada Password Spraying.
Esta técnica consiste en probar una única contraseña contra muchos usuarios antes de intentar con otra contraseña, teniendo cuidado de no disparar bloqueos por intentos fallidos.
Password Spraying with crowbar
Crowbar - RDP Password Spraying
Password Spraying with Hydra
También podemos usar Hydra para realizar un ataque de Password Spraying contra un servicio RDP.
El funcionamiento es similar al de otras herramientas de fuerza bruta: definimos una lista de usuarios, una contraseña específica (ya que en password spraying solo se prueba una por intento), el host objetivo y el módulo rdp
.
Brute Force with Hydra
No es muy recomendable por el problema que mencionábamos anteriormente, pero se podría realizar fuerza bruta entre un listado de usuarios y contraseñas.
Pass-The-Hash (PtH) with RDP
Puede haber ocasiones en las que obtengas un NT hash de administrador local a partir de un volcado de SAM u otros métodos, pero no puedas descifrarlo para obtener la contraseña en texto claro. En algunos casos, puedes realizar un ataque Pass-the-Hash (PtH) en RDP para obtener acceso GUI al sistema utilizando una herramienta como xfreerdp.
El principal obstáculo para este ataque es el Modo de Administración Restringida (Restricted Admin Mode). Este modo está deshabilitado por defecto y evitará que inicies sesión con un NT hash.
Sin embargo, con acceso de administrador local, puedes habilitar esta función agregando una nueva clave en el registro:
Una vez que se agrega la clave en el registro, puedes usar una herramienta como xfreerdp para obtener acceso por RDP sin necesidad de conocer la contraseña en texto claro de la cuenta:
PoC (Proof of Concept)
RDP Session Hijacking
Imaginemos que hemos conseguido acceso a una máquina y tenemos una cuenta con privilegios de administrador local. Si un usuario está conectado por RDP a nuestra máquina comprometida, podemos secuestrar la sesión de escritorio remoto de ese usuario para escalar privilegios e imitar su cuenta.
En un entorno de Active Directory, esto podría permitirnos tomar el control de una cuenta Domain Admin o ampliar aún más nuestro acceso dentro del dominio.
Como se muestra en el ejemplo, estamos conectados como el usuario juurena
(UserID = 2), que tiene privilegios de administrador. Nuestro objetivo es secuestrar la sesión del usuario lewen
(UserID = 4), quien también está conectado vía RDP.
Para suplantar a un usuario sin conocer su contraseña, necesitamos tener privilegios SYSTEM y utilizar el binario de Microsoft tscon.exe
, que permite conectarse a otra sesión de escritorio.
Funciona indicando el SESSION ID al que queremos conectarnos (por ejemplo, el 4 para el usuario lewen
) y el nombre de nuestra sesión actual (por ejemplo, rdp-tcp#13
).
El siguiente comando abrirá una nueva consola con el contexto del SESSION_ID especificado dentro de nuestra sesión RDP actual:
Si ya tenemos privilegios de administrador local, podemos conseguir privilegios SYSTEM usando herramientas como PsExec o Mimikatz.
Un truco sencillo es crear un servicio de Windows, que por defecto se ejecuta como Local System y puede lanzar cualquier binario con esos privilegios.
Para ello, utilizamos el binario sc.exe
de Microsoft. Primero definimos un nombre para el servicio (por ejemplo, sessionhijack
) y el binpath
, que es el comando que queremos ejecutar. Al ejecutar el siguiente comando, se creará un servicio llamado sessionhijack
:
Para ejecutar el comando, simplemente iniciamos el servicio sessionhijack
:
Una vez que el servicio se inicie, se abrirá una nueva terminal con la sesión del usuario lewen
.
Con esta nueva cuenta, podemos intentar descubrir qué tipo de privilegios tiene en la red, y con algo de suerte, podríamos estar ante un usuario que pertenece al grupo Help Desk (con derechos de administrador sobre varios equipos) o incluso a Domain Admin.
Nota: Este método ya no funciona en Windows Server 2019.
RDP File Transfer
RDP (Remote Desktop Protocol) se utiliza habitualmente en redes Windows para el acceso remoto. Podemos transferir archivos mediante RDP copiando y pegando. Podemos hacer clic derecho y copiar un archivo desde la máquina Windows a la que nos conectamos y pegarlo en la sesión RDP.
Si estamos conectados desde Linux, podemos utilizar xfreerdp
o rdesktop
. En el momento de redactar este artículo, xfreerdp
y rdesktop
permiten copiar desde nuestra máquina de destino a la sesión RDP, pero puede haber situaciones en las que esto no funcione como se espera.
Como alternativa a copiar y pegar, podemos montar un recurso local en el servidor RDP de destino. rdesktop
o xfreerdp
se pueden utilizar para exponer una carpeta local en la sesión RDP remota.
Mounting a Linux Folder Using rdesktop
Mounting a Linux Folder Using xfreerdp
Para acceder al directorio, podemos conectarnos a \\tsclient
, lo que nos permitirá transferir archivos hacia y desde la sesión RDP.
mstsc.exe
Alternativamente, desde Windows, se puede utilizar el cliente de escritorio remoto nativo mstsc.exe
.
Después de seleccionar la unidad, podremos interactuar con ella en la sesión remota que sigue.
Nota: Esta unidad no es accesible para ningún otro usuario que haya iniciado sesión en la computadora de destino, incluso si logra secuestrar la sesión RDP.
Última actualización