AndroidApp

Als je nieuwsgierig bent aangelegd, is het leuk om te weten wat een bepaalde apps op je Android device allemaal versturen en ophalen van het internet. In dit artikel vindt je alles om dat voor elkaar te krijgen.

In de tijd vóór Android 6, was het relatief makkelijk om app verkeer ‘af te luisteren’ en wel om 2 redenen: In het verleden werd vaak gewone, onversleutelde HTTP gebruikt in plaats van HTTPS. Als tweede hadden het apps die wel HTTPS gebruikte geen moeite met een willekeurige onvertrouwde CA.

HTTP in plaats van HTTPS

Veel apps communiceerde in het verleden zonder problemen onversleuteld, dus gewoon via clear text HTTP. Sinds de laatste versie van Android kan dit niet meer zomaar. Je kunt alleen nog ‘gewone’ clear text HTTP gebruiken als je de configuratieinstellingen aanpast in je app, Bij iOS was dat trouwens al langer het geval.

HTTPS met onvertrouwd Root-CA-certificaat

Tot en met Android 6 was het gemakkelijk om een Man-In-The-Middle in te zetten om mee te luisteren met het HTTPS verkeer van je mobiele device. Het komt er simpelweg op neer dat je al het verkeer van je smartphone via een door jezelf gecontroleerde proxy laat lopen. De proxy doet zich voor als de HTTPS server waar de app mee wil praten. Je kunt met zo’n proxy al het verkeer meelezen. De proxy geeft dit verkeer dan weer door aan de ‘echte’ webservice. De proxy presenteert zijn eigen SSL certificaat aan de app, gemaakt mijn zijn eigen onvertrouwde Root CA.  Dit was mogelijk omdat in de oudere Android versies elk Root CA certificaat werd geaccepteerd. Hieronder meer daarover.

>= Android 7 HTTPS

Om verkeer van apps mee te kunnen lezen op een modern Android OS, moet je met wat meer geschut inzetten. Wat is er dan veranderd in Android 7? De beveiliging is op verschillende manieren verbeterd, waaronder die voor SSL verbindingen.

Alleen vertrouwde Root CA’s

Vanaf deze versie controleert Android het root-CA certificaat waarmee het SSL certificaat is getekend. Android accepteert alleen vertrouwde Root-CA certificaten. Is het SSL certificaat van een HTTPS verbinding getekend met een onbekende CA, dan blokkeert het Android OS de verbinding.

De proxy heeft geen vertrouwd Root CA-certificaat

Een Man-In-The-Middle proxy levert SSL certificaat via zijn eigen, zelfgemaakt, Root CA-certificaat. Dit CA-certificaat wordt NIET vertrouwd. Dus, meelezen kan alleen, als je Android of de de app zover krijgt een willekeurig Root-CA certificaat te accepteren.

Kortom, de missie is dus om de app, waarvan we de communicatie mee willen lezen, zover te krijgen elke Root-CA te accepteren, dus ook die van onze proxy. Daarvoor moet de source code van de app worden aangepast. Hoe je dat doet lees je hieronder.

Het aanvalsplan

  1. App sources bemachtigen.
  2. App sources aanpassen.
  3. App signen en installeren
  4. Meeluisteren via proxy

1. App sources bemachtigen

Benodigde tools:

  • Chrome Browser
  • Chrome Extensie: APK Downloader

Om bij de source code van de app te komen moeten we eerst zorgen dat we het APK bestand te pakken krijgen. Dit is het uitvoerbare bestand dat Android gebruikt om een app te kunnen starten. Via de stappen hieronder kom je gemakkelijk aan de APK van de app die je op het oog hebt:

  1. Start je Chrome browser
  2. Installeer de APK Downloader extensie in Chrome
  3. Gaan naar de Google Play Store
  4. Zoek de app die je op het oog hebt voor je afluisterpraktijken.
  5. Klik op de app zodat de pagina met app details wordt geopend op de Google Play Store.
  6. Kopieer de url uit het browservenster.
  7. Open de APK Download extensie rechts boven in Chrome.
  8. Plak de url. (in mijn geval: https://play.google.com/store/apps/details?id=com.funda.two voor de Funda app).
  9. Klik op: “Generate Download Link”
  10. Klik daarna op: “Download APK”

Nadat je de APK hebt gedownload kunnen we aan de slag om bij de source code te komen.

Benodigde tools:

De source code verkrijgen van de app gaat als volgt:

  1. Download Apktool van deze site. Met deze tool kunnen we de zojuist gedownloade APK ‘uitpakken’.
  2. Volg de installatieinstructie op de website van Apktool.
  3. Nu voeren we de volgende code uit in de directory waar de APK staat: apktool d <Gedownloade APK> -f
  4. Het resultaat:
    apktool d <Gedownloade APK>.apk -f
    I: Using Apktool 2.4.1 on com.funda.two.apk
    I: Loading resource table...
    I: Decoding AndroidManifest.xml with resources...
    I: Loading resource table from file: C:\Users\ton.snoei\AppData\Local\apktool\framework\1.apk
    I: Regular manifest package...
    I: Decoding file-resources...
    I: Decoding values */* XMLs...
    I: Baksmaling classes.dex...
    I: Baksmaling classes2.dex...
    I: Baksmaling classes3.dex...
    I: Copying assets and libs...
    I: Copying unknown files...
    I: Copying original files...
    I: Copying META-INF/services directory
    Press any key to continue . . .
  5. In de folder is nu een directory aangemaakt met de inhoud van de APK.
  6. Je kunt nu ook de source code van de app bekijken. Als deze niet is ge-obfuscate is daar al best wat interessants terug te vinden. Voor ons doel is dit overigens niet belangrijk.

In de volgende paragraaf gaan we de source code aanpassen om te zorgen dat ‘custom’ CA certificaten worden geaccepteerd. Daarna bouwen we de APK opnieuw.

2. App sources aanpassen

We gaan nu de app aanpassen zodat custom certificaten worden geaccepteerd.

Tools:

Het aanpassen van de APK gaat alsvolgt:

  1. Open met Visual Studio Code de folder met de uitgepakte APK.
  2. Als het volgende bestand: res/xml/network_security_config.xml nog niet bestaat maak het dan aan.
  3. Maak dit bestand aan met de volgende inhoud of voeg toe:
  4. <network-security-config>
     ...
     <base-config>
       <trust-anchors>
         <certificates src="system" />
         <certificates src="user" />
       </trust-anchors>
     </base-config>
     ...
    </network-security-config>

    Hiermee geven we aan dat ook “user” SSL-certificaten moeten worden geaccepteerd. Dus certificaten die zijn getekend met een onvertrouwde CA.

  5. Voeg het attribute “android:networkSecurityConfig” aan het AndroidManifest.xml in de app sources.
  6. <application … android:networkSecurityConfig=”@xml/network_security_config”>

Alle aanpassingen zijn nu gedaan in de app.

3. App signen en installeren

Om te zorgen dat de app weer geïnstalleerd kan worden op een Android apparaat, moet de een nieuwe APK-bestand gemaakt worden. Daarna moet het APK-bestand worden getekend met een zelfgemaakt certificaat.

Benodigde tools:

  1. Een nieuwe APK bouwen met apktool:
    1. Open de directory waarin de app staat.
    2. Voer de volgende opdracht uit: apktool b -f
    3. In de /dist directory staat nu het nieuwe APK-bestand.
  2. Certificaat maken voor het tekenen van het APK-bestand.
    1. Voer het volgende commando uit keytool -genkey -v -keystore release-keystore.keystore -alias release_key -keyalg RSA -keysize 2048 -validity 9999. keytool is onderdeel van de JRE of JDK. Op Windows is deze terug te vinden onder c:\Program Files\Java\<JDK_of_JRE versie>\bin
    2. Voer willekeurige gegevens in op de vragen die voorbijkomen bij het maken van het certificaat.
    3. We hebben nu een bestand met de naam: release-keystore.keystore. Deze bevat het certificaat: release_key, waarmee een handtekening wordt gezet op het APK-bestand.
  3. De handtekening zetten.
    1. Voer het volgende commando uit: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore release-keystore.keystore <NAME>.apk release_key. Jarsigner is onderdeel van de JDK. Op Windows is deze terug te vinden onder c:\Program Files\Java\<JDK_versie>\bin
    2. Het APK-bestand is nu klaar. Voor de zekerheid controleer je de datum van het APK-bestand.
  4. Het APK-bestand installeren
      1. Start Android Studio.
      2. Open: Tools > AVD Manager
      3. Start 1 van de emulators in de lijst of maak een emulator aan.
      4. Als de emulator helemaal is opgestart kun je het APK-bestand vanaf de folder op je PC naar de emulator slepen.
      5. De APK wordt automatisch geïnstalleerd.
      6. Uiteraard kun je het APK-bestand ook op een fysieke smartphone installeren

4. Meeluisteren via proxy

In deze sectie gaan we actief meeluisteren naar de app die we zojuist hebben aangepast.

Benodigde tools:

We gebruiken Charles Proxy om mee te luisteren met het HTTP verkeer. We leggen hieronder uit welke stappen je moet nemen. Fiddler is trouwens ook een goed alternatief, die stappen beschrijven we hier niet. Al zal de procedure ongeveer dezelfde strekking hebben.

  1. Start Charles Proxy op.
  2. Open het menu: SSL Proxying > Install Charles Root Certificate on Mobile Device or Remote Browser.
  3. Ga nu op de Android emulator naar het settingsscherm.
  4. Kies “Network & Internet”
  5. Kies “Wi-Fi”
  6. Kies het actieve Wi-Fi. Voor de emulator is dat “AndroidWifi”.
  7. Druk op Edit.
  8. Druk op Advanced options.
  9. Kies als proxy: “Manual”
  10. Vul de gegevens in zoals Charles Proxy aangeeft.
  11. Open nu de browser op de emulator en ga naar http://chls.pro/ssl
  12. Download het bestand. Dit is het CA-certificaat van Charles Proxy.
  13. Geef het certificaat de naam “Charles”.
  14. Kies voor Credential Use: “VPN and Apps”.
  15. Start de app op de emulator
  16. Bekijk in Charles het netwerkverkeer.
  17. Vergeet niet de domains toe te voegen aan Charles Proxy die de app gebruikt om te communiceren. Anders zie alsnog alleen ge-encrypte berichten voorbijkomen. Dit doe je door de domains toe te voegen via Proxy > SSL Proxying Settings >. Wildcards zijn toegestaan zoals *.<domain.com>.

That’s it, het meeluisteren kan beginnen. Het lijkt een lang verhaal, maar als je dit een paar keer hebt gedaan is het prepareren van een app op deze manier een fluitje van een cent. Als app-maker, zie je hier dus ook dat alle verkeer tussen app en server kan worden afgeluisterd. Dit kan echter alleen als de afluisteraar controle heeft over het mobiele device dat hij wil afluisteren. In alle andere gevallen biedt SSL gewoon de gedegen beveiliging tegen afluisterpraktijken.

P.S. Certificate pinning

Het kan voorkomen dat het meeluisteren op deze manier toch niet lukt. Dit kan het geval zijn als de app gebruik maakt van certificate pinning. De app verwacht dan een specifieke vaste CA of een vast SSL certificaat. Dit is op een andere manier op te lossen maar dat valt buiten de scope van dit artikel.

Bonus: Source code lezen

Als je benieuwd bent naar de source code van een app, download dan ByteCode Viewer. Dit is een tool waarmee je APK-files kunt disassemblen. De code is niet meer compileerbaar, maar wel leesbaar. Het gebruik daarvan is zo simpel als opstarten en de APK in de UI slepen.