
CVE-2026-41940 cPanel/WHM auth bypass IOC сканер — исправляет ложные срабатывания в вышестоящем скрипте обнаружения, добавляет перекрёстную корреляцию журналов
Скрипт обнаружения обхода аутентификации cPanel/WHM (CVE-2026-41940), затрагивающего все версии cPanel после 11.40.
Это переработка исходного скрипта обнаружения cPanel с исправлениями ложных срабатываний и добавленной корреляцией журналов.
Сканирует /var/cpanel/sessions/raw/ на предмет файлов сессий с признаками эксплуатации через инъекцию перевода строки, затем сверяет подозрительные IP и токены сессий с журналами доступа/входа/ошибок cPanel. Также сканирует access_log на предмет исторической эксплуатации, когда файл сессии уже истёк или был удалён.
pass, которое давало ложные срабатывания на каждой аутентифицированной сессии в продакшене (регулярка совпадает с любым полем pass=, за которым следует другая строка, а это каждая файл сессии).method=badpass origin + ЛЮБОЙ атрибут после аутентификации вместо узкой комбинации token_denied + cp_security_token. Ловит варианты PoC, в которых опущен token_denied.POST /login/?login_only=1 -> 401) с последующим успешным использованием токена cpsess с того же IP.--extended для более глубокого сканирования журналов по дополнительным источникам.# Bash — работает везде, без зависимостей
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — быстрее на больших каталогах сессий, поддерживает --json
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# Расширенное сканирование (любой вариант)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# Проверка кода выхода после запуска ($? = 0 чисто, 1 найдены IOC, 2 ошибка окружения)
echo $?
Флаги curl:
-fзавершаться с ошибкой при HTTP-ошибках вместо передачи страницы ошибки в bash,-sтихий режим (без прогресс-бара),-Sвсё равно показывать ошибки несмотря на-s,-Lследовать перенаправлениям.
Вариант на Python поддерживает --json для структурированного вывода, который можно передать в jq, отправить в SIEM или обработать программно.
# Полный JSON-вывод
python3 ioc.py --json
# Только сводные счётчики
python3 ioc.py --json | jq '.counts'
# Список всех находок CRITICAL
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# Извлечь уникальные IP атакующих
python3 ioc.py --json | jq '.suspect_ips[]'
# Показать находки с их исходными IP (для блокировок в файрволе)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# Получить все IP с успешным использованием токена (для немедленной блокировки)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# Передать данные перекрёстной сверки для конкретного IP
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
Пример структуры JSON:
{
"findings": [
{
"severity": "CRITICAL",
"file": "/var/cpanel/sessions/raw/:Q3f8Ag2epeBuTaIZ",
"verdict": "Injected token used successfully (2xx/3xx in access_log)",
"origin": "address=203.0.113.50,app=whostmgrd,method=badpass",
"source_ip": "203.0.113.50",
"user": "root",
"hasroot": "1",
"tfa_verified": "0",
"cp_security_token": "/cpsess04396539398",
"token_denied": "1",
"successful_internal_auth_with_timestamp": "9999999999",
"token_hits": [
"203.0.113.50 - root [04/30/2026:12:12:01 -0000] \"GET /cpsess04396539398/json-api/version HTTP/1.1\" 200 0 ..."
]
},
{
"severity": "MEDIUM",
"file": "/var/cpanel/sessions/raw/:2TDiaHwh_r8qOH5y",
"verdict": "Injection landed; token was tried but BLOCKED (all 4xx/5xx)",
"source_ip": "198.51.100.23",
"cp_security_token": "/cpsess5637704041",
"token_hits": [
"198.51.100.23 - root [04/30/2026:04:08:09 -0000] \"GET /cpsess5637704041/json-api/version HTTP/1.1\" 403 0 ..."
]
},
{
"severity": "CRITICAL",
"file": null,
"verdict": "Injected cpsess token used with 2xx/3xx after failed login; session expired or purged",
"source_ip": "203.0.113.99",
"cp_security_token": "/cpsess8705792557",
"token_hits": ["..."]
}
],
"counts": {"critical": 2, "high": 15, "medium": 71, "warning": 0},
"suspect_ips": ["203.0.113.50", "198.51.100.23", "203.0.113.99"],
"suspect_ips_omitted": 0,
"cross_ref": {
"203.0.113.50": {
"cpanel_access_log": ["...last 5 lines..."],
"cpanel_login_log": ["..."]
}
},
"advisory": "https://support.cpanel.net/hc/en-us/articles/40073787579671"
}
git clone https://github.com/AndreiG6/cpanel-cve-2026-41940-ioc.git
cd cpanel-cve-2026-41940-ioc
# Вариант на Bash
bash ioc.sh # по умолчанию (CRITICAL/HIGH развёрнуты, MEDIUM/WARNING только счётчики)
bash ioc.sh -v # подробный (развернуть все находки)
bash ioc.sh --extended # подробный + более глубокие журналы + все IP в перекрёстной сверке
# Вариант на Python (та же логика обнаружения, быстрее, структурированный вывод)
python3 ioc.py # по умолчанию (такое же сворачивание, как в bash)
python3 ioc.py -v # подробный
python3 ioc.py --extended # подробный + более глубокие журналы
python3 ioc.py --json # структурированный JSON (всегда включает все находки)
Должен запускаться от root на целевом сервере cPanel. Вариант на Python требует Python 3.6+ (поставляется с CentOS 7 / CloudLinux 7+).
| Код | Значение |
|---|---|
| 0 | Индикаторы не найдены |
| 1 | Обнаружены IOC |
| 2 | Ошибка окружения (не сервер cPanel) |
MIT