hacktricks/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md
2024-02-11 01:46:25 +00:00

6 KiB
Raw Blame History

Wykorzystywanie debugowalnej aplikacji

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Ominięcie sprawdzeń roota i debugowalności

Ta sekcja pochodzi z posta https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

Kroki do zrobienia aplikacji Android debugowalnej i ominięcia sprawdzeń

Ustawienie aplikacji jako debugowalnej

Zawartość oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

  1. Dekompilacja pliku APK:
  • Wykorzystaj narzędzie APK-GUI do dekompilacji pliku APK.
  • W pliku android-manifest wstaw android:debuggable=true, aby włączyć tryb debugowania.
  • Przebuduj, podpisz i zipalignuj zmodyfikowaną aplikację.
  1. Zainstaluj zmodyfikowaną aplikację:
  • Użyj polecenia: adb install <nazwa_aplikacji>.
  1. Pobierz nazwę pakietu:
  • Wykonaj polecenie adb shell pm list packages 3, aby wyświetlić listę aplikacji innych firm i znaleźć nazwę pakietu.
  1. Ustaw aplikację w trybie oczekiwania na połączenie debugera:
  • Polecenie: adb shell am setup-debug-app w <nazwa_pakietu>.
  • Uwaga: To polecenie musi być uruchamiane za każdym razem przed uruchomieniem aplikacji, aby zapewnić oczekiwanie na debugger.
  • Aby zachować trwałość, użyj adb shell am setup-debug-app w -persistent <nazwa_pakietu>.
  • Aby usunąć wszystkie flagi, użyj adb shell am clear-debug-app <nazwa_pakietu>.
  1. Przygotuj się do debugowania w Android Studio:
  • Przejdź w Android Studio do Plik -> Otwórz profil lub APK.
  • Otwórz przebudowany plik APK.
  1. Ustaw punkty przerwania w kluczowych plikach Java:
  • Umieść punkty przerwania w plikach MainActivity.java (szczególnie w metodzie onCreate), b.java i ContextWrapper.java.

Ominięcie sprawdzeń

Aplikacja w określonych momentach sprawdzi, czy jest debugowalna, a także sprawdzi, czy istnieją binarne wskazujące na zrootowane urządzenie. Debugger może być używany do modyfikowania informacji o aplikacji, odznaczania bitu debugowalności i zmiany nazw wyszukiwanych binarnych w celu ominięcia tych sprawdzeń.

Dla sprawdzenia debugowalności:

  1. Modyfikacja ustawień flag:
  • W sekcji zmiennych konsoli debugera przejdź do: this mLoadedAPK -> mApplicationInfo -> flags = 814267974.
  • Uwaga: Reprzezentacja binarna flags = 814267974 to 11000011100111011110, co oznacza, że "Flag_debuggable" jest aktywny.

https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png

Te kroki zapewniają, że aplikacja może być debugowana i że pewne sprawdzenia bezpieczeństwa mogą być ominięte przy użyciu debugera, ułatwiając bardziej szczegółową analizę lub modyfikację zachowania aplikacji.

Krok 2 polega na zmianie wartości flagi na 814267972, co jest reprezentowane binarnie jako 110000101101000000100010100.

Wykorzystanie podatności

Przedstawiono demonstrację z wykorzystaniem podatnej aplikacji zawierającej przycisk i pole tekstowe. Początkowo aplikacja wyświetla "Crack Me". Celem jest zmiana wiadomości z "Try Again" na "Hacked" w czasie rzeczywistym, bez modyfikowania kodu źródłowego.

Sprawdzanie podatności

  • Aplikacja została zdekompilowana przy użyciu apktool, aby uzyskać dostęp do pliku AndroidManifest.xml.
  • Obecność android_debuggable="true" w pliku AndroidManifest.xml wskazuje, że aplikacja jest debugowalna i podatna na wykorzystanie.
  • Warto zauważyć, że narzędzie apktool jest używane wyłącznie do sprawdzenia statusu debugowalności bez zmieniania jakiegokolwiek kodu.

Przygotowanie konfiguracji

  • Proces obejmował uruchomienie emulatora, zainstalowanie podatnej aplikacji i użycie adb jdwp, aby zidentyfikować porty Dalvik VM, które nasłuchują.
  • JDWP (Java Debug Wire Protocol) umożliwia debugowanie aplikacji działającej w maszynie wirtualnej poprzez udostępnienie unikalnego portu.
  • Przekierowanie portów było konieczne do zdalnego debugowania, a następnie dołączenie JDB do docelowej aplikacji.

Wstrzykiwanie kodu w czasie rzeczywistym

  • Wykorzystano punkty przerwania i kontrolowano przebieg aplikacji.
  • Używano poleceń takich jak classes i methods <nazwa_klasy>, aby poznać strukturę aplikacji.
  • Ustawiono punkt przerwania w metodzie onClick i kontrolowano jej wykonanie.
  • Wykorzystano polecenia locals, next i set, aby sprawdzić i zmodyfikować zmienne lokalne, szczególnie zmieniając wiadomość "Try Again" na "Hacked".
  • Zmodyfikowany kod został wykonany przy użyciu polecenia run, co skutkowało pomyślną zmianą wyniku aplikacji w czasie rzeczywistym.

Ten przykład pokazał, jak można manipulować zachowaniem