Skip to content

Die SecureApp ist eine Android-Applikation, welche auf Basis meiner Bachelorarbeit entwickelt wurde. Diese implementiert technische Lösungen zu beliebten Schwachstellen in Android-Applikationen.

MaHo1194/secure_app

Repository files navigation

SecureApp

Demo-Applikation für Android für Pentester, Entwickler und jeden, der Interesse an Application-Security hat!


Die SecureApp ist auf Basis meiner Bachelorarbeit entstanden. In dieser wurden die wichtigsten Techniken zur Vermeidung von Sicherheitslücken in modernen Android-Apps untersucht und voneinander abgegrenzt.

Die Applikation beinhaltet technische Lösungen zu bestimmten Sicherheitslücken, bezogen auf die OWASP Mobile Top10 Risks.


Download der APK

https://github.com/MaHo1194/secure_app/releases/tag/v1.0

Backend

Der Quellcode des Backends kann hier eingesehen werden:

https://github.com/MaHo1194/secure_app_backend


Installation

Am besten lässt sich die SecureApp auf einem Android-Emulator ausführen, beispielsweise Genymotion: https://www.genymotion.com/


Anleitung zum Testen der einzelnen Schwachstellen

Lokale Datenspeicherung

Die SecureApp impelementiert die lokale Datenspeicherung, in Form der EncryptedSharedPreferences und einer SQLite-Datenbank, welche mit Hilfe von SQL-Cipher verschlüsselt wird.

EncryptedSharedPreferences

Die Speicherung in den EncryptedSharedPreferences lässt sich testen, indem im Eingabefenster ein beliebiger String übergeben wird. Dieser wird hier gespeichert: /data/data/shared_prefs/encrypted_shared_prefs.xml. Der String ist nicht im Klartext vorhanden, sondern wurde mit dem AES256-Algorithmus verschlüsselt. Zur Kontrolle wird der String im unteren Fenster ausgegeben.

Um die Datei zu öffnen, muss in der ADB-Shell folgender Befehl abgesetzt werden:

adb pull /data/data/com.example.secure_app/shared_prefs/encrypted_shared_prefs.xml <Zielpfad>

Anschließend kann die XML-Datei beispielsweise mit Notepad++ geöffnet werden.


Verschlüsselte SQLite-Datenbank

Bei der Erstbenutzung muss ein Passwort ausgewählt werden. Dieses wird lokal in den EncryptedSharedPreferneces gespeichert. Anschließend kann die Datenbank geöffnet werden. Diese Datenbank ermöglicht das Speichern von E-Mail-Adressen. Nachdem ein Passwort gesetzt und die Datenbank verlassen wurde, kann mit dem Passwort die Datenbank erneut geöffnet werden.

Um die Verschlüsselung der Datenbank zu testen, muss in der ADB-Shell folgender Befehl abgesetzt werden:

adb pull /data/data/databases/com.example.secure_app/encrypted_database.db <Zielpfad>

Anschließend kann die Datenbank mit dem DB-Browser und dem Passwort geöffnet werden.


Verschlüsselte Backend-Kommunikation

Das Backend stellt einen öffentlichen API-Endpunkt zur Verfügung, welcher die aktuelle Serverzeit übermittelt. Die Verschlüsselung geschieht hier über TLSv1.3. Einsehbar ist das ganze zum einen über die Burp-Suite oder auch Wireshark. Die Daten werden verschlüsselt übertragen.

Zum Testen mit Wireshark, den Filter auf

ip.addr == 193.174.71.211

setzen. Dies ist die IP-Adresse des Backends. Anschließend eine Anfrage an das Backend senden.

Danach ist in Wireshark eine Verschlüsselte Verbindung sichtbar.


Authentifizierung mit JWT

Neben dem öffentlichen API-Endpunkt, stellt das Backend auch einen privaten API-Endpunkt zur Verfügung. Dieser wird mit Hilfe von JSON Web Tokens abgesichert. Um das ganze zu testen, kann sich in der SecureApp registriert werden. Nach erfolgreicher Registrierung und erfolgreichem Login, kann nachfolgend auf den privaten API-Endpunkt zugegriffen werden und eine Hello World-Message sollte erscheinen.

Wird kein AccessToken im Header mitgeliefert, erscheint folgender Error.

Die SecureApp erhält seinen AccessToken von Auth0.com. Bevor die API aufgerufen werden kann, muss in der Applikation die Übergabe des Authorization Headers gewährleistet sein. Genutzt wird Volley. Dies geschieht wie folgt:

public Map<String, String> getHeaders() throws AuthFailureError {
  Map<String, String> headerMap = new HashMap<String, String>();
  headerMap.put("Content-Type", "application/json");
  headerMap.put("Authorization", "Bearer " + ACCESS_TOKEN);
  return headerMap;
 }

Client Side Injection / SQLite-Injection

Neben der verschlüsselten Datenbank, besitzt die SecureApp eine weitere Datenbank, welche speziell zum Testen von SQLite-Injections implementiert wurde. Diese ist unverschlüsselt, damit trotz SQLi-Gegenmaßnahmen die Datenbank eingesehen werden kann. Als Payloads können beispielsweise Folgende verwendet werden:

    - admin' or '1'='1
    - a'or'1'='1

Der Insert-Into-Befehl wurde wie folgt implementiert:

String SQL = "INSERT INTO sqliuser(user, password, phone_number) VALUES (?, ?, ?)";
mDB = openOrCreateDatabase("sqli", MODE_PRIVATE, null);
mDB.execSQL("DROP TABLE IF EXISTS sqliuser;");
mDB.execSQL("CREATE TABLE IF NOT EXISTS sqliuser(user VARCHAR, password VARCHAR, phone_number VARCHAR);");

SQLiteStatement statement = mDB.compileStatement(SQL);
statement.bindString(1, "admin");
statement.bindString(2, "passwd123");
statement.bindString(3, "0123456789");
statement.executeInsert();

Der Select-Befehl so:

String SQL = "select * from sqliuser where user = ?";

Cursor cursor = mDB.rawQuery(SQL, new String[]{srchtxt.getText().toString()});
StringBuilder strb = new StringBuilder("");

Dadurch werden Eingaben in das Suchfeld direkt als Parameter geparst.

About

Die SecureApp ist eine Android-Applikation, welche auf Basis meiner Bachelorarbeit entwickelt wurde. Diese implementiert technische Lösungen zu beliebten Schwachstellen in Android-Applikationen.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published