Needle wspomaga analizę bezpieczeństwa aplikacji na platformie iOS. Składa się z modułów, które korzystają z wielu dostępnych na tej platformie narzędzi, znacznie upraszczając pracę z nimi. Został stworzony przez MWRLabs, czyli twórców popularnego w androidowym środowisku Drozera. Podobnie jak Drozer, działa w architekturze klient - serwer. Uruchamiany na komputerze klient przesyła polecenia do serwera działającego na urządzeniu mobilnym.
Zapoznamy się z procesem instalacji i konfiguracji oraz obsługą na przykładzie kilku modułów.
Opis został przygotowany używając urządzenia z iOS 10. Część modułów może zachowywać się niepoprawnie lub nie działać na poszczególnych wersjach systemu.
Instalacja na urządzeniu
Wymagane są:
urządzenie z iOS (8, 9 lub 10) po jailbreaku,
Cydia,
APT 0.7 Strict,
Needle Agent - serwer.
Opcjonalne zależności:
Frida - narzędzie do dynamicznego modyfikowania uruchomionych aplikacji, wykorzystywane przez niektóre moduły Needle.
Clutch2 - narzędzie do deszyfrowania plików binarnych aplikacji, wykorzystywane przez jeden z modułów.
Needle oficjalnie ma wsparcie dla dwóch systemów - macOS i Kali Linux. Bez problemów można uruchomić narzędzie również na Ubuntu.
Instalacja zależności
Kali Linux
macOS
Instalacja Needle
Pobieramy projekt z GitHuba:
lub
Uruchomienie i konfiguracja
Uruchomienie serwera
Włączamy aplikację NeedleAgent na urządzeniu i aktywujemy przełącznik Listen.
Uruchomienie klienta
Klienta uruchamiamy na komputerze za pomocą polecenia:
Konfiguracja
Po uruchomieniu konieczne jest skonfigurowanie komunikacji między komputerem a urządzeniem. W opisywanym przypadku odbywała się ona za pośrednictwem Wi-Fi, jednak istnieje też możliwość komunikacji przez USB.
IP urządzenia (lub localhost dla połączenia USB):
Port urządzenia, na którym uruchomiona jest usługa SSH:
Hasło do konta root na urządzeniu. (Domyśle to alpine):
Dodatkowo można jeszcze wyłączyć wyświetlanie w narzędziu aplikacji systemowych, co ułatwia wyszukiwanie zainstalowanych aplikacji.
Konfiguracja z pliku
Konfigurowanie Needle jest konieczne przy każdym uruchomieniu. Możemy to sobie ułatwić tworząc plik, który zawiera wybrane polecenia.
Dodatkowy parametr -r, przy uruchamianiu Needle sprawi, że konfiguracja zostanie wczytana z pliku.
W akcji
Po instalacji i konfiguracji, mając przed sobą ekran główny Needle, możemy zająć się analizą zainstalowanych aplikacji.
Polecenia
show modules - wyświetla moduły
use <moduł> - wybiera moduł
show info - wyświetla informacje o wybranym module
show options - wyświetla ustawienia wybranego modułu
set <zmienna> <wartość> - przypisuje wartość do zmiennej
back - cofa wybór modułu
unset app - cofa wybór aplikacji
exec_command <polecenie> - wykonuje polecenie na urządzeniu
run - uruchamia wybrany moduł
Wybór aplikacji
Aplikację wybieramy podczas pierwszego uruchomienia modułu lub po wywołaniu unset app.
Moduły
Metadata
Moduł binary/info/metadata wyświetla szczegółowe informacje na temat aplikacji. Do dalszej analizy przydatne są:
data directory - katalog z danymi aplikacji,
binary directory - katalog z plikami binarnymi aplikacji,
URL Handlers - schematy URL używane przez aplikację,
dane aplikacji znajdują się w /private/var/mobile/Containers/Data/Application/09ACB084-A5A6-45F2-B421-5AF4BE3A1E0B,
pliki binarne znajdują się w /private/var/containers/Bundle/Application/9CE2809B-AD4F-4FBF-AB18-198062E39903/DamnVulnerableIOSApp.app,
Aplikacja posiada swój schemat URL dvia,
Aplikacja zezwala na komunikację protokołem HTTP.
Keyboard autocomplete
iOS posiada mechanizm autokorekty, który przechowuje słowa wpisywane na klawiaturze. Aplikacje powinny wyłączać autokorektę dla pól z wrażliwymi danymi. Moduł storage/caching/keyboard_autocomplete pozwala to zweryfikować poprzez wyświetlenie wszystkich zapamiętanych wyrazów.
Property list
Format plist służy do przechowywania informacja w formie klucz - wartość. Zapisywane w nim są m.in. informacje o aplikacji oraz ustawienia użytkowników. Moduł storage/data/files_plist wyszukuje wszystkie pliki plist powiązane z aplikacją i umożliwia wyświetlanie ich zawartości.
Strings
Znajomość stringów znajdujących się w pliku binarnym aplikacji znacznie ułatwia analizę. Wśród nich można znaleźć np. informacje o ukrytych opcjach aplikacji albo wykorzystywanych zewnętrznych usługach sieciowych, czasem łącznie z zaszytymi w kodzie hasłami. Aplikacje pobrane z AppStore są zaszyfrowane, dlatego przed przeszukaniem pliku konieczne jest odszyfrowanie go. Moduł binary/reversing/strings automatyzuje ten proces z wykorzystaniem narzędzia Clutch2.
Uruchomienie tego modułu może okazać się problematyczne w porównaniu do pozostałych.
Przy pierwszej próbie uruchomienia dowiadujemy się, że moduł ten nie jest wspierany na obecnej wersji systemu (iOS 10). Można jednak spróbować wykonać drobną modyfikację w kodzie Needle.
Otwieramy plik needle/core/utils/contants.py
i komentujemy w nim linię jak poniżej. Sprawi to, że Needle nie będzie blokował modułu w iOS 10.
Restartujemy Needle (mając przygotowany plik konfiguracyjny warto pamiętać o -r). Przy kolejnej próbie odpalenia modułu dowiadujemy się, że nie mamy uprawnień do uruchomienia Clutch2.
Rozwiązujemy to nadając prawa do wykonywania.
Ostatecznie moduł udaje się uruchomić.
Class Dump
Nagłówki klas aplikacji są kolejnym cennym źródłem informacji. Pozwalają w prosty sposób zapoznać się ze strukturą aplikacji. Moduł binary/reversing/class_dump_frida_enum-all-methods wykorzystuje narzędzie Frida do odczytania nazw klas i metod w wybranej aplikacji.
Przed pierwszym uruchomieniem modułu należy uruchomić serwer Fridy.
Pozostałe moduły
Needle jest pełen modułów, inne warte sprawdzenia to:
binary/info/checksums - Oblicza sumy kontrolne dla pliku binarnego.
binary/info/compilation_checks - Sprawdza czy plik binarny posiada odpowiednie zabezpieczenia (szyfrowanie, stack canaries, ARC, PIE).
binary/info/universal_links - Wyświetla Universal Links zdefiniowane dla aplikacji.
dynamic/ipc/open_uri - uruchamia podany URI.
static/code_checks - Analizuje kod źródłowy (jeśli jest dostępny) pod kątem podatności.
storage/backup/icloud_content_frida - Wyświetla listę plików, które trafiają do kopii zapasowych.
storage/data/container - Wyświetla i pobiera zawartość katalogów Bundle i Data.
storage/data/files_binarycookies - Wyświetla Binary Cookies używane przez aplikację.
storage/data/files_cachedb - Wyświetla pliki tymczasowe Cache.db.
storage/data/files_sql - Wyświetla pliki zawierające bazy danych.
storage/data/keychain_dump_frida - Wyciąga zawartość Keychain, która należy do aplikacji.