FreeIPA Pentesting

Support 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. Utilizando el Sistema de Certificados Dogtag para la gestión de certificados CA y RA, admite autenticación multifactor, incluidas las 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 las ubicaciones de los KDC y servidores administrativos, configuraciones predeterminadas y asignaciones.

  • Los valores predeterminados a nivel de sistema para los 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.

Unix Keyring

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.

Cheatsheet

Puedes encontrar más información sobre cómo usar tickets en linux en el siguiente enlace:

Linux Active Directory

Enumeración

Puedes 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).

# 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:

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

El usuario admin de FreeIPA es el equivalente a los administradores de dominio 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...)

# 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.

# 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 Administrador de Usuarios tiene estos privilegios:

  • Administradores de Usuarios

  • Administradores de Grupos

  • Administradores de Usuarios de Etapa

Con los siguientes comandos es posible enumerar los roles, privilegios y permisos:

# 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

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

Apoya a HackTricks

Last updated