Реверс-инженеринг на домашен рутер с помощта на binwalk. Доверявате ли се на софтуера на вашия рутер?

Реверс-инженеринг на домашен рутер с помощта на binwalk. Доверявате ли се на софтуера на вашия рутер?

Преди няколко дни реших да направя реверс-инжиниринг на фърмуера на рутера си, използвайки binwalk.

Купих си TP-Link Archer C7 домашен рутер. Не е най-добрият рутер, но за моите нужди е абсолютно достатъчен.

Всеки път, когато купувам нов рутер, инсталирам OpenWRT. Защо? Обикновено производителите не се грижат особено за поддръжката на рутерите си и с времето софтуерът остарява, появяват се уязвимости и така нататък, общо взето, разбрали сте. Затова предпочитам добре поддържаната от общността open-source фърмуер OpenWRT.

След като изтеглих OpenWRT, аз също изтеглих последния образ на фърмуера за новия ми Archer C7 от официалния сайт и реших да го анализирам. Чисто за забавление и да разкажа за binwalk.

Какво е 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=           Активира статуса на сървъра на зададения порт

Сканиране на изображения

Започваме с търсене на файлови сигнатури в изображението (изображение от сайта TP-Link).

Стартиране на 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

Сега имаме много информация за това изображение.

Изображението използва U-Boot като зареждач (заглавка на изображението на адрес 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)
 ---------------------------------------------------------------

Сега можем да направим много различни неща.

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

С помощта на qemu и chroot Можем дори да стартираме (емулираме) изпълним файл от образа:

$ 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 също така може да извършва ентропийен анализ, да печата необработени ентропийни данни и да генерира ентропийни графики. Обикновено голяма ентропия се наблюдава, когато байтовете в образа са случайни. Това може да означава, че образът съдържа криптиран, компресиран или объркан файл. Наистина ли е написан на твърдо ключ за шифроване? Защо не.

Реверс-инженеринг на домашен рутер с помощта на binwalk. Доверявате ли се на софтуера на вашия рутер?

Можем също да използваме параметъра --raw за търсене на потребителска последователност от необработени байтове в образа или параметъра --hexdump за извършване на хексадецимален дъмп, който сравнява два или повече входни файла.

Потребителските подписи могат да бъдат добавени в binwalk или чрез файл с персонализирани подписи, посочен в командния ред с параметъра --magic, или чрез добавянето им в директорията $ HOME / .config / binwalk / magic.

Можете да намерите повече информация за binwalk в официалната документация.

Разширението binwalk

Съществува API интерфейс binwalk, реализиран като Python модул, който може да се използва от всеки Python скрипт за програмирано изпълнение на binwalk сканиране, а командният инструмент binwalk може да бъде почти напълно дублиран само с две реда Python код!

import binwalk
binwalk.scan()

С помощта на Python API можете също да създавате плагини на Python за настройка и разширение на binwalk.

Съществува също плъгин IDA и облачна версия Binwalk Pro.

Така че защо да не изтеглите образ на фърмуер от Интернет и да изпробвате binwalk? Обещавам, ще се забавлявате много 🙂

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster