Firmware Analysis
Last updated
Last updated
Dowiedz się i ćwicz hakowanie AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz hakowanie GCP: HackTricks Training GCP Red Team Expert (GRTE)
Oprogramowanie układowe to istotne oprogramowanie umożliwiające urządzeniom poprawne działanie poprzez zarządzanie i ułatwianie komunikacji między podzespołami sprzętu a oprogramowaniem, z którym użytkownicy wchodzą w interakcje. Jest przechowywane w pamięci stałej, zapewniając urządzeniu dostęp do istotnych instrukcji od momentu włączenia zasilania, co prowadzi do uruchomienia systemu operacyjnego. Badanie i ewentualna modyfikacja oprogramowania układowego to kluczowy krok w identyfikowaniu podatności na ataki.
Zbieranie informacji to kluczowy początkowy krok w zrozumieniu budowy urządzenia i technologii, jakich używa. Proces ten polega na zbieraniu danych dotyczących:
Architektury CPU i systemu operacyjnego, który uruchamia
Szczegółów bootloadera
Układu sprzętowego i kart katalogowych
Metryk kodu źródłowego i lokalizacji źródeł
Zewnętrznych bibliotek i typów licencji
Historii aktualizacji i certyfikatów regulacyjnych
Diagramów architektonicznych i przepływów
Oceny bezpieczeństwa i zidentyfikowanych podatności
W tym celu narzędzia open-source intelligence (OSINT) są nieocenione, podobnie jak analiza dostępnych składników oprogramowania open-source za pomocą procesów ręcznych i zautomatyzowanych. Narzędzia takie jak Coverity Scan i Semmle’s LGTM oferują bezpłatną analizę statyczną, którą można wykorzystać do znalezienia potencjalnych problemów.
Pobranie oprogramowania układowego można podjąć na różne sposoby, z różnym stopniem skomplikowania:
Bezpośrednio od producenta (programistów, producentów)
Budując je z dostarczonych instrukcji
Pobierając z oficjalnych stron wsparcia
Wykorzystując zapytania Google dork do znalezienia hostowanych plików oprogramowania układowego
Bezpośredni dostęp do przechowywania w chmurze za pomocą narzędzi takich jak S3Scanner
Przechwytywanie aktualizacji za pomocą technik man-in-the-middle
Wyodrębnianie z urządzenia poprzez połączenia takie jak UART, JTAG lub PICit
Podglądanie żądań aktualizacji w komunikacji urządzenia
Identyfikowanie i korzystanie z wbudowanych punktów końcowych aktualizacji
Dumpowanie z bootloadera lub sieci
Usuwanie i odczytywanie chipa pamięci, gdy wszystko inne zawodzi, za pomocą odpowiednich narzędzi sprzętowych
Teraz, gdy masz oprogramowanie układowe, musisz wydobyć z niego informacje, aby wiedzieć, jak je przetwarzać. Różne narzędzia, których możesz użyć do tego:
Jeśli nie znajdziesz wiele za pomocą tych narzędzi, sprawdź entropię obrazu za pomocą binwalk -E <bin>
, jeśli entropia jest niska, to prawdopodobnie nie jest zaszyfrowany. Jeśli entropia jest wysoka, jest prawdopodobnie zaszyfrowany (lub skompresowany w jakiś sposób).
Ponadto, możesz użyć tych narzędzi do wyodrębnienia plików osadzonych w oprogramowaniu układowym:
Lub binvis.io (code) do inspekcji pliku.
Dzięki wcześniej wspomnianym narzędziom, takim jak binwalk -ev <bin>
, powinieneś być w stanie wyodrębnić system plików.
Binwalk zazwyczaj wyodrębnia go do folderu nazwanego zgodnie z typem systemu plików, który zazwyczaj jest jednym z następujących: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
Czasami binwalk nie będzie miał magicznego bajtu systemu plików w swoich sygnaturach. W takich przypadkach użyj binwalka, aby znaleźć przesunięcie systemu plików i wydobyć skompresowany system plików z pliku binarnego, a następnie ręcznie wyodrębnij system plików zgodnie z jego typem, korzystając z poniższych kroków.
Uruchom następujące polecenie dd, wycinając system plików Squashfs.
Alternatywnie można również uruchomić następujące polecenie.
$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs
Dla squashfs (użytego w powyższym przykładzie)
$ unsquashfs dir.squashfs
Pliki znajdą się w katalogu "squashfs-root
" po wykonaniu powyższych poleceń.
Pliki archiwum CPIO
$ cpio -ivd --no-absolute-filenames -F <bin>
Dla systemów plików jffs2
$ jefferson rootfsfile.jffs2
Dla systemów plików ubifs z pamięcią flash NAND
$ ubireader_extract_images -u UBI -s <start_offset> <bin>
$ ubidump.py <bin>
Po uzyskaniu firmware'u istotne jest jego szczegółowe przeanalizowanie w celu zrozumienia struktury oraz potencjalnych podatności. Proces ten polega na wykorzystaniu różnych narzędzi do analizy i wydobycia wartościowych danych z obrazu firmware'u.
Zestaw poleceń jest dostarczony do wstępnej inspekcji pliku binarnego (nazwanego <bin>
). Te polecenia pomagają zidentyfikować typy plików, wydobywać ciągi znaków, analizować dane binarne oraz zrozumieć szczegóły partycji i systemu plików:
Aby ocenić stan szyfrowania obrazu, entropia jest sprawdzana za pomocą binwalk -E <bin>
. Niska entropia sugeruje brak szyfrowania, podczas gdy wysoka entropia wskazuje na możliwe szyfrowanie lub kompresję.
Do wyodrębniania osadzonych plików, zaleca się korzystanie z narzędzi i zasobów takich jak dokumentacja file-data-carving-recovery-tools oraz binvis.io do inspekcji plików.
Za pomocą binwalk -ev <bin>
można zazwyczaj wyodrębnić system plików, często do katalogu nazwanego zgodnie z typem systemu plików (np. squashfs, ubifs). Jednak gdy binwalk nie rozpoznaje typu systemu plików z powodu braku magicznych bajtów, konieczne jest ręczne wyodrębnienie. Polega to na użyciu binwalk
do zlokalizowania przesunięcia systemu plików, a następnie polecenia dd
do wyodrębnienia systemu plików:
Po wyodrębnieniu systemu plików rozpoczyna się poszukiwanie luk w zabezpieczeniach. Uwaga jest skupiona na niezabezpieczonych demonach sieciowych, stałych poświadczeniach, punktach końcowych interfejsu API, funkcjach serwera aktualizacji, nie skompilowanym kodzie, skryptach uruchamiania oraz skompilowanych binariach do analizy offline.
Kluczowe lokalizacje i elementy do sprawdzenia obejmują:
etc/shadow i etc/passwd dla poświadczeń użytkowników
Certyfikaty SSL i klucze w etc/ssl
Pliki konfiguracyjne i skryptowe pod kątem potencjalnych podatności
Osadzone binaria do dalszej analizy
Powszechne serwery WWW urządzeń IoT i binaria
Kilka narzędzi pomaga w odkrywaniu poufnych informacji i podatności w systemie plików:
LinPEAS i Firmwalker do wyszukiwania poufnych informacji
The Firmware Analysis and Comparison Tool (FACT) do kompleksowej analizy oprogramowania układowego
FwAnalyzer, ByteSweep, ByteSweep-go i EMBA do analizy statycznej i dynamicznej
Zarówno kod źródłowy, jak i skompilowane binaria znalezione w systemie plików muszą być dokładnie przeanalizowane pod kątem podatności. Narzędzia takie jak checksec.sh dla binariów Unix oraz PESecurity dla binariów Windows pomagają zidentyfikować niezabezpieczone binaria, które mogą być wykorzystane.
Proces emulowania oprogramowania układowego umożliwia analizę dynamiczną działania urządzenia lub pojedynczego programu. To podejście może napotkać wyzwania z zależnościami sprzętowymi lub architektonicznymi, ale przeniesienie systemu plików głównego lub określonych binariów do urządzenia o pasującej architekturze i kolejności bajtów, takiego jak Raspberry Pi, lub do wirtualnej maszyny z gotowym oprogramowaniem, może ułatwić dalsze testowanie.
Przy badaniu pojedynczych programów istotne jest zidentyfikowanie kolejności bajtów programu oraz architektury CPU.
Aby emulować binaria z architekturą MIPS, można użyć polecenia:
I aby zainstalować niezbędne narzędzia do emulacji:
Dla binarnych plików ARM proces jest podobny, z użyciem emulatora qemu-arm
do emulacji.
Narzędzia takie jak Firmadyne, Firmware Analysis Toolkit i inne ułatwiają pełną emulację oprogramowania układowego, automatyzują proces i pomagają w dynamicznej analizie.
W tym etapie używane jest środowisko rzeczywiste lub zemulowane urządzenie do analizy. Istotne jest utrzymanie dostępu do powłoki systemu operacyjnego i systemu plików. Emulacja może nie doskonale odwzorowywać interakcji sprzętowych, co wymaga czasami ponownego uruchomienia emulacji. Analiza powinna ponownie przejrzeć system plików, wykorzystać wystawione strony internetowe i usługi sieciowe oraz zbadać podatności bootloadera. Testy integralności oprogramowania układowego są kluczowe dla identyfikacji potencjalnych podatności na tylne drzwi.
Analiza w czasie rzeczywistym polega na interakcji z procesem lub plikiem binarnym w jego środowisku operacyjnym, z użyciem narzędzi takich jak gdb-multiarch, Frida i Ghidra do ustawiania punktów przerwania i identyfikowania podatności poprzez testowanie wydajności i inne techniki.
Opracowanie PoC dla zidentyfikowanych podatności wymaga głębokiego zrozumienia architektury docelowej i programowania w językach niskiego poziomu. Ochrony czasu wykonania binarnego w systemach wbudowanych są rzadkie, ale gdy występują, mogą być konieczne techniki takie jak Return Oriented Programming (ROP).
Systemy operacyjne takie jak AttifyOS i EmbedOS zapewniają prekonfigurowane środowiska do testów bezpieczeństwa oprogramowania układowego, wyposażone w niezbędne narzędzia.
AttifyOS: AttifyOS to dystrybucja przeznaczona do przeprowadzania oceny bezpieczeństwa i testów penetracyjnych urządzeń Internetu Rzeczy (IoT). Oszczędza czas, dostarczając prekonfigurowane środowisko z załadowanymi wszystkimi niezbędnymi narzędziami.
EmbedOS: System operacyjny do testów bezpieczeństwa wbudowany w Ubuntu 18.04, załadowany narzędziami do testowania bezpieczeństwa oprogramowania układowego.
Aby ćwiczyć odkrywanie podatności w oprogramowaniu układowym, użyj następujących projektów podatnego oprogramowania układowego jako punktu wyjścia.
OWASP IoTGoat
The Damn Vulnerable Router Firmware Project
Damn Vulnerable ARM Router (DVAR)
ARM-X
Azeria Labs VM 2.0
Damn Vulnerable IoT Device (DVID)