From 5582e5cb86d3a003632eed7b76e969833c0b3fac Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 16 Jul 2025 12:10:12 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/drozer-tutoria --- .../exploiting-content-providers.md | 60 +++++++++++++++++-- theme/ai.js | 46 ++++++++++---- 2 files changed, 92 insertions(+), 14 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md index 9a865cdb5..d897f1104 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md @@ -4,7 +4,7 @@ ## Intro -I dati sono **forniti da un'applicazione ad altre** su richiesta da un componente noto come **content provider**. Queste richieste sono gestite attraverso i metodi della **classe ContentResolver**. I content provider possono memorizzare i loro dati in varie posizioni, come un **database**, **file** o su una **rete**. +I dati sono **forniti da un'applicazione ad altre** su richiesta da un componente noto come **content provider**. Queste richieste sono gestite attraverso i metodi della **ContentResolver class**. I content provider possono memorizzare i loro dati in varie posizioni, come un **database**, **file** o su una **rete**. Nel file _Manifest.xml_, è necessaria la dichiarazione del content provider. Ad esempio: ```xml @@ -62,7 +62,7 @@ Inoltre, se non riesci a trovare query complete, potresti **controllare quali no La query sarà simile a: `content://name.of.package.class/declared_name` -## **Content Provider basati su Database** +## **Content Provider supportati da database** Probabilmente la maggior parte dei Content Provider è utilizzata come **interfaccia** per un **database**. Pertanto, se puoi accedervi, potresti essere in grado di **estrarre, aggiornare, inserire e eliminare** informazioni.\ Controlla se puoi **accedere a informazioni sensibili** o prova a modificarle per **bypassare** i meccanismi di autorizzazione. @@ -93,7 +93,7 @@ Interrogando il database imparerai il **nome delle colonne**, poi, potresti esse ![](<../../../images/image (173).png>) -_Nota che in insert e update puoi usare --string per indicare stringa, --double per indicare un double, --float, --integer, --long, --short, --boolean_ +_Nota che in insert e update puoi usare --string per indicare una stringa, --double per indicare un double, --float, --integer, --long, --short, --boolean_ ### Update content @@ -173,10 +173,62 @@ Vulnerable Providers: content://com.mwr.example.sieve.FileBackupProvider/ content://com.mwr.example.sieve.FileBackupProvider ``` -## Riferimenti +## Aggiornamenti 2023-2025 e Consigli Moderni + +### Drozer 3.x (Python 3) è disponibile + +WithSecure ha ripreso la manutenzione di drozer nel 2022 e ha portato il framework a **Python 3** (ultima **3.1.0 – Aprile 2024**). +Oltre alle correzioni di compatibilità, i nuovi moduli che sono particolarmente utili quando si lavora con i Content Providers includono: + +* `scanner.provider.exported` – elenca solo i provider con `android:exported="true"`. +* `app.provider.grant` – chiama automaticamente `grantUriPermission()` in modo da poter comunicare con i provider che si aspettano `FLAG_GRANT_READ_URI_PERMISSION` / `FLAG_GRANT_WRITE_URI_PERMISSION` su Android 12+. +* Migliore gestione dello **Scoped Storage** in modo che i provider basati su file su Android 11+ possano ancora essere raggiunti. + +Aggiorna (host & agent): +```bash +pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0" +adb install drozer-agent-3.1.0.apk +``` +### Utilizzando l'assistente integrato `cmd content` (ADB ≥ 8.0) + +Tutti i moderni dispositivi Android sono dotati di un'interfaccia a riga di comando che può interrogare/aggiornare i provider **senza installare alcun agente**: +```bash +adb shell cmd content query --uri content://com.test.provider/items/ +adb shell cmd content update --uri content://com.test.provider/items/1 \ +--bind price:d:1337 +adb shell cmd content call --uri content://com.test.provider \ +--method evilMethod --arg 'foo' +``` +Combinalo con `run-as ` o una shell con accesso root per testare i provider riservati. + +### CVE recenti nel mondo reale che hanno abusato dei Content Providers + +| CVE | Anno | Componente | Classe di bug | Impatto | +|-----|------|-----------|---------------|--------| +| CVE-2024-43089 | 2024 | MediaProvider | Traversata del percorso in `openFile()` | Lettura di file arbitrari dalla memoria privata di qualsiasi app | +| CVE-2023-35670 | 2023 | MediaProvider | Traversata del percorso | Divulgazione di informazioni | + +Ricrea CVE-2024-43089 su una build vulnerabile: +```bash +adb shell cmd content read \ +--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml +``` +### Hardening checklist for API 30+ + +* Dichiarare `android:exported="false"` a meno che il provider **debba** essere pubblico – a partire dall'API 31 l'attributo è obbligatorio. +* Applicare **permessi** e/o `android:grantUriPermissions="true"` invece di esportare l'intero provider. +* Aggiungere alla whitelist gli argomenti `projection`, `selection` e `sortOrder` consentiti (ad es. costruire query con `SQLiteQueryBuilder.setProjectionMap`). +* In `openFile()` canonizzare il percorso richiesto (`FileUtils`) e rifiutare le sequenze `..` per prevenire la traversata. +* Quando si espongono file, preferire il **Storage Access Framework** o un `FileProvider`. + +Queste modifiche nelle versioni recenti di Android significano che molte primitive di sfruttamento legacy funzionano ancora, ma richiedono flag/permissi aggiuntivi che i moduli drozer aggiornati o l'assistente `cmd content` possono applicare automaticamente. + +## References - [https://www.tutorialspoint.com/android/android_content_providers.htm](https://www.tutorialspoint.com/android/android_content_providers.htm) - [https://manifestsecurity.com/android-application-security-part-15/](https://manifestsecurity.com/android-application-security-part-15/) - [https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf) +- [https://github.com/WithSecureLabs/drozer/releases/tag/3.1.0](https://github.com/WithSecureLabs/drozer/releases/tag/3.1.0) +- [https://source.android.com/security/bulletin/2024-07-01](https://source.android.com/security/bulletin/2024-07-01) {{#include ../../../banners/hacktricks-training.md}} diff --git a/theme/ai.js b/theme/ai.js index 68d091923..a376d751b 100644 --- a/theme/ai.js +++ b/theme/ai.js @@ -4,9 +4,10 @@ (() => { - const KEY = 'htSummerDiscountDismissed'; - const IMG = '/images/discount.jpeg'; - const TXT = 'HT Summer Discount, Last Days!'; + const KEY = 'htSummerDiscountsDismissed'; + const IMG = '/images/discount.jpeg'; + const TXT = 'Click here for HT Summer Discounts, Last Days!'; + const URL = 'https://training.hacktricks.xyz'; /* Stop if user already dismissed */ if (localStorage.getItem(KEY) === 'true') return; @@ -32,13 +33,37 @@ display: flex; flex-direction: column; align-items: stretch; `); - /* --- Title bar (separate, over image) --- */ + /* --- Title bar (link + close) --- */ const titleBar = $('div', ` - padding: 1rem; text-align: center; + position: relative; + padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */ + text-align: center; background: #222; color: #fff; font-size: 1.3rem; font-weight: 700; `); - titleBar.textContent = TXT; + + const link = $('a', ` + color: inherit; + text-decoration: none; + display: block; + `); + link.href = URL; + link.target = '_blank'; + link.rel = 'noopener noreferrer'; + link.textContent = TXT; + titleBar.appendChild(link); + + /* Close "X" (no persistence) */ + const closeBtn = $('button', ` + position: absolute; top: .25rem; right: .5rem; + background: transparent; border: none; + color: #fff; font-size: 1.4rem; line-height: 1; + cursor: pointer; padding: 0; margin: 0; + `); + closeBtn.setAttribute('aria-label', 'Close'); + closeBtn.textContent = '✕'; + closeBtn.onclick = () => overlay.remove(); + titleBar.appendChild(closeBtn); /* --- Image --- */ const img = $('img'); @@ -62,14 +87,15 @@ modal.append(titleBar, img, label); overlay.appendChild(modal); - (document.readyState === 'loading' - ? () => document.addEventListener('DOMContentLoaded', () => document.body.appendChild(overlay), { once: true }) - : () => document.body.appendChild(overlay))(); + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => document.body.appendChild(overlay), { once: true }); + } else { + document.body.appendChild(overlay); + } })(); - /** * HackTricks AI Chat Widget v1.16 – resizable sidebar * ---------------------------------------------------