# FreeIPA Pentesting {{#include ../banners/hacktricks-training.md}} ## Información Básica FreeIPA es una **alternativa** de código abierto a **Active Directory** de Microsoft, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utiliza el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, y admite autenticación **multi-factor**, incluyendo tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. ## Huellas ### 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 ubicaciones de KDCs y servidores administrativos, configuraciones predeterminadas y asignaciones. - Las configuraciones predeterminadas a nivel de 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 los procesos de autenticación. - Varias variables de entorno (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) se utilizan para apuntar a archivos y configuraciones específicas relevantes para la autenticación Kerberos. ### Binarios Herramientas como `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` y `kvno` son centrales para gestionar dominios FreeIPA, manejar tickets 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 de 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 Kerberos, importantes para la autenticación sin la contraseña en texto plano del usuario debido a su portabilidad. El análisis de un ticket CCACHE se puede realizar utilizando el comando `klist`, y reutilizar un Ticket CCACHE válido implica exportar `KRB5CCNAME` a la ruta del archivo del ticket. ### **Keyring de Unix** Alternativamente, los Tickets CCACHE pueden almacenarse en el keyring de Linux, ofreciendo más control sobre la gestión de tickets. El alcance del almacenamiento de tickets varía (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`), siendo `klist` capaz de analizar esta información para el usuario. Sin embargo, reutilizar un Ticket CCACHE del keyring de Unix puede presentar desafíos, con herramientas como **Tickey** disponibles para extraer tickets Kerberos. ### Keytab Los archivos keytab, que contienen principios Kerberos y claves encriptadas, son críticos para obtener tickets de concesión de tickets válidos (TGT) sin necesidad de la contraseña del principio. El análisis y la reutilización de credenciales de archivos keytab se pueden 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: {{#ref}} privilege-escalation/linux-active-directory.md {{#endref}} ## Enumeración > [!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**. ### Hosts, Usuarios y Grupos Es posible crear **hosts**, **usuarios** y **grupos**. Los hosts y usuarios se organizan en contenedores llamados “**Grupos de Hosts**” y “**Grupos de Usuarios**” respectivamente. Estos son similares a las **Unidades Organizativas** (OU). Por defecto en FreeIPA, el servidor LDAP permite **vínculos anónimos**, y una gran cantidad de datos es enumerable **no autenticada**. Esto puede enumerar todos los datos disponibles no autenticados: ``` 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 usar **binarios instalados** para enumerar el dominio: ```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 ``` > [!NOTE] > El usuario **admin** de **FreeIPA** es el equivalente a **domain admins** de **AD**. ### Hashes El usuario **root** del servidor **IPA** tiene acceso a los **hashes** de contraseña. - El hash de contraseña de un usuario se almacena como **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 como **base64** en “**ipaNTHash**” si el sistema tiene **integración** con **AD**. Para romper estos hashes: • Si FreeIPA está integrado con AD, **ipaNTHash** es fácil de romper: Debes **decodificar** **base64** -> volver a codificarlo como **ASCII** hex -> John The Ripper o **hashcat** pueden ayudarte a romperlo rápidamente. • Si se utiliza una versión antigua de FreeIPA, entonces se usa **SSHA512**: Debes decodificar **base64** -> encontrar el **hash** SSHA512 -> John The Ripper o **hashcat** pueden ayudarte a romperlo. • Si se utiliza una nueva versión de FreeIPA, entonces se usa **PBKDF2_SHA256**: Debes decodificar **base64** -> encontrar PBKDF2_SHA256 -> su **longitud** es de 256 bytes. John puede trabajar con 256 bits (32 bytes) -> SHA-265 se utiliza como la función pseudoaleatoria, el tamaño del bloque es de 32 bytes -> solo puedes usar los primeros 256 bits de nuestro hash PBKDF2_SHA256 -> John The Ripper o hashcat pueden ayudarte a romperlo.
Para extraer los hashes necesitas ser **root en el servidor FreeIPA**, allí puedes usar la herramienta **`dbscan`** para extraerlos:
### HBAC-Rules 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 --all ``` #### Sudo-Rules FreeIPA permite el control centralizado sobre **sudo permissions** a través de sudo-rules. Estas reglas permiten o limitan la ejecución de comandos con sudo en los hosts dentro del dominio. Un atacante podría identificar potencialmente los hosts aplicables, usuarios y comandos permitidos al examinar 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 --all ``` ### Control de Acceso Basado en Roles Un **rol** se compone de varios **privilegios**, cada uno de los cuales abarca una colección de **permisos**. Estos roles pueden ser asignados a Usuarios, Grupos de Usuarios, **Hosts**, Grupos de Hosts y Servicios. Por ejemplo, considera el rol predeterminado “Administrador de Usuarios” en FreeIPA para ejemplificar esta estructura. El rol `User Administrator` tiene estos privilegios: - **User Administrators** - **Group Administrators** - **Stage User Administrators** 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 --all ipa privilege-find ipa privilege-show --all ipa permission-find ipa permission-show --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) ## Privesc ### ~~creación de usuario root~~ > [!WARNING] > Si puedes **crear un nuevo usuario con el nombre `root`**, puedes suplantarlo y podrás **SSH en cualquier máquina como root.** > > **ESTO HA SIDO PARCHEADO.** 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) {{#include ../banners/hacktricks-training.md}}