# FreeIPA Pentesting
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 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** 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).
Ces informations ont été prises à partir des publications suivantes :
* [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a)
* [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1)
* [https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be](https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be)
## Informations de base
Il s'agit d'une **alternative** open source à Microsoft Windows **Active Directory**, principalement utilisée comme solution de gestion intégrée pour les environnements **Unix**. Tout comme Active Directory, FreeIPA implémente une infrastructure de **répertoire LDAP** complète soutenue par un centre de distribution de clés MIT **Kerberos**. Il utilise le système de certificats Dogtag pour la gestion des certificats CA & RA, ce qui lui permet de gérer l'authentification **multi-facteurs**, y compris les cartes à puce. SSSD est utilisé pour intégrer FreeIPA dans le processus d'authentification Unix standard.
## Empreintes digitales
### Fichiers et variables d'environnement
* **`/etc/krb5.conf` :** Le fichier `krb5.conf` contient les informations du client Kerberos requises pour être **inscrit dans le domaine**. Cela inclut les **emplacements des KDC et des serveurs d'administration** pour les royaumes Kerberos d'intérêt, les valeurs par défaut pour le royaume actuel et pour les applications Kerberos, et les mappages des noms d'hôtes sur les royaumes Kerberos.
* **`/etc/ipa/default.conf` :** Il s'agit du **fichier de configuration par défaut pour les serveurs IPA**, il est utilisé pour définir les valeurs par défaut à appliquer lors de l'exécution des clients et des serveurs IPA.
* **`/etc/krb5.keytab` :** Le fichier `krb5.keytab` est **obligatoire** sur tous les hôtes à l'intérieur du **domaine**. Il est requis dans le cadre du processus d'**authentification** au KDC.
* **`KRB5CCNAME` :** S'il est défini, cette variable pointe vers l'**emplacement du fichier CCACHE Ticket** à utiliser pour l'authentification.
* **`KRB5_KTNAME` :** S'il est défini, cette variable pointe vers l'**emplacement** du **fichier Keytab** à utiliser pour l'authentification.
* **`KRB5_CONFIG` :** S'il est défini, cette variable pointe vers l'**emplacement** du **fichier de configuration Kerberos**.
* **`KRB5_KDC_PROFILE` :** S'il est défini, cette variable pointe vers l'**emplacement de la configuration KDC**, qui contient des directives de configuration supplémentaires pour le démon Key Distribution Center.
* **`KRB5RCACHETYPE` :** Cette variable spécifie le **type par défaut de cache de rejeu** à utiliser pour les serveurs.
* **`KRB5RCACHEDIR` :** Cette variable spécifie le **répertoire par défaut pour les caches de rejeu** utilisés par les serveurs.
* **`KRB5_TRACE` :** Cette variable spécifie un **nom de fichier pour écrire la sortie de journal de trace**. Les journaux de trace peuvent aider à éclairer les décisions prises en interne par les bibliothèques Kerberos.
* **`KRB5_CLIENT_KTNAME` :** Cette variable définit le **nom de fichier par défaut du client keytab**.
* **`KPROP_PORT` :** Cette variable définit le **port par défaut pour kprop** à utiliser.
### Binaires
* **ipa :** Ce binaire est la norme pour **gérer un domaine FreeIPA**. Il peut être utilisé pour gérer des hôtes, des utilisateurs, des règles sudo, et bien plus encore.
* **kdestroy :** Le binaire kdestroy est utilisé pour **détruire** tous les **tickets Kerberos actuels** dans la session de l'utilisateur.
* **kinit :** Le binaire kinit est utilisé pour **établir** ou **renouveler** les **tickets Kerberos**.
* **klist :** Le binaire klist **liste** tous les **tickets Kerberos actuels en cours d'utilisation**, et les principaux auxquels les tickets donnent accès.
* **kpasswd :** La commande kpasswd est utilisée pour **changer le mot de passe d'un principal Kerberos**. kpasswd demande d'abord le mot de passe Kerberos actuel, puis demande deux fois à l'utilisateur le nouveau mot de passe, et le mot de passe est changé.
* **ksu :** Ksu peut être utilisé comme **alternative au binaire su**, pour basculer le **contexte utilisateur actuel**.
* **kswitch :** La commande kswitch **basculera** le **cache de crédential actuel en cours d'utilisation**.
* **kvno :** Le binaire kvno acquiert un **ticket de service** pour les **principaux Kerberos spécifiés** et affiche les numéros de version de clé de chacun.
### Réseau
Voici à quoi pourrait ressembler un serveur FreeIPA :
## Authentification
Étant donné que FreeIPA utilise **Kerberos pour l'authentification**, ce processus est très similaire à l'**authentification** dans **Active Directory**. Pour **accéder** aux ressources du domaine, un utilisateur doit avoir un **ticket Kerberos valide** pour cette ressource. Ces tickets peuvent être stockés dans un certain nombre d'emplacements différents en fonction de la configuration du domaine FreeIPA.
### Fichiers de tickets CCACHE
Lorsque les tickets sont définis pour être **stockés** sous forme de **fichier** sur **disque**, le format et le type standard est un fichier **CCACHE**. Il s'agit d'un format de fichier binaire simple pour stocker les informations d'identification Kerberos. Ces fichiers sont généralement stockés dans **`/tmp`** et sont limités par des permissions **600**. Du point de vue d'un attaquant, cela est important pour les raisons suivantes :
1. Les tickets valides peuvent être **utilisés pour l'authentification**, **sans** avoir besoin du **mot de passe** en texte clair des utilisateurs respectifs.
2. Les tickets **CCACHE** sont hautement **portables**. Ils peuvent être télécharg
```
klist /tmp/krb5cc_0
```
Pour un attaquant, il est très facile de **réutiliser** un ticket CCACHE valide. Pour **réutiliser** un ticket CCACHE valide, **exportez** **KRB5CCNAME** vers le **chemin** du fichier de ticket valide. Le système devrait reconnaître la variable d'environnement et tentera d'utiliser ce matériel d'identification lors de l'interaction avec le domaine.
```bash
export KRB5CCNAME=/tmp/krb5cc_0
klist
```
### **Unix Keyring**
Les tickets CCACHE peuvent également être **stockés** dans le **keyring** Linux. Le keyring vit à l'intérieur du **noyau** et donne aux administrateurs **plus de contrôle sur la récupération et l'utilisation des tickets stockés**. Les tickets peuvent être délimités de différentes manières :
* **`KEYRING:name` :** Les tickets sont délimités à un keyring nommé spécifique.
* **`KEYRING:process:name` :** Les tickets sont délimités à un identifiant de processus spécifique.
* **`KEYRING:thread:name` :** Les tickets sont délimités à un thread spécifique.
* **`KEYRING:session:name` :** Les tickets sont délimités à une session utilisateur spécifique.
* **`KEYRING:persistent:uidnumber` :** Les tickets sont délimités à un utilisateur spécifique indépendamment de la session (par défaut).
Selon la manière dont l'administrateur a délimité le ticket stocké dans le keyring Unix, son analyse peut être difficile. Cependant, la **portée** **par défaut** pour les tickets CCACHE dans le keyring Unix est **`KEYRING:persistent:uidnumber`**. Heureusement, si vous êtes dans le **contexte** de l'**utilisateur**, `klist` peut **analyser** ces informations pour nous.
En tant qu'attaquant, **réutiliser un ticket CCACHE** stocké dans le **keyring** Unix est assez **difficile** selon la manière dont le ticket est délimité. Heureusement, [@Zer1t0](https://github.com/Zer1t0) de [@Tarlogic](https://twitter.com/Tarlogic) a créé un outil qui peut extraire les tickets Kerberos du keyring Unix. L'outil s'appelle **Tickey** et peut être trouvé [**ici**](https://github.com/TarlogicSecurity/tickey).
### Keytab
{% hint style="warning" %}
Généralement, chaque hôte est déployé avec une clé d'identification keytab pour cet hôte qui peut être utilisée pour obtenir un ticket de validation de ticket (TGT) de cache de crédential valide pour l'hôte lui-même.
{% endhint %}
Il se compose de paires de **principaux Kerberos et de clés chiffrées** qui sont dérivées du mot de passe Kerberos associé au principal. Étant donné que ces clés sont dérivées du mot de passe du principal, si ce **mot de passe change, la keytab sera invalidée**.
Les fichiers Keytab peuvent être utilisés pour **obtenir un ticket de validation de ticket** (TGT) pour le principal auquel il est délimité. Ce processus d'authentification **ne nécessite pas le mot de passe**, car il contient des clés dérivées du mot de passe.
L'analyse d'un fichier Keytab est très facile et peut être accomplie de quelques manières. La manière la plus facile de **décoder** un fichier **keytab** est avec **klist**. La deuxième méthode utilise un excellent utilitaire Python que [Cody Thomas](https://medium.com/u/645ffcef8682?source=post\_page-----77e73d837d6a--------------------------------) a créé. Son projet \*\*\*\* [**KeytabParser**](https://github.com/its-a-feature/KeytabParser) \*\*\*\* analysera le principal et ses clés chiffrées pertinentes.
Les attaquants peuvent **réutiliser les crédentials stockées dans les fichiers keytab en générant un ticket CCACHE** via le binaire kinit.
```powershell
# Parse keytab
klist -k /rtc/krb5.keytab
# Get TGT
kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
```
### Fiche de triche
Vous pouvez trouver plus d'informations sur la façon d'utiliser les tickets dans Linux en suivant le lien suivant:
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
{% endcontent-ref %}
## Énumération
{% hint style="warning" %}
Vous pouvez effectuer l'**énumération** via **ldap** et d'autres outils **binaires**, ou en **se connectant à la page web sur le port 443 du serveur FreeIPA**.
{% endhint %}
### Hôtes, Utilisateurs et Groupes
Il est possible de créer des **hôtes**, des **utilisateurs** et des **groupes**. Les hôtes et les utilisateurs sont triés dans des conteneurs appelés «**Groupes d'hôtes**» et «**Groupes d'utilisateurs**» respectivement. Ceux-ci sont similaires aux **Unités organisationnelles** (OU).
Par défaut dans FreeIPA, le serveur LDAP permet les **liens anonymes**, et une grande quantité de données est énumérable **non authentifiée**. Cela peut énumérer toutes les données disponibles non authentifiées:
```
ldapsearch -x
```
Pour obtenir **plus d'informations**, vous devez utiliser une session **authentifiée** (consultez la section Authentification pour apprendre comment préparer une session authentifiée).
```bash
# Get all users of domain
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local"
# Get users groups
ldapsearch -Y gssapi -b "cn=groups,cn=accounts,dc=domain_name,dc=local"
# Get all the hosts
ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=domain_name,dc=local"
# Get hosts groups
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local"
```
À partir d'une machine jointe à un domaine, vous pourrez utiliser les **binaires installés** pour énumérer le domaine :
```bash
ipa user-find
ipa usergroup-find
ipa host-find
ipa host-group-find
-------------------
ipa user-show --all
ipa usergroup-show --all
ipa host-find --all
ipa hostgroup-show --all
```
{% hint style="info" %}
L'utilisateur **admin** de **FreeIPA** est l'équivalent des administrateurs de domaine d'**AD**.
{% endhint %}
### Hashes
L'utilisateur **root** du serveur **IPA** a accès aux **hashes** de mots de passe.
* Le hash de mot de passe d'un utilisateur est stocké en **base64** dans l'**attribut** "userPassword". Ce hash peut être **SSHA512** (anciennes versions de FreeIPA) ou **PBKDF2\_SHA256**.
* Le **Nthash** du mot de passe est stocké en **base64** dans "ipaNTHash" si le système est **intégré** à **AD**.
Pour casser ces hashes :
• Si FreeIPA est intégré à AD, **ipaNTHash** est facile à casser : vous devez **décoder** **base64** -> le réencoder en **hexadécimal ASCII** -> John The Ripper ou **hashcat** peuvent vous aider à le casser rapidement.
• Si une ancienne version de FreeIPA est utilisée, **SSHA512** est utilisé : vous devez décoder **base64** -> trouver le **hash SSHA512** -> John The Ripper ou **hashcat** peuvent vous aider à le casser.
• Si une nouvelle version de FreeIPA est utilisée, **PBKDF2\_SHA256** est utilisé : vous devez décoder **base64** -> trouver **PBKDF2\_SHA256** -> sa **longueur** est de 256 octets. John peut travailler avec 256 bits (32 octets) -> SHA-265 est utilisé comme fonction pseudo-aléatoire, la taille de bloc est de 32 octets -> vous pouvez utiliser uniquement les premiers 256 bits de notre hash PBKDF2\_SHA256 -> John The Ripper ou hashcat peuvent vous aider à le casser.
Pour extraire les hashes, vous devez être **root dans le serveur FreeIPA**, là vous pouvez utiliser l'outil **`dbscan`** pour les extraire :
### Règles HBAC
Ce sont les règles qui accordent des autorisations spécifiques aux utilisateurs ou aux hôtes sur les ressources (hôtes, services, groupes de services...).
```bash
# Enumerate using ldap
ldapsearch -Y gssapi -b "cn=hbac,dc=domain_name,dc=local"
# Using ipa
ipa hbacrule-find
# Show info of rule
ipa hbacrule-show --all
```
#### Règles Sudo
FreeIPA permet de **gérer les permissions sudo** à partir d'une source **centralisée** grâce aux règles sudo. Ces ensembles de règles peuvent être utilisés pour restreindre ou déléguer la capacité à **exécuter des commandes en tant que sudo** sur les hôtes inscrits dans le domaine. En tant qu'attaquant, nous pouvons énumérer les hôtes et les utilisateurs auxquels ces ensembles de règles sont appliqués, ainsi que les commandes autorisées par l'ensemble de règles.
```bash
# Enumerate using ldap
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
# Using ipa
ipa sudorule-find
# Show info of rule
ipa sudorule-show --all
```
### Contrôle d'accès basé sur les rôles
Chaque **rôle** contient un ensemble de **privilèges**, et ces privilèges respectifs contiennent un **ensemble de permissions**. Les rôles peuvent être **appliqués aux utilisateurs**, aux **groupes d'utilisateurs**, aux **hôtes**, aux groupes d'hôtes et aux services. Pour illustrer ce concept, discutons du rôle par défaut "Administrateur d'utilisateurs" dans FreeIPA.
Comme le montre la capture d'écran ci-dessus, le rôle "Administrateur d'utilisateurs" contient les privilèges suivants :
* **Administrateurs d'utilisateurs**
* **Administrateurs de groupes**
* **Administrateurs d'utilisateurs de la scène**
Nous pouvons aller plus loin et énumérer les **permissions** déléguées à chaque **privilège** :
Comme nous pouvons le voir, le rôle "Administrateur d'utilisateurs" contient un **grand nombre de permissions** à l'intérieur de l'environnement. Comprendre le concept général et la structure des **rôles**, des **privilèges** et des **permissions** peut être crucial pour identifier les chemins d'attaque dans tout l'environnement.
```bash
# Using ldap
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
# Using ipa binary
ipa role-find
ipa role-show --all
ipa privilege-find
ipa privilege-show --all
ipa permission-find
ipa permission-show --all
```
### Exemple de scénario d'attaque
Dans [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e), vous pouvez trouver un exemple simple de la façon d'abuser de certaines autorisations pour compromettre le domaine.
### Linikatz
[https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
## Privesc
### ~~Création d'un utilisateur root~~
{% hint style="warning" %}
Si vous pouvez **créer un nouvel utilisateur avec le nom `root`**, vous pouvez vous faire passer pour lui et vous pourrez **SSH dans n'importe quelle machine en tant que root.**
**CELA A ÉTÉ CORRIGÉ.**
{% endhint %}
Le privilège "**Administrateurs d'utilisateurs**" est très puissant (comme son nom l'indique) :
Avec ce privilège, on peut avoir beaucoup de pouvoir différent pour affecter les utilisateurs à l'intérieur de l'environnement. En utilisant ce privilège, nous pouvons **créer un nouvel utilisateur dans le domaine FreeIPA nommé \_root**.\_
Une fois que l'utilisateur est créé dans le domaine, nous pouvons **obtenir un ticket pour le compte avec \_kinit**\_.
Maintenant, nous pouvons essayer de **SSH** en utilisant notre nouveau compte de domaine root.
Comme le montre la figure, cela **fait passer l'utilisateur en compte root local** ! Ainsi, simplement en créant un utilisateur de domaine pour un utilisateur local, nous avons pu nous authentifier en utilisant le compte _root@WESTEROS.LOCAL_ et obtenir le **contexte utilisateur du compte root local**_._
Pour plus de détails sur cette vulnérabilité, consultez [_https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b_](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)\\
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 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)**.**
* **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).