11-07-2014, 18:38
Introduktion til Android Hacking
I denne korte introduktion til Android hacking kigger vi på den basale opsætning til at få lidt mere styr på hvordan vi decompiler Android applikationer,
samt hvordan vi igennem en proxy kan opfange oplysninger om, hvad data applikationen sender videre til dennes tilknyttede backend server.
Krav
Android SDK + Eclipse ADT (Eclipse + Android Development Tool(kit) er kun hvis du ønsker at køre en emulator i stedet for en fysisk enhed,
samt hvis du ønsker at dykke lidt længere ned i Android programmering samt patching/cracking)
http://developer.android.com/sdk/index.html
Java JDK & JRE (JDK er den vigtige her, men JRE er brugbar til visse opgaver)
http://www.oracle.com/technetwork/java/j...index.html
Charles Proxy (Kan være hvilket som helst proxy tool du har erfaring med)
http://www.charlesproxy.com/
APKTool (Skal bruges til at decompile + recompile (Smali - Baksmali) dine APK filer)
https://mega.co.nz/#!10UHnAxC!zLg6ucEf43...YVOkd9rHy0
SignAPK (Eller jarsigner - Skal bruges til at signe APK filerne, så de kan installeres på Android styresystemet.
Langt de fleste enheder vil ikke installere applikationer Uden denne hersens underskift)
https://mega.co.nz/#!ZklzhYhZ!g0ZcCd1epr...At1nTWyJ7g
Dex2Jar (Konverterer .DEX filen der er pakket ind i .APK filen til .JAR.
https://mega.co.nz/#!Jh0AkayZ!hzmJx-gRpf...MylPdap-zA
Jd_Gui (Giver dig en pæn brugerflade til at læse .JAR filerne fra Dex2Jar)
http://jd.benow.ca/
Så Hvad Er En APK-Fil?
En APK er sådan set bare et pakkeformat ligesom RAR og ZIP. Du kan endda omdøbe din .APK til .ZIP og herved åbne og udpakke indholdet.
APK-formatet er bare hvad Google har valgt at kalde deres applikationers filtype, sådan at Android styresystemet kan genkende det.
Det er disse filer du downloader og installerer, når du henter en app i Google Play eller andre tredjeparts app butikker.
Hvis du har en Rooted Android enhed, kan disse filer kopieres som "backups" og smides over på computeren via ADB, Email, Dropbox osv.
Desuden kan du bruge online downloaders såsom http://download.freeapk.ru/en eller http://apkleecher.com/ til at hente filerne ned til nærmere undersøgelser.
Pas dog på med det, da mange af disse downloaders først lige smider spyware eller reklamer ind før gør dit download-link klar.
Mappestruktur
Lad os for en god ordens skyld lave en mappe på skrivebordet der hedder Android
Inde i den mappe udpakker vi følgende filer til deres egne mapper:
Desktop/Android/APKTool
Desktop/Android/SignAPK
Desktop/Android/Dex2Jar
Desktop/Android/Jd_Gui.exe (Ingen mappe, så bare smid i den i Android mappens rod)
Opsætning af Emulatoren
For at gøre det så let som muligt bruger vi Eclipse til åbne AVD (Android Virtual Device Manager).
Sørg for at Android SDK er installeret, samt at Eclipse er udpakket (Det er lige meget hvor).
1) Åbn Eclipse > Window > Preferences > Android og tjek om 'SDK location' passer til hvor du installerede/udpakkede Android SDK og tryk OK.
2) Gå til Window > Android SDK Manager Og installer alle de pakker den selv foreslår (Samt tjek at du har mindst én af de nyeste platforme - Android 4.3 osv - installeret - Dette kræver til tider Administrator rettigheder)
3) Gå til Window > Android Virtual Device Manager > Tryk på 'Create' og udfyld indstillingerne.
Disse indstillinger er ikke så vigtige lige nu, og kan hele tiden ændres. Har selv mange forskellige, men her er et eksempel:
Det kan være en fordel at hente Google API's i SDK Manager'en, da flere applikationer ellers vil fejle installationen grundet en 'manglende delt pakke'.
Tryk OK > Og start så emulatoren.
!! Der kan opstå tilfælde hvor vores ADT plugin ikke er installeret korrekt, i disse tilfælde gør følgende:
Gå til Help > Install New Software >
Tryk på Add >
Giv den et navn (ADT Plugin) >
Angiv en URL til plugin-filerne > https://dl-ssl.google.com/android/eclipse/
Og installer så Android Development Tools. Dette kan igen til tider kræve administrator rettigheder.
Installation af Applikationer til Emulatoren
Sørg for, at du har emulatoren åben og kørende.
Åbn CMD/Kommandovinduet og CD til mappen mappen hvor du installerede Android SD/platform-tools.
C:\Windows\System32> cd C:\sdk\platform-tools
ELLER gå til Android SDK mappen, Hold Shift-knappen nede og højreklik på platform-tools > "Åbn kommandovindue her".
I denne mappe gemmer adb.exe sig, og det er dette lille fikse program vi vil bruge til at installere applikationer og køre aktiviteter/services.
Som et eksempel vil jeg bruge Verisure's fjernstyrrings app til tyverisikring/overvægning.
Hvis vi går til https://play.google.com og søger efter denne applikation.
( https://play.google.com/store/apps/details?id=com.sdi.mobile.android.verisure )
kan vi se i adressebaren, at pakkenavnet er: 'com.sdi.mobile.android.verisure'
Her kan vi så gå videre til http://download.freeapk.ru og skrive pakkenavnet/adressen og downloade .APK-filen hurtigt og uden problemer, i stedet for at hente den ned på vores enhed, installere, tage backup og overføre filen til vores computer.
Gem .apk-filen Android mappen.
For at installere denne app skriver vi blot
Dette bliver således til:
Nu er applikationen så installeret på emulatoren, og kan findes inde i Apps menuen.
!! I tilfælde af at adb ikke kan finde din emulator enhed kan det til tider hjælpe at forwarde:
Opsætning af Charles Proxy
Installér Charles Proxy (Dette er kun en trial, så den låser op nogle sekunder engang imellem, og kan kun køre i 30 minutter før det lukker ned. Kan dog åbnes igen med det samme)
Gå til Proxy > Proxy Settings og tjek portnummeret (Højst sansynligt 8888)
Under fanen Proxies skal du lige tjekke om der er flueben i 'Enable transparent HTTP proxying'.
Under fanen SSL skal du lige tjekke om der er flueben i 'Enable SSL proxying'.
Hvis den her kræver en opsætning under 'locations', så tryk add og OK med tomme værdier.
Find din netværks-IP (Ikke din eksterne IP, men din interne IP routeren bruger til at finde dig på netværket)
Dette kan gøres på flere forskellige måder, men den letteste er IMO at skrive ipconfig i kommandovinduet, og kigge under IPv4:
Lad os vende tilbage til Android emulatoren for at opsætte Charles.
Først hopper vi lige ind i Androids browser nede i højre hjørne (Blå planet-tingy).
Gå til http://charlesproxy.com/charles.crt > Giv certifikatet et navn og tryk OK for at installere det. (Dette skal bruges til at opsnappe SSL trafik)
Der er forskelle i brugerfladen på forskellige Android versioner, men i min (4.4.2) er det således:
Gå til Settings (Tryk på Menu knappen, eller find den inde i Apps menuen)
Under Wireless & Networks tryk på More...
Tryk på Mobile Networks > Access Point Names
Tryk på den APN der allerede er i brug (T-Mobile US hos mig)
Tryk på Proxy, og indsæt den IP vi fandt før (192.168.1.105)
Tryk på Port og indsæt porten fra Charles (8888)
Disse indstillinger vil muligvis kræve et kodeord (Dette kodeord/PIN vil også blive krævet til at logge ind næste gang du starter emulatoren, så ingen grund til at gå i panik hvis den lige pludselig kræver Pinkode næste gang)
I øverst højre hjørne - Udfra 'Edit access point' er der 3 vertikale firkanter, tryk på disse og vælg 'Save'
Nu vil netværksaktiviteten fra din Android emulator automatisk blive kørt igennem Charles - Det samme vil din browseraktivitet i Windows dog også - For at undgå dette kan du trykke på Proxy > Og fjerne fluebenet i 'Windows Proxy'.
Decompile Android Applikationer
Ved Hjælp af APKTool
Åbn et kommandovindue i APKTool mappen (cd C:/... eller højreklik > Åbn ko..) og skriv følgende:
apktool d(står for decompile) <apkfilen> <mappenavn på de decompilede smali filer>
Altså noget i stil med dette:
Nu har vi så de decompilede .smali filer i 'verisuredecom' mappen, som kan ændres/pacthes/crackes og recompiles.
At patche diverse dele af koden er ikke noget jeg synes vi skal begive os ud i, da dette kun er en simpel introduktion
(Og smali er pænt svært at forstå hvis man bare lige hopper ud i det - det er simpelthen alt for let at ødelægge det bare ved at fjerne en enkelt funktion/variabel, og glemme at starten af funktionen så smali er klar over der er den satan mindre)
Lad os i stedet tage et kig på 'AndroidManifest.xml' filen som er i roden af 'verisuredecom' mappen. Denne fil er det berygtede manifest, der indeholder oplysninger om f. eks. pakkenavn, egenskaber, version, aktiviteter, services, tilladelser, broadcast receivers, intents osv.
Manifestet giver næsten sig selv, og efter 10 minutters nærstudering + google vil det meste give mening. Hvad vi er interesserede i her, er hvilke services, intents og aktiviteter(activities) der er angivede.
I dette eksempel er der ikke nogle services eller intents der ser ud til at kunne hjælpe os, men der er nogle spændende aktiviteter. Den aktivitet mine øjne først sprænger på er denne:
DeveloperActivity.smali er placeret i ..\verisuredecom\smali\com\sdi\mobile\android\verisure - Men igen er smali altså for viderekomne, og passer dårligt ind i en intro.
Lad os istedet prøve noget andet. Vi kan bruge adb shell's am kommando(activity mamager) til at starte aktiviteter
Lad os prøve at åbne det kommandovindue vi brugte til at installere applikationen med (Android SDK/platform-tools)
I dette kommandovindue skriver vi først adb shell
Herefter skriver vi am start <pakkenavn>/.<aktivitet>
Og boom. Vi har started en aktivitet direkte fra kommandovinduet/konsollen. Dette kan bruges til forskellige ting, f. eks. gemte menuer og aktiviteter der glemmer at tjekke om brugeren er logget ind, og herved lækker information der kun burde være forebeholdt autoriserede brugere.
OBS! For at komme tilbage fra vores shell kan vi trykke CTRL+C
!! Hvis du her får en fejlmeddelse i stil med følgende:
!!error: protocol fault (no status)
!!Så skriv >adb kill-server
!!efterfulgt af >adb start-server
Ved Hjælp af Dex2Jar
Åbn et kommandovindue i dex2jar mappen (cd C:/... eller højreklik > Åbn ko..) og skriv følgende:
Dette vil decompile Androids .DEX dalvik byte code til Java, og være noget lettere at forstå. verisure-dex2jar.jar filen kan nu åbnes i jd-gui.exe.
Du kan dog ikke ændre i koden og gemme det, men i stedet bruge koden til at få oplysninger om applikationens indhold, samt mulige hulder i programmeringen.
Efter en lille gennemgang af den decompilede kode finder vi igen den spændende klasse med navnet DeveloperActivity, som ovenikøbet indeholder følgende hardcoded credentials:
Skulle vi prøve at se om de virker? Sørg for Ikke at køre Charles når du forsøger dette.
Sørme jo. Der er ikke meget at komme efter her, men det er da en vej ind for at få lidt bedre viden om hvordan applikationen virker.
Hvis vi på nuværende tidspunkt har Charles åben vil vi få en fejl, da verisure bruger en form for SSL Pinning, der gør at forbindelsen bliver nægtet hvis ikke SSL certifikatet er ens hos både klienten(android) og serveren(I dette tilfælde Charles, som herefter videregiver trafikken).
Igen ville det være lidt overkill at begynde at fjerne dette tjek eller bytte deres http klient ud med vores egen. Men måske engang i fremtiden. ;)
( Hvis det alligevel skulle have interesse er der her to gode artikler om emnet: http://www.mcafee.com/us/resources/white...dation.pdf
http://www.exploit-db.com/wp-content/the.../33430.pdf )
Jeg vil dog alligevel lige vise en lille sjov ting jeg fandt i denne applikation, som også vil give anledning til at recompile.
Ved at kigge på klassen \com\sdi\mobile\android\util\http\httpservice.smali, der hjælper med forbindelsen til backend-serveren, finder vi følgende:
Java:
Smali:
Vi har altså her at gøre med en string der bruges i samarbejde med en ressource(RAW) der smides ind i en inputstream. Hmm..
Lad os tage et kig på vores ressourcer (Den blev loaded fra RAW). Under \verisuredecom\res\raw finder vi sørme en fil med navnet mykeystore.bks, som er en filtype der bruges til at importere certificater fra BouncyCastle.
Kan det virkelig passe de bare har hardcoded deres key/password? altså....
Vi skal altså bruge BouncyCastle til at optette et certifikat i stil med det vi fandt i raw mappen.
http://www.bouncycastle.org/ - Et velkendt krypterings-library.
Jeg har her valgt at bruge 'bcprov-jdk15on-146.jar' til denne opgave.
Til dette skal vi bruge 'keytool', som befinder sig i JDK's Bin mappe:
Nu skulle certifikatet altså være gemt i KeyStore filen, og hvis vi nu recompiler vores decompilede smali filer, burde vi ikke få problemer med Charles.
Recompiling Decompiled Smali Filer
Her skal vi igen tilbage til APKTool kommandovinduet / Eller starte en ny, hvis den er lukket ned.
I kommandovinduet skriver vi følgende:
Hvilket ser således ud:
(Her kan vi nøjes med at skrive 'verisuredecom' som mappe, da vi allerede arbejder fra Android mappen.
Det er sådan set alt der skal til for at recompile filerne. Disse skal dog 'signeres/underskrives' før Android styresytemet tillader at de bliver installeret.
"Signering" af Recompiled Applikationer
Denne process er heldigvis også utroligt hurtig.
Ved hjælp af vores trofaste kommandovindue CD'er eller åbner vi op i SignApk mappen, hvor signapk.jar gemmer sig.
SignApk køres ved hjælp af Java, og behøver kun ganske få parametre.
Vi vil her benytte os af de "nøglefiler" der er med i zip-filen, da der ikke er brug for selv at lave nye til dette formål.
Skriv følgende i kommandovinduet, som du har åbnet/ændret sti til SignApk mappen:
Som med mine filer vil være således:
Efter blot få sekunder er den nye fil signeret, og befinder sig i signapk mappen.
Installering af Modificerede Applikationer
Da vi brugte SignApk erstattede vi nøglen med en ny, så vi kan ikke 'opdatere' vores applikation. Vi er her tvunget til først at afinstallere applikationen, og herefter installere den nye version.
Dette kan gøres i emulatoren inde under Settings > App > Vælg applikationen (Verisure) > Uninstall - Eller - Ved hjælp af vores elskede adb shell med følgende kommando:
Som Doctor Blue så fint lige fik påpeget, så er den letteste og hurtigste måde at afinstallere applikationer på, helt klart ved at benytte adb uninstall
Herfra er der bare at installere den nye signerede apk, ved hjælp af samme kommando som vi brugte i starten:
Nu er applikationen så installeret, og hvis vi først åbner Charles og herefter Verisure, kan vi nu se at alt SSL trafikken bliver kørt igennem Charles uden et eneste problem.
Herfra kan vi så se at brugernavn/pasword bliver sendt som Base64, samt vi får diverse oplysninger om hvordan de forskellige anmodninger og svar er strukturerede på serveren.
Charles og andre proxies kan i nogle tilfælde være rigtig godt til at lave SQL injections i f. eks. POST parametre, som de fleste ellers bare hopper over.
Skal nok lige få rettet de værste fejl, og så skal billederne lige prioriteres da boardet er sat til maks 10.
Skal nok også få smidt lidt simpel patching ind engang.
I denne korte introduktion til Android hacking kigger vi på den basale opsætning til at få lidt mere styr på hvordan vi decompiler Android applikationer,
samt hvordan vi igennem en proxy kan opfange oplysninger om, hvad data applikationen sender videre til dennes tilknyttede backend server.
Krav
Android SDK + Eclipse ADT (Eclipse + Android Development Tool(kit) er kun hvis du ønsker at køre en emulator i stedet for en fysisk enhed,
samt hvis du ønsker at dykke lidt længere ned i Android programmering samt patching/cracking)
http://developer.android.com/sdk/index.html
Java JDK & JRE (JDK er den vigtige her, men JRE er brugbar til visse opgaver)
http://www.oracle.com/technetwork/java/j...index.html
Charles Proxy (Kan være hvilket som helst proxy tool du har erfaring med)
http://www.charlesproxy.com/
APKTool (Skal bruges til at decompile + recompile (Smali - Baksmali) dine APK filer)
https://mega.co.nz/#!10UHnAxC!zLg6ucEf43...YVOkd9rHy0
SignAPK (Eller jarsigner - Skal bruges til at signe APK filerne, så de kan installeres på Android styresystemet.
Langt de fleste enheder vil ikke installere applikationer Uden denne hersens underskift)
https://mega.co.nz/#!ZklzhYhZ!g0ZcCd1epr...At1nTWyJ7g
Dex2Jar (Konverterer .DEX filen der er pakket ind i .APK filen til .JAR.
https://mega.co.nz/#!Jh0AkayZ!hzmJx-gRpf...MylPdap-zA
Jd_Gui (Giver dig en pæn brugerflade til at læse .JAR filerne fra Dex2Jar)
http://jd.benow.ca/
Så Hvad Er En APK-Fil?
En APK er sådan set bare et pakkeformat ligesom RAR og ZIP. Du kan endda omdøbe din .APK til .ZIP og herved åbne og udpakke indholdet.
APK-formatet er bare hvad Google har valgt at kalde deres applikationers filtype, sådan at Android styresystemet kan genkende det.
Det er disse filer du downloader og installerer, når du henter en app i Google Play eller andre tredjeparts app butikker.
Hvis du har en Rooted Android enhed, kan disse filer kopieres som "backups" og smides over på computeren via ADB, Email, Dropbox osv.
Desuden kan du bruge online downloaders såsom http://download.freeapk.ru/en eller http://apkleecher.com/ til at hente filerne ned til nærmere undersøgelser.
Pas dog på med det, da mange af disse downloaders først lige smider spyware eller reklamer ind før gør dit download-link klar.
Mappestruktur
Lad os for en god ordens skyld lave en mappe på skrivebordet der hedder Android
Inde i den mappe udpakker vi følgende filer til deres egne mapper:
Desktop/Android/APKTool
Desktop/Android/SignAPK
Desktop/Android/Dex2Jar
Desktop/Android/Jd_Gui.exe (Ingen mappe, så bare smid i den i Android mappens rod)
Opsætning af Emulatoren
For at gøre det så let som muligt bruger vi Eclipse til åbne AVD (Android Virtual Device Manager).
Sørg for at Android SDK er installeret, samt at Eclipse er udpakket (Det er lige meget hvor).
1) Åbn Eclipse > Window > Preferences > Android og tjek om 'SDK location' passer til hvor du installerede/udpakkede Android SDK og tryk OK.
2) Gå til Window > Android SDK Manager Og installer alle de pakker den selv foreslår (Samt tjek at du har mindst én af de nyeste platforme - Android 4.3 osv - installeret - Dette kræver til tider Administrator rettigheder)
3) Gå til Window > Android Virtual Device Manager > Tryk på 'Create' og udfyld indstillingerne.
Disse indstillinger er ikke så vigtige lige nu, og kan hele tiden ændres. Har selv mange forskellige, men her er et eksempel:
Det kan være en fordel at hente Google API's i SDK Manager'en, da flere applikationer ellers vil fejle installationen grundet en 'manglende delt pakke'.
Tryk OK > Og start så emulatoren.
!! Der kan opstå tilfælde hvor vores ADT plugin ikke er installeret korrekt, i disse tilfælde gør følgende:
Gå til Help > Install New Software >
Tryk på Add >
Giv den et navn (ADT Plugin) >
Angiv en URL til plugin-filerne > https://dl-ssl.google.com/android/eclipse/
Og installer så Android Development Tools. Dette kan igen til tider kræve administrator rettigheder.
Installation af Applikationer til Emulatoren
Sørg for, at du har emulatoren åben og kørende.
Åbn CMD/Kommandovinduet og CD til mappen mappen hvor du installerede Android SD/platform-tools.
C:\Windows\System32> cd C:\sdk\platform-tools
ELLER gå til Android SDK mappen, Hold Shift-knappen nede og højreklik på platform-tools > "Åbn kommandovindue her".
I denne mappe gemmer adb.exe sig, og det er dette lille fikse program vi vil bruge til at installere applikationer og køre aktiviteter/services.
Som et eksempel vil jeg bruge Verisure's fjernstyrrings app til tyverisikring/overvægning.
Hvis vi går til https://play.google.com og søger efter denne applikation.
( https://play.google.com/store/apps/details?id=com.sdi.mobile.android.verisure )
kan vi se i adressebaren, at pakkenavnet er: 'com.sdi.mobile.android.verisure'
Her kan vi så gå videre til http://download.freeapk.ru og skrive pakkenavnet/adressen og downloade .APK-filen hurtigt og uden problemer, i stedet for at hente den ned på vores enhed, installere, tage backup og overføre filen til vores computer.
Gem .apk-filen Android mappen.
For at installere denne app skriver vi blot
Citer:adb install <stien til .apk-filen>(Du kan skrive adb install og herefter bare trække filen ind i kommandovinduet for automatisk at udfylde stien til filen.
Dette bliver således til:
Citer:C:\sdk\platform-tools>adb install C:\Users\MXI\Desktop\Android\verisure.apk
1112 KB/s (7109188 bytes in 6.240s)
pkg: /data/local/tmp/bas.apk
Success
Nu er applikationen så installeret på emulatoren, og kan findes inde i Apps menuen.
!! I tilfælde af at adb ikke kan finde din emulator enhed kan det til tider hjælpe at forwarde:
Citer:'C:\sdk\platform-tools>adb -d forward tcp:5601 tcp:5601'!! Prøv herefter at skrive
Citer:'C:\sdk\platform-tools>adb devices'for at se om den har registreret din enhed.
Opsætning af Charles Proxy
Installér Charles Proxy (Dette er kun en trial, så den låser op nogle sekunder engang imellem, og kan kun køre i 30 minutter før det lukker ned. Kan dog åbnes igen med det samme)
Gå til Proxy > Proxy Settings og tjek portnummeret (Højst sansynligt 8888)
Under fanen Proxies skal du lige tjekke om der er flueben i 'Enable transparent HTTP proxying'.
Under fanen SSL skal du lige tjekke om der er flueben i 'Enable SSL proxying'.
Hvis den her kræver en opsætning under 'locations', så tryk add og OK med tomme værdier.
Find din netværks-IP (Ikke din eksterne IP, men din interne IP routeren bruger til at finde dig på netværket)
Dette kan gøres på flere forskellige måder, men den letteste er IMO at skrive ipconfig i kommandovinduet, og kigge under IPv4:
Citer:C:\Windows\System32>ipconfig
Lad os vende tilbage til Android emulatoren for at opsætte Charles.
Først hopper vi lige ind i Androids browser nede i højre hjørne (Blå planet-tingy).
Gå til http://charlesproxy.com/charles.crt > Giv certifikatet et navn og tryk OK for at installere det. (Dette skal bruges til at opsnappe SSL trafik)
Der er forskelle i brugerfladen på forskellige Android versioner, men i min (4.4.2) er det således:
Gå til Settings (Tryk på Menu knappen, eller find den inde i Apps menuen)
Under Wireless & Networks tryk på More...
Tryk på Mobile Networks > Access Point Names
Tryk på den APN der allerede er i brug (T-Mobile US hos mig)
Tryk på Proxy, og indsæt den IP vi fandt før (192.168.1.105)
Tryk på Port og indsæt porten fra Charles (8888)
Disse indstillinger vil muligvis kræve et kodeord (Dette kodeord/PIN vil også blive krævet til at logge ind næste gang du starter emulatoren, så ingen grund til at gå i panik hvis den lige pludselig kræver Pinkode næste gang)
I øverst højre hjørne - Udfra 'Edit access point' er der 3 vertikale firkanter, tryk på disse og vælg 'Save'
Nu vil netværksaktiviteten fra din Android emulator automatisk blive kørt igennem Charles - Det samme vil din browseraktivitet i Windows dog også - For at undgå dette kan du trykke på Proxy > Og fjerne fluebenet i 'Windows Proxy'.
Decompile Android Applikationer
Ved Hjælp af APKTool
Åbn et kommandovindue i APKTool mappen (cd C:/... eller højreklik > Åbn ko..) og skriv følgende:
apktool d(står for decompile) <apkfilen> <mappenavn på de decompilede smali filer>
Altså noget i stil med dette:
Citer:C:\Users\MXI\Desktop\Android\>apktool d C:\Users\MXI\Desktop\android\verisure.apk verisuredecom
I: Baksmaling...
I: Loading resource table.
I: Loaded.
I: Loading resource table from
I: Loaded.
I: Decoding file-resources...
I: Decoding values*/* XMLs...
I: Done.
I: Copying assets and libs...
Nu har vi så de decompilede .smali filer i 'verisuredecom' mappen, som kan ændres/pacthes/crackes og recompiles.
At patche diverse dele af koden er ikke noget jeg synes vi skal begive os ud i, da dette kun er en simpel introduktion
(Og smali er pænt svært at forstå hvis man bare lige hopper ud i det - det er simpelthen alt for let at ødelægge det bare ved at fjerne en enkelt funktion/variabel, og glemme at starten af funktionen så smali er klar over der er den satan mindre)
Lad os i stedet tage et kig på 'AndroidManifest.xml' filen som er i roden af 'verisuredecom' mappen. Denne fil er det berygtede manifest, der indeholder oplysninger om f. eks. pakkenavn, egenskaber, version, aktiviteter, services, tilladelser, broadcast receivers, intents osv.
Manifestet giver næsten sig selv, og efter 10 minutters nærstudering + google vil det meste give mening. Hvad vi er interesserede i her, er hvilke services, intents og aktiviteter(activities) der er angivede.
I dette eksempel er der ikke nogle services eller intents der ser ud til at kunne hjælpe os, men der er nogle spændende aktiviteter. Den aktivitet mine øjne først sprænger på er denne:
Citer:<activity android:name=".DeveloperActivity" />. Uha. Der er altid en mulighed for, at classes/aktiviteter med navne som dev/developer/programmer/coder kan indeholde noget spændende.
DeveloperActivity.smali er placeret i ..\verisuredecom\smali\com\sdi\mobile\android\verisure - Men igen er smali altså for viderekomne, og passer dårligt ind i en intro.
Lad os istedet prøve noget andet. Vi kan bruge adb shell's am kommando(activity mamager) til at starte aktiviteter
Lad os prøve at åbne det kommandovindue vi brugte til at installere applikationen med (Android SDK/platform-tools)
I dette kommandovindue skriver vi først adb shell
Citer:C:\sdk\platform-tools>adb shell
root@generic:/ #
Herefter skriver vi am start <pakkenavn>/.<aktivitet>
Citer:root@generic:/ # am start com.sdi.mobile.android.verisure/.DeveloperActivity
Og boom. Vi har started en aktivitet direkte fra kommandovinduet/konsollen. Dette kan bruges til forskellige ting, f. eks. gemte menuer og aktiviteter der glemmer at tjekke om brugeren er logget ind, og herved lækker information der kun burde være forebeholdt autoriserede brugere.
OBS! For at komme tilbage fra vores shell kan vi trykke CTRL+C
!! Hvis du her får en fejlmeddelse i stil med følgende:
!!error: protocol fault (no status)
!!Så skriv >adb kill-server
!!efterfulgt af >adb start-server
Ved Hjælp af Dex2Jar
Åbn et kommandovindue i dex2jar mappen (cd C:/... eller højreklik > Åbn ko..) og skriv følgende:
Citer:C:\Users\MXI\Desktop\Android\>d2j-dex2jar C:\Users\MXI\Desktop\android\verisure.apk
Dette vil decompile Androids .DEX dalvik byte code til Java, og være noget lettere at forstå. verisure-dex2jar.jar filen kan nu åbnes i jd-gui.exe.
Du kan dog ikke ændre i koden og gemme det, men i stedet bruge koden til at få oplysninger om applikationens indhold, samt mulige hulder i programmeringen.
Efter en lille gennemgang af den decompilede kode finder vi igen den spændende klasse med navnet DeveloperActivity, som ovenikøbet indeholder følgende hardcoded credentials:
Citer:
dd.a(this, "[b]mm-test1@verisure.com", "asdf1234");[/b]
Skulle vi prøve at se om de virker? Sørg for Ikke at køre Charles når du forsøger dette.
Sørme jo. Der er ikke meget at komme efter her, men det er da en vej ind for at få lidt bedre viden om hvordan applikationen virker.
Hvis vi på nuværende tidspunkt har Charles åben vil vi få en fejl, da verisure bruger en form for SSL Pinning, der gør at forbindelsen bliver nægtet hvis ikke SSL certifikatet er ens hos både klienten(android) og serveren(I dette tilfælde Charles, som herefter videregiver trafikken).
Igen ville det være lidt overkill at begynde at fjerne dette tjek eller bytte deres http klient ud med vores egen. Men måske engang i fremtiden. ;)
( Hvis det alligevel skulle have interesse er der her to gode artikler om emnet: http://www.mcafee.com/us/resources/white...dation.pdf
http://www.exploit-db.com/wp-content/the.../33430.pdf )
Jeg vil dog alligevel lige vise en lille sjov ting jeg fandt i denne applikation, som også vil give anledning til at recompile.
Ved at kigge på klassen \com\sdi\mobile\android\util\http\httpservice.smali, der hjælper med forbindelsen til backend-serveren, finder vi følgende:
Java:
Citer: private static void b(Context paramContext)
{
b = new a(new ByteArrayInputStream(a(paramContext.getResources().openRawResource(2131099649))), "mysecret");
d = c(paramContext);
}
Smali:
Kode:
new-instance v1, Ljava/io/ByteArrayInputStream;
invoke-direct {v1, v0}, Ljava/io/ByteArrayInputStream;-><init>([B)V
.line 74
new-instance v0, Lcom/sdi/mobile/android/util/http/a;
const-string v2, "mysecret"
invoke-direct {v0, v1, v2}, Lcom/sdi/mobile/android/util/http/a;-><init>(Ljava/io/InputStream;Ljava/lang/String;)V
sput-object v0, Lcom/sdi/mobile/android/util/http/HttpService;->b:Lcom/sdi/mobile/android/util/http/a;
Vi har altså her at gøre med en string der bruges i samarbejde med en ressource(RAW) der smides ind i en inputstream. Hmm..
Lad os tage et kig på vores ressourcer (Den blev loaded fra RAW). Under \verisuredecom\res\raw finder vi sørme en fil med navnet mykeystore.bks, som er en filtype der bruges til at importere certificater fra BouncyCastle.
Kan det virkelig passe de bare har hardcoded deres key/password? altså....
Vi skal altså bruge BouncyCastle til at optette et certifikat i stil med det vi fandt i raw mappen.
http://www.bouncycastle.org/ - Et velkendt krypterings-library.
Jeg har her valgt at bruge 'bcprov-jdk15on-146.jar' til denne opgave.
Til dette skal vi bruge 'keytool', som befinder sig i JDK's Bin mappe:
Citer:'C:\Program Files\Java\jdk1.7.0_51\bin'Åbn en konsol i denne mappe, og indtast følgende for at lave en ny BouncyCastle .bks keystore fil:
Citer:keytool -importcert -v -trustcacerts -file <certifikatet> -alias sslshit -keystore <keystore-filen der skal eksporteres til> -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath <BouncyCastle's Jar library> -storetype BKS -storepass <Kodeord>
Kode:
C:\Program Files\Java\jdk1.7.0_51\bin>keytool -importcert -v -trustcacerts -fil
"C:\Users\MXI\Desktop\apk\charles.crt" -alias sslshit -keystore "C:\Users\MXI\Desktop\apk\verisuredecom\res\raw\mykeystore.bks" -provider org.bouncycastle.j
e.provider.BouncyCastleProvider -providerpath "C:\MXI\MXI\Desktop\apk\bcprov
jdk15on-146.jar" -storetype BKS -storepass mysecret
Owner: C=NZ, ST=Auckland, L=Auckland, O=XK72 Ltd, OU=http://charlesproxy.com/ss
, CN=Charles Proxy SSL Proxying
Issuer: C=NZ, ST=Auckland, L=Auckland, O=XK72 Ltd, OU=http://charlesproxy.com/s
l, CN=Charles Proxy SSL Proxying
Serial number: 1
Valid from: Sun Dec 31 13:00:00 CET 1899 until: Fri Sep 24 05:19:05 CEST 2038
Certificate fingerprints:
MD5: D5:E8:27:14:9B:A1:5E:AC:85:02:B5:93:93:6D:9A:83
SHA1: 18:9B:6E:28:D1:63:5F:3A:83:25:E1:E0:02:18:0D:BA:2C:02:C2:41
SHA256: C6:A5:94:B2:53:0F:EF:2E:AE:85:1B:91:62:CD:CD:42:EB:B1:BE:A5:E2
6B:A3:1F:81:6C:03:22:40:33:30:9E
Signature algorithm name: SHA1withRSA
Version: 3
Extensions:
#1: ObjectId: 2.16.840.1.113730.1.13 Criticality=false
0000: 13 68 53 53 4C 20 50 72 6F 78 79 69 6E 67 20 69 .hSSL Proxying i
0010: 73 20 65 6E 61 62 6C 65 64 20 69 6E 20 43 68 61 s enabled in Cha
0020: 72 6C 65 73 20 50 72 6F 78 79 2E 20 50 6C 65 61 rles Proxy. Plea
0030: 73 65 20 76 69 73 69 74 20 68 74 74 70 3A 2F 2F se visit http://
0040: 63 68 61 72 6C 65 73 70 72 6F 78 79 2E 63 6F 6D charlesproxy.com
0050: 2F 73 73 6C 20 66 6F 72 20 6D 6F 72 65 20 69 6E /ssl for more in
0060: 66 6F 72 6D 61 74 69 6F 6E 2E formation.
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB 27 F4 CB 2E B6 DB B0 58 10 1B BD 80 3F 38 D2 .'......X....?8.
0010: 08 D7 61 29 ..a)
]
]
Trust this certificate? [no]: yes
Certificate was added to keystore
[Storing C:\Users\MXI\Desktop\apk\verisuredecom\res\raw\mykeystore.bks]
Nu skulle certifikatet altså være gemt i KeyStore filen, og hvis vi nu recompiler vores decompilede smali filer, burde vi ikke få problemer med Charles.
Recompiling Decompiled Smali Filer
Her skal vi igen tilbage til APKTool kommandovinduet / Eller starte en ny, hvis den er lukket ned.
I kommandovinduet skriver vi følgende:
Citer:apktool b(står for build) <mappenavn på de decompilede smali filer> <navnet på den nye apk-fil>
Hvilket ser således ud:
Citer:C:\Users\MXI\Desktop\Android\>apktool b C:\Users\MXI\Desktop\Android\verisuredecom verisurerecompiled.apk
(Her kan vi nøjes med at skrive 'verisuredecom' som mappe, da vi allerede arbejder fra Android mappen.
Citer:C:\Users\MXI\Desktop\apk>apktool b verisuredecom verisurerecompiled.apk
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs...
I: Building apk file...
Det er sådan set alt der skal til for at recompile filerne. Disse skal dog 'signeres/underskrives' før Android styresytemet tillader at de bliver installeret.
"Signering" af Recompiled Applikationer
Denne process er heldigvis også utroligt hurtig.
Ved hjælp af vores trofaste kommandovindue CD'er eller åbner vi op i SignApk mappen, hvor signapk.jar gemmer sig.
SignApk køres ved hjælp af Java, og behøver kun ganske få parametre.
Vi vil her benytte os af de "nøglefiler" der er med i zip-filen, da der ikke er brug for selv at lave nye til dette formål.
Skriv følgende i kommandovinduet, som du har åbnet/ændret sti til SignApk mappen:
Citer:java -jar SignApk.jar <pem nøglefil> <pk8 nøglefil> <apk der skal signeres> <apk efter signering>
Som med mine filer vil være således:
Citer:java -jar signapk.jar testkey.x509.pem testkey.pk8 verisurerecompiled.apk verisuresigned.apk
Efter blot få sekunder er den nye fil signeret, og befinder sig i signapk mappen.
Installering af Modificerede Applikationer
Da vi brugte SignApk erstattede vi nøglen med en ny, så vi kan ikke 'opdatere' vores applikation. Vi er her tvunget til først at afinstallere applikationen, og herefter installere den nye version.
Dette kan gøres i emulatoren inde under Settings > App > Vælg applikationen (Verisure) > Uninstall - Eller - Ved hjælp af vores elskede adb shell med følgende kommando:
Som Doctor Blue så fint lige fik påpeget, så er den letteste og hurtigste måde at afinstallere applikationer på, helt klart ved at benytte adb uninstall
Citer:C:\sdk\platform-tools>adb uninstall com.sdi.mobile.android.verisure
Citer:C:\sdk\platform-tools>adb shell
root@generic:/ # am start -a android.intent.action.DELETE -d package:com.sdi.mob
ile.android.verisure
on.DELETE -d package:com.sdi.mobile.android.verisure <
Starting: Intent { act=android.intent.action.DELETE dat=package:com.sdi.mobile.a
ndroid.verisure }
Herfra er der bare at installere den nye signerede apk, ved hjælp af samme kommando som vi brugte i starten:
Citer:C:\sdk\platform-tools>adb install C:\Users\MXI\Desktop\android\SignApk\verisuresigned.apk
Nu er applikationen så installeret, og hvis vi først åbner Charles og herefter Verisure, kan vi nu se at alt SSL trafikken bliver kørt igennem Charles uden et eneste problem.
Herfra kan vi så se at brugernavn/pasword bliver sendt som Base64, samt vi får diverse oplysninger om hvordan de forskellige anmodninger og svar er strukturerede på serveren.
Charles og andre proxies kan i nogle tilfælde være rigtig godt til at lave SQL injections i f. eks. POST parametre, som de fleste ellers bare hopper over.
Skal nok lige få rettet de værste fejl, og så skal billederne lige prioriteres da boardet er sat til maks 10.
Skal nok også få smidt lidt simpel patching ind engang.