С наступлением эры 5G роль Интернета вещей становится все более важной, а также сопровождается увеличением рисков безопасности. Безопасность Интернета вещей включает в себя широкий спектр статей. В этой серии статей будет рассказано о понимании автором исследования уязвимостей Интернета вещей с технической точки зрения. Автор обсудит это с точки зрения пяти измерений: встроенного ПО, Интернета, аппаратного обеспечения, протокола IOT и мобильного приложения. Из-за ограниченного уровня возможностей каждый может исправить или дополнить любые неуместные или пропущенные части.
Причина, по которой прошивка является первой темой для обсуждения, заключается в том, что она относительно проста, и исследование уязвимостей Интернета вещей, как правило, невозможно обойти. Далее будут представлены четыре части расшифровки прошивки (если она зашифрована), распаковки и упаковки, моделирования и общей оценки безопасности прошивки.
Некоторые устройства IOT шифруют или даже подписывают встроенное ПО для повышения порога исследования и безопасности во время обновлений. Поскольку шифрование и дешифрование потребляют больше ресурсов, такие устройства обычно имеют более высокие конфигурации, например некоторые маршрутизаторы и брандмауэры.
Определить, зашифрована ли прошивка, относительно просто. Опытные друзья могут определить, откроют ли ее бинарным редактором. В целом будут иметь место следующие характеристики.
За исключением заголовка индикации прошивки, видимых символов нет (кроме заголовка), данные развернуты в битах и частота 01 в принципе такая же. binwalk(-e) не может анализировать структуру прошивки и (-A) не распознаёт никакие инструкции по архитектуре процессора
Если вышеуказанные характеристики соблюдены, можно предположить, что прошивка зашифрована. Расшифровка прошивки обычно осуществляется с этих точек зрения, но не ограничивается следующими методами.
Этот метод ограничен тем, что прошивка всегда существует в зашифрованном состоянии и расшифровывается и распаковывается для загрузки во флеш при запуске системы, а в устройстве отсутствуют средства динамической отладки (UART/JTAG и т.п.). Поскольку во флэш-памяти происходит полный процесс расшифровки, флэш-память можно прочитать с помощью программатора, а алгоритм дешифрования и ключ можно изменить на противоположные для достижения цели расшифровки прошивки. Например, считываемая с устройства флэш-память распределяется следующим образом:
0x000000-0x020000 boot section
0x020000-0x070000 encrypt section
0x070000-0x200000 encrypt section
0x200000-0x400000 config section
Очевидно, что процесс шифрования, который нам нужен, находится в разделе загрузки, где нам нужно найти алгоритм шифрования и ключ. Обычно для шифрования используются общедоступные алгоритмы шифрования, такие как AES. Ключ заключается в том, чтобы найти режим группировки IV (не ECB). ) и ключ. Загружаю загрузку в IDA pro, она автоматически не распознается:
Его можно определить вручную, сравнив структуру таблицы векторов прерываний в начале кода ARM. Ниже приведены общие коды входа.
.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 будет обсуждаться позже, когда будет представлена ОСРВ.,Воспользуйтесь этой прошивкойшифрованиеманераБезопасность устройстваОбучение на высоком уровне,Как правило, устройства выполняют проверку расшифровки только при обновлении.
Этот метод самый простой для понимания, то есть после запуска устройства используются UART, JTAG, Консоль или сеть для передачи прошивки (упакованной) обратно, минуя при этом ссылку на расшифровку. Стоит отметить, что устройство должно иметь эти интерфейсы. Конкретные методы варьируются от устройства к устройству. Использование этих интерфейсов будет описано в главе об аппаратном обеспечении.
Этот метод подходит, когда производитель вначале не использует решение шифрования, то есть старая версия прошивки не шифруется, в обновлении добавляется программа дешифрования, а затем при обновлении используется зашифрованная прошивка. Таким образом, мы можем найти пограничную версию между зашифрованной и незашифрованной версией из ряда прошивок, а также распаковать последнюю незашифрованную версию и выполнить обратное обновление программы для восстановления процесса шифрования.
Загрузите прошивку маршрутизатора, показанную на рисунке выше, распакуйте ее и найдите местоположение программы обновления, выполнив поиск по комбинации ключевых слов, таких как «прошивка», «обновление», «обновление», «загрузка» и т. д. Конечно, существуют методы отладки, а также вы можете проверить обновление процесса, найти программу обновления и параметры во время обновления через ps:
/usr/sbin/encimg -d -i <fw_path> -s <image_sign>
через МАР Профессиональная программа обратного шифрования быстро получила код процесса шифрования и дешифрования, используя AES. Режим CBC:
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
)
Этот метод подходит для программ, которые были обновлены через интерфейсы или пограничные версии.,Блоки, которые могут использовать преимущества алгоритмов группировкиИнструменты обнаружениясудитьшифрование Алгоритмы и позиционирование,Конечно, binwalk также может анализировать некоторые простые ситуации.,Например, определенная прошивка HMI промышленного управления:
iot@attifyos ~/Documents> binwalk hmis.tar.gz
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
34 0x22 OpenSSL encyption, salted, salt:0x5879382A7
Непосредственно загрузите программу обновления, найдите вызов openssl и легко получите команду расшифровки:
1.1.6 Уязвимость для получения ключа
Если вы не можете найти граничную версию, интерфейс отладки или не знакомы с аппаратной отладкой, вы можете рассмотреть возможность использования уязвимостей исторических версий, чтобы сначала получить контроль над устройством, а затем отменить алгоритм шифрования программа обновления. Этот метод довольно сложен. Он требует наличия исторической прошивки устройства с уязвимостями RCE, внедрения уязвимости посредством операции понижения версии для получения разрешений, загрузки необходимой программы обновления, а затем обратного проектирования алгоритма шифрования.
Друзья, которые плохо знакомы с исследованиями безопасности Интернета вещей, почувствуют, что Распаковка прошивка проста,прямойbinwalk -Me
Вот и все,Но идеал полон,Реальность тощая,Узнаете, если еще протестируете прошивкуbinwalkВо многих случаях решить проблему невозможно.。
Прошивки IOT обычно делятся на две категории. Один тип имеет файловую систему, в основном основанную на Linux/BSD. Другой тип прошивки представляет собой единое целое, которое мы называем RTOS (Real-time. operating system)。
Каждый должен быть знаком с binwalk. Использование binwalk для непосредственного получения файловой системы rootfs не будет повторяться. Автор считает, что сила binwalk заключается в том, что он может анализировать и идентифицировать заголовки в нескольких форматах, предоставляя ссылку для распаковки. Далее представлены несколько ситуаций, когда требуется огибание точек. Конечно, прошивка сильно различается, и все зависит от замысла дизайнера. Все невозможно перечислить.
1.2.1.1 UBI(Unsorted Block Image)
Прошивки в формате UBI довольно распространены. Binwalk не может их распаковать напрямую. Однако в Интернете есть готовый инструмент ubi_reader. Вот на что стоит обратить внимание:
UBI_reader распаковывает, файл UBI должен быть целым числом, кратным 1024 байтам, а содержимое необходимо добавлять и удалять.
Например, проанализировав роутер, обнаруживается, что его rootfs имеет формат UBI:
# 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:
$ 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
Или напрямую
$ sudo pip install ubi_reader
Затем структура UBI будет извлечена на основе адреса,использоватьubireader_extract_files [options] path/to/file
Готов к распаковке。
1.2.1.2 PFS
Некоторые прошивки binwalk могут распознавать заголовок, но не могут его декодировать, например следующая прошивка
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 проверьте результаты и обнаружите, что ничего идентифицируемого не найдено. В это время вы можете вручную проанализировать или найти некоторые связанные инструменты. Найдите соответствующие инструменты в Интернете и используйте команды непосредственно в соответствии с подсказками, чтобы разблокировать прошивку.
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», а затем распаковать и распаковать его в соответствии с конкретным форматом. распаковка прошивки все-таки это формат данных.
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. Команда выглядит следующим образом:
$ 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:
# 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)
Затем выполните:
$ make linux
$ ldconfig
$ cd ../luadec
$ make LUAVER=5.1
$ sudo cp luadec /usr/local/bin/
Используйте luadec для отображения структуры кода:
$ 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 содержит подфункции):
$ luadec -f 0 squashfs-root/usr/lib/lua/luci/sgi/uhttpd.lua
Следует отметить, что компиляция luadec связана с архитектурой. Официальный luadec не может парсить lua-файл в среде Arm, но в Интернете есть соответствующие инструменты, поэтому я не буду здесь вдаваться в подробности.
Многие устройства IOT используют архитектуру RTOS (операционная система реального времени). Сама прошивка представляет собой исполняемый файл. Файловая система не требуется, она добавляется и запускается сразу после запуска. Наиболее важными моментами при анализе ОСРВ являются два момента:
(1) Запись программы прошивки (2) Символы программы прошивки
1.2.2.1 vxworks
Начнем с vxworks, который широко используется и имеет соответствующие процедуры. VxWorks — это операционная система реального времени, запущенная Wind River System. Она широко используется в области встраиваемого оборудования связи, военной, авиационной и аэрокосмической промышленности. Поскольку существуют стандарты, их легко определить. Возьмем в качестве примера следующую прошивку:
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, чтобы получить базовый адрес, который здесь явно не применим.
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 — это таблица адресов функций. В этой прошивке таких таблиц много. Таким образом, как и в таблице адресов, строки являются для нас важными подсказками для анализа базового адреса и функций встроенного ПО.
Разобрать вещи легко, а вот установить. Этот принцип касается и упаковки прошивки. Если устройство имеет интерфейс отладки, в операциях упаковки обычно нет необходимости. В конце концов, исследования безопасности в основном основаны на обратном мышлении. Иногда средств отладки не хватает, поэтому приходится вручную добавлять их в разблокированную прошивку. Обычно кросс-скомпилированные файлы telnetd, dropbear (sshd) и gdb помещаются в файл прошивки, а затем заменяется и упаковывается сценарий запуска. Существует множество процедур сценариев запуска для Linux, особенно в устройствах IOT. Здесь автор обычно использует более умный метод, например, проверяя, что служба /sbin/xxxd запустится и заработает, и вы сможете ее заменить:
# mv rootfs/sbin/xxxd sbin/xxxdd
# touch rootfs/sbin/xxxd
# chmod +x rootfs/sbin/xxxd
Затем добавьте его в sbin/xxxd
#!/bin/sh
/usr/sbin/telnetd -F -l /bin/sh -p 1234 &
/sbin/xxxdd &
Таким образом, telnetd будет запускаться первым при запуске xxxd.
Конечно, удобнее всего, если его можно упаковать с точки зрения дальнейшей разработки, что является вопросом кросс-компиляции. Среди некоторых устройств, которые я изучил, основными являются прошивки маршрутизаторов, которые частично соответствуют лицензии GPL, которая заключается в открытом исходном коде части программного обеспечения (как правило, на основе инструментов с открытым исходным кодом) и предоставлении двоичных файлов остального программного обеспечения и упаковки. инструменты (методы) для всей прошивки. Например, определенное устройство маршрутизации, изученное ранее, обеспечивает загрузку с открытым исходным кодом:
Загрузите zip-пакет, скомпилируйте rootfs в соответствии со своими потребностями и, наконец, упакуйте его с помощью инструментов, включенных в zip-пакет:
./packet -k %s -f rootfs -b compatible_r6400.txt
-ok kernel -oall image -or rootfs -i ambitCfg.h
firmware-mod-kit (fmk) может быть наиболее часто используемым инструментом распаковки на основе binwalk, но поскольку он давно не обновлялся, сценарии его использования ограничены. Установка и использование fmk относительно просты, как показано ниже:
# 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 //Пакет
Сложность упаковки в том, что прошивка должна соответствовать оригинальной прошивке и проходить различные проверки, иначе перепрошивка может не удаться, либо устройство заблокируется. Автор ранее написал статью об уязвимости netgear upnp, которая включает в себя процесс упаковки прошивки netgear. Заинтересованные друзья могут посмотреть. Прошивка обычно разделена на множество разделов. Для облегчения анализа каждый раздел имеет заголовок инструкции. В заголовке может храниться такая информация, как флаги, размер и проверка crc. Эта информация служит основой для распаковки. Например, можно сначала получить размер прошивки (шестнадцатеричный), разбить байты по размеру конца прошивки, обычно 4 байта, а затем поискать аналогичные байты в заголовке прошивки (указанная длина в заголовке прошивки вычтется длину заголовка), а затем анализируем его по байтам с указанием размера для уточнения формата, что очень похоже на процесс анализа сетевых протоколов.
Конечно, большинство заголовков имеют стандарты и могут быть сопоставлены один к одному в соответствии со стандартным форматом. Стоит отметить, что некоторые производители подписывают прошивки, что увеличивает сложность упаковки. В настоящее время мы можем поискать какие-нибудь официальные инструменты упаковки, соответствующие GPL, или использовать openssl для генерации пары открытого и закрытого ключей, чтобы перезаписать открытый ключ проверки на устройстве. Конечно, здесь должны быть лазейки, иначе мы. попадет в цикл курицы и яйца. Конечно, есть способ лучше и дешевле – эмуляция прошивки.
Моделирование прошивки может иметь следующие три сценария в зависимости от различных потребностей:
(1) Просто смоделируйте приложение, такое как web, upnpd, dnsmasq и т. д., чтобы отладить приложение. На этом этапе вы можете запустить программу напрямую с помощью инструмента моделирования. Вам нужно только подумать, можно ли загрузить динамическую библиотеку. (2) Необходимо смоделировать оболочку прошивки и взаимодействовать со всей системой. Здесь вы можете изменить корневой путь через chroot и использовать инструмент моделирования для выполнения /bin/sh. При этом его можно повесить в /proc, чтобы он выглядел более реалистично при просмотре процесса в PS. (3) Необходимо имитировать запуск всей прошивки, а сетевую карту и т. д. тоже можно использовать нормально. Здесь вам нужно использовать инструмент, который может моделировать систему img для непосредственной загрузки всей системы. Вы также можете использовать метод «матрешка», чтобы сначала смоделировать debian.img архитектуры, а затем использовать chroot, чтобы поднять крышу. устройство.
Вот некоторые часто используемые инструменты моделирования.
QemuЭто старейший инструмент моделирования мультиархитектуры.,выше3индивидуальныйиспользоватьсценаqemuВсе могут быть удовлетворены。qemu可以下载Установить也可以прямойиспользовать源Установить,Здесь следует отметить, что если приложению моделирования требуется не только qemu,Вам также необходимо установить qemu-user.
# For ubuntu
$ sudo apt-get install qemu
$ sudo apt-get install qemu-user qemu-uesr-static
В качестве примера рассмотрим моделирование прошивки ARM. Разблокируйте прошивку, чтобы получить rootfs. Ниже показано использование qemu для имитации выполнения busybox:
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 для имитации sh аналогично описанной выше ситуации. Вы можете сначала смонтировать proc, чтобы сделать его более реалистичным при просмотре процесса с помощью ps:
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 очень мощный инструмент и может устанавливать систему так же, как в vmware или virtualbox:
$ 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:
$ 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:
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-систему «матрешка»:
$ 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, представленный ниже.
Unicorn — это платформа моделирования инструкций ЦП, основанная на Qemu, которая может моделировать любую инструкцию ЦП. Обычно мы можем воспользоваться преимуществами функций моделирования Unicorn на уровне инструкций:
Программы нечеткого тестирования (IOT) Используется для плагинов GDB или инструментов для выполнения моделирования кода для изменения логики кода. Имитируйте выполнение некоторых сложных запутанных кодов для повышения эффективности ручного обратного проектирования.
Существует множество руководств по моделированию выполнения и изменению логики кода Unicorn. Здесь я не буду вдаваться в подробности. Ниже представлено введение в плагин IDA pro, основанный на Unicorn. Этот плагин может имитировать выполнение в IDA pro и. предоставить результаты выполнения. Содержимое, связанное с UnicornFuzz, будет рассмотрено позже.
#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 выглядит следующим образом:
.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
Python>a = EmuMips()
Настройте адрес и параметры моделирования
Python>a.configEmu(0x00400640,0x00400678,[2,3])
[*] Init registers success...
[*] Init code and data segment success!
[*] Init Stack success...
[*] set args...
Запустить симуляцию команды
Python>a.beginEmu()
[*] emulating...
[*] Done! Emulate result return: 0x5
В результате выполнения симуляции Unicorn результат sum(2+3) равен 0x5.
Qiling — очень молодой симулятор на базе Unicorn, предназначенный для исследования Интернета вещей. Qiling можно использовать в качестве IDA pro, вы также можете использовать Qiling Unicornalfруководитьfuzz,Прошивку устройства IOT также можно смоделировать. Qiling разработан с использованием Python3.,可以прямой用pip3 install qiling
Установить,Ниже приведена часть кода официальной прошивки маршрутизатора с имитированной архитектурой ARMj:
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 еще больше упрощает код, необходимый для моделирования, и предоставляет функции инструментирования на уровне инструкций, что по-прежнему очень эффективно.
Firmadyne — это автоматизированная и масштабируемая система для моделирования и динамического анализа встроенного ПО на базе Linux. Firmadyne также основан на Qemu, и его использование аналогично. Существует множество онлайн-руководств. Здесь мы в основном представляем инструмент для проверки прошивки с использованием Firmadyne - Firm-AFL.
Установка Firm-AFL разделена на пользовательский и системный режимы. Пользовательский режим:
$ cd user_mode/
$ ./configure --target-list=mipsel-linux-user,mips-linux-user,arm-linux-user --static --disable-werror
$ make
Системный режим:
$ cd qemu_mode/DECAF_qemu_2.10/
$ ./configure --target-list=mipsel-softmmu,mips-softmmu,arm-softmmu --disable-werror
$ make
На примере прошивки Dlink DIR-815 сначала установите Firmadyne и проделайте некоторую работу по инициализации:
$ 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 в соответствии с архитектурой маршрутизатора:
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-скрипт, чтобы начать тестирование:
$ cd image_9050
$ sudo python start.py 9050
Исследование прошивок является основой исследования уязвимостей 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/
Замечательная рекомендация