Исследование уязвимостей IoT (1) Основы прошивки
Исследование уязвимостей IoT (1) Основы прошивки

С наступлением эры 5G роль Интернета вещей становится все более важной, а также сопровождается увеличением рисков безопасности. Безопасность Интернета вещей включает в себя широкий спектр статей. В этой серии статей будет рассказано о понимании автором исследования уязвимостей Интернета вещей с технической точки зрения. Автор обсудит это с точки зрения пяти измерений: встроенного ПО, Интернета, аппаратного обеспечения, протокола IOT и мобильного приложения. Из-за ограниченного уровня возможностей каждый может исправить или дополнить любые неуместные или пропущенные части.

Основы прошивки IoT

Причина, по которой прошивка является первой темой для обсуждения, заключается в том, что она относительно проста, и исследование уязвимостей Интернета вещей, как правило, невозможно обойти. Далее будут представлены четыре части расшифровки прошивки (если она зашифрована), распаковки и упаковки, моделирования и общей оценки безопасности прошивки.

1.1 Расшифровка прошивки

Некоторые устройства IOT шифруют или даже подписывают встроенное ПО для повышения порога исследования и безопасности во время обновлений. Поскольку шифрование и дешифрование потребляют больше ресурсов, такие устройства обычно имеют более высокие конфигурации, например некоторые маршрутизаторы и брандмауэры.

1.1.1 Оценка шифрования прошивки

Определить, зашифрована ли прошивка, относительно просто. Опытные друзья могут определить, откроют ли ее бинарным редактором. В целом будут иметь место следующие характеристики.

За исключением заголовка индикации прошивки, видимых символов нет (кроме заголовка), данные развернуты в битах и ​​частота 01 в принципе такая же. binwalk(-e) не может анализировать структуру прошивки и (-A) не распознаёт никакие инструкции по архитектуре процессора

Если вышеуказанные характеристики соблюдены, можно предположить, что прошивка зашифрована. Расшифровка прошивки обычно осуществляется с этих точек зрения, но не ограничивается следующими методами.

1.1.2 Ключ приобретения оборудования

Этот метод ограничен тем, что прошивка всегда существует в зашифрованном состоянии и расшифровывается и распаковывается для загрузки во флеш при запуске системы, а в устройстве отсутствуют средства динамической отладки (UART/JTAG и т.п.). Поскольку во флэш-памяти происходит полный процесс расшифровки, флэш-память можно прочитать с помощью программатора, а алгоритм дешифрования и ключ можно изменить на противоположные для достижения цели расшифровки прошивки. Например, считываемая с устройства флэш-память распределяется следующим образом:

Язык кода:javascript
копировать
0x000000-0x020000 boot section
0x020000-0x070000 encrypt section
0x070000-0x200000 encrypt section
0x200000-0x400000 config section

Очевидно, что процесс шифрования, который нам нужен, находится в разделе загрузки, где нам нужно найти алгоритм шифрования и ключ. Обычно для шифрования используются общедоступные алгоритмы шифрования, такие как AES. Ключ заключается в том, чтобы найти режим группировки IV (не ECB). ) и ключ. Загружаю загрузку в IDA pro, она автоматически не распознается:

Его можно определить вручную, сравнив структуру таблицы векторов прерываний в начале кода ARM. Ниже приведены общие коды входа.

Язык кода:javascript
копировать
.globl _start
_start:
    b       reset
    ldr     pc, _undefined_instruction
    ldr     pc, _software_interrupt
    ldr     pc, _prefetch_abort
    ldr     pc, _data_abort
    ldr     pc, _not_used
    ldr     pc, _irq
    ldr     pc, _fiq
...
_irq:
        .word irq

После этого вы можете перепроектировать алгоритм шифрования на AES, и ключ будет получен через хэш sha256 серийного номера устройства.

Распознавание таких структур с помощью МАР pro будет обсуждаться позже, когда будет представлена ​​ОСРВ.,Воспользуйтесь этой прошивкойшифрованиеманераБезопасность устройстваОбучение на высоком уровне,Как правило, устройства выполняют проверку расшифровки только при обновлении.

1.1.3 Отладка прямого чтения

Этот метод самый простой для понимания, то есть после запуска устройства используются UART, JTAG, Консоль или сеть для передачи прошивки (упакованной) обратно, минуя при этом ссылку на расшифровку. Стоит отметить, что устройство должно иметь эти интерфейсы. Конкретные методы варьируются от устройства к устройству. Использование этих интерфейсов будет описано в главе об аппаратном обеспечении.

1.1.4 Сравнение граничных версий

Этот метод подходит, когда производитель вначале не использует решение шифрования, то есть старая версия прошивки не шифруется, в обновлении добавляется программа дешифрования, а затем при обновлении используется зашифрованная прошивка. Таким образом, мы можем найти пограничную версию между зашифрованной и незашифрованной версией из ряда прошивок, а также распаковать последнюю незашифрованную версию и выполнить обратное обновление программы для восстановления процесса шифрования.

Загрузите прошивку маршрутизатора, показанную на рисунке выше, распакуйте ее и найдите местоположение программы обновления, выполнив поиск по комбинации ключевых слов, таких как «прошивка», «обновление», «обновление», «загрузка» и т. д. Конечно, существуют методы отладки, а также вы можете проверить обновление процесса, найти программу обновления и параметры во время обновления через ps:

Язык кода:javascript
копировать
/usr/sbin/encimg -d -i <fw_path> -s <image_sign>

через МАР Профессиональная программа обратного шифрования быстро получила код процесса шифрования и дешифрования, используя AES. Режим CBC:

Язык кода:javascript
копировать
AES_set_decrypt_key (
   // user input key
   const unsigned char *userKey,
   // size of key
   const int bits,
   // encryption key struct which will be used by
   // encryption function
   AES_KEY *key
)

AES_cbc_encrypt (
   // input buffer
   const unsigned char *in,
   // output buffer
   unsigned char *out,
   // buffer length
   size_t length,
   // key struct return by previous function
   const AES_KEY *key,
   // initializatin vector
   unsigned char *ivec,
   // is encryption or decryption
   const int enc
)
1.1.5 Процедура обратного обновления

Этот метод подходит для программ, которые были обновлены через интерфейсы или пограничные версии.,Блоки, которые могут использовать преимущества алгоритмов группировкиИнструменты обнаружениясудитьшифрование Алгоритмы и позиционирование,Конечно, binwalk также может анализировать некоторые простые ситуации.,Например, определенная прошивка HMI промышленного управления:

Язык кода:javascript
копировать
iot@attifyos ~/Documents> binwalk hmis.tar.gz
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
34       0x22        OpenSSL encyption, salted, salt:0x5879382A7

Непосредственно загрузите программу обновления, найдите вызов openssl и легко получите команду расшифровки:

1.1.6 Уязвимость для получения ключа

Если вы не можете найти граничную версию, интерфейс отладки или не знакомы с аппаратной отладкой, вы можете рассмотреть возможность использования уязвимостей исторических версий, чтобы сначала получить контроль над устройством, а затем отменить алгоритм шифрования программа обновления. Этот метод довольно сложен. Он требует наличия исторической прошивки устройства с уязвимостями RCE, внедрения уязвимости посредством операции понижения версии для получения разрешений, загрузки необходимой программы обновления, а затем обратного проектирования алгоритма шифрования.

1.2 Распаковка прошивки

Друзья, которые плохо знакомы с исследованиями безопасности Интернета вещей, почувствуют, что Распаковка прошивка проста,прямойbinwalk -MeВот и все,Но идеал полон,Реальность тощая,Узнаете, если еще протестируете прошивкуbinwalkВо многих случаях решить проблему невозможно.。 Прошивки IOT обычно делятся на две категории. Один тип имеет файловую систему, в основном основанную на Linux/BSD. Другой тип прошивки представляет собой единое целое, которое мы называем RTOS (Real-time. operating system)。

1.2.1 Файловая система существует

Каждый должен быть знаком с binwalk. Использование binwalk для непосредственного получения файловой системы rootfs не будет повторяться. Автор считает, что сила binwalk заключается в том, что он может анализировать и идентифицировать заголовки в нескольких форматах, предоставляя ссылку для распаковки. Далее представлены несколько ситуаций, когда требуется огибание точек. Конечно, прошивка сильно различается, и все зависит от замысла дизайнера. Все невозможно перечислить.

1.2.1.1 UBI(Unsorted Block Image)

Прошивки в формате UBI довольно распространены. Binwalk не может их распаковать напрямую. Однако в Интернете есть готовый инструмент ubi_reader. Вот на что стоит обратить внимание:

UBI_reader распаковывает, файл UBI должен быть целым числом, кратным 1024 байтам, а содержимое необходимо добавлять и удалять.

Например, проанализировав роутер, обнаруживается, что его rootfs имеет формат UBI:

Язык кода:javascript
копировать
# binwalk ROM/wifi_firmware_c91ea_1.0.50.bin
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
684           0x2AC           UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x800, data offset: 0x1000

Сначала установите ubi_reader:

Язык кода:javascript
копировать
$ sudo apt-get install liblzo2-dev
$ sudo pip install python-lzo
$ git clone https://github.com/jrspruitt/ubi_reader
$ cd ubi_reader
$ sudo python setup.py install

Или напрямую

Язык кода:javascript
копировать
$ sudo pip install ubi_reader

Затем структура UBI будет извлечена на основе адреса,использоватьubireader_extract_files [options] path/to/fileГотов к распаковке。

1.2.1.2 PFS

Некоторые прошивки binwalk могут распознавать заголовок, но не могут его декодировать, например следующая прошивка

Язык кода:javascript
копировать
iot@attifyos ~/Documents> binwalk -Me v2912_389.all

Scan Time:     2020-11-04 18:39:13
Target File:   /home/iot/Documents/v2912_389.all
MD5 Checksum:  180c60197aae7e272191695e906c941e
Signatures:    396

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1546799       0x179A2F        gzip compressed data, last modified: 2042-04-26 20:13:56 (bogus date)
1717744       0x1A35F0        LZ4 compressed data
4171513       0x3FA6F9        SHA256 hash constants, little endian
4179098       0x3FC59A        Copyright string: "Copyright (c) 1998-2000 by XXXXX Corp."
4214532       0x404F04        Base64 standard index table
4224780       0x40770C        HTML document header
4232369       0x4094B1        SHA256 hash constants, little endian
4307839       0x41BB7F        SHA256 hash constants, little endian
4314017       0x41D3A1        XML document, version: "1.0"
4702230       0x47C016        Base64 standard index table
4707197       0x47D37D        Certificate in DER format (x509 v3), header length: 4, sequence length: 873
4727609       0x482339        Base64 standard index table
4791281       0x491BF1        PFS filesystem, version 1.0, 12886 files
4807401       0x495AE9        Base64 standard index table
...
iot@attifyos ~/Documents> ls _v2912_389.all.extracted/pfs-root/000/
WEBLOGIN.HTM  _WEBLOGIN.HTM.extracted/
iot@attifyos ~/Documents> ls _v2912_389.all.extracted/pfs-root/000/_WEBLOGIN.HTM.extracted/
3CB  3CB.zlib  E235  E235.zlib

После запуска binwalk проверьте результаты и обнаружите, что ничего идентифицируемого не найдено. В это время вы можете вручную проанализировать или найти некоторые связанные инструменты. Найдите соответствующие инструменты в Интернете и используйте команды непосредственно в соответствии с подсказками, чтобы разблокировать прошивку.

Язык кода:javascript
копировать
iot@attifyos ~/D/draytools> python draytools.py -F v2910_61252.all 
v2910_61252.all.out written, 12816484 [0x00C39064] bytes
FS extracted to [/home/iot/Documents/draytools/fs_out], 429 files extracted
iot@attifyos ~/D/draytools> ls fs_out/
v2000/  v2910.lst
iot@attifyos ~/D/draytools> ls fs_out/v2000/
act_sta.htm  CSS/  header.htm  INDEX2.HTM  ivr_711u/  jg/  l_m.htm    menu.htm   STATUS.HTM  SYSINFO_C.TXT  UPNP/  webauth.htm
CGI-BIN/     DOC/  IMAGES/     ivr_711a/   ivr_729/   JS/  LOGIN.HTM  rpage.htm  STYLE.CSS   SYSINFO.TXT    VLAN/

Вот краткий обзор кода ключа для распаковки прошивки. Суть в том, чтобы найти заголовок, похожий на «\xA5\xA5\xA5\x5A\xA5\x5A», а затем распаковать и распаковать его в соответствии с конкретным форматом. распаковка прошивки все-таки это формат данных.

Язык кода:javascript
копировать
def decompress_firmware(data):
    flen = len(data)
    sigstart = data.find('\xA5\xA5\xA5\x5A\xA5\x5A')
    if sigstart <= 0:
        sigstart = data.find('\x5A\x5A\xA5\x5A\xA5\x5A')
    if sigstart > 0:
        if draytools.verbose:
            print 'Signature found at [0x%08X]' % sigstart
        lzosizestart = sigstart + 6
        lzostart = lzosizestart + 4
        lzosize = unpack('>L', data[lzosizestart:lzostart])[0]
        return data[0x100:sigstart+2] \
            + pydelzo.decompress('\xF0' + pack(">L",0x1000000) \
                + data[lzostart:lzostart+lzosize])
    ...

1.2.1.3 Openwrt Lua

Возможно, неуместно размещать здесь анализ структуры Lua при распаковке, но ввиду большой базы использования Openwrt я кратко упомяну об этом здесь. Lua — это легкий язык сценариев, который легко встраивать и расширять. Этот язык сценариев будет использоваться при разработке Openwrt. Стоит отметить, что lua некоторых устройств не представляет собой простой текст и сбивает с толку, поэтому его необходимо декомпилировать с помощью luadec. Скрипт lua в openwrt немного отличается от традиционной версии, скомпилированной luajit, для нормальной декомпиляции с использованием luadec. Команда выглядит следующим образом:

Язык кода:javascript
копировать
$ cd ..
$ mkdir luadec
$ cd luadec/
$ git clone https://github.com/viruscamp/luadec
$ cd luadec/
$ git submodule update --init lua-5.1
$ cd lua-5.1
$ make linux
$ make clean
$ mkdir patch
$ cd patch/
$ get https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/010-lua-5.1.3-lnum-full-260308.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/030-archindependent-bytecode.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/011-lnum-use-double.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/015-lnum-ppc-compat.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/020-shared_liblua.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/040-use-symbolic-functions.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/050-honor-cflags.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/100-no_readline.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/200-lua-path.patch
$ wget https://dev.openwrt.org/export/HEAD/trunk/package/utils/lua/patches/300-opcode_performance.patch
$ mv patch/ patches
$ for i in ../patches/*.patch; do patch -p1 <$i ; done
$ for i in ./patches/*.patch; do patch -p1 <$i ; done
$ make linux

Измените lua-5.1/src/MakeFile:

Язык кода:javascript
копировать
# USE_READLINE=1
  +PKG_VERSION = 5.1.5
  -CFLAGS= -O2 -Wall $(MYCFLAGS)
  +CFLAGS= -fPIC -O2 -Wall $(MYCFLAGS)
  - $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUA_O) $(LIBS)
  + $(CC) -o $@ $(LUA_O) $(MYLDFLAGS) -L. -llua $(LIBS)
  - $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUAC_O) $(LIBS)
  + $(CC) -o $@ $(LUAC_O) $(MYLDFLAGS) -L. -llua $(LIBS)

Затем выполните:

Язык кода:javascript
копировать
$ make linux
 $ ldconfig
 $ cd ../luadec
 $ make LUAVER=5.1
 $ sudo cp luadec /usr/local/bin/

Используйте luadec для отображения структуры кода:

Язык кода:javascript
копировать
$ luadec -pn squashfs-root/usr/lib/lua/luci/sgi/uhttpd.lua
0
  0_0
    0_0_0
    0_0_1
    0_0_2

Используйте luadec для декомпиляции указанной функции (функция 0 содержит подфункции):

Язык кода:javascript
копировать
$ luadec -f 0 squashfs-root/usr/lib/lua/luci/sgi/uhttpd.lua

Следует отметить, что компиляция luadec связана с архитектурой. Официальный luadec не может парсить lua-файл в среде Arm, но в Интернете есть соответствующие инструменты, поэтому я не буду здесь вдаваться в подробности.

1.2.2 RTOS

Многие устройства IOT используют архитектуру RTOS (операционная система реального времени). Сама прошивка представляет собой исполняемый файл. Файловая система не требуется, она добавляется и запускается сразу после запуска. Наиболее важными моментами при анализе ОСРВ являются два момента:

(1) Запись программы прошивки (2) Символы программы прошивки

1.2.2.1 vxworks

Начнем с vxworks, который широко используется и имеет соответствующие процедуры. VxWorks — это операционная система реального времени, запущенная Wind River System. Она широко используется в области встраиваемого оборудования связи, военной, авиационной и аэрокосмической промышленности. Поскольку существуют стандарты, их легко определить. Возьмем в качестве примера следующую прошивку:

Язык кода:javascript
копировать
iot@attifyos ~/Documents> binwalk image_vx5.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
335280        0x51DB0         PEM certificate
...
3721556       0x38C954        GIF image data, version "89a", 10 x 210
8518936       0x81FD18        VxWorks operating system version "5.5.1" , compiled: "Mar  5 2015, 15:56:18"
9736988       0x94931C        SHA256 hash constants, little endian
...
13374599      0xCC1487        Copyright string: "Copyright  1999-2001 Wind River Systems."
13387388      0xCC567C        VxWorks symbol table, big endian, first entry: [type: function, code address: 0xF4A09A00, symbol address: 0xF813C800]
13391405      0xCC562D        VxWorks symbol table, little endian, first entry: [type: function, code address: 0xB8BD, symbol address: 0xD000C800]

Binwalk определил прошивку как Vxworks 5.5.1 и указал расположение таблицы символов. Во-первых, вам необходимо определить точку входа прошивки. Если прошивка инкапсулирована в формате ELF, вы можете напрямую использовать readelf, чтобы получить базовый адрес, который здесь явно не применим.

Язык кода:javascript
копировать
iot@attifyos ~/Documents> readelf -a image_vx5_arm_little_eniadn.bin 
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start
iot@attifyos ~/Documents> binwalk -A image_vx5.bin |more

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
244           0xF4            ARM instructions, function prologue
408           0x198           ARM instructions, function prologue
440           0x1B8           ARM instructions, function prologue
472           0x1D8           ARM instructions, function prologue
608           0x260           ARM instructions, function prologue

проходитьbinwalk -AПолучить архитектуру прошивкиARM,прямой用IDA про загрузку:

Проанализируйте скачок в начале прошивки и определите, что адрес загрузки 0x1000. Для Vxworks общими методами определения базового адреса являются:

Проанализируйте код инициализации в шапке прошивки и найдите первую функцию usrInit, запущенную vxworks. Найдите границу BSS на основе характеристик инициализации области BSS и рассчитайте адрес загрузки прошивки на основе смещения.

Затем исправьте имя таблицы символов в соответствии с местоположением, указанным binwalk.

В таблице функций хранятся имена функций и адреса функций. Найдя их, можно также проверить правильность базового адреса. Например, 0x00c813f8, показанный на рисунке выше, является именем функции:

0x009aa0f4 — адрес функции:

Поскольку базовый адрес связан с архитектурой, мы не будем здесь вдаваться в подробности. Для анализа vxworks мы можем использовать плагин, умеющий автоматически восстанавливать записи и символы — vxhunter. На примере Ghidra после загрузки прошивки напрямую выберите плагин vxhunter_firmware_init.py и версию vxworks, чтобы автоматически восстановить запись и символы:

1.2.2.2 U-boot

Загрузочная прошивка также является разновидностью прошивки без файловой системы, с которой мы часто сталкиваемся. Например, многие устройства IOT используют U-boot для загрузки. Поскольку U-boot имеет открытый исходный код, мы можем обратиться к исходному коду для анализа. Также можно использовать загрузку некоторых архитектур. Используйте фиксированные процедуры, например, mips может основываться на регистре $gp и т. д.

1.2.2.3 Chip firmware

Некоторые прошивки IOT не содержат данных и их трудно отменить. Например, прошивка чипа ARM, показанная ниже, была загружена в IDA pro и обнаружила, что никакие функции не распознаются:

Итак, нам нужен общий анализ прошивки. Мы видим, что расположение прошивки 0x100 очень интересное:

После упорядочения 4 байтов все они начинаются с 0x2. Это не код и не данные, поэтому, вероятно, это адрес. Это должна быть таблица, поэтому базовый адрес, вероятно, 0x200000. Давайте проверим строку после перебазирования:

Увидев множество строк, похожих на имена функций, после нахождения конкретного местоположения выполните двоичный поиск по адресу 0x16852A в прошивке, который является адресом wlc_probresp_attach (с прямым порядком байтов).

Вы можете видеть, что поиск действительно был найден, и он также имеет табличную структуру:

Найдите местоположение в IDA pro по базовому адресу:

Как видно, некоторые перекрестные ссылки выполнены. Дальнейший анализ более сложен и не будет здесь разворачиваться. На самом деле позиция 0x100 — это таблица адресов функций. В этой прошивке таких таблиц много. Таким образом, как и в таблице адресов, строки являются для нас важными подсказками для анализа базового адреса и функций встроенного ПО.

1.3 Упаковка прошивки

Разобрать вещи легко, а вот установить. Этот принцип касается и упаковки прошивки. Если устройство имеет интерфейс отладки, в операциях упаковки обычно нет необходимости. В конце концов, исследования безопасности в основном основаны на обратном мышлении. Иногда средств отладки не хватает, поэтому приходится вручную добавлять их в разблокированную прошивку. Обычно кросс-скомпилированные файлы telnetd, dropbear (sshd) и gdb помещаются в файл прошивки, а затем заменяется и упаковывается сценарий запуска. Существует множество процедур сценариев запуска для Linux, особенно в устройствах IOT. Здесь автор обычно использует более умный метод, например, проверяя, что служба /sbin/xxxd запустится и заработает, и вы сможете ее заменить:

Язык кода:javascript
копировать
# mv rootfs/sbin/xxxd sbin/xxxdd
# touch rootfs/sbin/xxxd
# chmod +x rootfs/sbin/xxxd

Затем добавьте его в sbin/xxxd

Язык кода:javascript
копировать
#!/bin/sh

/usr/sbin/telnetd -F -l /bin/sh -p 1234 &
/sbin/xxxdd &

Таким образом, telnetd будет запускаться первым при запуске xxxd.

1.3.1 Кросс-компиляция

Конечно, удобнее всего, если его можно упаковать с точки зрения дальнейшей разработки, что является вопросом кросс-компиляции. Среди некоторых устройств, которые я изучил, основными являются прошивки маршрутизаторов, которые частично соответствуют лицензии GPL, которая заключается в открытом исходном коде части программного обеспечения (как правило, на основе инструментов с открытым исходным кодом) и предоставлении двоичных файлов остального программного обеспечения и упаковки. инструменты (методы) для всей прошивки. Например, определенное устройство маршрутизации, изученное ранее, обеспечивает загрузку с открытым исходным кодом:

Загрузите zip-пакет, скомпилируйте rootfs в соответствии со своими потребностями и, наконец, упакуйте его с помощью инструментов, включенных в zip-пакет:

Язык кода:javascript
копировать
./packet -k %s -f rootfs -b compatible_r6400.txt 
        -ok kernel -oall image -or rootfs -i ambitCfg.h
1.3.2 firmware-mod-kit

firmware-mod-kit (fmk) может быть наиболее часто используемым инструментом распаковки на основе binwalk, но поскольку он давно не обновлялся, сценарии его использования ограничены. Установка и использование fmk относительно просты, как показано ниже:

Язык кода:javascript
копировать
# For ubuntu
$ sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic bsdmainutils autoconf
# For redhat/centos
$ yum groupinstall "Development Tools"
$ yum install git zlib1g-dev xz-devel python-magic zlib-devel util-linux
# использовать
$ ./extract-firmware.sh firmware.bin //распаковываем
$ cp new-telnetd fmk/rootfs/usr/sbin/telnetd //по требованию Исправлять
$ ./build-firmware.sh //Пакет
1.3.3 Ручной анализ

Сложность упаковки в том, что прошивка должна соответствовать оригинальной прошивке и проходить различные проверки, иначе перепрошивка может не удаться, либо устройство заблокируется. Автор ранее написал статью об уязвимости netgear upnp, которая включает в себя процесс упаковки прошивки netgear. Заинтересованные друзья могут посмотреть. Прошивка обычно разделена на множество разделов. Для облегчения анализа каждый раздел имеет заголовок инструкции. В заголовке может храниться такая информация, как флаги, размер и проверка crc. Эта информация служит основой для распаковки. Например, можно сначала получить размер прошивки (шестнадцатеричный), разбить байты по размеру конца прошивки, обычно 4 байта, а затем поискать аналогичные байты в заголовке прошивки (указанная длина в заголовке прошивки вычтется длину заголовка), а затем анализируем его по байтам с указанием размера для уточнения формата, что очень похоже на процесс анализа сетевых протоколов.

Конечно, большинство заголовков имеют стандарты и могут быть сопоставлены один к одному в соответствии со стандартным форматом. Стоит отметить, что некоторые производители подписывают прошивки, что увеличивает сложность упаковки. В настоящее время мы можем поискать какие-нибудь официальные инструменты упаковки, соответствующие GPL, или использовать openssl для генерации пары открытого и закрытого ключей, чтобы перезаписать открытый ключ проверки на устройстве. Конечно, здесь должны быть лазейки, иначе мы. попадет в цикл курицы и яйца. Конечно, есть способ лучше и дешевле – эмуляция прошивки.

1.4 Моделирование прошивки

Моделирование прошивки может иметь следующие три сценария в зависимости от различных потребностей:

(1) Просто смоделируйте приложение, такое как web, upnpd, dnsmasq и т. д., чтобы отладить приложение. На этом этапе вы можете запустить программу напрямую с помощью инструмента моделирования. Вам нужно только подумать, можно ли загрузить динамическую библиотеку. (2) Необходимо смоделировать оболочку прошивки и взаимодействовать со всей системой. Здесь вы можете изменить корневой путь через chroot и использовать инструмент моделирования для выполнения /bin/sh. При этом его можно повесить в /proc, чтобы он выглядел более реалистично при просмотре процесса в PS. (3) Необходимо имитировать запуск всей прошивки, а сетевую карту и т. д. тоже можно использовать нормально. Здесь вам нужно использовать инструмент, который может моделировать систему img для непосредственной загрузки всей системы. Вы также можете использовать метод «матрешка», чтобы сначала смоделировать debian.img архитектуры, а затем использовать chroot, чтобы поднять крышу. устройство.

Вот некоторые часто используемые инструменты моделирования.

1.4.1 Qemu

QemuЭто старейший инструмент моделирования мультиархитектуры.,выше3индивидуальныйиспользоватьсценаqemuВсе могут быть удовлетворены。qemu可以下载Установить也可以прямойиспользовать源Установить,Здесь следует отметить, что если приложению моделирования требуется не только qemu,Вам также необходимо установить qemu-user.

Язык кода:javascript
копировать
# For ubuntu
$ sudo apt-get install qemu
$ sudo apt-get install qemu-user qemu-uesr-static
  • приложение для моделирования qemu

В качестве примера рассмотрим моделирование прошивки ARM. Разблокируйте прошивку, чтобы получить rootfs. Ниже показано использование qemu для имитации выполнения busybox:

Язык кода:javascript
копировать
iot@attifyos ~/Document> cp (which qemu-arm-static) ./rootfs/
iot@attifyos ~/Document> sudo chroot ./rootfs /qemu-arm-static /bin/busybox

BusyBox v0.47 (2018.08.30-14:14+0000) multi-call binary -- GPL2

Usage: busybox [function] [arguments]...
   or: [function] [arguments]...

    BusyBox is a multi-call binary that combines many common Unix
    utilities into a single executable.  Most people will create a
    link to busybox for each function they wish to use, and BusyBox
    will act like whatever it was invoked as.

Currently defined functions:
    busybox, cat, chgrp, chmod, chown, cp, date, dd, df, echo, free,
    grep, gunzip, gzip, halt, hex, hostname, id, init, kill, killall,
    ln, ls, mkdir, mknod, more, mount, mv, ping, ps, pwd, reboot,
    rm, rmdir, sh, sleep, sync, syslogd, tail, tar, touch, tty, umount,
    uname, zcat
  • qemu имитирует оболочку

Использование qemu для имитации sh аналогично описанной выше ситуации. Вы можете сначала смонтировать proc, чтобы сделать его более реалистичным при просмотре процесса с помощью ps:

Язык кода:javascript
копировать
iot@attifyos ~/Document> cd ./rootfs
iot@attifyos ~/Document> rm -rf proc
iot@attifyos ~/Document> sudo mount -t proc /proc ./proc
iot@attifyos ~/Document> cd ..
iot@attifyos ~/Document> sudo chroot ./rootfs /qemu-arm-static /bin/sh

BusyBox v0.47 (2018.08.30-14:14+0000) Built-in shell
Enter 'help' for a list of built-in commands.

/ # ls
bin             gm              sbin            usr
dev             lib             store           var
etc             qemu-arm-static sys
/ # ps
  PID  PPID Uid     Mem  CPU St Command
    1     0 0      29936  0.0 S  init splash 
    2     0 0         0  0.0 S  [kthreadd]
    7     2 0         0  0.6 S  [ksoftirqd/0]
  332     1 0      26776  0.0 S  systemd-journald 
  358     1 0      6568  0.0 S  systemd-udevd 
  378     1 0      28144  0.0 S  vmware-vmblock-fuse /run/vmblock-fuse -o rw,su
  495     1 100    18500  0.0 S  systemd-timesyncd 
  607     1 0      8244  0.0 S  haveged --Foreground --verbose=1 -w 1024 
  608     1 0      42756  0.0 S  VGAuthService 
  615     1 0      38824  0.0 S  vmtoolsd 
  619     1 0      3740  0.0 S  cron -f 
  621     1 103    6216  0.0 S  avahi-daemon: running [attifyos.local]
...
  • система моделирования qemu

qemu очень мощный инструмент и может устанавливать систему так же, как в vmware или virtualbox:

Язык кода:javascript
копировать
$ qemu-img create -f qcow2 arm.qcow2 10G
$ qemu-system-arm -m 1024M -sd arm.qcow2 -M vexpress-a9 -cpu cortex-a9 -kernel ../Downloads/vmlinuz-3.2.0-4-vexpress -initrd ../Downloads/initrd.gz -append "root=/dev/ram" -no-reboot

Самый распространенный способ использования qemu для имитации полной прошивки — превратить rootfs в файл img или qcow2, а затем использовать qemu соответствующей архитектуры для имитации выполнения. Здесь мы представляем метод «матрешки», упомянутый ранее. Сначала загрузите официальный образ системы Debian с архитектурой ARM. Подвесьте зеркало qcow2 и скопируйте rootfs на зеркало qcow2:

Язык кода:javascript
копировать
$ sudo apt-get install libguestfs-tools
# Используйте Guestmount для монтирования образа qcow2.
$ guestmount -a debian_wheezy_armel_standard.qcow2 -m /dev/sda1 /mnt
# скопировать rootfs
$ cp -rf ./rootfs /mnt/root/rootfs
$ guestunmount /mnt

Затем запустите файл qcow2:

Язык кода:javascript
копировать
qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1"

Используя chroot-систему «матрешка»:

Язык кода:javascript
копировать
$ chroot -u ./rootfs /bin/sh

BusyBox v0.47 (2018.08.30-14:14+0000) Built-in shell
Enter 'help' for a list of built-in commands.

/ #

Использование готового образа qcow2 Debian позволяет сохранить сетевую карту и другие процессы настройки, а также повысить эффективность моделирования. Стоит отметить, что qemu также часто используется при тестировании программ методом «черного ящика», например, qemu_mode AFL, который мы обсудим в последующих главах. Конечно, AFL также может использовать unicorn_mode, используя симулятор unicorn, представленный ниже.

1.4.2 Unicorn

Unicorn — это платформа моделирования инструкций ЦП, основанная на Qemu, которая может моделировать любую инструкцию ЦП. Обычно мы можем воспользоваться преимуществами функций моделирования Unicorn на уровне инструкций:

Программы нечеткого тестирования (IOT) Используется для плагинов GDB или инструментов для выполнения моделирования кода для изменения логики кода. Имитируйте выполнение некоторых сложных запутанных кодов для повышения эффективности ручного обратного проектирования.

Существует множество руководств по моделированию выполнения и изменению логики кода Unicorn. Здесь я не буду вдаваться в подробности. Ниже представлено введение в плагин IDA pro, основанный на Unicorn. Этот плагин может имитировать выполнение в IDA pro и. предоставить результаты выполнения. Содержимое, связанное с UnicornFuzz, будет рассмотрено позже.

Язык кода:javascript
копировать
#include <stdlib.h>

int calc(int a,int b){
        int sum;
        sum = a+b;
        return sum;

}

int main(){
        calc(2,3);
}

Очень простой код калькулятора C, приведенный выше, является официальным примером плагина, а его код дизассемблирования mipsel IDA pro выглядит следующим образом:

Язык кода:javascript
копировать
.text:00400640                 .globl calc
.text:00400640 calc:                                    # CODE XREF: main+18↓p
.text:00400640
.text:00400640 var_10          = -0x10
.text:00400640 var_4           = -4
.text:00400640 arg_0           =  0
.text:00400640 arg_4           =  4
.text:00400640
.text:00400640                 addiu   $sp, -0x18
.text:00400644                 sw      $fp, 0x18+var_4($sp)
.text:00400648                 move    $fp, $sp
.text:0040064C                 sw      $a0, 0x18+arg_0($fp)
.text:00400650                 sw      $a1, 0x18+arg_4($fp)
.text:00400654                 lw      $v1, 0x18+arg_0($fp)
.text:00400658                 lw      $v0, 0x18+arg_4($fp)
.text:0040065C                 addu    $v0, $v1, $v0
.text:00400660                 sw      $v0, 0x18+var_10($fp)
.text:00400664                 lw      $v0, 0x18+var_10($fp)
.text:00400668                 move    $sp, $fp
.text:0040066C                 lw      $fp, 0x18+var_4($sp)
.text:00400670                 addiu   $sp, 0x18
.text:00400674                 jr      $ra
.text:00400678                 nop
.text:00400678  # End of function calc

Создайте объект emu

Язык кода:javascript
копировать
Python>a = EmuMips()

Настройте адрес и параметры моделирования

Язык кода:javascript
копировать
Python>a.configEmu(0x00400640,0x00400678,[2,3])
[*] Init registers success...
[*] Init code and data segment success! 
[*] Init Stack success...
[*] set args...

Запустить симуляцию команды

Язык кода:javascript
копировать
Python>a.beginEmu()
[*] emulating...
[*] Done! Emulate result return: 0x5

В результате выполнения симуляции Unicorn результат sum(2+3) равен 0x5.

1.4.3 Qiling

Qiling — очень молодой симулятор на базе Unicorn, предназначенный для исследования Интернета вещей. Qiling можно использовать в качестве IDA pro, вы также можете использовать Qiling Unicornalfруководитьfuzz,Прошивку устройства IOT также можно смоделировать. Qiling разработан с использованием Python3.,可以прямой用pip3 install qilingУстановить,Ниже приведена часть кода официальной прошивки маршрутизатора с имитированной архитектурой ARMj:

Язык кода:javascript
копировать
import os, socket, sys, threading
sys.path.append("..")
from qiling import *

def patcher(ql):
    ...

def nvram_listener():
    ...

def my_sandbox(path, rootfs):
    ql = Qiling(path, rootfs, output = "debug")
    ql.add_fs_mapper("/dev/urandom","/dev/urandom")
    ql.hook_address(patcher ,ql.loader.elf_entry)
    ql.run()

if __name__ == "__main__":
    nvram_listener_therad =  threading.Thread(target=nvram_listener, daemon=True)
    nvram_listener_therad.start()
    my_sandbox(["rootfs/bin/httpd"], "rootfs")

Видно, что структура Qiling еще больше упрощает код, необходимый для моделирования, и предоставляет функции инструментирования на уровне инструкций, что по-прежнему очень эффективно.

1.4.4 Firmadyne

Firmadyne — это автоматизированная и масштабируемая система для моделирования и динамического анализа встроенного ПО на базе Linux. Firmadyne также основан на Qemu, и его использование аналогично. Существует множество онлайн-руководств. Здесь мы в основном представляем инструмент для проверки прошивки с использованием Firmadyne - Firm-AFL.

Установка Firm-AFL разделена на пользовательский и системный режимы. Пользовательский режим:

Язык кода:javascript
копировать
$ cd user_mode/
$ ./configure --target-list=mipsel-linux-user,mips-linux-user,arm-linux-user --static --disable-werror
$ make

Системный режим:

Язык кода:javascript
копировать
$ cd qemu_mode/DECAF_qemu_2.10/
$ ./configure --target-list=mipsel-softmmu,mips-softmmu,arm-softmmu --disable-werror
$ make

На примере прошивки Dlink DIR-815 сначала установите Firmadyne и проделайте некоторую работу по инициализации:

Язык кода:javascript
копировать
$ cd firmadyne
$ ./sources/extractor/extractor.py -b dlink -sql 127.0.0.1 -np -nk "../firmware/DIR-815_FIRMWARE_1.01.ZIP" images
$ ./scripts/getArch.sh ./images/9050.tar.gz
$ ./scripts/makeImage.sh 9050
$ ./scripts/inferNetwork.sh 9050
$ cd ..
$ python FirmAFL_setup.py 9050 mipsel

Измените run.sh в каталоге image_9050 в соответствии с архитектурой маршрутизатора:

Язык кода:javascript
копировать
ARCH=mipsel
QEMU="./qemu-system-${ARCH}"
KERNEL="./vmlinux.${ARCH}_3.2.1" 
IMAGE="./image.raw"
MEM_FILE="./mem_file"
${QEMU} -m 256 -mem-prealloc -mem-path ${MEM_FILE} -M ${QEMU_MACHINE} -kernel ${KERNEL} \

Затем вы можете запустить fuzz-скрипт, чтобы начать тестирование:

Язык кода:javascript
копировать
$ cd image_9050
$ sudo python start.py 9050

1.5 Резюме

Исследование прошивок является основой исследования уязвимостей IOT. В данной статье максимально полно представлено содержание исследования прошивок. С одной стороны, у автора ограниченный опыт, и есть еще некоторые моменты, которые невозможно охватить. пространство ограничено, и многие материалы не могут быть расширены. В будущем я обсужу это с вами еще раз, когда у меня будет возможность. В следующей статье будет представлено соответствующее содержание исследований веб-уязвимостей Интернета вещей.

Ссылки

https://cloud.tencent.com/developer/article/1005700 https://5alt.me/2017/08/расшифровка прошивки смарт-устройства/ http://blog.nsfocus.net/hmi-firmware-decryption-0522/ https://www.ershicimi.com/p/8e818120ac6352368837ef614dd496e4 http://blog.nsfocus.net/hmi-firmware-decryption-0522/ https://gorgias.me/2019/12/27/Firmware Extraction series-Извлечение и перепаковка файловой системы UBI/ https://paper.seebug.org/771/ https://paper.seebug.org/1090/ https://blog.csdn.net/yalecaltech/article/details/104113779 https://dassecurity-labs.github.io/HatLab_IOT_Wiki/firmware_security/firmware_security_tools/IDA_unicorn_base_tool/

Замечательная рекомендация

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose