MINDSHARE: КАК «ПРОСТО ЭМУЛИРОВАТЬ С QEMU»
MindShaRE - это наш периодический взгляд на различные советы и хитрости по обратному проектированию. Цель состоит в том, чтобы держать вещи маленькими и обсудить некоторые повседневные аспекты реверса. Вы можете просмотреть предыдущие записи в этой серии
Часто люди отвергают исследования маршрутизатора или IoT как легкие. «Просто подражайте ему с QEMU!» обычно так говорят. Они, вероятно, также скажут вам «просто покупайте дешево, продавайте дорого», чтобы зарабатывать деньги на фондовом рынке. Сложная, если не невозможная часть торговли акциями - это знать, когда цены самые низкие и самые высокие. Точно так же знание того , как эмулировать прошивку с помощью QEMU, вероятно, является самой трудной частью для новичка в области исследований встроенных систем безопасности. Хотя я не могу предложить большую помощь с торговыми советами, я могу помочь с эмуляцией прошивки.
Прежде чем мы начнем, я предполагаю, что ваша прошивка похожа на UNIX и не работает в какой-либо другой операционной системе реального времени (RTOS), такой как VxWorks или Windows CE. Я также предполагаю, что ваша прошивка дешифрована / де-обфусцирована и извлечена корневая файловая система. Если у вас возникли проблемы с зашифрованной прошивкой, ознакомьтесь с моим предыдущим сообщением в блоге
Начните с конца в уме
Ключевая часть эмуляции устройства имеет конечную цель. Вы хотите запустить только один двоичный файл? Как насчет одной услуги? Или вы хотите полную эмуляцию устройства? Так как для правильной работы эмуляции прошивки требуется много времени, ваша цель сильно повлияет на стратегию эмуляции. Иногда бесчисленные часы, потраченные на настройку эмуляции, оправдывают покупку некоторых из этих недорогих устройств.
Для запуска одного двоичного
Определение архитектуры процессора и сбор информации
Первый шаг в эмуляции всего - определение архитектуры процессора для нашей цели. Обычно мы можем определить это без устройства под рукой. Один из способов определения типа процессора - анализ двоичных файлов встроенного программного обеспечения. Выполнение fileкоманды в любом двоичном файле может быстро сказать нам, с какой архитектурой процессора мы имеем дело:
Рисунок 1 - Выводы команд file и readelf
Однако fileкоманда не предоставляет наиболее подробных результатов. Команда readelfс -Aопцией для двоичного файла ARM предоставляет гораздо более подробную информацию о процессоре, которая необходима для полной эмуляции системы и кросс-компиляции.
Другим способом определения архитектуры ЦП при работе с беспроводными маршрутизаторами (на примере TP-Link TL-WR841-ND [1]) является поиск модели устройства в Интернете. Это обычно приводит нас на
Это также прекрасное время для поиска таблицы характеристик ядра процессора для конкретной семьи, чтобы ознакомиться с процессором. Эта таблица данных предоставит специфическую для устройства информацию, такую как адрес загрузки и низкоуровневая структура памяти, которая может помочь с эмуляцией и анализом. Вы также можете просмотреть отчеты FCC, чтобы получить представление о
Эмуляция пользовательского режима
Эмуляция для каждого процесса полезна, когда необходимо эмулировать только один двоичный файл. Существует два способа эмулировать один двоичный файл в пользовательском режиме QEMU. Первый вариант - эмуляция процесса в пользовательском режиме. Это можно сделать с помощью одной из следующих команд:
qemu-mipsel -L <prefix> <binary>
qemu-arm -L <prefix> <binary>
qemu-<arch> -L <prefix> <binary>
Этот -Lпараметр важен для
Рисунок 2 - imgdecrypt
Еще один способ эмулировать процесс - выполнить кросс-архитектурную chroot с QEMU. Для этого мы копируем qemu-<arch>-staticдвоичный файл в /usr/bin/каталог корневой файловой системы прошивки. Затем мы chrootв корень прошивки и получить рабочую оболочку:
Рисунок 3 - Использование QEMU для выполнения кросс-архитектурного chroot
Это возможно благодаря регистрации QEMU в ядре во время установки для обработки двоичных файлов с определенными магическими байтами через binfmt_miscмеханизм. Поэтому этот метод
Этот метод является моей первой попыткой эмулировать устройство. Он быстро настраивается и позволяет мне экспериментировать с различными двоичными файлами в корневой файловой системе прошивки, не слишком заботясь о зависимостях. Обратите внимание, что в этом режиме эмуляции ни одна из пользовательских служб не инициализируется в оболочке chroot, поэтому ни одна из системных или сетевых служб недоступна. Однако этого может быть достаточно для запуска только одного двоичного файла или тестирования одного небольшого компонента.
Выведи большие орудия: полная эмуляция системы
Иногда нам необходимо более подробно проанализировать прошивку и воспользоваться преимуществами полной эмуляции системы. Есть много способов полностью эмулировать устройство. Вот несколько наиболее распространенных методов эмуляции. Эти методы были использованы исследователями для поиска реальных ошибок, которые впоследствии были представлены в программе ZDI.
В первой части процесса эмуляции мы будем использовать QEMU для создания полноценной виртуальной машины Linux, работающей на целевой архитектуре. Затем мы переносим корневую файловую систему прошивки в виртуальную машину и выполняем chroot в корневой файловой системе прошивки. Для создания полноценной виртуальной машины, работающей в QEMU, нам обычно необходимы следующие вещи:
- файл образа диска QEMU (qcow2)
- образ ядра Linux, скомпилированный для целевой архитектуры
- (иногда) начальный образ диска RAM (initrd)
Чтобы получить вышеуказанные элементы, вы, безусловно, можете установить кросс-компилятор, собрать ядро и загрузить установщик, чтобы получить начальный RAM-диск. Затем вы можете установить Linux на файл образа диска QEMU. Тем не менее, кросс-компиляция ядра - существенный побочный квест для случайного охотника за ошибками или новичка в Linux. Если вы заинтересованы в подготовке этих файлов самостоятельно, ознакомьтесь со ссылками в разделе дальнейшего чтения. В этом блоге мы воспользуемся более простым подходом. Мы будем загружать и использовать
После установки всех файлов мы можем запустить виртуальную машину QEMU с правильной архитектурой процессора с помощью одной из следующих команд:
Опция -M или -machine указывает модель платы, которую поддерживает QEMU, эта опция позволяет пользователю выбрать целевую аппаратную платформу. Параметры -appendпозволяют настроить параметры ядра, передаваемые ядру Linux. Мне нравится помещать команду QEMU в скрипт bash, чтобы ускорить процесс внесения изменений и запуска виртуальной машины. Кроме того, мы должны добавить следующие параметры к вызову QEMU, чтобы подключить сетевые интерфейсы и добавить параметры переадресации портов:
-net user,hostfwd=tcp::80-:80,hostfwd=tcp::443-:443,hostfwd=tcp::2222-:22 \
-net nic
Добавление этих параметров позволит нам взаимодействовать с виртуальной машиной через SSH через порт 2222 хост-компьютера, а также на страницах HTTP и HTTPS эмулируемой прошивки.
Рисунок 4 - Запуск готового образа Debian
Когда виртуальная машина загружена и дает нам рабочую виртуальную машину Debian, начинается вторая часть эмуляции. Перенесите корневую файловую систему прошивки на виртуальную машину, используя SCP или HTTP. Я считаю, что упаковка всей корневой файловой системы в шар TAR является наиболее эффективным способом обработки передачи. Затем нам нужно смонтировать /proc, /devи /sysкаталоги ВМ на соответствующие файлы в файловой системе прошивки. Наконец, мы chrootв файловой системе прошивки, используя следующую команду:
chroot ~/firmware_rootfs /bin/sh
Второй вариант говорит chrootзапустить /bin/shпосле изменения корневого каталога. От вас может потребоваться изменить эту команду /bin/bashили /bin/busyboxполучить рабочую оболочку.
Рисунок 5 - Busybox
С работающей оболочкой мы можем перейти к /etc/rc.dили /etc/init.dзапустить соответствующий скрипт RC, чтобы запустить службы пользовательского интерфейса. Внимательно проанализируйте rc.dпапку и осмотрите сценарии, вам нужно настроить сценарии запуска, чтобы учесть пропущенные сетевые интерфейсы, сбой вызова библиотеки NVRAM и всякие забавные вещи. Эта часть процесса эмуляции очень похожа на работу с зашифрованной прошивкой; каждая прошивка будет собственным приключением, которое и является определением исследования. Зачастую вам нужно настроить rcSскрипты настолько, чтобы целевая служба работала правильно. Эта часть процесса может занять недели исследований и дополнительной работы.
Эмуляция - это много работы. Иногда лучше всего стоять на плечах гигантов. Есть два основных проекта, которые помогают ускорить процесс эмуляции прошивки, а именно Firmadyne и ARM-X.
60% времени, это работает каждый раз: Firmadyne
Фирмадин великолепен, когда работает. Это платформа эмуляции прошивки, которая пытается автоматически эмулировать прошивку устройства на базе Linux. Firmadyne поддерживает как MIPS, так и ARM процессоры. Он извлечет корневую файловую систему, выведет сетевые интерфейсы и создаст образ диска QEMU для эмуляции. Он также пытается эмулировать NVRAM. Если вам нужна полная эмуляция системы для новой цели, я рекомендую сначала попробовать Firmadyne. Затем вы можете попытаться исправить некоторые ошибки, с которыми он сталкивается, прежде чем пытаться использовать другие методы эмуляции. У меня возникли проблемы с запуском Firmadyne с использованием более новых версий QEMU. Однако использование Docker для его установки обычно позволяет избежать этой проблемы.
ARM-X
Среда эмуляции прошивки
Вывод
Надеюсь, с помощью этого блога вы готовы «просто эмулировать его с помощью QEMU». Все методы, показанные выше (включая ARM-X и Firmadyne), использовались в различных материалах нашей программы. Все дороги могут вести в Рим, но не существует единого фиксированного способа эмулировать прошивку с QEMU. Изучите различные методы и посмотрите, что работает для вас. Познакомьтесь со знанием, чтобы владеть чудовищем по имени QEMU, и вы удивитесь тому, как оно может помочь вам неожиданным образом. Наконец, я хотел бы узнать о ваших методах эмуляции и с нетерпением жду вашего следующего представления.
Источник:
MindShaRE - это наш периодический взгляд на различные советы и хитрости по обратному проектированию. Цель состоит в том, чтобы держать вещи маленькими и обсудить некоторые повседневные аспекты реверса. Вы можете просмотреть предыдущие записи в этой серии
Ссылка скрыта от гостей
.Часто люди отвергают исследования маршрутизатора или IoT как легкие. «Просто подражайте ему с QEMU!» обычно так говорят. Они, вероятно, также скажут вам «просто покупайте дешево, продавайте дорого», чтобы зарабатывать деньги на фондовом рынке. Сложная, если не невозможная часть торговли акциями - это знать, когда цены самые низкие и самые высокие. Точно так же знание того , как эмулировать прошивку с помощью QEMU, вероятно, является самой трудной частью для новичка в области исследований встроенных систем безопасности. Хотя я не могу предложить большую помощь с торговыми советами, я могу помочь с эмуляцией прошивки.
Прежде чем мы начнем, я предполагаю, что ваша прошивка похожа на UNIX и не работает в какой-либо другой операционной системе реального времени (RTOS), такой как VxWorks или Windows CE. Я также предполагаю, что ваша прошивка дешифрована / де-обфусцирована и извлечена корневая файловая система. Если у вас возникли проблемы с зашифрованной прошивкой, ознакомьтесь с моим предыдущим сообщением в блоге
Ссылка скрыта от гостей
.Начните с конца в уме
Ключевая часть эмуляции устройства имеет конечную цель. Вы хотите запустить только один двоичный файл? Как насчет одной услуги? Или вы хотите полную эмуляцию устройства? Так как для правильной работы эмуляции прошивки требуется много времени, ваша цель сильно повлияет на стратегию эмуляции. Иногда бесчисленные часы, потраченные на настройку эмуляции, оправдывают покупку некоторых из этих недорогих устройств.
Для запуска одного двоичного
Ссылка скрыта от гостей
такого как процедура дешифрования, рассмотрите более легкий подход к
Ссылка скрыта от гостей
. Если ваша цель заключается в написании эксплойтов, работа с физическим устройством может быть наилучшей, поскольку эксплойты в конечном итоге используются против реальных устройств. Эмуляция может не учитывать тонкое поведение оборудования, такое как кэши команд, которые могут повлиять на эксплойты по повреждению памяти. Однако эмуляция отлично подходит для разработки и тестирования эксплойтов для высокоуровневых уязвимостей, таких как внедрение команд CGI-скриптов или ошибки логики входа на страницах PHP.Определение архитектуры процессора и сбор информации
Первый шаг в эмуляции всего - определение архитектуры процессора для нашей цели. Обычно мы можем определить это без устройства под рукой. Один из способов определения типа процессора - анализ двоичных файлов встроенного программного обеспечения. Выполнение fileкоманды в любом двоичном файле может быстро сказать нам, с какой архитектурой процессора мы имеем дело:
Рисунок 1 - Выводы команд file и readelf
Однако fileкоманда не предоставляет наиболее подробных результатов. Команда readelfс -Aопцией для двоичного файла ARM предоставляет гораздо более подробную информацию о процессоре, которая необходима для полной эмуляции системы и кросс-компиляции.
Другим способом определения архитектуры ЦП при работе с беспроводными маршрутизаторами (на примере TP-Link TL-WR841-ND [1]) является поиск модели устройства в Интернете. Это обычно приводит нас на
Ссылка скрыта от гостей
которая предоставляет информацию об оборудовании устройства. Быстрый поиск также может сообщить нам основной номер компонента System on Chip (SoC) и идентификатор FCC устройства. Затем мы можем найти таблицу данных для соответствующего чипа SoC и определить точную архитектуру процессора.Это также прекрасное время для поиска таблицы характеристик ядра процессора для конкретной семьи, чтобы ознакомиться с процессором. Эта таблица данных предоставит специфическую для устройства информацию, такую как адрес загрузки и низкоуровневая структура памяти, которая может помочь с эмуляцией и анализом. Вы также можете просмотреть отчеты FCC, чтобы получить представление о
Ссылка скрыта от гостей
устройства.Эмуляция пользовательского режима
Эмуляция для каждого процесса полезна, когда необходимо эмулировать только один двоичный файл. Существует два способа эмулировать один двоичный файл в пользовательском режиме QEMU. Первый вариант - эмуляция процесса в пользовательском режиме. Это можно сделать с помощью одной из следующих команд:
qemu-mipsel -L <prefix> <binary>
qemu-arm -L <prefix> <binary>
qemu-<arch> -L <prefix> <binary>
Этот -Lпараметр важен для
Ссылка скрыта от гостей
когда двоичные ссылки связаны с внешними зависимостями, такими как
Ссылка скрыта от гостей
или библиотеки шифрования. Он говорит динамическому компоновщику искать зависимости с предоставленным префиксом. Ниже приведен пример запуска imgdecryptдвоичного файла для маршрутизатора D-Link DIR-882.Рисунок 2 - imgdecrypt
Еще один способ эмулировать процесс - выполнить кросс-архитектурную chroot с QEMU. Для этого мы копируем qemu-<arch>-staticдвоичный файл в /usr/bin/каталог корневой файловой системы прошивки. Затем мы chrootв корень прошивки и получить рабочую оболочку:
Рисунок 3 - Использование QEMU для выполнения кросс-архитектурного chroot
Это возможно благодаря регистрации QEMU в ядре во время установки для обработки двоичных файлов с определенными магическими байтами через binfmt_miscмеханизм. Поэтому этот метод
Ссылка скрыта от гостей
кросс-компиляции
Ссылка скрыта от гостей
, который использует тот же механизм. Вы можете найти более подробное объяснение кросс-архитектурного chroot в
Ссылка скрыта от гостей
посте StackOverflow.Этот метод является моей первой попыткой эмулировать устройство. Он быстро настраивается и позволяет мне экспериментировать с различными двоичными файлами в корневой файловой системе прошивки, не слишком заботясь о зависимостях. Обратите внимание, что в этом режиме эмуляции ни одна из пользовательских служб не инициализируется в оболочке chroot, поэтому ни одна из системных или сетевых служб недоступна. Однако этого может быть достаточно для запуска только одного двоичного файла или тестирования одного небольшого компонента.
Выведи большие орудия: полная эмуляция системы
Иногда нам необходимо более подробно проанализировать прошивку и воспользоваться преимуществами полной эмуляции системы. Есть много способов полностью эмулировать устройство. Вот несколько наиболее распространенных методов эмуляции. Эти методы были использованы исследователями для поиска реальных ошибок, которые впоследствии были представлены в программе ZDI.
В первой части процесса эмуляции мы будем использовать QEMU для создания полноценной виртуальной машины Linux, работающей на целевой архитектуре. Затем мы переносим корневую файловую систему прошивки в виртуальную машину и выполняем chroot в корневой файловой системе прошивки. Для создания полноценной виртуальной машины, работающей в QEMU, нам обычно необходимы следующие вещи:
- файл образа диска QEMU (qcow2)
- образ ядра Linux, скомпилированный для целевой архитектуры
- (иногда) начальный образ диска RAM (initrd)
Чтобы получить вышеуказанные элементы, вы, безусловно, можете установить кросс-компилятор, собрать ядро и загрузить установщик, чтобы получить начальный RAM-диск. Затем вы можете установить Linux на файл образа диска QEMU. Тем не менее, кросс-компиляция ядра - существенный побочный квест для случайного охотника за ошибками или новичка в Linux. Если вы заинтересованы в подготовке этих файлов самостоятельно, ознакомьтесь со ссылками в разделе дальнейшего чтения. В этом блоге мы воспользуемся более простым подходом. Мы будем загружать и использовать
Ссылка скрыта от гостей
подготовленные Aurelien Jarn, разработчиком Debian. Кроме того, вы можете использовать
Ссылка скрыта от гостей
предоставленные Крисом (
Ссылка скрыта от гостей
), автором плагина «gef».После установки всех файлов мы можем запустить виртуальную машину QEMU с правильной архитектурой процессора с помощью одной из следующих команд:
Код:
sudo qemu-system-mipsel -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root = / dev / sda1 console = tty0"
sudo qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root = / dev / sda1 console = tty0"
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if = sd, file = debian_wheezy_armhf_standard.qcow2 -append "root = / DEV / mmcblk0p2"
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if = sd, file = debian_wheezy_armhf_desktop.qcow2 -append "root = / DEV / mmcblk0p2"
Опция -M или -machine указывает модель платы, которую поддерживает QEMU, эта опция позволяет пользователю выбрать целевую аппаратную платформу. Параметры -appendпозволяют настроить параметры ядра, передаваемые ядру Linux. Мне нравится помещать команду QEMU в скрипт bash, чтобы ускорить процесс внесения изменений и запуска виртуальной машины. Кроме того, мы должны добавить следующие параметры к вызову QEMU, чтобы подключить сетевые интерфейсы и добавить параметры переадресации портов:
-net user,hostfwd=tcp::80-:80,hostfwd=tcp::443-:443,hostfwd=tcp::2222-:22 \
-net nic
Добавление этих параметров позволит нам взаимодействовать с виртуальной машиной через SSH через порт 2222 хост-компьютера, а также на страницах HTTP и HTTPS эмулируемой прошивки.
Рисунок 4 - Запуск готового образа Debian
Когда виртуальная машина загружена и дает нам рабочую виртуальную машину Debian, начинается вторая часть эмуляции. Перенесите корневую файловую систему прошивки на виртуальную машину, используя SCP или HTTP. Я считаю, что упаковка всей корневой файловой системы в шар TAR является наиболее эффективным способом обработки передачи. Затем нам нужно смонтировать /proc, /devи /sysкаталоги ВМ на соответствующие файлы в файловой системе прошивки. Наконец, мы chrootв файловой системе прошивки, используя следующую команду:
chroot ~/firmware_rootfs /bin/sh
Второй вариант говорит chrootзапустить /bin/shпосле изменения корневого каталога. От вас может потребоваться изменить эту команду /bin/bashили /bin/busyboxполучить рабочую оболочку.
Рисунок 5 - Busybox
С работающей оболочкой мы можем перейти к /etc/rc.dили /etc/init.dзапустить соответствующий скрипт RC, чтобы запустить службы пользовательского интерфейса. Внимательно проанализируйте rc.dпапку и осмотрите сценарии, вам нужно настроить сценарии запуска, чтобы учесть пропущенные сетевые интерфейсы, сбой вызова библиотеки NVRAM и всякие забавные вещи. Эта часть процесса эмуляции очень похожа на работу с зашифрованной прошивкой; каждая прошивка будет собственным приключением, которое и является определением исследования. Зачастую вам нужно настроить rcSскрипты настолько, чтобы целевая служба работала правильно. Эта часть процесса может занять недели исследований и дополнительной работы.
Эмуляция - это много работы. Иногда лучше всего стоять на плечах гигантов. Есть два основных проекта, которые помогают ускорить процесс эмуляции прошивки, а именно Firmadyne и ARM-X.
60% времени, это работает каждый раз: Firmadyne
Фирмадин великолепен, когда работает. Это платформа эмуляции прошивки, которая пытается автоматически эмулировать прошивку устройства на базе Linux. Firmadyne поддерживает как MIPS, так и ARM процессоры. Он извлечет корневую файловую систему, выведет сетевые интерфейсы и создаст образ диска QEMU для эмуляции. Он также пытается эмулировать NVRAM. Если вам нужна полная эмуляция системы для новой цели, я рекомендую сначала попробовать Firmadyne. Затем вы можете попытаться исправить некоторые ошибки, с которыми он сталкивается, прежде чем пытаться использовать другие методы эмуляции. У меня возникли проблемы с запуском Firmadyne с использованием более новых версий QEMU. Однако использование Docker для его установки обычно позволяет избежать этой проблемы.
ARM-X
Среда эмуляции прошивки
Ссылка скрыта от гостей
прошивки на основе ARM. Это набор ядер, скриптов и файловых систем для эмуляции прошивки с QEMU. Он поставляется с несколькими примерами конфигурации эмуляции, чтобы помочь вам в вашем проекте. Я рекомендую посмотреть часовую запись презентации Hack In The Box 2019 Saumil Shah (
Ссылка скрыта от гостей
) на YouTube, прежде чем попробовать виртуальную
Ссылка скрыта от гостей
ARM-X. Если вы абсолютно новичок в исследованиях IoT, презентация также станет отличным ресурсом для начала.Вывод
Надеюсь, с помощью этого блога вы готовы «просто эмулировать его с помощью QEMU». Все методы, показанные выше (включая ARM-X и Firmadyne), использовались в различных материалах нашей программы. Все дороги могут вести в Рим, но не существует единого фиксированного способа эмулировать прошивку с QEMU. Изучите различные методы и посмотрите, что работает для вас. Познакомьтесь со знанием, чтобы владеть чудовищем по имени QEMU, и вы удивитесь тому, как оно может помочь вам неожиданным образом. Наконец, я хотел бы узнать о ваших методах эмуляции и с нетерпением жду вашего следующего представления.
Источник:
Ссылка скрыта от гостей
Последнее редактирование: