hacktricks/src/linux-hardening/freeipa-pentesting.md

187 lines
11 KiB
Markdown

# FreeIPA Pentesting
{{#include ../banners/hacktricks-training.md}}
## 기본 정보
FreeIPA는 주로 **Unix** 환경을 위한 Microsoft Windows **Active Directory**의 오픈 소스 **대안**입니다. Active Directory와 유사한 관리 기능을 위해 MIT **Kerberos** 키 배포 센터와 완전한 **LDAP 디렉토리**를 결합합니다. CA 및 RA 인증서 관리를 위해 Dogtag **Certificate System**을 활용하며, 스마트카드를 포함한 **다중 인증**을 지원합니다. Unix 인증 프로세스를 위해 SSSD가 통합되어 있습니다.
## 지문
### 파일 및 환경 변수
- Kerberos 클라이언트 정보가 저장되는 파일은 `/etc/krb5.conf`입니다. 여기에는 KDC 및 관리 서버의 위치, 기본 설정 및 매핑이 포함됩니다.
- IPA 클라이언트 및 서버에 대한 시스템 전체 기본값은 `/etc/ipa/default.conf`에 설정됩니다.
- 도메인 내의 호스트는 인증 프로세스를 위해 `/etc/krb5.keytab``krb5.keytab` 파일을 가져야 합니다.
- Kerberos 인증과 관련된 특정 파일 및 설정을 가리키기 위해 다양한 환경 변수(`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`)가 사용됩니다.
### 바이너리
`ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, `kvno`와 같은 도구는 FreeIPA 도메인을 관리하고 Kerberos 티켓을 처리하며 비밀번호를 변경하고 서비스 티켓을 획득하는 등 여러 기능의 중심입니다.
### 네트워크
일반적인 FreeIPA 서버 설정을 나타내는 그림이 제공됩니다.
## 인증
FreeIPA에서의 인증은 **Kerberos**를 활용하여 **Active Directory**와 유사합니다. 도메인 리소스에 접근하려면 유효한 Kerberos 티켓이 필요하며, 이는 FreeIPA 도메인 구성에 따라 다양한 위치에 저장될 수 있습니다.
### **CCACHE 티켓 파일**
CCACHE 파일은 일반적으로 **`/tmp`**에 **600** 권한으로 저장되며, Kerberos 자격 증명을 저장하기 위한 이진 형식으로, 사용자의 평문 비밀번호 없이 인증에 중요합니다. CCACHE 티켓을 파싱하는 것은 `klist` 명령을 사용하여 수행할 수 있으며, 유효한 CCACHE 티켓을 재사용하려면 `KRB5CCNAME`을 티켓 파일의 경로로 내보내야 합니다.
### **Unix 키링**
대안으로, CCACHE 티켓은 Linux 키링에 저장할 수 있어 티켓 관리에 대한 더 많은 제어를 제공합니다. 티켓 저장 범위는 (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`)로 다양하며, `klist`는 사용자를 위해 이 정보를 파싱할 수 있습니다. 그러나 Unix 키링에서 CCACHE 티켓을 재사용하는 것은 어려울 수 있으며, Kerberos 티켓을 추출하기 위해 **Tickey**와 같은 도구가 제공됩니다.
### 키탭
Kerberos 주체와 암호화된 키를 포함하는 키탭 파일은 유효한 티켓 부여 티켓(TGT)을 얻기 위해 필수적이며, 주체의 비밀번호 없이도 가능합니다. 키탭 파일에서 자격 증명을 파싱하고 재사용하는 것은 `klist`와 같은 유틸리티 및 **KeytabParser**와 같은 스크립트를 사용하여 쉽게 수행할 수 있습니다.
### 치트시트
Linux에서 티켓을 사용하는 방법에 대한 더 많은 정보는 다음 링크에서 확인할 수 있습니다:
{{#ref}}
privilege-escalation/linux-active-directory.md
{{#endref}}
## 열거
> [!WARNING]
> **ldap** 및 기타 **바이너리** 도구를 통해 **열거**를 수행하거나 **FreeIPA 서버의 포트 443에 연결하여 웹 페이지에 접근**할 수 있습니다.
### 호스트, 사용자 및 그룹 <a href="#id-4b3b" id="id-4b3b"></a>
**호스트**, **사용자****그룹**을 생성할 수 있습니다. 호스트와 사용자는 각각 “**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 <username> --all
ipa usergroup-show <user group> --all
ipa host-find <host> --all
ipa hostgroup-show <host group> --all
```
> [!NOTE]
> **FreeIPA**의 **admin** 사용자는 **AD**의 **domain admins**와 동등합니다.
### Hashes <a href="#id-482b" id="id-482b"></a>
**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이 크랙하는 데 도움을 줄 수 있습니다.
<figure><img src="../images/image (655).png" alt=""><figcaption></figcaption></figure>
해시를 추출하려면 **FreeIPA 서버의 root**가 되어야 하며, 그곳에서 **`dbscan`** 도구를 사용하여 추출할 수 있습니다:
<figure><img src="../images/image (293).png" alt=""><figcaption></figcaption></figure>
### HBAC-Rules <a href="#id-482b" id="id-482b"></a>
사용자 또는 호스트에 자원(호스트, 서비스, 서비스 그룹 등)에 대한 특정 권한을 부여하는 규칙이 있습니다.
```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는 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 <sudorule> --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 <role> --all
ipa privilege-find
ipa privilege-show <privilege> --all
ipa permission-find
ipa permission-show <permission> --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}}