# Objection Tutorial {{#include ../../../banners/hacktricks-training.md}} ## **Wprowadzenie** **objection - Eksploracja mobilna w czasie rzeczywistym** [**Objection**](https://github.com/sensepost/objection) to zestaw narzędzi do eksploracji mobilnej w czasie rzeczywistym, oparty na [Frida](https://www.frida.re). Został stworzony w celu pomocy w ocenie aplikacji mobilnych i ich bezpieczeństwa bez potrzeby posiadania urządzenia mobilnego z jailbreakiem lub roota. **Uwaga:** To nie jest forma obejścia jailbreaka / roota. Używając `objection`, nadal jesteś ograniczony przez wszystkie restrykcje nałożone przez odpowiedni sandbox, z którym się zmagasz. ### Podsumowanie **Celem** **objection** jest umożliwienie użytkownikowi wywoływania **głównych akcji, które oferuje Frida**. **W przeciwnym razie**, użytkownik będzie musiał stworzyć **pojedynczy skrypt dla każdej aplikacji**, którą chce przetestować. ## Tutorial W tym tutorialu użyję pliku APK, który możesz pobrać tutaj: {{#file}} app-release.zip {{#endfile}} Lub z jego [oryginalnego repozytorium](https://github.com/asvid/FridaApp) (pobierz app-release.apk) ### Instalacja ```bash pip3 install objection ``` ### Połączenie Zrób **zwykłe połączenie ADB** i **uruchom** serwer **frida** na urządzeniu (i sprawdź, czy frida działa zarówno na kliencie, jak i na serwerze). Jeśli używasz **urządzenia z rootem**, musisz wybrać aplikację, którą chcesz przetestować w opcji _**--gadget**_. w tym przypadku: ```bash frida-ps -Uai objection --gadget asvid.github.io.fridaapp explore ``` ### Podstawowe działania Nie wszystkie możliwe polecenia objections będą wymienione w tym samouczku, tylko te, które uznałem za bardziej przydatne. #### Środowisko Niektóre interesujące informacje (takie jak hasła lub ścieżki) można znaleźć w środowisku. ```bash env ``` ![](<../../../images/image (220).png>) #### Informacje o Frida ```bash frida ``` ![](<../../../images/image (1093).png>) #### Przesyłanie/Pobieranie ```bash file download [] file upload [] ``` #### Importuj skrypt frida ```bash import ``` #### SSLPinning ```bash android sslpinning disable #Attempts to disable SSL Pinning on Android devices. ``` #### Wykrywanie roota ```bash android root disable #Attempts to disable root detection on Android devices. android root simulate #Attempts to simulate a rooted Android environment. ``` #### Wykonaj polecenie ```bash android shell_exec whoami ``` #### Zrzuty ekranu ```bash android ui screenshot /tmp/screenshot android ui FLAG_SECURE false #This may enable you to take screenshots using the hardware keys ``` ### Analiza statyczna staje się dynamiczna W rzeczywistej aplikacji powinniśmy znać wszystkie informacje odkryte w tej części przed użyciem objection dzięki **analizie statycznej**. Tak czy inaczej, w ten sposób być może zobaczysz **coś nowego**, ponieważ tutaj będziesz miał tylko pełną listę klas, metod i eksportowanych obiektów. To jest również przydatne, jeśli w jakiś sposób jesteś **niezdolny do uzyskania czytelnego kodu źródłowego** aplikacji. #### Lista aktywności, odbiorników i usług ```bash android hooking list activities ``` ![](<../../../images/image (1016).png>) ```bash android hooking list services android hooking list receivers ``` Frida zgłosi błąd, jeśli żaden nie zostanie znaleziony #### Uzyskiwanie bieżącej aktywności ```bash android hooking get current_activity ``` ![](<../../../images/image (813).png>) #### Wyszukiwanie klas Zacznijmy szukać klas w naszej aplikacji ```bash android hooking search classes asvid.github.io.fridaapp ``` ![](<../../../images/image (507).png>) #### Metody wyszukiwania klasy Teraz wyodrębnijmy metody wewnątrz klasy _MainActivity:_ ```bash android hooking search methods asvid.github.io.fridaapp MainActivity ``` ![](<../../../images/image (929).png>) #### Lista zadeklarowanych metod klasy z ich parametrami Zobaczmy, jakie parametry są potrzebne metodom klasy: ```bash android hooking list class_methods asvid.github.io.fridaapp.MainActivity ``` ![](<../../../images/image (299).png>) #### Lista klas Możesz również wylistować wszystkie klasy, które zostały załadowane w bieżącej aplikacji: ```bash android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes. ``` To bardzo przydatne, jeśli chcesz **podpiąć metodę klasy i znasz tylko nazwę klasy**. Możesz użyć tej funkcji, aby **wyszukać, który moduł jest właścicielem klasy** i następnie podpiąć jej metodę. ### Łatwe podpinanie #### Podpinanie (obserwowanie) metody Z [kodu źródłowego](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) aplikacji wiemy, że **funkcja** _**sum()**_ **z** _**MainActivity**_ jest uruchamiana **co sekundę**. Spróbujmy **zrzucić wszystkie możliwe informacje** za każdym razem, gdy funkcja jest wywoływana (argumenty, wartość zwracana i backtrace): ```bash android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return ``` ![](<../../../images/image (1086).png>) #### Hooking (watching) an entire class Właściwie uważam, że wszystkie metody klasy MainActivity są naprawdę interesujące, więc **podłączmy je wszystkie**. Bądź ostrożny, to może **spowodować awarię** aplikacji. ```bash android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return ``` Jeśli będziesz bawić się aplikacją, gdy klasa jest podłączona, zobaczysz, kiedy **każda funkcja jest wywoływana**, jej **argumenty** oraz **wartość zwracaną**. ![](<../../../images/image (861).png>) #### Zmiana wartości zwracanej typu boolean funkcji Z kodu źródłowego możesz zobaczyć, że funkcja _checkPin_ przyjmuje _String_ jako argument i zwraca _boolean_. Zmieńmy funkcję, aby **zawsze zwracała true**: ![](<../../../images/image (883).png>) Teraz, jeśli wpiszesz cokolwiek w polu tekstowym dla kodu PIN, zobaczysz, że cokolwiek jest ważne: ![](<../../../images/image (228).png>) ### Instancje klas Szukaj i drukuj **aktywne instancje konkretnej klasy Java**, określonej przez w pełni kwalifikowaną nazwę klasy. Oto wynik próby uzyskania wartości string dla odkrytej objection, która zazwyczaj **zawiera wartości właściwości dla obiektu**. ``` android heap print_instances ``` ![](<../../../images/image (1095).png>) ### Keystore/Intents Możesz bawić się keystore i intencjami używając: ```bash android keystore list android intents launch_activity android intent launch_service ``` ### Pamięć #### Zrzut ```bash memory dump all #Dump all memory memory dump from_base #Dump a part ``` #### Lista ```bash memory list modules ``` ![](<../../../images/image (286).png>) Na dole listy możesz zobaczyć frida: ![](<../../../images/image (1097).png>) Sprawdźmy, co frida eksportuje: ![](<../../../images/image (298).png>) #### Szukaj/Pisz Możesz również szukać i pisać w pamięci za pomocą objection: ```bash memory search "" (--string) (--offsets-only) memory write "
" "" (--string) ``` ### SQLite Możesz użyć polecenia `sqlite`, aby interagować z bazami danych sqlite. ### Exit ```bash exit ``` ## Czego mi brakuje w Objection - Metody hookujące czasami powodują awarię aplikacji (to również z powodu Frida). - Nie możesz używać instancji klas do wywoływania funkcji instancji. I nie możesz tworzyć nowych instancji klas i używać ich do wywoływania funkcji. - Nie ma skrótu (jak ten dla sslpinnin), aby hookować wszystkie powszechnie używane metody kryptograficzne w aplikacji, aby zobaczyć tekst zaszyfrowany, tekst jawny, klucze, IV i używane algorytmy. {{#include ../../../banners/hacktricks-training.md}}