hacktricks/linux-hardening/freeipa-pentesting.md
2023-06-06 18:56:34 +00:00

300 lines
21 KiB
Markdown

# FreeIPA Pentesting
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>
Esta informação foi retirada dos posts:
* [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\&feature=youtu.be](https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be)
## Informações básicas
É uma **alternativa** de código aberto ao **Active Directory** da Microsoft Windows, usada principalmente como solução de gerenciamento integrado para ambientes **Unix**. Semelhante ao Active Directory, o FreeIPA implementa uma infraestrutura completa de diretório **LDAP** suportada por um Centro de Distribuição de Chaves **Kerberos** do MIT. Ele usa o sistema de certificados Dogtag para gerenciamento de certificados CA e RA, dando-lhe a capacidade de lidar com autenticação de **múltiplos fatores**, incluindo smartcards. O SSSD é usado para integrar o FreeIPA ao processo padrão de autenticação Unix.
## Impressões digitais
### Arquivos e variáveis de ambiente
* **`/etc/krb5.conf`:** O arquivo `krb5.conf` contém as informações do cliente Kerberos necessárias para ser **matriculado no domínio**. Isso inclui as **localizações dos KDCs e servidores de administração** para os reinos Kerberos de interesse, padrões para o reino atual e para aplicativos Kerberos, e mapeamentos de nomes de host em reinos Kerberos.
* **`/etc/ipa/default.conf`:** Este é o **arquivo de configuração padrão para servidores IPA**, é usado para definir padrões em todo o sistema a serem aplicados ao executar clientes e servidores IPA.
* **`/etc/krb5.keytab`:** O arquivo `krb5.keytab` é **obrigatório** em todos os hosts dentro do **domínio**. É necessário como parte do processo de **autenticação** para o KDC.
* **`KRB5CCNAME`:** Se definido, essa variável aponta para a **localização do arquivo CCACHE Ticket** a ser usado para autenticação.
* **`KRB5_KTNAME`:** Se definido, essa variável aponta para a **localização** do arquivo **Keytab** a ser usado para autenticação.
* **`KRB5_CONFIG`:** Se definido, essa variável aponta para a **localização** do **arquivo de configuração Kerberos**.
* **`KRB5_KDC_PROFILE`:** Se definido, essa variável aponta para a **localização do arquivo de configuração KDC**, que contém diretivas de configuração adicionais para o daemon do Centro de Distribuição de Chaves.
* **`KRB5RCACHETYPE`:** Essa variável especifica o **tipo padrão de cache de replay** a ser usado para servidores.
* **`KRB5RCACHEDIR`:** Essa variável especifica o **diretório padrão para caches de replay** usados por servidores.
* **`KRB5_TRACE`:** Essa variável especifica um **nome de arquivo para gravar a saída do log de rastreamento**. Os logs de rastreamento podem ajudar a iluminar as decisões tomadas internamente pelas bibliotecas Kerberos.
* **`KRB5_CLIENT_KTNAME`:** Essa variável define o **nome do arquivo de chave do cliente padrão**.
* **`KPROP_PORT`:** Essa variável define a **porta padrão para kprop** a ser usada.
### Binários
* **ipa:** Este binário é o padrão para **gerenciar um domínio FreeIPA**. Ele pode ser usado para gerenciar hosts, usuários, regras sudo e muito mais.
* **kdestroy:** O binário kdestroy é usado para **destruir** quaisquer **tickets Kerberos atuais** na sessão do usuário.
* **kinit:** O binário kinit é usado para **estabelecer** ou **renovar tickets Kerberos**.
* **klist:** O binário klist **lista** quaisquer **tickets Kerberos atuais em uso** e quais princípios os tickets fornecem acesso.
* **kpasswd:** O comando kpasswd é usado para **alterar a senha do principal Kerberos**. O kpasswd primeiro solicita a senha Kerberos atual, depois solicita ao usuário duas vezes a nova senha e a senha é alterada.
* **ksu:** Ksu pode ser usado como uma **alternativa ao binário su**, para alternar o **contexto do usuário atual**.
* **kswitch:** O comando kswitch irá **alternar o cache de credenciais atual em uso**.
* **kvno:** O binário kvno adquire um **ticket de serviço** para os **princípios Kerberos especificados** e imprime os números de versão da chave de cada um.
### Rede
Assim é como um servidor FreeIPA pode parecer:
<figure><img src="../.gitbook/assets/image (197).png" alt=""><figcaption></figcaption></figure>
## Autenticação
Como o FreeIPA usa o **Kerberos para autenticação**, esse processo é muito semelhante à **autenticação** no **Active Directory**. Para **acessar** recursos no domínio, um usuário deve ter um **ticket Kerberos válido** para esse recurso. Esses tickets podem ser armazenados em vários locais diferentes com base na configuração do domínio FreeIPA.
### Arquivos de ticket CCACHE
Quando os tickets são definidos para serem **armazenados** como um **arquivo** em **disco**, o formato e tipo padrão é um arquivo **CCACHE**. Este é um formato de arquivo binário simples para armazenar credenciais Kerberos. Esses arquivos são normalmente armazenados em **`/tmp`** e com permissões **600**. Do ponto de vista de um atacante, isso é importante pelos seguintes motivos:
1. Tickets válidos podem ser **utilizados para autenticação**, **sem** a necessidade da senha em texto **plano** do respectivo usuário.
2. Os tickets **CCACHE** são altamente **portáteis**. Eles podem ser baixados e carregados em outro host sem a necessidade de renovar ou validar o ticket.
**Analisar** um ticket CCACHE é facilmente realizado de várias maneiras diferentes. O método mais simples é analisá-lo com o binário klist.
```
klist /tmp/krb5cc_0
```
<figure><img src="../.gitbook/assets/image (70).png" alt=""><figcaption></figcaption></figure>
Para um atacante, reutilizar um Ticket CCACHE válido é muito fácil. Para **reutilizar** um Ticket CCACHE válido, **exporte** **KRB5CCNAME** para o **caminho** do arquivo de ticket válido. O sistema deve reconhecer a variável de ambiente e tentará usar esse material de credencial ao interagir com o domínio.
```bash
export KRB5CCNAME=/tmp/krb5cc_0
klist
```
<figure><img src="../.gitbook/assets/image (175).png" alt=""><figcaption></figcaption></figure>
### **Unix Keyring**
Os Tickets CCACHE também podem ser **armazenados** no **keyring** do Linux. O keyring fica dentro do **kernel** e dá aos administradores **maior controle sobre a recuperação e uso dos tickets armazenados**. Os tickets podem ser escopados das seguintes maneiras:
* **`KEYRING:nome`:** Tickets são escopados para um keyring nomeado específico.
* **`KEYRING:processo:nome`:** Tickets são escopados para um ID de processo específico.
* **`KEYRING:thread:nome`:** Tickets são escopados para uma thread específica.
* **`KEYRING:sessão:nome`:** Tickets são escopados para uma sessão de usuário específica.
* **`KEYRING:persistente:númerodeuid`:** Tickets são escopados para um usuário específico, independentemente da sessão (padrão).
Dependendo de como o administrador escopou o ticket armazenado no Unix keyring, analisá-lo pode ser difícil. No entanto, o **escopo padrão** para os Tickets CCACHE no Unix keyring é **`KEYRING:persistente:númerodeuid`**. Felizmente, se você estiver no **contexto** do **usuário**, o `klist` pode **analisar** essas informações para nós.
<figure><img src="../.gitbook/assets/image (3) (1) (4).png" alt=""><figcaption></figcaption></figure>
Como atacante, **reutilizar um Ticket CCACHE** armazenado no **keyring** do Unix é bastante **difícil**, dependendo de como o ticket é escopado. Felizmente, [@Zer1t0](https://github.com/Zer1t0) da [@Tarlogic](https://twitter.com/Tarlogic) criou uma ferramenta que pode extrair tickets Kerberos do keyring do Unix. A ferramenta é chamada de **Tickey** e pode ser encontrada [**aqui**](https://github.com/TarlogicSecurity/tickey).
<figure><img src="../.gitbook/assets/image (185).png" alt=""><figcaption></figcaption></figure>
### Keytab <a href="#ff38" id="ff38"></a>
{% hint style="warning" %}
geralmente, cada host é implantado com uma credencial keytab para esse host que pode ser usada para obter um Ticket Granting Ticket(TGT) válido do Cache de Credenciais(CCACHE) para o próprio host.
{% endhint %}
Consiste em pares de **principais Kerberos e chaves criptografadas** que são derivadas da senha Kerberos associada ao principal. Como essas chaves são derivadas da senha do principal, se essa **senha mudar, o keytab será invalidado**.
Os arquivos Keytab podem ser usados para **obter um TGT válido** para o principal ao qual está escopado. Esse processo de autenticação **não requer a senha**, pois contém chaves derivadas da senha.
Analisar um arquivo Keytab é muito fácil e pode ser feito de algumas maneiras. A maneira mais fácil de **analisar** um arquivo **keytab** é com o **klist**. A segunda maneira utiliza uma ótima ferramenta em Python que [Cody Thomas](https://medium.com/u/645ffcef8682?source=post\_page-----77e73d837d6a--------------------------------) criou. Seu projeto \*\*\*\* [**KeytabParser**](https://github.com/its-a-feature/KeytabParser) \*\*\*\* irá analisar o principal e suas chaves criptografadas relevantes.
<figure><img src="../.gitbook/assets/image (200).png" alt=""><figcaption></figcaption></figure>
Os atacantes podem **reutilizar credenciais armazenadas em arquivos keytab gerando um Ticket CCACHE** através do binário kinit.
```powershell
# Parse keytab
klist -k /rtc/krb5.keytab
# Get TGT
kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
```
<figure><img src="../.gitbook/assets/image (205).png" alt=""><figcaption></figcaption></figure>
### Folha de dicas
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 %}
<figure><img src="../.gitbook/assets/image (184).png" alt=""><figcaption></figcaption></figure>
### 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. Estes 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"
```
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 às **hashes** de senha.
* A hash de senha de um usuário é armazenada como **base64** no atributo "**userPassword**". Essa hash pode ser **SSHA512** (versões antigas do FreeIPA) ou **PBKDF2\_SHA256**.
* O **Nthash** da senha é armazenado como **base64** em "**ipaNTHash**" se o sistema tiver **integração** com o **AD**.
Para quebrar essas 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 ajudá-lo a quebrá-lo rapidamente.
• Se uma versão antiga do FreeIPA for usada, então **SSHA512** é usado: você deve decodificar o **base64** -> encontrar a hash **SSHA512** -> John The Ripper ou **hashcat** podem ajudá-lo a quebrá-lo.
• Se uma nova versão do FreeIPA for usada, então **PBKDF2\_SHA256** é usado: você deve decodificar o **base64** -> encontrar o **PBKDF2\_SHA256** -> seu **tamanho** é de 256 bytes. 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 da hash PBKDF2\_SHA256 -> John The Ripper ou hashcat podem ajudá-lo a quebrá-lo.
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
Para extrair as hashes, você precisa ser **root no servidor FreeIPA**, lá você pode usar a ferramenta **`dbscan`** para extraí-las:
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
### Regras HBAC <a href="#482b" id="482b"></a>
São as 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 fornece a capacidade de **gerenciar permissões do sudo** a partir de uma fonte **centralizada** por meio de regras do sudo. Esses conjuntos de regras podem ser usados para restringir ou delegar a capacidade de **executar comandos como sudo** em hosts inscritos no domínio. Como atacante, podemos enumerar em quais hosts e usuários esses conjuntos de regras são aplicados e quais comandos são permitidos por meio do conjunto 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ção
Cada **função** contém um conjunto de **privilégios**, e esses respectivos privilégios contêm um **conjunto** de **permissões**. As funções podem ser **aplicadas a usuários**, grupos de usuários, **hosts**, grupos de hosts e serviços. Para ilustrar esse conceito, vamos discutir a função padrão "Administrador de Usuário" no FreeIPA.
<figure><img src="../.gitbook/assets/image (161).png" alt=""><figcaption></figcaption></figure>
Como a captura de tela acima mostra, a função "Administrador de Usuário" contém os seguintes privilégios:
* **Administradores de Usuários**
* **Administradores de Grupos**
* **Administradores de Usuários de Estágio**
Podemos aprofundar ainda mais e enumerar as **permissões** delegadas a cada **privilégio**:
<figure><img src="../.gitbook/assets/image (189).png" alt=""><figcaption></figcaption></figure>
Como podemos ver, a função "Administrador de Usuário" contém muitas **permissões** dentro do ambiente. Compreender o conceito geral e a estrutura de **funções**, **privilégios** e **permissões** pode ser fundamental para identificar caminhos de ataque em todo o ambiente.
```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
[https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
## Privesc
### ~~criação de usuário root~~
{% hint style="warning" %}
Se você pode **criar um novo usuário com o nome `root`**, você pode se passar por ele e será capaz de **SSH em qualquer máquina como root.**
**ISSO FOI CORRIGIDO.**
{% endhint %}
O privilégio "**Administradores de Usuários**", é muito poderoso (como o nome indica):
<figure><img src="../.gitbook/assets/image (182).png" alt=""><figcaption></figcaption></figure>
Com esse privilégio vem muitos poderes diferentes para afetar usuários dentro do ambiente. Usando esse privilégio, podemos **criar um novo usuário dentro do domínio FreeIPA com o nome \_root**.\_
<figure><img src="../.gitbook/assets/image (158).png" alt=""><figcaption></figcaption></figure>
Uma vez que o usuário é criado no domínio, podemos **obter um ticket para a conta com \_kinit**\_.
<figure><img src="../.gitbook/assets/image (178).png" alt=""><figcaption></figcaption></figure>
Agora podemos tentar **SSH** usando nossa nova conta de domínio root.
<figure><img src="../.gitbook/assets/image (176).png" alt=""><figcaption></figcaption></figure>
Como mostrado, isso **coloca o usuário na conta root local**! Então, simplesmente criando um usuário de domínio para um usuário local, fomos capazes de autenticar usando a conta _root@WESTEROS.LOCAL_ e obter o **contexto do usuário da conta root local**_._
_Para mais detalhes sobre essa vulnerabilidade, verifique_ [_https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b_](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)\\
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* 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)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>