mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
212 lines
13 KiB
Markdown
212 lines
13 KiB
Markdown
# Pentesting de FreeIPA
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Otras formas de apoyar a HackTricks:
|
|
|
|
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs a** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
|
|
|
</details>
|
|
|
|
## Información Básica
|
|
|
|
FreeIPA es una **alternativa** de código abierto a Microsoft Windows **Active Directory**, principalmente para entornos **Unix**. Combina un directorio **LDAP completo** con un Centro de Distribución de Claves MIT **Kerberos** para la gestión similar a Active Directory. Utiliza el Sistema de Certificados Dogtag para la gestión de certificados CA y RA, admite autenticación **multifactor**, incluidas tarjetas inteligentes. SSSD está integrado para procesos de autenticación de Unix.
|
|
|
|
## Huellas Digitales
|
|
|
|
### Archivos y Variables de Entorno
|
|
|
|
- El archivo en `/etc/krb5.conf` es donde se almacena la información del cliente Kerberos, necesaria para la inscripción en el dominio. Esto incluye las ubicaciones de los KDC y servidores de administración, configuraciones predeterminadas y asignaciones.
|
|
- Las configuraciones predeterminadas del sistema para clientes y servidores IPA se establecen en el archivo ubicado en `/etc/ipa/default.conf`.
|
|
- Los hosts dentro del dominio deben tener un archivo `krb5.keytab` en `/etc/krb5.keytab` para procesos de autenticación.
|
|
- Se utilizan varias variables de entorno (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) para apuntar a archivos específicos y configuraciones relevantes para la autenticación de Kerberos.
|
|
|
|
### Binarios
|
|
|
|
Herramientas como `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` y `kvno` son fundamentales para administrar dominios FreeIPA, manejar tickets de Kerberos, cambiar contraseñas y adquirir tickets de servicio, entre otras funcionalidades.
|
|
|
|
### Red
|
|
|
|
Se proporciona una ilustración para representar una configuración típica del servidor FreeIPA.
|
|
|
|
## Autenticación
|
|
|
|
La autenticación en FreeIPA, aprovechando **Kerberos**, refleja la de **Active Directory**. El acceso a los recursos del dominio requiere un ticket Kerberos válido, que puede almacenarse en varias ubicaciones dependiendo de la configuración del dominio FreeIPA.
|
|
|
|
### Archivos de Tickets CCACHE
|
|
|
|
Los archivos CCACHE, almacenados típicamente en **`/tmp`** con permisos **600**, son formatos binarios para almacenar credenciales de Kerberos, importantes para la autenticación sin la contraseña en texto plano del usuario debido a su portabilidad. Analizar un ticket CCACHE se puede hacer utilizando el comando `klist`, y reutilizar un ticket CCACHE válido implica exportar `KRB5CCNAME` a la ruta del archivo del ticket.
|
|
|
|
### Llavero de Unix
|
|
|
|
Alternativamente, los Tickets CCACHE se pueden almacenar en el llavero de Linux, ofreciendo más control sobre la gestión de tickets. El alcance del almacenamiento de tickets varía (`KEYRING:nombre`, `KEYRING:proceso:nombre`, `KEYRING:hilo:nombre`, `KEYRING:sessión:nombre`, `KEYRING:persistent:uidnúmero`), con `klist` capaz de analizar esta información para el usuario. Sin embargo, reutilizar un Ticket CCACHE desde el llavero de Unix puede plantear desafíos, con herramientas como **Tickey** disponibles para extraer tickets de Kerberos.
|
|
|
|
### Keytab
|
|
|
|
Los archivos Keytab, que contienen principios de Kerberos y claves encriptadas, son críticos para obtener tickets de concesión de tickets (TGT) válidos sin necesidad de la contraseña del principio. Analizar y reutilizar credenciales de archivos Keytab se puede realizar fácilmente con utilidades como `klist` y scripts como **KeytabParser**.
|
|
|
|
### Hoja de Trucos
|
|
|
|
Puedes encontrar más información sobre cómo usar tickets en Linux en el siguiente enlace:
|
|
|
|
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
|
|
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Enumeración
|
|
|
|
{% hint style="warning" %}
|
|
Podrías realizar la **enumeración** a través de **ldap** y otras **herramientas binarias**, o **conectándote a la página web en el puerto 443 del servidor FreeIPA**.
|
|
{% endhint %}
|
|
|
|
### Hosts, Usuarios y Grupos <a href="#4b3b" id="4b3b"></a>
|
|
|
|
Es posible crear **hosts**, **usuarios** y **grupos**. Los hosts y usuarios se clasifican en contenedores llamados "**Grupos de Hosts**" y "**Grupos de Usuarios**" respectivamente. Estos son similares a las **Unidades Organizativas** (OU).
|
|
|
|
De forma predeterminada en FreeIPA, el servidor LDAP permite **vínculos anónimos**, y una gran cantidad de datos son enumerables **sin autenticación**. Esto puede enumerar todos los datos disponibles sin autenticación:
|
|
```
|
|
ldapsearch -x
|
|
```
|
|
Para obtener **más información**, necesitas usar una sesión **autenticada** (consulta la sección de Autenticación para aprender cómo preparar una sesión autenticada).
|
|
```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"
|
|
```
|
|
Desde una máquina unida al dominio podrás utilizar **binarios instalados** para enumerar el 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
|
|
```
|
|
{% hint style="info" %}
|
|
El usuario **admin** de **FreeIPA** es equivalente a los **administradores de dominio** de **AD**.
|
|
{% endhint %}
|
|
|
|
### Hashes <a href="#482b" id="482b"></a>
|
|
|
|
El usuario **root** del **servidor IPA** tiene acceso a los **hashes** de contraseñas.
|
|
|
|
* El hash de la contraseña de un usuario se almacena en formato **base64** en el atributo “**userPassword**”. Este hash puede ser **SSHA512** (versiones antiguas de FreeIPA) o **PBKDF2\_SHA256**.
|
|
* El **Nthash** de la contraseña se almacena en formato **base64** en “**ipaNTHash**” si el sistema está integrado con **AD**.
|
|
|
|
Para crackear estos hashes:
|
|
|
|
• Si FreeIPA está integrado con AD, el **ipaNTHash** es fácil de crackear: Debes **decodificar** el **base64** -> re-codificarlo como **ASCII** hexadecimal -> John The Ripper o **hashcat** pueden ayudarte a crackearlo rápidamente
|
|
|
|
• Si se utiliza una versión antigua de FreeIPA, se utiliza **SSHA512**: Debes decodificar el **base64** -> encontrar el hash SSHA512 -> John The Ripper o **hashcat** pueden ayudarte a crackearlo
|
|
|
|
• Si se utiliza una nueva versión de FreeIPA, se utiliza **PBKDF2\_SHA256**: Debes decodificar el **base64** -> encontrar PBKDF2\_SHA256 -> su **longitud** es de 256 bytes. John puede trabajar con 256 bits (32 bytes) -> SHA-265 se utiliza como función pseudoaleatoria, el tamaño del bloque es de 32 bytes -> puedes usar solo los primeros 256 bits de nuestro hash PBKDF2\_SHA256 -> John The Ripper o hashcat pueden ayudarte a crackearlo
|
|
|
|
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Para extraer los hashes necesitas ser **root en el servidor FreeIPA**, allí puedes usar la herramienta **`dbscan`** para extraerlos:
|
|
|
|
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
### Reglas HBAC <a href="#482b" id="482b"></a>
|
|
|
|
Estas son las reglas que otorgan permisos específicos a usuarios o hosts sobre recursos (hosts, servicios, grupos de servicios...).
|
|
```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
|
|
```
|
|
#### Reglas de Sudo
|
|
|
|
FreeIPA permite el control centralizado sobre los **permisos de sudo** a través de las reglas de sudo. Estas reglas permiten o limitan la ejecución de comandos con sudo en hosts dentro del dominio. Un atacante podría potencialmente identificar los hosts aplicables, usuarios y comandos permitidos examinando estos conjuntos de reglas.
|
|
```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
|
|
```
|
|
### Control de Acceso Basado en Roles
|
|
|
|
Un **rol** está compuesto por varios **privilegios**, cada uno de los cuales abarca una colección de **permisos**. Estos roles pueden asignarse a Usuarios, **Grupos** de Usuarios, **Hosts**, Grupos de Hosts y Servicios. Por ejemplo, considera el rol predeterminado de "Administrador de Usuarios" en FreeIPA para ejemplificar esta estructura.
|
|
|
|
El rol `Administrador de Usuarios` tiene los siguientes privilegios:
|
|
|
|
* **Administradores de Usuarios**
|
|
* **Administradores de Grupos**
|
|
* **Administradores de Usuarios de Etapa**
|
|
|
|
Con los siguientes comandos es posible enumerar los roles, privilegios y permisos:
|
|
```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
|
|
```
|
|
### Ejemplo de Escenario de Ataque
|
|
|
|
En [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) puedes encontrar un ejemplo simple de cómo abusar de algunos permisos para comprometer el 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)
|
|
|
|
## Elevación de Privilegios
|
|
|
|
### ~~Creación de usuario root~~
|
|
|
|
{% hint style="warning" %}
|
|
Si puedes **crear un nuevo usuario con el nombre `root`**, puedes hacerse pasar por él y ser capaz de **SSH en cualquier máquina como root.**
|
|
|
|
**ESTO HA SIDO PARCHADO.**
|
|
{% endhint %}
|
|
|
|
Puedes consultar una explicación detallada en [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
|
|
|
## Referencias
|
|
* [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)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Otras formas de apoyar a HackTricks:
|
|
|
|
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|