# FreeIPA Pentesting
{{#include ../banners/hacktricks-training.md}}
## Basic Information
FreeIPA는 Microsoft Windows **Active Directory**에 대한 오픈 소스 **대안**으로, 주로 **Unix** 환경을 위해 설계되었습니다. 이는 Active Directory와 유사한 관리 기능을 제공하는 MIT **Kerberos** 키 배포 센터와 완전한 **LDAP 디렉토리**를 결합합니다. CA 및 RA 인증서 관리를 위해 Dogtag **Certificate System**을 활용하며, 스마트카드를 포함한 **다중 인증**을 지원합니다. Unix 인증 프로세스를 위해 SSSD가 통합되어 있습니다.
## Fingerprints
### Files & Environment Variables
- Kerberos 클라이언트 정보는 도메인 등록에 필요하며 `/etc/krb5.conf` 파일에 저장됩니다. 여기에는 KDC 및 관리 서버의 위치, 기본 설정 및 매핑이 포함됩니다.
- IPA 클라이언트 및 서버에 대한 시스템 전체 기본값은 `/etc/ipa/default.conf` 파일에 설정됩니다.
- 도메인 내의 호스트는 인증 프로세스를 위해 `/etc/krb5.keytab`에 `krb5.keytab` 파일을 가져야 합니다.
- 다양한 환경 변수(`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`)는 Kerberos 인증과 관련된 특정 파일 및 설정을 가리키는 데 사용됩니다.
### Binaries
`ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, `kvno`와 같은 도구는 FreeIPA 도메인을 관리하고 Kerberos 티켓을 처리하며 비밀번호를 변경하고 서비스 티켓을 획득하는 등 여러 기능에 핵심적입니다.
### Network
일반적인 FreeIPA 서버 설정을 나타내는 그림이 제공됩니다.
## Authentication
FreeIPA에서의 인증은 **Kerberos**를 활용하여 **Active Directory**와 유사합니다. 도메인 리소스에 접근하려면 유효한 Kerberos 티켓이 필요하며, 이는 FreeIPA 도메인 구성에 따라 다양한 위치에 저장될 수 있습니다.
### **CCACHE Ticket Files**
CCACHE 파일은 일반적으로 **`/tmp`**에 **600** 권한으로 저장되며, Kerberos 자격 증명을 저장하기 위한 이진 형식으로, 사용자의 평문 비밀번호 없이 인증을 가능하게 합니다. CCACHE 티켓을 파싱하려면 `klist` 명령을 사용할 수 있으며, 유효한 CCACHE 티켓을 재사용하려면 `KRB5CCNAME`을 티켓 파일의 경로로 내보내야 합니다.
### **Unix Keyring**
대안으로, CCACHE 티켓은 Linux 키링에 저장할 수 있어 티켓 관리에 대한 더 많은 제어를 제공합니다. 티켓 저장 범위는 (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`)로 다양하며, `klist`는 사용자를 위해 이 정보를 파싱할 수 있습니다. 그러나 Unix 키링에서 CCACHE 티켓을 재사용하는 것은 어려울 수 있으며, Kerberos 티켓을 추출하기 위해 **Tickey**와 같은 도구가 제공됩니다.
### Keytab
Kerberos 주체와 암호화된 키를 포함하는 Keytab 파일은 유효한 티켓 부여 티켓(TGT)을 얻는 데 중요하며, 주체의 비밀번호 없이도 가능합니다. Keytab 파일에서 자격 증명을 파싱하고 재사용하는 것은 `klist`와 **KeytabParser**와 같은 유틸리티를 사용하여 쉽게 수행할 수 있습니다.
### Cheatsheet
Linux에서 티켓을 사용하는 방법에 대한 더 많은 정보는 다음 링크에서 확인할 수 있습니다:
{{#ref}}
privilege-escalation/linux-active-directory.md
{{#endref}}
## Enumeration
> [!WARNING]
> **ldap** 및 기타 **binary** 도구를 통해 **enumeration**을 수행하거나 **FreeIPA 서버의 포트 443에 있는 웹 페이지에 연결**할 수 있습니다.
### Hosts, Users, and Groups
**호스트**, **사용자** 및 **그룹**을 생성할 수 있습니다. 호스트와 사용자는 각각 “**Host Groups**” 및 “**User Groups**”라는 컨테이너로 정렬됩니다. 이는 **조직 단위**(OU)와 유사합니다.
기본적으로 FreeIPA에서 LDAP 서버는 **익명 바인딩**을 허용하며, 많은 데이터가 **인증되지 않은** 상태에서 열람 가능합니다. 이는 인증되지 않은 모든 데이터를 열람할 수 있습니다:
```
ldapsearch -x
```
더 많은 **정보**를 얻으려면 **인증된** 세션을 사용해야 합니다 (인증된 세션을 준비하는 방법은 인증 섹션을 확인하세요).
```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"
```
도메인에 가입된 머신에서 **설치된 바이너리**를 사용하여 도메인을 열거할 수 있습니다:
```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
```
> [!TIP]
> **FreeIPA**의 **admin** 사용자는 **AD**의 **domain admins**와 동등합니다.
### Hashes
**IPA 서버**의 **root** 사용자는 비밀번호 **hashes**에 접근할 수 있습니다.
- 사용자의 비밀번호 해시는 “**userPassword**” **attribute**에 **base64**로 저장됩니다. 이 해시는 **SSHA512** (구버전의 FreeIPA) 또는 **PBKDF2_SHA256**일 수 있습니다.
- 시스템이 **AD**와 **integration**되어 있다면 비밀번호의 **Nthash**는 “**ipaNTHash**”에 **base64**로 저장됩니다.
이 해시를 크랙하려면:
• FreeIPA가 AD와 통합된 경우, **ipaNTHash**는 쉽게 크랙할 수 있습니다: **base64**를 **decode**한 후 **ASCII** hex로 다시 인코딩 -> John The Ripper 또는 **hashcat**을 사용하여 빠르게 크랙할 수 있습니다.
• 구버전의 FreeIPA가 사용되는 경우, **SSHA512**가 사용됩니다: **base64**를 **decode**한 후 SSHA512 **hash**를 찾아야 합니다 -> John The Ripper 또는 **hashcat**이 크랙하는 데 도움을 줄 수 있습니다.
• 최신 버전의 FreeIPA가 사용되는 경우, **PBKDF2_SHA256**이 사용됩니다: **base64**를 **decode**한 후 PBKDF2_SHA256을 찾아야 합니다 -> 길이는 256 바이트입니다. John은 256 비트(32 바이트)로 작업할 수 있습니다 -> SHA-265가 의사 난수 함수로 사용되며, 블록 크기는 32 바이트입니다 -> PBKDF2_SHA256 해시의 처음 256 비트만 사용할 수 있습니다 -> John The Ripper 또는 hashcat이 크랙하는 데 도움을 줄 수 있습니다.
해시를 추출하려면 **FreeIPA 서버의 root**가 되어야 하며, 그곳에서 **`dbscan`** 도구를 사용하여 추출할 수 있습니다:
### HBAC-Rules
사용자 또는 호스트에 자원(호스트, 서비스, 서비스 그룹 등)에 대한 특정 권한을 부여하는 규칙이 있습니다.
```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는 sudo-rules를 통해 **sudo 권한**에 대한 중앙 집중식 제어를 가능하게 합니다. 이러한 규칙은 도메인 내 호스트에서 sudo로 명령을 실행할 수 있도록 허용하거나 제한합니다. 공격자는 이러한 규칙 세트를 검토하여 적용 가능한 호스트, 사용자 및 허용된 명령을 식별할 수 있습니다.
```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
```
### 역할 기반 접근 제어
A **role**는 다양한 **privileges**로 구성되며, 각 privilege는 **permissions**의 모음을 포함합니다. 이러한 역할은 사용자, 사용자 **그룹**, **호스트**, 호스트 그룹 및 서비스에 할당될 수 있습니다. 예를 들어, 이 구조를 설명하기 위해 FreeIPA의 기본 “User Administrator” 역할을 고려해 보십시오.
역할 `User Administrator`는 다음과 같은 privileges를 가지고 있습니다:
- **User Administrators**
- **Group Administrators**
- **Stage User Administrators**
다음 명령어를 사용하여 역할, privileges 및 permissions를 열거할 수 있습니다:
```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
```
### 공격 시나리오 예시
[https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e)에서 도메인을 손상시키기 위해 일부 권한을 악용하는 간단한 예시를 찾을 수 있습니다.
### Linikatz/LinikatzV2
- [https://github.com/Orange-Cyberdefense/LinikatzV2](https://github.com/Orange-Cyberdefense/LinikatzV2)
- [https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
## 권한 상승
### ~~root 사용자 생성~~
> [!WARNING]
> 만약 **`root`라는 이름의 새 사용자를 생성할 수 있다면**, 그를 가장할 수 있으며 **root로 모든 머신에 SSH로 접속할 수 있습니다.**
>
> **이것은 패치되었습니다.**
자세한 설명은 [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-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}}