mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h
This commit is contained in:
parent
c3466ebb2e
commit
bf38793aba
@ -11,7 +11,7 @@ Evo brzog pregleda prelaza između aktivnosti:
|
||||
- **Activity 1** počinje kao jedina aktivnost u foreground-u.
|
||||
- Pokretanje **Activity 2** pomera **Activity 1** u back stack, dovodeći **Activity 2** u foreground.
|
||||
- Pokretanje **Activity 3** pomera **Activity 1** i **Activity 2** dalje nazad u stogu, pri čemu je **Activity 3** sada ispred.
|
||||
- Zatvaranje **Activity 3** vraća **Activity 2** nazad u foreground, prikazujući Androidov pojednostavljeni mehanizam navigacije kroz task.
|
||||
- Zatvaranje **Activity 3** vraća **Activity 2** nazad u foreground, prikazujući Androidov pojednostavljeni mehanizam navigacije kroz zadatke.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -23,21 +23,27 @@ U Android aplikacijama, **task affinity** specificira preferirani task aktivnost
|
||||
|
||||
### Launch Modes
|
||||
|
||||
Atribut `launchMode` usmerava rukovanje instancama aktivnosti unutar taskova. **singleTask** režim je ključan za ovaj napad, određujući tri scenarija na osnovu postojećih instanci aktivnosti i podudaranja task affinity. Eksploatacija se oslanja na sposobnost napadačeve aplikacije da imitira task affinity ciljne aplikacije, obmanjujući Android sistem da pokrene napadačevu aplikaciju umesto nameravane mete.
|
||||
Atribut `launchMode` usmerava rukovanje instancama aktivnosti unutar zadataka. **singleTask** režim je ključan za ovaj napad, određujući tri scenarija na osnovu postojećih instanci aktivnosti i podudaranja task affinity. Eksploatacija se oslanja na sposobnost napadačeve aplikacije da imitira task affinity ciljne aplikacije, obmanjujući Android sistem da pokrene napadačevu aplikaciju umesto nameravane mete.
|
||||
|
||||
### Detailed Attack Steps
|
||||
|
||||
1. **Instalacija zlonamerne aplikacije**: Žrtva instalira napadačevu aplikaciju na svom uređaju.
|
||||
2. **Prva aktivacija**: Žrtva prvo otvara zlonamernu aplikaciju, pripremajući uređaj za napad.
|
||||
3. **Pokušaj pokretanja ciljne aplikacije**: Žrtva pokušava da otvori ciljnu aplikaciju.
|
||||
4. **Izvršenje otmice**: Zbog podudaranja task affinity, zlonamerna aplikacija se pokreće umesto ciljne aplikacije.
|
||||
4. **Izvršenje otmice**: U nekom trenutku aplikacija pokušava da otvori **singleTask** prikaz. Zbog podudaranja task affinity, zlonamerna aplikacija se pokreće umesto ciljne aplikacije.
|
||||
5. **Obmana**: Zlonamerna aplikacija prikazuje lažni ekran za prijavu koji podseća na ciljnu aplikaciju, obmanjujući korisnika da unese osetljive informacije.
|
||||
|
||||
> [!TIP]
|
||||
> Imajte na umu da za ovaj napad da bi funkcionisao, ranjivi prikaz **ne mora imati exported na true** niti mora biti glavna aktivnost.
|
||||
|
||||
Za praktičnu implementaciju ovog napada, pogledajte Task Hijacking Strandhogg repozitorijum na GitHub-u: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
||||
|
||||
### Prevention Measures
|
||||
|
||||
Da bi se sprečili ovakvi napadi, programeri mogu postaviti `taskAffinity` na prazan string i odabrati `singleInstance` režim pokretanja, osiguravajući izolaciju svoje aplikacije od drugih. Prilagođavanje funkcije `onBackPressed()` pruža dodatnu zaštitu protiv otmice taska.
|
||||
Da bi sprečili takve napade, programeri mogu:
|
||||
- Postaviti **`**taskAffinity`** za **singleTask** prikaz na prazan string (`android:taskAffinity=""`)
|
||||
- Odabrati **`singleInstance`** režim pokretanja, osiguravajući izolaciju svoje aplikacije od drugih.
|
||||
- Prilagoditi funkciju **`onBackPressed()`** koja nudi dodatnu zaštitu protiv otmice zadataka.
|
||||
|
||||
## **References**
|
||||
|
||||
|
@ -10,30 +10,72 @@ Da biste potvrdili da li je aplikacija izgrađena na React Native okviru, pratit
|
||||
|
||||
3. Koristite komandu `find . -print | grep -i ".bundle$"` da biste pretražili JavaScript datoteku.
|
||||
|
||||
Da biste dalje analizirali JavaScript kod, kreirajte datoteku pod imenom `index.html` u istoj direktoriji sa sledećim kodom:
|
||||
## Javascript Kod
|
||||
|
||||
Ako prilikom provere sadržaja `index.android.bundle` pronađete JavaScript kod aplikacije (čak i ako je minifikovan), možete **analizirati ga da pronađete osetljive informacije i ranjivosti**.
|
||||
|
||||
Pošto paket zapravo sadrži sav JS kod aplikacije, moguće je **podeliti ga u različite datoteke** (potencijalno olakšavajući njegovo obrnuto inženjerstvo) koristeći **alat [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
|
||||
|
||||
### Webpack
|
||||
|
||||
Da biste dalje analizirali JavaScript kod, možete otpremiti datoteku na [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ili pratiti ove korake:
|
||||
|
||||
1. Kreirajte datoteku pod imenom `index.html` u istoj fascikli sa sledećim kodom:
|
||||
```html
|
||||
<script src="./index.android.bundle"></script>
|
||||
```
|
||||
Možete da otpremite datoteku na [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ili pratite ove korake:
|
||||
2. Otvorite `index.html` datoteku u Google Chrome-u.
|
||||
|
||||
1. Otvorite `index.html` datoteku u Google Chrome-u.
|
||||
3. Otvorite Developer Toolbar pritiskom na **Command+Option+J za OS X** ili **Control+Shift+J za Windows**.
|
||||
|
||||
2. Otvorite Developer Toolbar pritiskom na **Command+Option+J za OS X** ili **Control+Shift+J za Windows**.
|
||||
|
||||
3. Kliknite na "Sources" u Developer Toolbar-u. Trebalo bi da vidite JavaScript datoteku koja je podeljena na foldere i datoteke, čineći glavni paket.
|
||||
4. Kliknite na "Sources" u Developer Toolbar-u. Trebalo bi da vidite JavaScript datoteku koja je podeljena na foldere i datoteke, čineći glavni paket.
|
||||
|
||||
Ako pronađete datoteku pod nazivom `index.android.bundle.map`, moći ćete da analizirate izvorni kod u nekompresovanom formatu. Map datoteke sadrže izvorno mapiranje, što vam omogućava da mapirate kompresovane identifikatore.
|
||||
|
||||
Da biste pretražili osetljive akreditive i krajnje tačke, pratite ove korake:
|
||||
|
||||
1. Identifikujte osetljive ključne reči za analizu JavaScript koda. React Native aplikacije često koriste usluge trećih strana kao što su Firebase, AWS S3 krajnje tačke, privatni ključevi itd.
|
||||
1. Identifikujte osetljive ključne reči za analizu JavaScript koda. React Native aplikacije često koriste usluge trećih strana kao što su Firebase, AWS S3 usluge, privatni ključevi itd.
|
||||
|
||||
2. U ovom konkretnom slučaju, primećeno je da aplikacija koristi Dialogflow uslugu. Potražite obrazac povezan sa njenom konfiguracijom.
|
||||
2. U ovom specifičnom slučaju, primećeno je da aplikacija koristi Dialogflow uslugu. Potražite obrazac povezan sa njenom konfiguracijom.
|
||||
|
||||
3. Bilo je sreće što su osetljivi hard-kodirani akreditive pronađeni u JavaScript kodu tokom recon procesa.
|
||||
|
||||
### Promenite JS kod i ponovo izgradite
|
||||
|
||||
U ovom slučaju, promena koda je jednostavna. Samo treba da preimenujete aplikaciju da koristi ekstenziju `.zip` i da je raspakujete. Zatim možete **modifikovati JS kod unutar ovog paketa i ponovo izgraditi aplikaciju**. Ovo bi trebalo da bude dovoljno da vam omogući da **ubacite kod** u aplikaciju u svrhe testiranja.
|
||||
|
||||
## Hermes bytecode
|
||||
|
||||
Ako paket sadrži **Hermes bytecode**, **nećete moći da pristupite JavaScript kodu** aplikacije (čak ni kompresovanoj verziji).
|
||||
|
||||
Možete proveriti da li paket sadrži Hermes bytecode pokretanjem sledeće komande:
|
||||
```bash
|
||||
file index.android.bundle
|
||||
index.android.bundle: Hermes JavaScript bytecode, version 96
|
||||
```
|
||||
Međutim, možete koristiti alate **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** ili **[hermes_rs](https://github.com/Pilfer/hermes_rs)** da **dezintegrirate bajtkod** i takođe da **dekompajlirate u neki pseudo JS kod**. Da biste to uradili, na primer, ove komande:
|
||||
```bash
|
||||
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
```
|
||||
### Promena koda i ponovna izgradnja
|
||||
|
||||
Idealno bi bilo da možete da modifikujete disasemblirani kod (menjajući poređenje, ili vrednost ili šta god da treba da modifikujete) i zatim **ponovno izgradite bajtkod** i ponovo izgradite aplikaciju.
|
||||
|
||||
Alat **[hbctool](https://github.com/bongtrop/hbctool)** podržava disasembliranje paketa i ponovnu izgradnju nakon što su promene izvršene, međutim **podržava samo stare verzije** Hermes bajtkoda.
|
||||
|
||||
Alat **[hermes-dec](https://github.com/P1sec/hermes-dec)** ne podržava ponovnu izgradnju bajtkoda.
|
||||
|
||||
Alat **[hermes_rs](https://github.com/Pilfer/hermes_rs)** podržava ponovnu izgradnju bajtkoda, ali je zapravo biblioteka, a ne CLI alat.
|
||||
|
||||
## Dinamička analiza
|
||||
|
||||
Možete pokušati da dinamički analizirate aplikaciju koristeći Frida da omogućite developerski režim React aplikacije i koristite **`react-native-debugger`** da se povežete na nju. Međutim, za ovo vam očigledno treba izvorni kod aplikacije. Više informacija o tome možete pronaći na [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
|
||||
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,16 +2,17 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## **Osnovne informacije**
|
||||
|
||||
**Tapjacking** je napad gde se **maliciozna** **aplikacija** pokreće i **pozicionira iznad aplikacije žrtve**. Kada vidljivo zakloni aplikaciju žrtve, njen korisnički interfejs je dizajniran na način da prevari korisnika da interaguje s njom, dok zapravo prosleđuje interakciju aplikaciji žrtve.\
|
||||
**Tapjacking** je napad gde se **maliciozna** **aplikacija** pokreće i **pozicionira iznad aplikacije žrtve**. Kada vidljivo zakloni aplikaciju žrtve, njen korisnički interfejs je dizajniran na način da prevari korisnika da interaguje sa njom, dok zapravo prosleđuje interakciju aplikaciji žrtve.\
|
||||
U suštini, to **oslepljuje korisnika da ne zna da zapravo izvršava radnje na aplikaciji žrtve**.
|
||||
|
||||
### Detekcija
|
||||
|
||||
Da biste detektovali aplikacije ranjive na ovaj napad, trebali biste tražiti **izvezene aktivnosti** u android manifestu (napomena: aktivnost sa intent-filterom se automatski izveze po defaultu). Kada pronađete izvezene aktivnosti, **proverite da li zahtevaju neku dozvolu**. To je zato što će **maliciozna aplikacija takođe trebati tu dozvolu**.
|
||||
|
||||
Takođe možete proveriti minimalnu SDK verziju aplikacije, proveravajući vrednost **`android:minSdkVersion`** u **`AndroidManifest.xml`** datoteci. Ako je vrednost **manja od 30**, aplikacija je ranjiva na Tapjacking.
|
||||
|
||||
### Zaštita
|
||||
|
||||
#### Android 12 (API 31,32) i noviji
|
||||
@ -24,7 +25,7 @@ Ako je **`android:filterTouchesWhenObscured`** postavljeno na **`true`**, `View`
|
||||
|
||||
#### **`setFilterTouchesWhenObscured`**
|
||||
|
||||
Atribut **`setFilterTouchesWhenObscured`** postavljen na true takođe može sprečiti eksploataciju ove ranjivosti ako je verzija Android-a niža.\
|
||||
Atribut **`setFilterTouchesWhenObscured`** postavljen na true takođe može sprečiti iskorišćavanje ove ranjivosti ako je verzija Android-a niža.\
|
||||
Ako je postavljeno na **`true`**, na primer, dugme može automatski biti **onemogućeno ako je zaklonjeno**:
|
||||
```xml
|
||||
<Button android:text="Button"
|
||||
@ -49,13 +50,13 @@ Primer projekta koji implementira **FloatingWindowApp**, koji se može koristiti
|
||||
### Qark
|
||||
|
||||
> [!OPREZ]
|
||||
> Izgleda da ovaj projekat sada nije održavan i ova funkcionalnost više ne radi ispravno
|
||||
> Izgleda da ovaj projekat više nije održavan i ova funkcionalnost više ne radi ispravno
|
||||
|
||||
Možete koristiti [**qark**](https://github.com/linkedin/qark) sa `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` parametrima da kreirate zloćudnu aplikaciju za testiranje mogućih **Tapjacking** ranjivosti.\
|
||||
Možete koristiti [**qark**](https://github.com/linkedin/qark) sa `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` parametrima za kreiranje zlonamerne aplikacije za testiranje mogućih **Tapjacking** ranjivosti.\
|
||||
|
||||
Mitracija je relativno jednostavna jer programer može odlučiti da ne prima dodirne događaje kada je prikaz pokriven drugim. Koristeći [Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security):
|
||||
Mitigacija je relativno jednostavna jer programer može odlučiti da ne prima dodirne događaje kada je prikaz pokriven drugim. Koristeći [Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Ponekad je od suštinskog značaja da aplikacija može da verifikuje da se akcija vrši uz puno znanje i pristanak korisnika, kao što je odobravanje zahteva za dozvolu, kupovina ili klik na oglas. Nažalost, zloćudna aplikacija bi mogla pokušati da prevari korisnika da izvrši ove akcije, nesvesno, prikrivajući nameru prikaza. Kao rešenje, okvir nudi mehanizam filtriranja dodira koji se može koristiti za poboljšanje bezbednosti prikaza koji pružaju pristup osetljivoj funkcionalnosti.
|
||||
> Ponekad je od suštinskog značaja da aplikacija može da verifikuje da se akcija vrši uz puno znanje i pristanak korisnika, kao što je odobravanje zahteva za dozvolu, kupovina ili klik na oglas. Nažalost, zlonamerna aplikacija bi mogla pokušati da prevari korisnika da izvrši ove akcije, nesvesno, prikrivanjem namene prikaza. Kao rešenje, okvir nudi mehanizam filtriranja dodira koji se može koristiti za poboljšanje bezbednosti prikaza koji pružaju pristup osetljivoj funkcionalnosti.
|
||||
>
|
||||
> Da biste omogućili filtriranje dodira, pozovite [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) ili postavite android:filterTouchesWhenObscured atribut rasporeda na true. Kada je omogućeno, okvir će odbaciti dodire koji se primaju kada je prozor prikaza zaklonjen drugim vidljivim prozorom. Kao rezultat, prikaz neće primati dodire kada se iznad prozora prikaza pojavi toast, dijalog ili drugi prozor.
|
||||
|
||||
|
@ -471,12 +471,13 @@ window.search = window.search || {};
|
||||
showResults(true);
|
||||
}
|
||||
|
||||
fetch(path_to_root + 'searchindex.json')
|
||||
var branch = lang === "en" ? "master" : lang
|
||||
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
|
||||
.then(response => response.json())
|
||||
.then(json => init(json))
|
||||
.catch(error => { // Try to load searchindex.js if fetch failed
|
||||
var script = document.createElement('script');
|
||||
script.src = path_to_root + 'searchindex.js';
|
||||
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
|
||||
script.onload = () => init(window.search);
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
|
@ -55,6 +55,7 @@
|
||||
<!-- Provide site root to javascript -->
|
||||
<script>
|
||||
var path_to_root = "{{ path_to_root }}";
|
||||
var lang = "{{ language }}";
|
||||
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
|
Loading…
x
Reference in New Issue
Block a user