Firmware Analysis

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки 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>, якщо ентропія низька, то ймовірно, що воно не зашифроване. Якщо висока ентропія, то ймовірно, що воно зашифроване (або стиснене якимось чином).

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

pageFile/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