mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
Translated ['macos-hardening/macos-auto-start-locations.md', 'macos-hard
This commit is contained in:
parent
71282dd6af
commit
13e0f1daeb
4 changed files with 159 additions and 193 deletions
BIN
.gitbook/assets/image (676).png
Normal file
BIN
.gitbook/assets/image (676).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
BIN
.gitbook/assets/image (677).png
Normal file
BIN
.gitbook/assets/image (677).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
|
@ -4,10 +4,10 @@
|
|||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
@ -16,7 +16,7 @@ Voici les emplacements sur le système qui pourraient conduire à l'**exécution
|
|||
|
||||
### Launchd
|
||||
|
||||
**`launchd`** est le **premier** **processus** exécuté par le noyau OX S au démarrage et le dernier à se terminer à l'arrêt. Il doit toujours avoir le **PID 1**. Ce processus **lira et exécutera** les configurations indiquées dans les **plists ASEP** dans :
|
||||
**`launchd`** est le **premier** **processus** exécuté par le noyau OX S au démarrage et le dernier à se terminer à l'arrêt. Il devrait toujours avoir le **PID 1**. Ce processus **lit et exécute** les configurations indiquées dans les **plists ASEP** dans :
|
||||
|
||||
* `/Library/LaunchAgents` : Agents par utilisateur installés par l'administrateur
|
||||
* `/Library/LaunchDaemons` : Daemons système installés par l'administrateur
|
||||
|
@ -25,35 +25,35 @@ Voici les emplacements sur le système qui pourraient conduire à l'**exécution
|
|||
|
||||
Lorsqu'un utilisateur se connecte, les plists situés dans `/Users/$USER/Library/LaunchAgents` et `/Users/$USER/Library/LaunchDemons` sont démarrés avec les **permissions des utilisateurs connectés**.
|
||||
|
||||
La **principale différence entre les agents et les daemons est que les agents sont chargés lorsque l'utilisateur se connecte et les daemons sont chargés au démarrage du système** (car il y a des services comme ssh qui doivent être exécutés avant que tout utilisateur n'accède au système). Les agents peuvent également utiliser l'interface graphique tandis que les daemons doivent s'exécuter en arrière-plan.
|
||||
La **principale différence entre les agents et les daemons est que les agents sont chargés lorsque l'utilisateur se connecte et les daemons sont chargés au démarrage du système** (car il y a des services comme ssh qui doivent être exécutés avant que tout utilisateur n'accède au système). De plus, les agents peuvent utiliser l'interface graphique tandis que les daemons doivent s'exécuter en arrière-plan.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.apple.someidentifier</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/username/malware</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
|
||||
<key>StartInterval</key>
|
||||
<integer>800</integer> <!--Execute each 800s-->
|
||||
<key>KeepAlive</key>
|
||||
<dict>
|
||||
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
|
||||
<!--If previous is true, then re-execute in successful exit-->
|
||||
</dict>
|
||||
<key>Label</key>
|
||||
<string>com.apple.someidentifier</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/username/malware</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
|
||||
<key>StartInterval</key>
|
||||
<integer>800</integer> <!--Execute each 800s-->
|
||||
<key>KeepAlive</key>
|
||||
<dict>
|
||||
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
|
||||
<!--If previous is true, then re-execute in successful exit-->
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Il y a des cas où un **agent doit être exécuté avant que l'utilisateur ne se connecte**, ceux-ci sont appelés **PreLoginAgents**. Par exemple, cela est utile pour fournir une technologie d'assistance à la connexion. Ils peuvent également être trouvés dans `/Library/LaunchAgents` (voir [**ici**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) un exemple).
|
||||
Il y a des cas où un **agent doit être exécuté avant la connexion de l'utilisateur**, on les appelle des **PreLoginAgents**. Par exemple, cela est utile pour fournir une technologie d'assistance lors de la connexion. Ils peuvent également être trouvés dans `/Library/LaunchAgents` (voir [**ici**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) un exemple).
|
||||
|
||||
\{% hint style="info" %\} Les nouveaux fichiers de configuration de Daemons ou Agents seront **chargés après le prochain redémarrage ou en utilisant** `launchctl load <target.plist>` Il est **également possible de charger des fichiers .plist sans cette extension** avec `launchctl -F <file>` (cependant, ces fichiers plist ne seront pas automatiquement chargés après le redémarrage).\
|
||||
Il est également possible de **décharger** avec `launchctl unload <target.plist>` (le processus pointé par celui-ci sera terminé),
|
||||
|
||||
Pour **s'assurer** qu'il n'y a **rien** (comme une substitution) **empêchant** un **Agent** ou un **Daemon** **de** **s'exécuter**, exécutez : `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist` \{% endhint %\}
|
||||
Pour **s'assurer** qu'il n'y a rien (comme une substitution) **empêchant** un **Agent** ou un **Daemon** de s'exécuter, exécutez : `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist` \{% endhint %\}
|
||||
|
||||
Listez tous les agents et démons chargés par l'utilisateur actuel :
|
||||
```bash
|
||||
|
@ -65,15 +65,15 @@ Listez les tâches cron de l'**utilisateur actuel** avec:
|
|||
```bash
|
||||
crontab -l
|
||||
```
|
||||
Vous pouvez également voir toutes les tâches cron des utilisateurs dans **`/usr/lib/cron/tabs/`** et **`/var/at/tabs/`** (nécessite des privilèges root).
|
||||
Vous pouvez également voir toutes les tâches cron des utilisateurs dans **`/usr/lib/cron/tabs/`** et **`/var/at/tabs/`** (nécessite les droits root).
|
||||
|
||||
Dans MacOS, plusieurs dossiers exécutant des scripts avec **une certaine fréquence** peuvent être trouvés dans:
|
||||
Dans MacOS, plusieurs dossiers exécutant des scripts à **une certaine fréquence** peuvent être trouvés dans :
|
||||
```bash
|
||||
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
||||
```
|
||||
Vous pouvez trouver les tâches **cron** régulières, les tâches **at** (peu utilisées) et les tâches **périodiques** (principalement utilisées pour nettoyer les fichiers temporaires). Les tâches périodiques quotidiennes peuvent être exécutées par exemple avec: `periodic daily`.
|
||||
Voici où vous pouvez trouver les **tâches cron** régulières, les **tâches at** (peu utilisées) et les **tâches périodiques** (principalement utilisées pour nettoyer les fichiers temporaires). Les tâches périodiques quotidiennes peuvent être exécutées par exemple avec la commande : `periodic daily`.
|
||||
|
||||
Les scripts périodiques (**`/etc/periodic`**) sont exécutés en raison des **daemons de lancement** configurés dans `/System/Library/LaunchDaemons/com.apple.periodic*`. Notez que si un script est stocké dans `/etc/periodic/` comme moyen d'**escalader les privilèges**, il sera **exécuté** en tant que **propriétaire du fichier**.
|
||||
Les scripts périodiques (**`/etc/periodic`**) sont exécutés en raison des **daemons de lancement** configurés dans `/System/Library/LaunchDaemons/com.apple.periodic*`. Notez que si un script est stocké dans `/etc/periodic/` dans le but d'**escalader les privilèges**, il sera **exécuté** en tant que **propriétaire du fichier**.
|
||||
```bash
|
||||
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
||||
-rw-r--r-- 1 root wheel 887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
|
||||
|
@ -85,11 +85,11 @@ ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
|||
Afin d'installer un KEXT en tant qu'élément de démarrage, il doit être **installé dans l'un des emplacements suivants** :
|
||||
|
||||
* `/System/Library/Extensions`
|
||||
* Fichiers KEXT intégrés au système d'exploitation OS X.
|
||||
* Fichiers KEXT intégrés au système d'exploitation OS X.
|
||||
* `/Library/Extensions`
|
||||
* Fichiers KEXT installés par des logiciels tiers.
|
||||
* Fichiers KEXT installés par des logiciels tiers
|
||||
|
||||
Vous pouvez lister les fichiers kext actuellement chargés avec :
|
||||
Vous pouvez répertorier les fichiers kext actuellement chargés avec :
|
||||
```bash
|
||||
kextstat #List loaded kext
|
||||
kextload /path/to/kext.kext #Load a new one based on path
|
||||
|
@ -108,19 +108,25 @@ Il est possible de les lister, d'en ajouter et d'en supprimer depuis la ligne de
|
|||
osascript -e 'tell application "System Events" to get the name of every login item'
|
||||
|
||||
#Add an item:
|
||||
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'
|
||||
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'
|
||||
|
||||
#Remove an item:
|
||||
osascript -e 'tell application "System Events" to delete login item "itemname"'
|
||||
osascript -e 'tell application "System Events" to delete login item "itemname"'
|
||||
```
|
||||
Ces éléments sont stockés dans le fichier /Users/\<username>/Library/Application Support/com.apple.backgroundtaskmanagementagent
|
||||
|
||||
### ZIP en tant qu'élément de connexion
|
||||
|
||||
Si vous stockez un fichier **ZIP** en tant qu'**élément de connexion**, l'**`Archive Utility`** l'ouvrira et si le zip était par exemple stocké dans **`~/Library`** et contenait le dossier **`LaunchAgents/file.plist`** avec une porte dérobée, ce dossier sera créé (il ne l'est pas par défaut) et le plist sera ajouté afin que la prochaine fois que l'utilisateur se connecte, la **porte dérobée indiquée dans le plist sera exécutée**.
|
||||
|
||||
Une autre option serait de créer les fichiers **`.bash_profile`** et **`.zshenv`** à l'intérieur du répertoire HOME de l'utilisateur, de sorte que si le dossier LaunchAgents existe déjà, cette technique fonctionnerait toujours.
|
||||
|
||||
### At
|
||||
|
||||
Les "tâches At" sont utilisées pour **planifier des tâches à des moments spécifiques**.\
|
||||
Ces tâches diffèrent de cron en ce qu'elles sont des tâches ponctuelles qui sont supprimées après leur exécution. Cependant, elles **survivent à un redémarrage du système** et ne peuvent donc pas être exclues en tant que menace potentielle.
|
||||
Les "tâches at" sont utilisées pour **planifier des tâches à des moments spécifiques**.\
|
||||
Ces tâches diffèrent de cron en ce sens qu'**elles sont des tâches ponctuelles** qui sont supprimées après leur exécution. Cependant, elles **survivent à un redémarrage du système**, il ne faut donc pas les exclure en tant que menace potentielle.
|
||||
|
||||
Par **défaut**, elles sont **désactivées**, mais l'utilisateur **root** peut les **activer** avec:
|
||||
Par **défaut**, elles sont **désactivées**, mais l'utilisateur **root** peut les **activer** avec :
|
||||
```bash
|
||||
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
|
||||
```
|
||||
|
@ -141,15 +147,15 @@ EOF
|
|||
chmod +x $HOME/hook.sh
|
||||
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
|
||||
```
|
||||
Cette configuration est stockée dans `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist`
|
||||
Ce paramètre est stocké dans `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist`
|
||||
```bash
|
||||
defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
|
||||
{
|
||||
LoginHook = "/Users/username/hook.sh";
|
||||
MiniBuddyLaunch = 0;
|
||||
TALLogoutReason = "Shut Down";
|
||||
TALLogoutSavesState = 0;
|
||||
oneTimeSSMigrationComplete = 1;
|
||||
LoginHook = "/Users/username/hook.sh";
|
||||
MiniBuddyLaunch = 0;
|
||||
TALLogoutReason = "Shut Down";
|
||||
TALLogoutSavesState = 0;
|
||||
oneTimeSSMigrationComplete = 1;
|
||||
}
|
||||
```
|
||||
Pour le supprimer :
|
||||
|
@ -160,134 +166,87 @@ Dans l'exemple précédent, nous avons créé et supprimé un **LoginHook**, il
|
|||
|
||||
Celui de l'utilisateur root est stocké dans `/private/var/root/Library/Preferences/com.apple.loginwindow.plist`
|
||||
|
||||
### Préférences des applications
|
||||
|
||||
Dans **`~/Library/Preferences`** sont stockées les préférences de l'utilisateur dans les applications. Certaines de ces préférences peuvent contenir une configuration pour **exécuter d'autres applications/scripts**.
|
||||
|
||||
Par exemple, le Terminal peut exécuter une commande au démarrage :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (676).png" alt="" width="495"><figcaption></figcaption></figure>
|
||||
|
||||
Cette configuration est reflétée dans le fichier **`~/Library/Preferences/com.apple.Terminal.plist`** de cette manière :
|
||||
```bash
|
||||
[...]
|
||||
"Window Settings" => {
|
||||
"Basic" => {
|
||||
"CommandString" => "touch /tmp/terminal_pwn"
|
||||
"Font" => {length = 267, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000000cf }
|
||||
"FontAntialias" => 1
|
||||
"FontWidthSpacing" => 1.004032258064516
|
||||
"name" => "Basic"
|
||||
"ProfileCurrentVersion" => 2.07
|
||||
"RunCommandAsShell" => 0
|
||||
"type" => "Window Settings"
|
||||
}
|
||||
[...]
|
||||
```
|
||||
Donc, si le plist des préférences du terminal dans le système peut être écrasé, alors la fonctionnalité **`open`** peut être utilisée pour **ouvrir le terminal et exécuter cette commande**.
|
||||
|
||||
### Emond
|
||||
|
||||
Apple a introduit un mécanisme de journalisation appelé **emond**. Il semble qu'il n'ait jamais été entièrement développé et que le développement ait été **abandonné** par Apple au profit d'autres mécanismes, mais il reste **disponible**.
|
||||
Apple a introduit un mécanisme de journalisation appelé **emond**. Il semble qu'il n'ait jamais été entièrement développé et que le développement ait peut-être été **abandonné** par Apple au profit d'autres mécanismes, mais il reste **disponible**.
|
||||
|
||||
Ce service peu connu peut **ne pas être très utile pour un administrateur Mac**, mais pour un acteur de menace, une très bonne raison serait de l'utiliser comme un mécanisme de **persistance que la plupart des administrateurs macOS ne connaissent probablement pas**. Détecter l'utilisation malveillante d'emond ne devrait pas être difficile, car le System LaunchDaemon du service ne recherche des scripts à exécuter qu'à un seul endroit :
|
||||
Ce service peu connu peut **ne pas être très utile pour un administrateur Mac**, mais pour un acteur malveillant, une très bonne raison serait de l'utiliser comme un **mécanisme de persistance que la plupart des administrateurs macOS ne connaîtraient probablement pas**. Détecter une utilisation malveillante d'emond ne devrait pas être difficile, car le LaunchDaemon système du service recherche les scripts à exécuter uniquement à un seul endroit :
|
||||
```bash
|
||||
ls -l /private/var/db/emondClients
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
**Comme cela n'est pas beaucoup utilisé, tout ce qui se trouve dans ce dossier doit être considéré comme suspect**
|
||||
**Comme cela n'est pas beaucoup utilisé, tout ce qui se trouve dans ce dossier devrait être suspect**
|
||||
{% endhint %}
|
||||
|
||||
### Éléments de démarrage
|
||||
|
||||
\{% hint style="danger" %\} **Ceci est obsolète, donc rien ne devrait être trouvé dans les répertoires suivants.** \{% endhint %\}
|
||||
{% hint style="danger" %}
|
||||
**Ceci est obsolète, donc rien ne devrait être trouvé dans les répertoires suivants.**
|
||||
{% endhint %}
|
||||
|
||||
Un **élément de démarrage** est un **répertoire** qui est **placé** dans l'un de ces deux dossiers : `/Library/StartupItems/` ou `/System/Library/StartupItems/`
|
||||
Un **StartupItem** est un **répertoire** qui est **placé** dans l'un de ces deux dossiers : `/Library/StartupItems/` ou `/System/Library/StartupItems/`
|
||||
|
||||
Après avoir placé un nouveau répertoire dans l'un de ces deux emplacements, **deux autres éléments** doivent être placés à l'intérieur de ce répertoire. Ces deux éléments sont un **script rc** et un **plist** qui contient quelques paramètres. Ce plist doit être appelé "**StartupParameters.plist**".
|
||||
{% endtab %}
|
||||
{% tab title="StartupParameters.plist" %\}
|
||||
Après avoir placé un nouveau répertoire dans l'un de ces deux emplacements, **deux autres éléments** doivent être placés à l'intérieur de ce répertoire. Ces deux éléments sont un **script rc** et un **plist** qui contient quelques paramètres. Ce plist doit être appelé "**StartupParameters.plist**".
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="StartupParameters.plist" %}
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>This is a description of this service</string>
|
||||
<key>OrderPreference</key>
|
||||
<string>None</string> <!--Other req services to execute before this -->
|
||||
<key>Provides</key>
|
||||
<array>
|
||||
<string>superservicename</string> <!--Name of the services provided by this file -->
|
||||
</array>
|
||||
<key>Description</key>
|
||||
<string>This is a description of this service</string>
|
||||
<key>OrderPreference</key>
|
||||
<string>None</string> <!--Other req services to execute before this -->
|
||||
<key>Provides</key>
|
||||
<array>
|
||||
<string>superservicename</string> <!--Name of the services provided by this file -->
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="superservicename" %}
|
||||
|
||||
## Emplacement de démarrage automatique de macOS
|
||||
|
||||
### Emplacements de démarrage automatique
|
||||
|
||||
Les emplacements de démarrage automatique de macOS sont les suivants:
|
||||
|
||||
* `/Library/LaunchAgents/`
|
||||
* `/Library/LaunchDaemons/`
|
||||
* `/System/Library/LaunchAgents/`
|
||||
* `/System/Library/LaunchDaemons/`
|
||||
* `~/Library/LaunchAgents/`
|
||||
|
||||
Les deux premiers emplacements sont utilisés pour les services système, tandis que les deux derniers sont utilisés pour les services utilisateur.
|
||||
|
||||
### Comment fonctionnent les emplacements de démarrage automatique
|
||||
|
||||
Les emplacements de démarrage automatique contiennent des fichiers de configuration de service qui indiquent à macOS comment démarrer et gérer les services. Les fichiers de configuration peuvent être écrits en XML ou en format binaire.
|
||||
|
||||
Les fichiers de configuration de service peuvent être utilisés pour démarrer des programmes, des scripts ou des commandes au démarrage de macOS ou lorsqu'un utilisateur se connecte.
|
||||
|
||||
### Comment trouver les emplacements de démarrage automatique
|
||||
|
||||
Pour trouver les emplacements de démarrage automatique, vous pouvez utiliser la commande `launchctl`. Par exemple, pour lister tous les services en cours d'exécution, vous pouvez utiliser la commande suivante:
|
||||
|
||||
```bash
|
||||
sudo launchctl list
|
||||
```
|
||||
|
||||
Pour lister tous les services dans un emplacement de démarrage automatique spécifique, vous pouvez utiliser la commande suivante:
|
||||
|
||||
```bash
|
||||
sudo launchctl list <emplacement>
|
||||
```
|
||||
|
||||
### Comment désactiver les services de démarrage automatique
|
||||
|
||||
Pour désactiver un service de démarrage automatique, vous pouvez utiliser la commande `launchctl`. Par exemple, pour désactiver le service `com.apple.AirPlayXPCHelper`, vous pouvez utiliser la commande suivante:
|
||||
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.AirPlayXPCHelper.plist
|
||||
```
|
||||
|
||||
### Comment ajouter un service de démarrage automatique
|
||||
|
||||
Pour ajouter un service de démarrage automatique, vous devez créer un fichier de configuration de service dans l'un des emplacements de démarrage automatique et y ajouter les informations de configuration appropriées. Par exemple, pour créer un service de démarrage automatique qui exécute un script Python au démarrage de macOS, vous pouvez créer un fichier `com.example.myservice.plist` dans le dossier `~/Library/LaunchAgents/` avec le contenu suivant:
|
||||
|
||||
```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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.example.myservice</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/usr/bin/python</string>
|
||||
<string>/path/to/myscript.py</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
Une fois que vous avez créé le fichier de configuration de service, vous pouvez charger le service en utilisant la commande `launchctl`. Par exemple, pour charger le service `com.example.myservice`, vous pouvez utiliser la commande suivante:
|
||||
|
||||
```bash
|
||||
launchctl load ~/Library/LaunchAgents/com.example.myservice.plist
|
||||
```
|
||||
|
||||
### Conclusion
|
||||
|
||||
Les emplacements de démarrage automatique de macOS sont un moyen pratique de démarrer des services au démarrage de macOS ou lorsqu'un utilisateur se connecte. En comprenant comment fonctionnent les emplacements de démarrage automatique et comment les utiliser, vous pouvez personnaliser le comportement de macOS pour répondre à vos besoins.
|
||||
{% tab title="superservicename" %}Le nom du super service
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
||||
StartService(){
|
||||
touch /tmp/superservicestarted
|
||||
touch /tmp/superservicestarted
|
||||
}
|
||||
|
||||
StopService(){
|
||||
rm /tmp/superservicestarted
|
||||
rm /tmp/superservicestarted
|
||||
}
|
||||
|
||||
RestartService(){
|
||||
echo "Restarting"
|
||||
echo "Restarting"
|
||||
}
|
||||
|
||||
RunService "$1"
|
||||
|
@ -341,16 +300,16 @@ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; ex
|
|||
#
|
||||
CheckForNetwork()
|
||||
{
|
||||
local test
|
||||
local test
|
||||
|
||||
if [ -z "${NETWORKUP:=}" ]; then
|
||||
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
|
||||
if [ "${test}" -gt 0 ]; then
|
||||
NETWORKUP="-YES-"
|
||||
else
|
||||
NETWORKUP="-NO-"
|
||||
fi
|
||||
fi
|
||||
if [ -z "${NETWORKUP:=}" ]; then
|
||||
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
|
||||
if [ "${test}" -gt 0 ]; then
|
||||
NETWORKUP="-YES-"
|
||||
else
|
||||
NETWORKUP="-NO-"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
alias ConsoleMessage=echo
|
||||
|
@ -360,25 +319,25 @@ alias ConsoleMessage=echo
|
|||
#
|
||||
GetPID ()
|
||||
{
|
||||
local program="$1"
|
||||
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
|
||||
local pid=""
|
||||
local program="$1"
|
||||
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
|
||||
local pid=""
|
||||
|
||||
if [ -f "${pidfile}" ]; then
|
||||
pid=$(head -1 "${pidfile}")
|
||||
if ! kill -0 "${pid}" 2> /dev/null; then
|
||||
echo "Bad pid file $pidfile; deleting."
|
||||
pid=""
|
||||
rm -f "${pidfile}"
|
||||
fi
|
||||
fi
|
||||
if [ -f "${pidfile}" ]; then
|
||||
pid=$(head -1 "${pidfile}")
|
||||
if ! kill -0 "${pid}" 2> /dev/null; then
|
||||
echo "Bad pid file $pidfile; deleting."
|
||||
pid=""
|
||||
rm -f "${pidfile}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${pid}" ]; then
|
||||
echo "${pid}"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
if [ -n "${pid}" ]; then
|
||||
echo "${pid}"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
|
@ -386,19 +345,19 @@ GetPID ()
|
|||
#
|
||||
RunService ()
|
||||
{
|
||||
case $1 in
|
||||
start ) StartService ;;
|
||||
stop ) StopService ;;
|
||||
restart) RestartService ;;
|
||||
* ) echo "$0: unknown argument: $1";;
|
||||
esac
|
||||
case $1 in
|
||||
start ) StartService ;;
|
||||
stop ) StopService ;;
|
||||
restart) RestartService ;;
|
||||
* ) echo "$0: unknown argument: $1";;
|
||||
esac
|
||||
}
|
||||
```
|
||||
### Profils
|
||||
|
||||
Les profils de configuration peuvent forcer un utilisateur à utiliser certains paramètres de navigateur, des paramètres de proxy DNS ou des paramètres VPN. De nombreux autres payloads sont possibles, ce qui les rend propices à l'abus.
|
||||
Les profils de configuration peuvent contraindre un utilisateur à utiliser certains paramètres de navigateur, des paramètres de proxy DNS ou des paramètres de VPN. De nombreux autres charges utiles sont possibles, ce qui les rend propices à des abus.
|
||||
|
||||
Vous pouvez les énumérer en exécutant:
|
||||
Vous pouvez les énumérer en exécutant :
|
||||
```bash
|
||||
ls -Rl /Library/Managed\ Preferences/
|
||||
```
|
||||
|
@ -411,10 +370,10 @@ ls -Rl /Library/Managed\ Preferences/
|
|||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,64 +1,71 @@
|
|||
# Contournement de la Sandbox de Word sur macOS
|
||||
# Contournement de la sandbox macOS Office
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### Contournement de la Sandbox de Word via les Launch Agents
|
||||
### Contournement de la sandbox Word via les Launch Agents
|
||||
|
||||
L'application utilise une **Sandbox personnalisée** en utilisant l'entitlement **`com.apple.security.temporary-exception.sbpl`** et cette Sandbox personnalisée permet d'écrire des fichiers n'importe où tant que le nom de fichier commence par `~$` : `(require-any (require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~$[^/]+$")))`
|
||||
L'application utilise une **sandbox personnalisée** en utilisant l'autorisation **`com.apple.security.temporary-exception.sbpl`** et cette sandbox personnalisée permet d'écrire des fichiers n'importe où tant que le nom de fichier commence par `~$`: `(require-any (require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~$[^/]+$")))`
|
||||
|
||||
Par conséquent, l'évasion était aussi facile que **d'écrire un fichier `plist`** LaunchAgent dans `~/Library/LaunchAgents/~$escape.plist`.
|
||||
Par conséquent, l'évasion était aussi simple que **d'écrire un fichier `plist`** LaunchAgent dans `~/Library/LaunchAgents/~$escape.plist`.
|
||||
|
||||
Consultez le [**rapport original ici**](https://www.mdsec.co.uk/2018/08/escaping-the-sandbox-microsoft-office-on-macos/).
|
||||
|
||||
### Contournement de la Sandbox de Word via les Login Items et zip
|
||||
### Contournement de la sandbox Word via les Login Items et zip
|
||||
|
||||
(Rappelez-vous que depuis la première évasion, Word peut écrire des fichiers arbitraires dont le nom commence par `~$`).
|
||||
(Rappelez-vous que depuis la première évasion, Word peut écrire des fichiers arbitraires dont le nom commence par `~$`, bien qu'après le correctif de la vulnérabilité précédente, il n'était plus possible d'écrire dans `/Library/Application Scripts` ou dans `/Library/LaunchAgents`).
|
||||
|
||||
Il a été découvert qu'à partir de la Sandbox, il est possible de créer un **Login Item** (applications qui seront exécutées lorsque l'utilisateur se connecte). Cependant, ces applications **ne s'exécuteront pas à moins qu'elles ne soient pasar notariées** et qu'il n'est **pas possible d'ajouter des arguments** (vous ne pouvez donc pas simplement exécuter un shell inversé en utilisant **`bash`**).
|
||||
Il a été découvert qu'à partir de la sandbox, il est possible de créer un **élément de connexion** (des applications qui s'exécutent lorsque l'utilisateur se connecte). Cependant, ces applications **ne s'exécuteront pas** à moins qu'elles ne soient **notarisées** et il n'est **pas possible d'ajouter des arguments** (vous ne pouvez donc pas simplement exécuter un shell inversé en utilisant **`bash`**).
|
||||
|
||||
À partir de la précédente évasion de la Sandbox, Microsoft a désactivé l'option d'écriture de fichiers dans `~/Library/LaunchAgents`. Cependant, il a été découvert que si vous mettez un **fichier zip en tant que Login Item**, l'`Archive Utility` va simplement le **décompresser** à son emplacement actuel. Ainsi, comme par défaut le dossier `LaunchAgents` de `~/Library` n'est pas créé, il était possible de **compresser un plist dans `LaunchAgents/~$escape.plist`** et de **placer** le fichier zip dans **`~/Library`** afin que lorsqu'il est décompressé, il atteigne la destination de persistance.
|
||||
À partir de la précédente évasion de la sandbox, Microsoft a désactivé l'option d'écriture de fichiers dans `~/Library/LaunchAgents`. Cependant, il a été découvert que si vous mettez un **fichier zip en tant qu'élément de connexion**, l'`Archive Utility` le décompressera simplement à son emplacement actuel. Ainsi, comme par défaut le dossier `LaunchAgents` de `~/Library` n'est pas créé, il était possible de **compresser un fichier plist dans `LaunchAgents/~$escape.plist`** et de placer le fichier zip dans **`~/Library`** afin que lorsqu'il est décompressé, il atteigne la destination de persistance.
|
||||
|
||||
Consultez le [**rapport original ici**](https://objective-see.org/blog/blog\_0x4B.html).
|
||||
|
||||
### Contournement de la Sandbox de Word via les Login Items et .zshenv
|
||||
### Contournement de la sandbox Word via les Login Items et .zshenv
|
||||
|
||||
(Rappelez-vous que depuis la première évasion, Word peut écrire des fichiers arbitraires dont le nom commence par `~$`).
|
||||
|
||||
Cependant, la technique précédente avait une limitation, si le dossier **`~/Library/LaunchAgents`** existe parce qu'un autre logiciel l'a créé, cela échouera. Une chaîne de Login Items différente a donc été découverte pour cela.
|
||||
Cependant, la technique précédente avait une limitation : si le dossier **`~/Library/LaunchAgents`** existe parce qu'un autre logiciel l'a créé, cela échouerait. Une autre chaîne d'éléments de connexion a donc été découverte pour cela.
|
||||
|
||||
Un attaquant pourrait créer les fichiers **`.bash_profile`** et **`.zshenv`** avec la charge utile à exécuter, puis les compresser et **écrire le zip dans le dossier de l'utilisateur** victime : \~/\~$escape.zip.
|
||||
Un attaquant pourrait créer les fichiers **`.bash_profile`** et **`.zshenv`** avec la charge utile à exécuter, puis les compresser et **écrire le fichier zip dans le dossier de l'utilisateur** victime : **`~/~$escape.zip`**.
|
||||
|
||||
Ensuite, ajoutez le fichier zip aux **Login Items** et ensuite l'application **`Terminal`**. Lorsque l'utilisateur se reconnecte, le fichier zip sera décompressé dans les fichiers de l'utilisateur, écrasant **`.bash_profile`** et **`.zshenv`** et donc, le terminal exécutera l'un de ces fichiers (selon que bash ou zsh est utilisé).
|
||||
Ensuite, ajoutez le fichier zip aux **éléments de connexion** puis à l'application **`Terminal`**. Lorsque l'utilisateur se reconnecte, le fichier zip sera décompressé dans les fichiers de l'utilisateur, écrasant **`.bash_profile`** et **`.zshenv`** et donc, le terminal exécutera l'un de ces fichiers (selon l'utilisation de bash ou zsh).
|
||||
|
||||
Consultez le [**rapport original ici**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c).
|
||||
|
||||
### Contournement de la Sandbox de Word avec Open et les variables d'environnement
|
||||
### Contournement de la sandbox Word avec Open et les variables d'environnement
|
||||
|
||||
À partir des processus Sandbox, il est toujours possible d'appeler d'autres processus en utilisant l'utilitaire **`open`**. De plus, ces processus s'exécuteront **dans leur propre Sandbox**.
|
||||
À partir des processus en sandbox, il est toujours possible d'appeler d'autres processus en utilisant l'utilitaire **`open`**. De plus, ces processus s'exécuteront **dans leur propre sandbox**.
|
||||
|
||||
Il a été découvert que l'utilitaire open a l'option **`--env`** pour exécuter une application avec des **variables d'environnement spécifiques**. Par conséquent, il était possible de créer le fichier **`.zshenv`** dans un dossier **à l'intérieur** de la **sandbox** et d'utiliser `open` avec `--env` en définissant la variable **`HOME`** sur ce dossier en ouvrant cette application `Terminal`, qui exécutera le fichier `.zshenv` (pour une raison quelconque, il était également nécessaire de définir la variable `__OSINSTALL_ENVIROMENT`).
|
||||
Il a été découvert que l'utilitaire open dispose de l'option **`--env`** pour exécuter une application avec des **variables d'environnement spécifiques**. Par conséquent, il était possible de créer le fichier **`.zshenv`** dans un dossier **à l'intérieur** de la **sandbox** et d'utiliser `open` avec `--env` en définissant la variable **`HOME`** sur ce dossier, ouvrant ainsi l'application `Terminal` qui exécutera le fichier `.zshenv` (pour une raison quelconque, il était également nécessaire de définir la variable `__OSINSTALL_ENVIROMENT`).
|
||||
|
||||
Consultez le [**rapport original ici**](https://perception-point.io/blog/technical-analysis-of-cve-2021-30864/).
|
||||
|
||||
### Contournement de la Sandbox de Word avec Open et stdin
|
||||
### Contournement de la sandbox Word avec Open et stdin
|
||||
|
||||
L'utilitaire **`open`** prenait également en charge le paramètre **`--stdin`** (et après la précédente évasion, il n'était plus possible d'utiliser `--env`).
|
||||
|
||||
Le truc, c'est que même si **`python`** était signé par Apple, il **n'exécutera pas** un script avec l'attribut **`quarantine`**. Cependant, il était possible de lui passer un script depuis stdin afin qu'il ne vérifie pas s'il était mis en quarantaine ou non : 
|
||||
Le problème est que même si **`python`** était signé par Apple, il **n'exécutera pas** un script avec l'attribut **`quarantine`**. Cependant, il était possible de lui transmettre un script depuis stdin afin qu'il ne vérifie pas s'il était mis en quarantaine ou non : 
|
||||
|
||||
1. Déposez un fichier **`~$exploit.py`** avec des commandes Python arbitraires.
|
||||
2. Exécutez _open_ **`–stdin='~$exploit.py' -a Python`**, qui exécute l'application Python avec notre fichier déposé en tant qu'entrée standard. Python exécute joyeusement notre code, et comme c'est un processus enfant de _launchd_, il n'est pas soumis aux règles de la Sandbox de Word.
|
||||
2. Exécutez _open_ **`–stdin='~$exploit.py' -a Python`**, qui exécute l'application Python avec notre fichier déposé servant de son entrée standard. Python exécute notre code sans problème, et comme c'est un processus enfant de _launchd_, il n'est pas soumis aux règles de la sandbox de Word.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktr
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue