mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
187 lines
11 KiB
Markdown
187 lines
11 KiB
Markdown
# FreeIPA Pentesting
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## Informations de base
|
|
|
|
FreeIPA est une **alternative** open-source à Microsoft Windows **Active Directory**, principalement pour les environnements **Unix**. Il combine un **annuaire LDAP** complet avec un Centre de Distribution de Clés **Kerberos** MIT pour une gestion similaire à Active Directory. Utilisant le **Système de Certificats** Dogtag pour la gestion des certificats CA et RA, il prend en charge l'authentification **multi-facteurs**, y compris les cartes à puce. SSSD est intégré pour les processus d'authentification Unix.
|
|
|
|
## Empreintes
|
|
|
|
### Fichiers & Variables d'environnement
|
|
|
|
- Le fichier à `/etc/krb5.conf` est l'endroit où les informations du client Kerberos, nécessaires pour l'inscription dans le domaine, sont stockées. Cela inclut les emplacements des KDC et des serveurs administratifs, les paramètres par défaut et les mappages.
|
|
- Les paramètres par défaut à l'échelle du système pour les clients et serveurs IPA sont définis dans le fichier situé à `/etc/ipa/default.conf`.
|
|
- Les hôtes au sein du domaine doivent avoir un fichier `krb5.keytab` à `/etc/krb5.keytab` pour les processus d'authentification.
|
|
- Diverses variables d'environnement (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) sont utilisées pour pointer vers des fichiers et des paramètres spécifiques liés à l'authentification Kerberos.
|
|
|
|
### Binaires
|
|
|
|
Des outils tels que `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, et `kvno` sont essentiels pour gérer les domaines FreeIPA, traiter les tickets Kerberos, changer les mots de passe et acquérir des tickets de service, entre autres fonctionnalités.
|
|
|
|
### Réseau
|
|
|
|
Une illustration est fournie pour dépeindre une configuration typique de serveur FreeIPA.
|
|
|
|
## Authentification
|
|
|
|
L'authentification dans FreeIPA, utilisant **Kerberos**, reflète celle de **Active Directory**. L'accès aux ressources du domaine nécessite un ticket Kerberos valide, qui peut être stocké à divers emplacements selon la configuration du domaine FreeIPA.
|
|
|
|
### **Fichiers de tickets CCACHE**
|
|
|
|
Les fichiers CCACHE, généralement stockés dans **`/tmp`** avec des permissions **600**, sont des formats binaires pour stocker les informations d'identification Kerberos, importants pour l'authentification sans le mot de passe en clair de l'utilisateur en raison de leur portabilité. L'analyse d'un ticket CCACHE peut être effectuée à l'aide de la commande `klist`, et la réutilisation d'un ticket CCACHE valide implique d'exporter `KRB5CCNAME` vers le chemin du fichier de ticket.
|
|
|
|
### **Keyring Unix**
|
|
|
|
Alternativement, les tickets CCACHE peuvent être stockés dans le keyring Linux, offrant plus de contrôle sur la gestion des tickets. La portée du stockage des tickets varie (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`), avec `klist` capable d'analyser ces informations pour l'utilisateur. Cependant, la réutilisation d'un ticket CCACHE depuis le keyring Unix peut poser des défis, avec des outils comme **Tickey** disponibles pour extraire les tickets Kerberos.
|
|
|
|
### Keytab
|
|
|
|
Les fichiers keytab, contenant des principaux Kerberos et des clés chiffrées, sont essentiels pour obtenir des tickets de concession de tickets valides (TGT) sans avoir besoin du mot de passe du principal. L'analyse et la réutilisation des informations d'identification à partir des fichiers keytab peuvent être facilement effectuées avec des utilitaires comme `klist` et des scripts tels que **KeytabParser**.
|
|
|
|
### Cheatsheet
|
|
|
|
Vous pouvez trouver plus d'informations sur la façon d'utiliser les tickets dans linux dans le lien suivant :
|
|
|
|
{{#ref}}
|
|
privilege-escalation/linux-active-directory.md
|
|
{{#endref}}
|
|
|
|
## Énumération
|
|
|
|
> [!WARNING]
|
|
> Vous pouvez effectuer l'**énumération** via **ldap** et d'autres outils **binaires**, ou **en vous connectant à la page web sur le port 443 du serveur FreeIPA**.
|
|
|
|
### Hôtes, Utilisateurs et Groupes <a href="#id-4b3b" id="id-4b3b"></a>
|
|
|
|
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 des **liens anonymes**, et une grande partie des 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 au domaine, vous pourrez utiliser **des 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 <username> --all
|
|
ipa usergroup-show <user group> --all
|
|
ipa host-find <host> --all
|
|
ipa hostgroup-show <host group> --all
|
|
```
|
|
> [!TIP]
|
|
> L'utilisateur **admin** de **FreeIPA** est l'équivalent des **domain admins** de **AD**.
|
|
|
|
### Hashes <a href="#id-482b" id="id-482b"></a>
|
|
|
|
L'utilisateur **root** du serveur **IPA** a accès aux **hashes** de mot 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 a une **intégration** avec **AD**.
|
|
|
|
Pour cracker ces hashes :
|
|
|
|
• Si FreeIPA est intégré avec AD, **ipaNTHash** est facile à cracker : Vous devez **décoder** **base64** -> le réencoder en **ASCII** hex -> John The Ripper ou **hashcat** peuvent vous aider à le cracker rapidement.
|
|
|
|
• Si une ancienne version de FreeIPA est utilisée, alors **SSHA512** est utilisé : Vous devez décoder **base64** -> trouver le **hash** SSHA512 -> John The Ripper ou **hashcat** peuvent vous aider à le cracker.
|
|
|
|
• Si une nouvelle version de FreeIPA est utilisée, alors **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 seulement les 256 premiers bits de notre hash PBKDF2_SHA256 -> John The Ripper ou hashcat peuvent vous aider à le cracker.
|
|
|
|
<figure><img src="../images/image (655).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Pour extraire les hashes, vous devez être **root sur le serveur FreeIPA**, là vous pouvez utiliser l'outil **`dbscan`** pour les extraire :
|
|
|
|
<figure><img src="../images/image (293).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
### HBAC-Rules <a href="#id-482b" id="id-482b"></a>
|
|
|
|
Ce sont les règles qui accordent des permissions spécifiques aux utilisateurs ou aux hôtes sur des 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 <hbacrule> --all
|
|
```
|
|
#### Sudo-Rules
|
|
|
|
FreeIPA permet un contrôle centralisé des **permissions sudo** via des sudo-rules. Ces règles permettent ou limitent l'exécution de commandes avec sudo sur les hôtes au sein du domaine. Un attaquant pourrait potentiellement identifier les hôtes applicables, les utilisateurs et les commandes autorisées en examinant ces ensembles 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 <sudorule> --all
|
|
```
|
|
### Contrôle d'Accès Basé sur les Rôles
|
|
|
|
Un **rôle** est composé de divers **privilèges**, chacun englobant un ensemble de **permissions**. Ces rôles peuvent être attribués aux Utilisateurs, Groupes d'Utilisateurs, **Hôtes**, Groupes d'Hôtes et Services. Par exemple, considérons le rôle par défaut “Administrateur d'Utilisateurs” dans FreeIPA pour illustrer cette structure.
|
|
|
|
Le rôle `User Administrator` a ces privilèges :
|
|
|
|
- **Administrateurs d'Utilisateurs**
|
|
- **Administrateurs de Groupes**
|
|
- **Administrateurs d'Utilisateurs de Stage**
|
|
|
|
Avec les commandes suivantes, il est possible d'énumérer les rôles, privilèges et permissions :
|
|
```bash
|
|
# Using ldap
|
|
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
|
|
# Using ipa binary
|
|
ipa role-find
|
|
ipa role-show <role> --all
|
|
ipa privilege-find
|
|
ipa privilege-show <privilege> --all
|
|
ipa permission-find
|
|
ipa permission-show <permission> --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 permissions pour compromettre le domaine.
|
|
|
|
### Linikatz/LinikatzV2
|
|
|
|
- [https://github.com/Orange-Cyberdefense/LinikatzV2](https://github.com/Orange-Cyberdefense/LinikatzV2)
|
|
- [https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
|
|
|
|
## Privesc
|
|
|
|
### ~~création d'utilisateur root~~
|
|
|
|
> [!WARNING]
|
|
> Si vous pouvez **créer un nouvel utilisateur avec le nom `root`**, vous pouvez vous faire passer pour lui et vous pourrez **SSH sur n'importe quelle machine en tant que root.**
|
|
>
|
|
> **CECI A ÉTÉ CORRIGÉ.**
|
|
|
|
Vous pouvez consulter une explication détaillée dans [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
|
|
|
## Références
|
|
|
|
- [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
|
- [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](https://www.youtube.com/watch?v=9dOu-7BTwPQ)
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|