FreeIPA Pentesting

Reading time: 8 minutes

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

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:

Linux Active Directory

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 <username> --all ipa usergroup-show <user group> --all ipa host-find <host> --all ipa hostgroup-show <host group> --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 <hbacrule> --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 <sudorule> --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 <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 puedes encontrar un ejemplo simple de cómo abusar de algunos permisos para comprometer el dominio.

Linikatz/LinikatzV2

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

Referencias

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks