VMware Tools servis keşfi LPE (CWE-426) regex tabanlı binary keşif aracılığıyla (CVE-2025-41244)
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Bu teknik, çalışan süreçlerin komut satırlarını parse eden ve servis sürümlerini çıkardıktan sonra aday bir binary'yi "version" bayrağıyla çalıştıran regex ile çalışan servis keşif boru hatlarını kötüye kullanır. İzin verici desenler, saldırgan kontrollü güvenilmez yolları (ör. /tmp/httpd) kabul ettiğinde, ayrıcalıklı toplayıcı güvenilmez bir konumdan rastgele bir binary'yi çalıştırır ve yerel ayrıcalık yükselmesine yol açar. NVISO bunu VMware Tools/Aria Operations Service Discovery içinde CVE-2025-41244 olarak belgeledi.
- 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)
VMware servis keşfi nasıl çalışır (yüksek seviyede)
- Credential-based (legacy): Aria, yapılandırılmış ayrıcalıklı kimlik bilgilerini kullanarak VMware Tools aracılığıyla guest içinde discovery scriptlerini çalıştırır.
- Credential-less (modern): Keşif mantığı VMware Tools içinde, zaten guest'te ayrıcalıklı olarak çalışır.
Her iki mod da eninde sonunda dinleyen soketleri olan işlemleri tarayan shell mantığı çalıştırır, bir regex ile eşleşen komut yolunu çıkarır ve ilk argv token'ını bir versiyon bayrağı ile çalıştırır.
Root cause and vulnerable pattern (open-vm-tools)
open-vm-tools içinde, serviceDiscovery plugin script get-versions.sh aday binary'leri geniş regex'lerle eşleştirir ve herhangi bir trusted-path doğrulaması yapmadan ilk token'ı çalıştırır:
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
}
Kullanıcı tarafından yazılabilir konumlardaki sistem dizinleri dışındaki yollarla kolayca eşleşecek \S (boşluk olmayan) içeren gevşek desenlerle çağrılır:
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
- Çıkarma grep -Eo kullanır ve ilk token'ı alır: ${COMMAND%%[[:space:]]*}
- Güvenilen sistem yolları için herhangi bir whitelist/allowlist yok; eşleşen isimli bulunan herhangi bir listener -v/--version ile çalıştırılır
Bu, untrusted search path execution primitive oluşturur: world-writable dizinlerde bulunan keyfi ikili dosyalar (ör. /tmp/httpd) ayrıcalıklı bir bileşen tarafından çalıştırılır.
Exploitation (both credential-less and credential-based modes)
Preconditions
- Guest üzerinde dinleyen bir soket açan ayrıcalıksız bir process çalıştırabilirsiniz.
- Discovery job etkinleştirilmiş ve periyodik olarak çalışır (tarihsel olarak ~5 dakika).
Steps
- İzin verici regexlerden biriyle eşleşen bir yola bir binary yerleştirin, örn. /tmp/httpd veya ./nginx
- Bunu düşük ayrıcalıklı bir kullanıcı olarak çalıştırın ve herhangi bir dinleyen soket açtığından emin olun
- Discovery döngüsünü bekleyin; ayrıcalıklı collector otomatik olarak çalıştıracaktır: /tmp/httpd -v (veya benzeri), programınızı root olarak çalıştırır
Minimal demo (using NVISO’s approach)
# 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
Tipik işlem soy ağacı
- Kimlik bilgisine dayalı: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
- Kimlik bilgisi olmadan: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
Artefaktlar (kimlik bilgisine dayalı) Kurtarılan SDMP wrapper scripts /tmp/VMware-SDMP-Scripts-{UUID}/ altında kötü amaçlı yolun doğrudan çalıştırılmasını gösterebilir:
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
Tekniği genelleştirme: regex-driven discovery abuse (portable pattern)
Many agents and monitoring suites implement version/service discovery by:
- Enumerating processes with listening sockets
- Grepping argv/command lines with permissive regexes (e.g., patterns containing \S)
- Executing the matched path with a benign flag like -v, --version, -V, -h
If the regex accepts untrusted paths and the path is executed from a privileged context, you get CWE-426 Untrusted Search Path execution.
Abuse recipe
- Name your binary like common daemons that the regex is likely to match: httpd, nginx, mysqld, dataserver
- Place it in a writable directory: /tmp/httpd, ./nginx
- Ensure it matches the regex and opens any port to be enumerated
- Wait for the scheduled collector; you get an automatic privileged invocation of
-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
- Build your helper so that on privileged invocation (-v/--version) it connects to a known rendezvous (e.g., a Linux abstract UNIX socket like @cve) and bridges stdio to /bin/sh -i. This avoids on-disk artifacts and works across many environments where the same binary is re-invoked with a flag.
Detection and DFIR guidance
Hunting queries
- Uncommon children of vmtoolsd or get-versions.sh such as /tmp/httpd, ./nginx, /tmp/mysqld
- Any execution of non-system absolute paths by discovery scripts (look for spaces in ${COMMAND%%...} expansions)
- ps -ef --forest to visualize ancestry trees: vmtoolsd -> get-versions.sh ->
On Aria SDMP (credential-based)
- Inspect /tmp/VMware-SDMP-Scripts-{UUID}/ for transient scripts and stdout/stderr artifacts showing execution of attacker paths
Policy/telemetry
- Alert when privileged collectors execute from non-system prefixes: ^/(tmp|home|var/tmp|dev/shm)/
- File integrity monitoring on get-versions.sh and VMware Tools plugins
Mitigations
- Patch: Apply Broadcom/VMware updates for CVE-2025-41244 (Tools and Aria Operations SDMP)
- Disable or restrict credential-less discovery where feasible
- Validate trusted paths: restrict execution to allowlisted directories (/usr/sbin, /usr/bin, /sbin, /bin) and only exact known binaries
- Avoid permissive regexes with \S; prefer anchored, explicit absolute paths and exact command names
- Drop privileges for discovery helpers where possible; sandbox (seccomp/AppArmor) to reduce impact
- Monitor for and alert on vmtoolsd/get-versions.sh executing non-system paths
Notes for defenders and implementers
Safer matching and execution pattern
# 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
Referanslar
- NVISO – You name it, VMware elevates it (CVE-2025-41244)
- Broadcom advisory for CVE-2025-41244
- open-vm-tools – serviceDiscovery/get-versions.sh (stable-13.0.0)
- MITRE ATT&CK T1036.005 – Match Legitimate Name or Location
- CWE-426: Untrusted Search Path
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.