
Преди няколко дни реших да направя реверс-инжиниринг на фърмуера на рутера си, използвайки binwalk.
Купих си . Не е най-добрият рутер, но за моите нужди е абсолютно достатъчен.
Всеки път, когато купувам нов рутер, инсталирам . Защо? Обикновено производителите не се грижат особено за поддръжката на рутерите си и с времето софтуерът остарява, появяват се уязвимости и така нататък, общо взето, разбрали сте. Затова предпочитам добре поддържаната от общността open-source фърмуер OpenWRT.
След като изтеглих OpenWRT, аз също за новия ми Archer C7 от официалния сайт и реших да го анализирам. Чисто за забавление и да разкажа за binwalk.
Какво е binwalk?
е инструмент с отворен код за анализ, реверс-инжиниринг и извличане на образи на фърмуери.
Създаден през 2010 г. от Крейг Хеффнер, binwalk може да сканира образи на фърмуери и да намери файлове, да идентифицира и извлече образи на файлови системи, изпълняем код, компресирани архиви, бустери и ядра, формати на файлове като JPEG и PDF и много други.
Можете да използвате binwalk за реверс-инжиниринг на фърмуера, за да разберете как е устроен. Да търсите уязвимости в бинарните файлове, да извличате файлове и да търсите бекдори или цифрови сертификати. Можете също така да намерите опкодове за различни CPU.
Можете да разархивирате образи на файлови системи, за да търсите конкретни файлове с пароли (passwd, shadow и т.н.) и да опитате да счупите хешовете на паролите. Можете да извършите бинарен анализ между два или повече файла. Можете да направите анализ на ентропията на данни, за да откриете компресирани данни или кодирани ключове за криптиране. Всичко това без необходимост от достъп до изходния код.
Като цяло, всичко необходимо е налично 🙂
Как работи binwalk?
Основната функция на binwalk е неговото сигнатурно сканиране. Binwalk може да сканира образ на фърмуера, за да търси различни вградени типове файлове и файлови системи.
Знаете ли за утилитата на командния ред file?
file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, strippedКоманда fileглежда заглавието на файла и търси подпис (магическо число), за да определи типа на файла. Например, ако файлът започва с последователност от байтове 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, тя знае, че това е PNG файл. На има списък с често срещани подписи на файлове.
Binwalk работи по същия начин. Но вместо да търси подписи само в началото на файла, binwalk ще сканира целия файл. Освен това, binwalk може да извлече файлове, намерени в образа.
Инструменти file и binwalk използва библиотека libmagic за идентификация на подписи на файлове. Но binwalk допълнително поддържа списък с потребителски магически подписи за търсене на компресирани / архивирани файлове, заглавия на фърмуери, ядра на Linux, буутлоудъри, файлови системи и т.н.
Да се позабавляваме?
Инсталация на binwalk
Binwalk се поддържа на няколко платформи, включително Linux, OSX, FreeBSD и Windows.
За да инсталирате последната версия на binwalk, можете да и да следвате или , налично на уебсайта на проекта.
Binwalk има много различни параметри:
$ binwalk
Binwalk v2.2.0
Крейг Хефнър, ReFirmLabs
https://github.com/ReFirmLabs/binwalk
Използване: binwalk [OPCIИ] [ФАЙЛ1] [ФАЙЛ2] [ФАЙЛ3] ...
Опции за сканиране на подписи:
-B, --signature Сканира целевите файлове за общи файлови подписи
-R, --raw= Сканира целевите файлове за определената последователност от байтове
-A, --opcodes Сканира целевите файлове за общи подписи на изпълними операции
-m, --magic= Укажете персонализиран файл магия
-b, --dumb Деактивирайте умните ключови думи за подписи
-I, --invalid Показва резултати, маркирани като невалидни
-x, --exclude= Изключва резултатите, които съвпадат с
-y, --include= Показва само резултати, които съвпадат с
Опции за извличане:
-e, --extract Автоматично извлича познати файлови типове
-D, --dd= Извлича подписи, дадете на файловете разширение и изпълнете
-M, --matryoshka Рекурсивно сканира извлечени файлове
-d, --depth= Ограничете рекурсивната дълбочина на матрьошките (по подразбиране: 8 нива дълбоко)
-C, --directory= Извлича файлове/папки в персонализирана директория (по подразбиране: текущата работна директория)
-j, --size= Ограничете размера на всеки извлечен файл
-n, --count= Ограничете броя на извлечените файлове
-r, --rm Изтрийте изсечените файлове след извличане
-z, --carve Извлича данни от файлове, но не изпълнява утилити за извличане
-V, --subdirs Извлича в поддиректории, наименувани по отместването
Опции за ентропия:
-E, --entropy Изчислява ентропията на файла
-F, --fast Използва по-бърза, но по-малко детайлна, ентропийна анализ
-J, --save Запазва графиката като PNG
-Q, --nlegend Пропуска легендата от графиката на ентропията
-N, --nplot Не генерира графика на ентропията
-H, --high= Задайте прага на тригера на ентропията на възходящия ръб (по подразбиране: 0.95)
-L, --low= Задайте прага на тригера на ентропията на низходящия ръб (по подразбиране: 0.85)
Опции за бинарно сравнение:
-W, --hexdump Извършва хекс даун или различия на файл или файлове
-G, --green Показва само редове, съдържащи байтове, които са еднакви за всички файлове
-i, --red Показва само редове, съдържащи байтове, които са различни за всички файлове
-U, --blue Показва само редове, съдържащи байтове, които са различни за някои файлове
-u, --similar Показва само редове, които са еднакви между всички файлове
-w, --terse Сравнява всички файлове, но показва само хекс даун на първия файл
Опции за сурова компресия:
-X, --deflate Сканира за потоци за компресия с дефлет
-Z, --lzma Сканира за потоци за компресия с LZMA
-P, --partial Извършва повърхностно, но по-бързо сканиране
-S, --stop Спира след първия резултат
Общи опции:
-l, --length= Брой байтове за сканиране
-o, --offset= Започнете сканирането от този файл отклонение
-O, --base= Добавя база адреса към всички отпечатани отклонения
-K, --block= Задайте размера на блок файла
-g, --swap= Обърнете всеки n байта преди сканиране
-f, --log= Записва резултати в файл
-c, --csv Записва резултати в CSV формат
-t, --term Форматира изхода, за да пасне на терминалния прозорец
-q, --quiet Потиска изхода до stdout
-v, --verbose Активира подробен изход
-h, --help Показва изхода на помощта
-a, --finclude= Сканира само файлове, чиито имена съвпадат с този регекс
-p, --fexclude= Не сканира файлове, чиито имена съвпадат с този регекс
-s, --status= Активира статуса на сървъра на зададения портСканиране на изображения
Започваме с търсене на файлови сигнатури в изображението (изображение от сайта ).
Стартиране на binwalk с параметъра —signature:
$ binwalk --signature --term archer-c7.bin
ДЕСЕТИЧЕН ШЕСТНАДЕСЕТИЧЕН ОПИСАНИЕ
------------------------------------------------------------------------------------------
21876 0x5574 версия на U-Boot, "U-Boot 1.1.4-g4480d5f9-dirty (20
май 2019 - 18:45:16)"
21940 0x55B4 CRC32 полиномиална таблица, big endian
23232 0x5AC0 заглавка на uImage, размер на заглавката: 64 байта, заглавен CRC:
0x386C2BD5, създадено: 2019-05-20 10:45:17, размер на изображението:
41162 байта, Адрес на данни: 0x80010000, Точка на вход:
0x80010000, CRC на данни: 0xC9CD1E38, ОС: Linux, CPU: MIPS,
тип на изображението: Firmware Image, тип на компресия: lzma, име на
изображение: "u-boot image"
23296 0x5B00 LZMA компресирани данни, свойства: 0x5D, размер на речника:
8388608 байта, некомпресирани размер: 97476 байта
64968 0xFDC8 XML документ, версия: "1.0"
78448 0x13270 заглавка на uImage, размер на заглавката: 64 байта, заглавен CRC:
0x78A267FF, създадено: 2019-07-26 07:46:14, размер на изображението:
1088500 байта, Адрес на данни: 0x80060000, Точка на вход:
0x80060000, CRC на данни: 0xBB9D4F94, ОС: Linux, CPU: MIPS,
тип на изображението: Multi-File Image, тип на компресия: lzma,
име на изображение: "MIPS OpenWrt Linux-3.3.8"
78520 0x132B8 LZMA компресирани данни, свойства: 0x6D, размер на речника:
8388608 байта, некомпресирани размер: 3164228 байта
1167013 0x11CEA5 Squashfs файлова система, little endian, версия 4.0,
компресия:xz, размер: 14388306 байта, 2541 инодa,
размер на блока: 65536 байта, създадено: 2019-07-26 07:51:38
15555328 0xED5B00 gzip компресирани данни, от Unix, последна модификация: 2019-07-26
07:51:41Сега имаме много информация за това изображение.
Изображението използва като зареждач (заглавка на изображението на адрес 0x5AC0 и компресирано изображение на зареждача на адрес 0x5B00). На базата на заглавката uImage на адрес 0x13270 знаем, че архитектурата на процесора е MIPS, а ядрото на Linux е версия 3.3.8. И на базата на изображението, намерено на адрес 0x11CEA5, можем да видим, че да бъдат достъпни за запис, а освен това много популярни приложения, които стартират вградени системи, ще се опитат да създадат конфигурационни е файлова система squashfs.
Сега да разархивираме зареждача (U-Boot) с помощта на командата dd:
$ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162
41162+0 записи вход
41162+0 записи изход
41162 байта (41 kB, 40 KiB) копирани, 0,0939608 с, 438 kB/sТъй като изображението е компресирано с LZMA, трябва да го разархивираме:
$ unlzma u-boot.bin.lzmaСега имаме изображение на U-Boot:
$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 Фев 5 08:48 u-boot.binКакво ще кажеш да потърсим подразбиращата стойност за bootargs?
$ strings u-boot.bin | grep bootargs
bootargs
bootargs=console=ttyS0,115200 board=AP152 rootfstype=squashfs init=\/etc\/preinit mtdparts=spi0.0:128k(factory-uboot),192k(u-boot),64k(ART),1536k(uImage),14464k@0x1e0000(rootfs) mem=128Mпроменлива на средата U-Boot bootargs използва се за предаване на параметри на ядрото на Linux. И от информацията по-горе, по-добре разбираме флаш паметта на устройството.
Какво ще кажете за извличането на образа на ядрото на Linux?
$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 записи
1088572+0 изхода
1088572 байта (1,1 MB, 1,0 MiB) копирани, 1,68628 с, 646 kB/sМожем да проверим дали образът е успешно извлечен с командата file:
$ file uImage
uImage: u-boot legacy uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Multi-File Image (lzma), 1088500 байта, Пт Юли 26 07:46:14 2019, Адрес за зареждане: 0x80060000, Точка на вход: 0x80060000, Header CRC: 0x78A267FF, Data CRC: 0xBB9D4F94Форматът на файла uImage е основно образ на ядрото на Linux с допълнителен заглавен файл. Нека да премахнем този заглавен файл, за да получим окончателния образ на ядрото на Linux:
$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 записи
1088500+0 изхода
1088500 байта (1,1 MB, 1,0 MiB) копирани, 1,65603 с, 657 kB/sОбразът е компресиран, затова нека го разпрем:
$ unlzma Image.lzmaСега имаме образ на ядрото на Linux:
$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Фев 5 10:51 ImageКакво можем да направим с образа на ядрото? Можем, например, да извършим търсене по низове в образа и да намерим версията на ядрото на Linux и да разберем за околната среда, използвана за компилиране на ядрото:
$ strings Image | grep "Linux version"
Linux version 3.3.8 (leo@leo-MS-7529) (gcc версия 4.6.3 20120201 (предварителна версия) (Linaro GCC 4.6-2012.02) ) #1 Пн Май 20 18:53:02 CST 2019Въпреки че фърмуера е издаден миналата година (2019 г.), когато пиша тази статия, той използва стара версия на ядрото на Linux (3.3.8), издадена през 2012 г., компилирана с много стара версия на GCC (4.6) също от 2012 г.!
(прим. прев. все още доверявате ли се на вашите рутери в офиса и у дома?)
С опцията --opcodes можем също да използваме binwalk за търсене на машинни инструкции и определяне на архитектурата на процесора на образа:
$ binwalk --opcodes Image
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
2400 0x960 MIPS инструкции, функция epilogue
2572 0xA0C MIPS инструкции, функция epilogue
2828 0xB0C MIPS инструкции, функция epilogueКакво ще кажете за кореновата файловата система? Вместо да извличаме образа ръчно, нека да използваме опцията binwalk --extract:
$ binwalk --extract --quiet archer-c7.binЦялата коренова файловата система ще бъде извлечена в подкаталог:
$ cd _archer-c7.bin.extracted/squashfs-root/
$ ls
bin dev etc lib mnt overlay proc rom root sbin sys tmp usr var www
$ cat etc/banner
MM NM MMMMMMM M M
$MMMMM MMMMM MMMMMMMMMMM MMM MMM
MMMMMMMM MM MMMMM. MMMMM:MMMMMM: MMMM MMMMM
MMMM= MMMMMM MMM MMMM MMMMM MMMM MMMMMM MMMM MMMMM'
MMMM= MMMMM MMMM MM MMMMM MMMM MMMM MMMMNMMMMM
MMMM= MMMM MMMMM MMMMM MMMM MMMM MMMMMMMM
MMMM= MMMM MMMMMM MMMMM MMMM MMMM MMMMMMMMM
MMMM= MMMM MMMMM, NMMMMMMMM MMMM MMMM MMMMMMMMMMM
MMMM= MMMM MMMMMM MMMMMMMM MMMM MMMM MMMM MMMMMM
MMMM= MMMM MM MMMM MMMM MMMM MMMM MMMM MMMM
MMMM$ ,MMMMM MMMMM MMMM MMM MMMM MMMMM MMMM MMMM
MMMMMMM: MMMMMMM M MMMMMMMMMMMM MMMMMMM MMMMMMM
MMMMMM MMMMN M MMMMMMMMM MMMM MMMM
MMMM M MMMMMMM M M
M
---------------------------------------------------------------
За тези, които ще рококуват... (%C, %R)
---------------------------------------------------------------Сега можем да направим много различни неща.
Можем да търсим конфигурационни файлове, хешове на пароли, криптографски ключове и цифрови сертификати. Можем да анализираме бинарни файлове за и уязвимости.
С помощта на и Можем дори да стартираме (емулираме) изпълним файл от образа:
$ ls
bin dev etc lib mnt overlay proc rom root sbin sys tmp usr var www
$ cp /usr/bin/qemu-mips-static .
$ sudo chroot . ./qemu-mips-static bin/busybox
BusyBox v1.19.4 (2019-05-20 18:13:49 CST) многофункционален бинарен файл.
Авторски права (C) 1998-2011 Erik Andersen, Rob Landley, Денис Власенко
и други. Лицензиран под GPLv2.
Вижте разпространението на изходния код за целия нотис.
Използване: busybox [функция] [аргументи]...
или: busybox --list[-full]
или: функция [аргументи]...
BusyBox е многофункционален бинарен файл, който комбинира много общи Unix
утилити в един изпълним файл. Повечето хора ще създадат линк към busybox за всяка функция, която искат да използват, и BusyBox
ще действа като каквото и да е, с което е извикано.
В момента определени функции:
[, [[, addgroup, adduser, arping, ash, awk, basename, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd, delgroup, deluser, dirname, dmesg, echo, egrep, env, expr, false,
fgrep, find, free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid, id, ifconfig, init, insmod, kill, killall, klogd, ln, lock, logger, ls, lsmod, mac_addr, md5sum, mkdir, mkfifo, mknod, mktemp,
mount, mv, nice, passwd, pgrep, pidof, ping, ping6, pivot_root, poweroff, printf, ps, pwd, readlink, reboot, reset, rm, rmdir, rmmod, route, sed, seq, sh, sleep, sort, start-stop-daemon, strings,
switch_root, sync, sysctl, tail, tar, tee, telnet, test, tftp, time, top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, which, xargs, yes, zcatСупер! Но имайте предвид, че версия на BusyBox е 1.19.4. Това е много стара версия на BusyBox, пусната през април 2012 година.
Така TP-Link пуска образ на фърмуера през 2019 година, използвайки софтуер (GCC инструменти, ядро, BusyBox и т.н.) от 2012 година!
Сега разбирате защо винаги инсталирам OpenWRT на моите рутери?
Това още не е всичко
Binwalk също така може да извършва ентропийен анализ, да печата необработени ентропийни данни и да генерира ентропийни графики. Обикновено голяма ентропия се наблюдава, когато байтовете в образа са случайни. Това може да означава, че образът съдържа криптиран, компресиран или объркан файл. Наистина ли е написан на твърдо ключ за шифроване? Защо не.

Можем също да използваме параметъра --raw за търсене на потребителска последователност от необработени байтове в образа или параметъра --hexdump за извършване на хексадецимален дъмп, който сравнява два или повече входни файла.
могат да бъдат добавени в binwalk или чрез файл с персонализирани подписи, посочен в командния ред с параметъра --magic, или чрез добавянето им в директорията $ HOME / .config / binwalk / magic.
Можете да намерите повече информация за binwalk в .
Разширението binwalk
Съществува binwalk, реализиран като Python модул, който може да се използва от всеки Python скрипт за програмирано изпълнение на binwalk сканиране, а командният инструмент binwalk може да бъде почти напълно дублиран само с две реда Python код!
import binwalk
binwalk.scan()С помощта на Python API можете също да създавате за настройка и разширение на binwalk.
Съществува също и облачна версия .
Така че защо да не изтеглите образ на фърмуер от Интернет и да изпробвате binwalk? Обещавам, ще се забавлявате много 🙂
Източник: habr.com
