Firmware Analysis

Підтримайте HackTricks

Вступ

Прошивка є важливим програмним забезпеченням, яке дозволяє пристроям працювати належним чином, керуючи та сприяючи комунікації між апаратними компонентами та програмним забезпеченням, з яким користувачі взаємодіють. Вона зберігається в постійній пам'яті, забезпечуючи доступ пристрою до важливих інструкцій з моменту ввімкнення живлення, що призводить до запуску операційної системи. Аналіз та, можливо, модифікація прошивки є важливим кроком у виявленні уразливостей безпеки.

Збір інформації

Збір інформації є критичним початковим кроком у розумінні структури пристрою та використовуваних технологій. Цей процес включає збір даних про:

  • Архітектуру ЦП та операційну систему, яку вона виконує

  • Конкрети завантажувача

  • Апаратне забезпечення та технічні описи

  • Метрики кодової бази та місця розташування джерел

  • Зовнішні бібліотеки та типи ліцензій

  • Історії оновлень та регуляторні сертифікати

  • Архітектурні та блок-схеми

  • Оцінки безпеки та виявлені уразливості

Для цієї мети інструменти відкритого джерела інформації (OSINT) є невід'ємними, так само як аналіз будь-яких доступних компонентів програмного забезпечення з використанням ручних та автоматизованих процесів перегляду. Інструменти, такі як Coverity Scan та LGTM від Semmle, пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.

Отримання прошивки

Отримання прошивки можна здійснити різними способами, кожен з яких має свій рівень складності:

  • Прямо від джерела (розробники, виробники)

  • Побудова за наданими інструкціями

  • Завантаження з офіційних сайтів підтримки

  • Використання запитів Google dork для пошуку розміщених файлів прошивки

  • Прямий доступ до хмарного сховища за допомогою інструментів, таких як S3Scanner

  • Перехоплення оновлень за допомогою технік "людина посередині"

  • Вилучення з пристрою через з'єднання, такі як UART, JTAG або PICit

  • Прослуховування запитів на оновлення в межах комунікації пристрою

  • Визначення та використання жорстко закодованих кінцевих точок оновлень

  • Вибірка з завантажувача або мережі

  • Вилучення та читання чіпа пам'яті, якщо всі інші способи не допомагають, за допомогою відповідних апаратних інструментів

Аналіз прошивки

Тепер, коли у вас є прошивка, вам потрібно отримати інформацію про неї, щоб знати, як з нею працювати. Різні інструменти, які ви можете використовувати для цього:

file <bin>
strings -n8 <bin>
strings -tx <bin> #print offsets in hex
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple

Якщо ви не знайшли багато із цими інструментами, перевірте ентропію зображення за допомогою binwalk -E <bin>, якщо ентропія низька, то ймовірно, що воно не зашифроване. Якщо висока ентропія, то ймовірно, що воно зашифроване (або стиснуте якимось чином).

Крім того, ви можете використовувати ці інструменти для вилучення файлів, вбудованих у прошивку:

File/Data Carving & Recovery Tools

Або binvis.io (code) для перевірки файлу.

Отримання файлової системи

За допомогою попередніх зазначених інструментів, таких як binwalk -ev <bin>, ви повинні були здатні витягти файлову систему. Зазвичай binwalk видобуває її всередину папки, названої як тип файлової системи, яка зазвичай є однією з наступних: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.

Ручне вилучення файлової системи

Іноді binwalk не має магічного байту файлової системи у своїх підписах. У цих випадках використовуйте binwalk для знаходження зміщення файлової системи та вирізання стиснутої файлової системи з бінарного файлу та ручне вилучення файлової системи відповідно до її типу за допомогою наведених нижче кроків.

$ binwalk DIR850L_REVB.bin

DECIMAL HEXADECIMAL DESCRIPTION
----------------------------------------------------------------------------- ---

0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41

Виконайте наступну команду dd, витягаючи файлову систему Squashfs.

$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs

8257536+0 records in

8257536+0 records out

8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s

Альтернативно, можна виконати наступну команду.

$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs

  • Для squashfs (використано в прикладі вище)

$ unsquashfs dir.squashfs

Файли будуть у каталозі "squashfs-root" після цього.

  • Файли архіву CPIO

$ cpio -ivd --no-absolute-filenames -F <bin>

  • Для файлових систем jffs2

$ jefferson rootfsfile.jffs2

  • Для файлових систем ubifs з NAND-пам'яттю

$ ubireader_extract_images -u UBI -s <start_offset> <bin>

$ ubidump.py <bin>

Аналіз Прошивки

Після отримання прошивки важливо розібрати її для розуміння її структури та потенційних вразливостей. Цей процес включає використання різноманітних інструментів для аналізу та вилучення цінної інформації з образу прошивки.

Інструменти Початкового Аналізу

Набір команд надається для початкового огляду бінарного файлу (зазначається як <bin>). Ці команди допомагають ідентифікувати типи файлів, вилучати рядки, аналізувати бінарні дані та розуміти деталі розділу та файлової системи:

file <bin>
strings -n8 <bin>
strings -tx <bin> #prints offsets in hexadecimal
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple

Для оцінки статусу шифрування зображення перевіряється ентропія за допомогою binwalk -E <bin>. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія вказує на можливе шифрування або стиснення.

Для вилучення вбудованих файлів рекомендується використовувати інструменти та ресурси, такі як документація file-data-carving-recovery-tools та binvis.io для інспекції файлів.

Вилучення файлової системи

За допомогою binwalk -ev <bin> зазвичай можна вилучити файлову систему, часто у каталог з назвою типу файлової системи (наприклад, squashfs, ubifs). Однак, коли binwalk не вдається визначити тип файлової системи через відсутність магічних байтів, необхідне ручне вилучення. Це включає використання binwalk для пошуку зміщення файлової системи, за яким слідує команда dd для вирізання файлової системи:

$ binwalk DIR850L_REVB.bin

$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs

Аналіз файлової системи

Після вилучення файлової системи використовуються різні команди для ручного вилучення вмісту, залежно від типу файлової системи (наприклад, squashfs, cpio, jffs2, ubifs).

Починається пошук уразливостей безпеки. Увага приділяється небезпечним мережевим демонам, зашитим обліковим записам, кінцевим точкам API, функціоналу сервера оновлень, некомпільованому коду, скриптам запуску та скомпільованим бінарникам для офлайн-аналізу.

Ключові місця та елементи для перевірки включають:

  • etc/shadow та etc/passwd для облікових даних користувача

  • SSL-сертифікати та ключі в etc/ssl

  • Файли конфігурації та скрипти для потенційних вразливостей

  • Вбудовані бінарні файли для подальшого аналізу

  • Загальні веб-сервери та бінарні файли пристроїв Інтернету речей

Декілька інструментів допомагають виявляти чутливу інформацію та вразливості в межах файлової системи:

Перевірка безпеки компільованих бінарних файлів

Як джерело коду, так і компільовані бінарні файли, знайдені в файловій системі, повинні бути ретельно перевірені на вразливості. Інструменти, такі як checksec.sh для бінарних файлів Unix та PESecurity для бінарних файлів Windows, допомагають виявляти незахищені бінарні файли, які можуть бути використані для атак.

Емуляція прошивки для динамічного аналізу

Процес емуляції прошивки дозволяє проводити динамічний аналіз роботи пристрою або окремої програми. Цей підхід може зіткнутися з викликами апаратного забезпечення або залежностями від архітектури, але передача кореневої файлової системи або конкретних бінарних файлів на пристрій з відповідною архітектурою та порядком байтів, такий як Raspberry Pi, або на попередньо побудовану віртуальну машину, може сприяти подальшому тестуванню.

Емуляція окремих бінарних файлів

Для вивчення окремих програм важливо визначити порядок байтів та архітектуру ЦП.

Приклад з архітектурою MIPS

Для емуляції бінарного файлу з архітектурою MIPS можна використовувати команду:

file ./squashfs-root/bin/busybox

І для встановлення необхідних інструментів емуляції:

sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils

Для архітектури MIPS (big-endian) використовується qemu-mips, а для little-endian бінарних файлів вибір падає на qemu-mipsel.

Емуляція архітектури ARM

Для ARM бінарних файлів процес схожий, з використанням емулятора qemu-arm.

Повна системна емуляція

Інструменти, такі як Firmadyne, Firmware Analysis Toolkit та інші, сприяють повній емуляції прошивки, автоматизуючи процес та допомагаючи у динамічному аналізі.

Практичний аналіз в реальному часі

На цьому етапі для аналізу використовується реальне або емульоване середовище пристрою. Важливо забезпечити доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати апаратні взаємодії, що може вимагати періодичного перезапуску емуляції. Аналіз повинен переглядати файлову систему, використовувати вразливі веб-сторінки та мережеві сервіси, досліджувати вразливості завантажувача. Тести на цілісність прошивки є критичними для виявлення потенційних вразливостей задніх дверей.

Техніки аналізу в реальному часі

Аналіз в реальному часі передбачає взаємодію з процесом або бінарним файлом у його робочому середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та ідентифікації вразливостей за допомогою фаззингу та інших технік.

Експлуатація бінарних файлів та доказ концепції

Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах низького рівня. Захист від виконання коду вбудованих систем рідко зустрічається, але у разі його наявності можуть знадобитися техніки, такі як Return Oriented Programming (ROP).

Підготовлені операційні системи для аналізу прошивки

Операційні системи, такі як AttifyOS та EmbedOS, надають попередньо налаштовані середовища для тестування безпеки прошивки, обладнані необхідними інструментами.

Підготовлені ОС для аналізу прошивки

  • AttifyOS: AttifyOS - це дистрибутив, призначений для допомоги у проведенні оцінки безпеки та тестування на проникнення пристроїв Інтернету речей (IoT). Він заощаджує час, надаючи попередньо налаштоване середовище з усіма необхідними завантаженими інструментами.

  • EmbedOS: Операційна система для тестування безпеки вбудованих систем на основі Ubuntu 18.04, попередньо завантажена інструментами для тестування безпеки прошивки.

Вразлива прошивка для практики

Для практики виявлення вразливостей у прошивці використовуйте наступні проекти вразливих прошивок як вихідну точку.

Посилання

Last updated