mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-18 17:16:10 +00:00
212 lines
13 KiB
Markdown
212 lines
13 KiB
Markdown
# Pentesting do FreeIPA
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
|
|
## Informações Básicas
|
|
|
|
O FreeIPA é apresentado como uma **alternativa** de código aberto ao **Active Directory** da Microsoft e é utilizado principalmente em ambientes **Unix** para gerenciamento integrado. Possui um diretório LDAP completo suportado por um Centro de Distribuição de Chaves MIT **Kerberos**, semelhante ao Active Directory. O Sistema de Certificados Dogtag é utilizado para gerenciar certificados CA & RA, possibilitando capacidades de autenticação **multi-fator**, incluindo cartões inteligentes. Para integração ao processo de autenticação Unix, é utilizado o SSSD.
|
|
|
|
## Impressões Digitais
|
|
|
|
### Arquivos e Variáveis de Ambiente
|
|
|
|
- O arquivo em `/etc/krb5.conf` é onde as informações do cliente Kerberos, necessárias para a inscrição no domínio, são armazenadas. Isso inclui as localizações dos KDCs e servidores de administração, configurações padrão e mapeamentos.
|
|
- As configurações padrão do sistema para clientes e servidores IPA são definidas no arquivo localizado em `/etc/ipa/default.conf`.
|
|
- Os hosts dentro do domínio devem ter um arquivo `krb5.keytab` em `/etc/krb5.keytab` para processos de autenticação.
|
|
- Várias variáveis de ambiente (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) são usadas para apontar para arquivos específicos e configurações relevantes à autenticação Kerberos.
|
|
|
|
### Binários
|
|
|
|
Ferramentas como `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` e `kvno` são essenciais para gerenciar domínios FreeIPA, lidar com tickets Kerberos, alterar senhas e adquirir tickets de serviço, entre outras funcionalidades.
|
|
|
|
### Rede
|
|
|
|
Uma ilustração é fornecida para representar uma configuração típica de servidor FreeIPA.
|
|
|
|
## Autenticação
|
|
|
|
A autenticação no FreeIPA, utilizando **Kerberos**, espelha a do **Active Directory**. O acesso a recursos do domínio requer um ticket Kerberos válido, que pode ser armazenado em vários locais, dependendo da configuração do domínio FreeIPA.
|
|
|
|
### Arquivos de Ticket CCACHE
|
|
|
|
Os arquivos CCACHE, armazenados tipicamente em **`/tmp`** com permissões **600**, são formatos binários para armazenar credenciais Kerberos, importantes para autenticação sem a senha em texto simples do usuário devido à sua portabilidade. Analisar um ticket CCACHE pode ser feito usando o comando `klist`, e reutilizar um Ticket CCACHE válido envolve exportar `KRB5CCNAME` para o caminho do arquivo de ticket.
|
|
|
|
### Chaveiro Unix
|
|
|
|
Alternativamente, Tickets CCACHE podem ser armazenados no chaveiro do Linux, oferecendo mais controle sobre o gerenciamento de tickets. O escopo de armazenamento de tickets varia (`KEYRING:nome`, `KEYRING:processo:nome`, `KEYRING:thread:nome`, `KEYRING:sessão:nome`, `KEYRING:persistente:uidnúmero`), com `klist` capaz de analisar essas informações para o usuário. No entanto, reutilizar um Ticket CCACHE do chaveiro Unix pode apresentar desafios, com ferramentas como **Tickey** disponíveis para extrair tickets Kerberos.
|
|
|
|
### Keytab
|
|
|
|
Arquivos Keytab, contendo princípios Kerberos e chaves criptografadas, são críticos para obter tickets de concessão de tickets (TGT) válidos sem precisar da senha do princípio. Analisar e reutilizar credenciais de arquivos Keytab pode ser facilmente realizado com utilitários como `klist` e scripts como **KeytabParser**.
|
|
|
|
### Cheatsheet
|
|
|
|
Você pode encontrar mais informações sobre como usar tickets no Linux no seguinte link:
|
|
|
|
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
|
|
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Enumeração
|
|
|
|
{% hint style="warning" %}
|
|
Você pode realizar a **enumeração** via **ldap** e outras **ferramentas binárias**, ou **conectando-se à página da web na porta 443 do servidor FreeIPA**.
|
|
{% endhint %}
|
|
|
|
### Hosts, Usuários e Grupos <a href="#4b3b" id="4b3b"></a>
|
|
|
|
É possível criar **hosts**, **usuários** e **grupos**. Hosts e usuários são classificados em contêineres chamados "**Grupos de Hosts**" e "**Grupos de Usuários**" respectivamente. Esses são semelhantes às **Unidades Organizacionais** (OU).
|
|
|
|
Por padrão no FreeIPA, o servidor LDAP permite **ligações anônimas**, e uma grande quantidade de dados é enumerável **não autenticada**. Isso pode enumerar todos os dados disponíveis não autenticados:
|
|
```
|
|
ldapsearch -x
|
|
```
|
|
Para obter **mais informações**, você precisa usar uma sessão **autenticada** (verifique a seção de Autenticação para aprender como preparar uma sessão 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"
|
|
```
|
|
A partir de uma máquina integrada ao domínio, você poderá usar **binários instalados** para enumerar o domínio:
|
|
```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" %}
|
|
O usuário **admin** do **FreeIPA** é equivalente aos **administradores de domínio** do **AD**.
|
|
{% endhint %}
|
|
|
|
### Hashes <a href="#482b" id="482b"></a>
|
|
|
|
O usuário **root** do **servidor IPA** tem acesso aos **hashes** de senha.
|
|
|
|
- O hash da senha de um usuário é armazenado como **base64** no atributo "**userPassword**". Esse hash pode ser **SSHA512** (versões antigas do FreeIPA) ou **PBKDF2\_SHA256**.
|
|
- O **Nthash** da senha é armazenado como **base64** em "**ipaNTHash**" se o sistema estiver integrado com o **AD**.
|
|
|
|
Para quebrar esses hashes:
|
|
|
|
- Se o FreeIPA estiver integrado com o AD, o **ipaNTHash** é fácil de quebrar: Você deve **decodificar** o **base64** -> re-codificá-lo como **hexadecimal ASCII** -> John The Ripper ou **hashcat** podem ajudar a quebrá-lo rapidamente.
|
|
|
|
- Se uma versão antiga do FreeIPA for usada, então o **SSHA512** é usado: Você deve decodificar o **base64** -> encontrar o **hash SSHA512** -> John The Ripper ou **hashcat** podem ajudar a quebrá-lo.
|
|
|
|
- Se uma nova versão do FreeIPA for usada, então o **PBKDF2\_SHA256** é usado: Você deve decodificar o **base64** -> encontrar o **PBKDF2\_SHA256** -> seu **comprimento** é de 256 bytes. O John pode trabalhar com 256 bits (32 bytes) -> SHA-265 é usado como a função pseudo-aleatória, o tamanho do bloco é de 32 bytes -> você pode usar apenas os primeiros 256 bits do nosso hash PBKDF2\_SHA256 -> John The Ripper ou hashcat podem ajudar a quebrá-lo.
|
|
|
|
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Para extrair os hashes, você precisa ser **root no servidor FreeIPA**, lá você pode usar a ferramenta **`dbscan`** para extraí-los:
|
|
|
|
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
### Regras HBAC <a href="#482b" id="482b"></a>
|
|
|
|
São regras que concedem permissões específicas a usuários ou hosts sobre recursos (hosts, serviços, grupos de serviços...).
|
|
```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
|
|
```
|
|
#### Regras do Sudo
|
|
|
|
O FreeIPA permite o controle centralizado sobre as **permissões do sudo** por meio de regras do sudo. Essas regras permitem ou limitam a execução de comandos com sudo em hosts dentro do domínio. Um atacante poderia potencialmente identificar os hosts aplicáveis, usuários e comandos permitidos examinando esses conjuntos de regras.
|
|
```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
|
|
```
|
|
### Controle de Acesso Baseado em Funções
|
|
|
|
Um **papel** é composto por vários **privilégios**, cada um dos quais engloba uma coleção de **permissões**. Esses papéis podem ser atribuídos a Usuários, **Grupos** de Usuários, **Hosts**, Grupos de Hosts e Serviços. Por exemplo, considere o papel padrão de "Administrador de Usuário" no FreeIPA para exemplificar essa estrutura.
|
|
|
|
O papel `Administrador de Usuário` possui esses privilégios:
|
|
|
|
- **Administradores de Usuários**
|
|
- **Administradores de Grupos**
|
|
- **Administradores de Usuários de Estágio**
|
|
|
|
Com os seguintes comandos é possível enumerar os papéis, privilégios e permissões:
|
|
```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
|
|
```
|
|
### Exemplo de Cenário de Ataque
|
|
|
|
Em [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) você pode encontrar um exemplo simples de como abusar de algumas permissões para comprometer o domínio.
|
|
|
|
### 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
|
|
|
|
### ~~Criação de usuário root~~
|
|
|
|
{% hint style="warning" %}
|
|
Se você puder **criar um novo usuário com o nome `root`**, você pode se passar por ele e será capaz de **fazer SSH em qualquer máquina como root.**
|
|
|
|
**ISSO FOI CORRIGIDO.**
|
|
{% endhint %}
|
|
|
|
Você pode conferir uma explicação detalhada em [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
|
|
|
# Referências
|
|
* [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>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|