mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
187 lines
10 KiB
Markdown
187 lines
10 KiB
Markdown
# FreeIPA Pentesting
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## Informazioni di Base
|
|
|
|
FreeIPA è un **alternativa** open-source a Microsoft Windows **Active Directory**, principalmente per ambienti **Unix**. Combina un completo **LDAP directory** con un MIT **Kerberos** Key Distribution Center per la gestione simile a Active Directory. Utilizzando il Dogtag **Certificate System** per la gestione dei certificati CA & RA, supporta l'autenticazione **multi-fattore**, inclusi i smartcard. SSSD è integrato per i processi di autenticazione Unix.
|
|
|
|
## Impronte
|
|
|
|
### File e Variabili d'Ambiente
|
|
|
|
- Il file in `/etc/krb5.conf` è dove sono memorizzate le informazioni del client Kerberos, necessarie per l'iscrizione nel dominio. Questo include le posizioni dei KDC e dei server di amministrazione, le impostazioni predefinite e le mappature.
|
|
- Le impostazioni predefinite a livello di sistema per i client e i server IPA sono impostate nel file situato in `/etc/ipa/default.conf`.
|
|
- Gli host all'interno del dominio devono avere un file `krb5.keytab` in `/etc/krb5.keytab` per i processi di autenticazione.
|
|
- Diverse variabili d'ambiente (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) sono utilizzate per puntare a file e impostazioni specifiche rilevanti per l'autenticazione Kerberos.
|
|
|
|
### Binaries
|
|
|
|
Strumenti come `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, e `kvno` sono fondamentali per gestire i domini FreeIPA, gestire i ticket Kerberos, cambiare le password e acquisire i ticket di servizio, tra le altre funzionalità.
|
|
|
|
### Rete
|
|
|
|
Viene fornita un'illustrazione per rappresentare una tipica configurazione del server FreeIPA.
|
|
|
|
## Autenticazione
|
|
|
|
L'autenticazione in FreeIPA, sfruttando **Kerberos**, rispecchia quella in **Active Directory**. L'accesso alle risorse del dominio richiede un ticket Kerberos valido, che può essere memorizzato in varie posizioni a seconda della configurazione del dominio FreeIPA.
|
|
|
|
### **File Ticket CCACHE**
|
|
|
|
I file CCACHE, memorizzati tipicamente in **`/tmp`** con permessi **600**, sono formati binari per memorizzare le credenziali Kerberos, importanti per l'autenticazione senza la password in chiaro dell'utente grazie alla loro portabilità. L'analisi di un ticket CCACHE può essere effettuata utilizzando il comando `klist`, e riutilizzare un ticket CCACHE valido comporta l'esportazione di `KRB5CCNAME` nel percorso del file del ticket.
|
|
|
|
### **Keyring Unix**
|
|
|
|
In alternativa, i ticket CCACHE possono essere memorizzati nel keyring di Linux, offrendo maggiore controllo sulla gestione dei ticket. L'ambito della memorizzazione dei ticket varia (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`), con `klist` capace di analizzare queste informazioni per l'utente. Tuttavia, riutilizzare un ticket CCACHE dal keyring Unix può presentare sfide, con strumenti come **Tickey** disponibili per estrarre i ticket Kerberos.
|
|
|
|
### Keytab
|
|
|
|
I file keytab, contenenti i principi Kerberos e le chiavi crittografate, sono critici per ottenere ticket di concessione validi (TGT) senza necessità della password del principio. L'analisi e il riutilizzo delle credenziali dai file keytab possono essere facilmente eseguiti con utility come `klist` e script come **KeytabParser**.
|
|
|
|
### Cheatsheet
|
|
|
|
Puoi trovare ulteriori informazioni su come utilizzare i ticket in linux nel seguente link:
|
|
|
|
{{#ref}}
|
|
privilege-escalation/linux-active-directory.md
|
|
{{#endref}}
|
|
|
|
## Enumerazione
|
|
|
|
> [!WARNING]
|
|
> Puoi eseguire l'**enumerazione** tramite **ldap** e altri strumenti **binari**, o **collegandoti alla pagina web sulla porta 443 del server FreeIPA**.
|
|
|
|
### Host, Utenti e Gruppi <a href="#id-4b3b" id="id-4b3b"></a>
|
|
|
|
È possibile creare **host**, **utenti** e **gruppi**. Gli host e gli utenti sono ordinati in contenitori chiamati “**Gruppi di Host**” e “**Gruppi di Utenti**” rispettivamente. Questi sono simili alle **Unità Organizzative** (OU).
|
|
|
|
Per impostazione predefinita in FreeIPA, il server LDAP consente **bind anonimi**, e una vasta gamma di dati è enumerabile **non autenticata**. Questo può enumerare tutti i dati disponibili non autenticati:
|
|
```
|
|
ldapsearch -x
|
|
```
|
|
Per ottenere **ulteriori informazioni** è necessario utilizzare una sessione **autenticata** (controlla la sezione Autenticazione per imparare come preparare una sessione autenticata).
|
|
```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"
|
|
```
|
|
Da una macchina unita al dominio sarai in grado di utilizzare **binaries installati** per enumerare il dominio:
|
|
```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'utente **admin** di **FreeIPA** è l'equivalente degli **admin di dominio** di **AD**.
|
|
|
|
### Hashes <a href="#id-482b" id="id-482b"></a>
|
|
|
|
L'utente **root** del server **IPA** ha accesso agli **hash** delle password.
|
|
|
|
- L'hash della password di un utente è memorizzato come **base64** nell'attributo “**userPassword**”. Questo hash potrebbe essere **SSHA512** (versioni precedenti di FreeIPA) o **PBKDF2_SHA256**.
|
|
- L'**Nthash** della password è memorizzato come **base64** in “**ipaNTHash**” se il sistema ha **integrazione** con **AD**.
|
|
|
|
Per decifrare questi hash:
|
|
|
|
• Se FreeIPA è integrato con AD, **ipaNTHash** è facile da decifrare: Dovresti **decodificare** **base64** -> ri-ricodificarlo come **ASCII** esadecimale -> John The Ripper o **hashcat** possono aiutarti a decifrarlo rapidamente
|
|
|
|
• Se viene utilizzata una vecchia versione di FreeIPA, allora si utilizza **SSHA512**: Dovresti decodificare **base64** -> trovare l'**hash** SSHA512 -> John The Ripper o **hashcat** possono aiutarti a decifrarlo
|
|
|
|
• Se viene utilizzata una nuova versione di FreeIPA, allora si utilizza **PBKDF2_SHA256**: Dovresti decodificare **base64** -> trovare PBKDF2_SHA256 -> la sua **lunghezza** è di 256 byte. John può lavorare con 256 bit (32 byte) -> SHA-265 è utilizzato come funzione pseudo-casuale, la dimensione del blocco è di 32 byte -> puoi usare solo i primi 256 bit del nostro hash PBKDF2_SHA256 -> John The Ripper o hashcat possono aiutarti a decifrarlo
|
|
|
|
<figure><img src="../images/image (655).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Per estrarre gli hash devi essere **root nel server FreeIPA**, lì puoi usare lo strumento **`dbscan`** per estrarli:
|
|
|
|
<figure><img src="../images/image (293).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
### HBAC-Rules <a href="#id-482b" id="id-482b"></a>
|
|
|
|
Ci sono le regole che concedono permessi specifici a utenti o host su risorse (host, servizi, gruppi di servizi...)
|
|
```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 consente il controllo centralizzato sui **permessi sudo** tramite sudo-rules. Queste regole consentono o limitano l'esecuzione di comandi con sudo su host all'interno del dominio. Un attaccante potrebbe potenzialmente identificare gli host, gli utenti e i comandi consentiti esaminando questi set di regole.
|
|
```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
|
|
```
|
|
### Controllo degli Accessi Basato sui Ruoli
|
|
|
|
Un **ruolo** è composto da vari **privilegi**, ognuno dei quali comprende una collezione di **permessi**. Questi ruoli possono essere assegnati a Utenti, Gruppi di Utenti, **Host**, Gruppi di Host e Servizi. Ad esempio, considera il ruolo predefinito “Amministratore Utenti” in FreeIPA per esemplificare questa struttura.
|
|
|
|
Il ruolo `Amministratore Utenti` ha questi privilegi:
|
|
|
|
- **Amministratori Utenti**
|
|
- **Amministratori Gruppi**
|
|
- **Amministratori Utenti di Stadio**
|
|
|
|
Con i seguenti comandi è possibile enumerare i ruoli, i privilegi e i permessi:
|
|
```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
|
|
```
|
|
### Esempio di Scenario di Attacco
|
|
|
|
In [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) puoi trovare un semplice esempio di come abusare di alcune autorizzazioni per compromettere il dominio.
|
|
|
|
### 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
|
|
|
|
### ~~creazione utente root~~
|
|
|
|
> [!WARNING]
|
|
> Se puoi **creare un nuovo utente con il nome `root`**, puoi impersonarlo e sarai in grado di **SSH in qualsiasi macchina come root.**
|
|
>
|
|
> **QUESTO È STATO CORRETTO.**
|
|
|
|
Puoi controllare una spiegazione dettagliata in [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
|
|
|
## Riferimenti
|
|
|
|
- [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}}
|