
Всесторонний реверс-инжиниринг и эксплуатация CVE-2019-17147, стекового переполнения буфера в маршрутизаторах TP-Link TL-WR841N. Включает анализ прошивки, отладку оборудования и эксплойт с поэтапным внедрением шеллкода для неаутентифицированного удаленного выполнения кода (RCE).

Этот репозиторий документирует полный процесс обратной разработки и эксплуатации CVE-2019-17147 — критической уязвимости удалённого выполнения кода (RCE) в маршрутизаторе TP-Link TL-WR841N (архитектура MIPSEL). Уязвимость находится в веб-сервере httpd, где некорректная проверка входных данных приводит к стековому переполнению буфера через пользовательскую функцию cstr_strncpy, что позволяет выполнять произвольный код без аутентификации.
| Уязвимость | CVE-2019-17147 |
|---|---|
| CVSS v3.1 | 8.8 (High) |
| Вектор | AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Тип | Стековое переполнение буфера |
| Компонент | /usr/bin/httpd |
Среда анализа была создана с использованием следующих компонентов:
flashrom (дампинг памяти), binwalk (извлечение прошивки), IDA Pro (статический анализ), GDB-Multiarch (удалённая отладка), QEMU (эмуляция MIPSEL).TL-WR841N(US)_V14_180319.Уязвимость была обнаружена в бинарном файле /usr/bin/httpd. Статический анализ с помощью IDA Pro выявил пользовательскую функцию копирования строк cstr_strncpy, используемую при разборе HTTP-заголовков (в частности, заголовка Host).

Функция cstr_strncpy принимает параметр copy_len, производный от длины исходной строки, а не от размера буфера назначения. Это позволяет классическое стековое переполнение буфера при подаче чрезмерно длинного заголовка. Кроме того, функция http_parser_argStrToList, работающая со структурой связного списка, подвержена этому переполнению, что даёт контроль над указателями next и prev.
Отладка во время выполнения с помощью gdbserver подтвердила аварию и контроль над потоком выполнения. Анализ карты памяти (vmmap) выявил критическое отсутствие защитных мер:

Такая конфигурация допускает прямое выполнение shellcode, размещённого в куче, обходя необходимость в сложных ROP-цепочках.
Цепочка эксплойта использует примитив Write-What-Where, полученный из повреждённых указателей связного списка, для достижения RCE.
strcpy, полезная нагрузка отправляется в нескольких запросах:
atol в глобальной таблице смещений (GOT) заменяется адресом shellcode.atol (через заголовок Content-Length), перенаправляя выполнение на внедрённый shellcode.
Финальный скрипт на Python успешно автоматизирует атаку, открывая root-оболочку на порту 31337.

Уязвимость проистекает из небезопасных практик кодирования при управлении буферами.
cstr_strncpy на безопасные альтернативы, которые строго соблюдают ограничения буфера назначения (например, strncpy с явной проверкой границ на основе sizeof(dest)).Для подробного пошагового руководства по всему процессу, включая анализ кода и настройку окружения, обратитесь к полным руководствам, включённым в этот репозиторий:
Этот проект предназначен только для образовательных и исследовательских целей. Предоставленная информация направлена на повышение безопасности IoT-устройств. Авторы не несут ответственности за любое неправомерное использование информации или кода, содержащегося здесь.
Основано на оригинальных исследованиях и анализе.