Логотип
Главная | Статьи | ROP-цепочки на ARM: взламываем IoT без ASLR
ROP-цепочки на ARM: взламываем IoT без ASLR

ROP-цепочки на ARM: взламываем IoT без ASLR

26 мая, 2025

73

Большинство IoT-устройств (роутеры, камеры, умные колонки) работают на архитектуре ARM. В 2025 году многие из них всё ещё не используют ASLR (Address Space Layout Randomization), что делает адреса памяти предсказуемыми. Это идеальная мишень для бинарных эксплойтов, особенно через ROP (Return-Oriented Programming) и переполнение буфера.

Цель атаки: Получить шелл на устройстве, чтобы управлять им или использовать как точку входа в сеть.

🛠️ Шаг 1: Дизассемблирование через Ghidra

Ghidra — мощный и бесплатный инструмент для реверс-инжиниринга. Он отлично справляется с ARM-байнкодами, которые часто встречаются в прошивках роутеров.

Как начать:

  1. Извлекаем прошивку:
    • Скачиваем прошивку с сайта производителя или через UART-доступ к устройству.
    • Используем binwalk для распаковки:
  1. Загружаем в Ghidra:
    • Создаем новый проект, импортируем извлеченный бинарник.
    • Выбираем архитектуру ARM (обычно ARMv7 или Cortex-M).
    • Анализируем код через CodeBrowser, ищем функции вроде strcpy или gets, которые могут быть уязвимы для переполнения буфера.
  2. Ищем гаджеты для ROP:
    • Используем плагин ROPgadget (устанавливается отдельно):

Лайфхак: Если Ghidra не может корректно разобрать код, вручную установите базовый адрес памяти (обычно 0x8000000 для ARM IoT).

💣 Шаг 2: Переполнение буфера в C

Переполнение буфера — классика бинарных эксплойтов. Без ASLR адреса в памяти статичны, что позволяет нам перезаписать адрес возврата (return address) на стеке.

Пример уязвимого кода (типичный для IoT):

Как эксплуатировать:

  1. Находим адрес возврата (ret) на стеке через Ghidra или отладчик gdb.
  2. Передаем строку длиннее 32 байта, чтобы перезаписать ret:
    • Первые 32 байта заполнят buffer.
    • Следующие байты (обычно 4 для ARM) перезапишут адрес возврата.

Пример payload (Python):

Результат: Если всё сработало, устройство вызывает system("/bin/sh"), и вы получаете шелл.

🧠 Шаг 3: ROP-цепочки на ARM

Если прямой вызов system() невозможен (например, нет удобного адреса /bin/sh), строим ROP-цепь. ROP позволяет “сшить” короткие куски кода (гаджеты), заканчивающиеся на ret, чтобы выполнить нужные действия.

Пример ROP-цепи:
Цель — загрузить в r0 адрес команды, затем вызвать system().

  1. Найти гаджет pop {r0, pc} (загружает значение в r0 и прыгает по адресу из стека).
  2. Найти адрес system() (через Ghidra).
  3. Построить стек:
    • После переполнения буфера: адрес pop {r0, pc}.
    • Затем: адрес строки (например, "/bin/sh" или нашей команды).
    • Затем: адрес system().

Payload для ROP (Python):

Лайфхак: Если system() отсутствует, можно собрать цепочку для вызова execve() или записать шеллкод в память через серию mov и str инструкций. Это сложнее, но реально на ARM.

⚡ Инструменты и автоматизация

  1. GDB с ARM-плагинами:
    • Установите gdb-multiarch и gef (GDB Enhanced Features).
    • Используйте для отладки в эмуляторе QEMU:

PwnTools (Python):

  • Библиотека для автоматизации эксплойтов:
  1. ROPgadget:
    • Для поиска гаджетов в бинарнике, особенно полезно с фильтром по регистрам ARM (r0r1pc).

🛡️ Почему IoT так уязвимы в 2025?

  • Отсутствие ASLR: Адреса статичны, упрощая ROP.
  • Устаревшие библиотекиlibc без современных защит (NX, Canary).
  • Слабые обновления: Многие устройства годами работают на старых прошивках.

Обход защит:

  • Если есть Canary (защита стека), ищем формат-стринг уязвимости для утечки значений стека.
  • Если есть NX (non-executable stack), ROP позволяет обойти это, используя только существующий код.

🔥 Итоги и реальный кейс

  • ROP на ARM — мощный инструмент для IoT, особенно без ASLR. Комбинируйте переполнение буфера с гаджет-цепями для получения шелла.
  • Реальный кейс: В 2023 году уязвимость в роутерах TP-Link (CVE-2023-XXXX) позволила выполнить код через переполнение буфера в веб-интерфейсе. ROP-цепь на 5 гаджетов дала полный доступ к системе.

Лайфхак напоследок: Если нет прямого доступа к устройству, используйте XSS в веб-интерфейсе роутера для отправки payload на внутренний порт. IoT-устройства часто доверяют локальным запросам.