hacktricks/linux-hardening/freeipa-pentesting.md

213 lines
13 KiB
Markdown
Raw Normal View History

2022-10-22 14:44:59 +00:00
# FreeIPA Pentesting
<details>
2024-02-10 21:30:13 +00:00
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로에서 영웅까지 AWS 해킹 배우기</strong>를 배워보세요<strong>!</strong></summary>
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2023-12-30 20:49:23 +00:00
2024-02-10 21:30:13 +00:00
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
2022-10-22 14:44:59 +00:00
</details>
2024-02-10 21:30:13 +00:00
## 기본 정보
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
FreeIPA는 주로 **Unix** 환경을 위한 Microsoft Windows **Active Directory**의 오픈 소스 **대체**입니다. Active Directory와 유사한 관리를 위해 완전한 **LDAP 디렉터리**와 MIT **Kerberos** 키 배포 센터를 결합합니다. CA 및 RA 인증서 관리를 위해 Dogtag **Certificate System**을 사용하며, 스마트 카드를 포함한 **다중 인증**을 지원합니다. Unix 인증 프로세스에는 SSSD가 통합되어 있습니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
## 지문
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### 파일 및 환경 변수
2024-02-05 02:28:59 +00:00
2024-02-10 21:30:13 +00:00
- `/etc/krb5.conf` 파일에는 도메인에 등록하기 위해 필요한 Kerberos 클라이언트 정보가 저장됩니다. 이에는 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 인증과 관련된 특정 파일 및 설정을 가리키는 데 사용됩니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### 실행 파일
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
`ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, `kvno`와 같은 도구는 FreeIPA 도메인을 관리하고 Kerberos 티켓을 처리하며 비밀번호를 변경하고 서비스 티켓을 획득하는 등의 중요한 기능을 수행합니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### 네트워크
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
전형적인 FreeIPA 서버 설정을 나타내는 그림이 제공됩니다.
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
## 인증
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
FreeIPA에서 **Kerberos**를 활용한 인증은 **Active Directory**와 유사합니다. 도메인 리소스에 대한 액세스는 유효한 Kerberos 티켓이 필요하며, FreeIPA 도메인 구성에 따라 다양한 위치에 저장될 수 있습니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### **CCACHE 티켓 파일**
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
일반적으로 **`/tmp`**에 **600** 권한으로 저장되는 CCACHE 파일은 이동성을 위해 사용자의 평문 암호 없이 인증에 중요한 Kerberos 자격 증명을 저장하는 이진 형식입니다. CCACHE 티켓을 구문 분석하려면 `klist` 명령을 사용하고, 유효한 CCACHE 티켓을 재사용하려면 `KRB5CCNAME`을 티켓 파일의 경로로 내보내야 합니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### **Unix 키링**
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
대안으로, CCACHE 티켓을 Linux 키링에 저장할 수 있으며, 티켓 관리에 대한 더 많은 제어를 제공합니다. 티켓 저장의 범위는 (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`)와 같이 다양하며, `klist`는 이 정보를 사용자에게 제공하기 위해 이를 구문 분석할 수 있습니다. 그러나 Unix 키링에서 CCACHE 티켓을 재사용하는 것은 도전적일 수 있으며, **Tickey**와 같은 도구를 사용하여 Kerberos 티켓을 추출할 수 있습니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### 키탭
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
Kerberos 주체와 암호화된 키를 포함하는 키탭 파일은 주체의 암호 없이 유효한 티켓 발급 티켓(TGT)을 얻는 데 중요합니다. 키탭 파일에서 자격 증명을 구문 분석하고 재사용하는 것은 `klist`와 **KeytabParser**와 같은 스크립트를 사용하여 쉽게 수행할 수 있습니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### 치트 시트
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
Linux에서 티켓을 사용하는 방법에 대한 자세한 정보는 다음 링크에서 찾을 수 있습니다:
2022-10-22 14:44:59 +00:00
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
{% endcontent-ref %}
2024-02-10 21:30:13 +00:00
## 열거
2022-10-22 14:44:59 +00:00
2022-10-22 15:26:54 +00:00
{% hint style="warning" %}
2024-02-10 21:30:13 +00:00
**ldap** 및 기타 **바이너리** 도구를 사용하거나 FreeIPA 서버의 **포트 443에서 웹 페이지에 연결**하여 **열거**를 수행할 수 있습니다.
2022-10-22 15:26:54 +00:00
{% endhint %}
2024-02-10 21:30:13 +00:00
### 호스트, 사용자 및 그룹 <a href="#4b3b" id="4b3b"></a>
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
**호스트**, **사용자****그룹**을 생성할 수 있습니다. 호스트와 사용자는 각각 "Host Groups" 및 "User Groups"라는 컨테이너에 정렬됩니다. 이는 **조직 단위**(OU)와 유사합니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
기본적으로 FreeIPA에서 LDAP 서버는 **익명 바인드**를 허용하며, 대량의 데이터가 **인증되지 않은** 상태에서 열거될 수 있습니다. 이는 인증되지 않은 상태에서 사용 가능한 모든 데이터를 열거할 수 있습니다:
2022-10-22 14:44:59 +00:00
```
2024-02-10 21:30:13 +00:00
ldapsearch -x
2022-10-22 14:44:59 +00:00
```
2024-02-10 21:30:13 +00:00
**더 많은 정보**를 얻으려면 **인증된** 세션을 사용해야 합니다 (인증 섹션에서 인증된 세션을 준비하는 방법을 알아보세요).
2022-10-22 14:44:59 +00:00
```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
2024-02-10 21:30:13 +00:00
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local"
2022-10-22 14:44:59 +00:00
```
2024-02-10 21:30:13 +00:00
도메인에 가입된 컴퓨터에서는 **설치된 이진 파일**을 사용하여 도메인을 열거할 수 있습니다:
2022-10-22 14:44:59 +00:00
```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
```
2022-10-22 15:26:54 +00:00
{% hint style="info" %}
2024-02-10 21:30:13 +00:00
**FreeIPA**의 **admin** 사용자는 **AD**의 **도메인 관리자**와 동등합니다.
2022-10-22 15:26:54 +00:00
{% endhint %}
2024-02-10 21:30:13 +00:00
### 해시 <a href="#482b" id="482b"></a>
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
**IPA 서버**의 **root** 사용자는 암호 **해시**에 액세스할 수 있습니다.
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
* 사용자의 암호 해시는 "userPassword" **속성**에 **base64**로 저장됩니다. 이 해시는 **SSHA512** (이전 버전의 FreeIPA) 또는 **PBKDF2\_SHA256**일 수 있습니다.
* 시스템이 **AD**와 **통합**되어 있다면 암호의 **Nthash**는 "ipaNTHash"에 **base64**로 저장됩니다.
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
이러한 해시를 크랙하기 위해:
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
• FreeIPA가 AD와 통합되어 있다면, **ipaNTHash**는 쉽게 크랙할 수 있습니다: **base64**를 **디코딩** -> ASCII 16진수로 다시 인코딩 -> John The Ripper 또는 **hashcat**을 사용하여 빠르게 크랙할 수 있습니다.
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
• 이전 버전의 FreeIPA를 사용한다면, **SSHA512**를 사용합니다: **base64**를 디코딩 -> SSHA512 **해시**를 찾습니다 -> John The Ripper 또는 **hashcat**을 사용하여 크랙할 수 있습니다.
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
• 새 버전의 FreeIPA를 사용한다면, **PBKDF2\_SHA256**을 사용합니다: **base64**를 디코딩 -> PBKDF2\_SHA256을 찾습니다 -> 길이는 256바이트입니다. John은 256비트 (32바이트)로 작동할 수 있습니다 -> 의사 난수 함수로 SHA-265를 사용하며 블록 크기는 32바이트입니다 -> PBKDF2\_SHA256 해시의 첫 번째 256비트만 사용할 수 있습니다 -> John The Ripper 또는 hashcat을 사용하여 크랙할 수 있습니다.
2022-10-22 15:26:54 +00:00
2022-10-24 09:15:22 +00:00
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
2022-10-22 15:26:54 +00:00
2024-02-10 21:30:13 +00:00
해시를 추출하려면 **FreeIPA 서버의 root** 권한이 필요하며, 여기에서 **`dbscan`** 도구를 사용하여 추출할 수 있습니다:
2022-10-22 15:26:54 +00:00
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
2024-02-10 21:30:13 +00:00
### HBAC 규칙 <a href="#482b" id="482b"></a>
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
이는 사용자 또는 호스트에게 리소스 (호스트, 서비스, 서비스 그룹 등)에 대한 특정 권한을 부여하는 규칙입니다.
2022-10-22 14:44:59 +00:00
```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
2024-02-10 21:30:13 +00:00
FreeIPA는 sudo 권한을 중앙 집중식으로 제어할 수 있도록 sudo 규칙을 제공합니다. 이러한 규칙은 도메인 내의 호스트에서 sudo를 사용하여 명령을 실행하는 것을 허용하거나 제한합니다. 공격자는 이러한 규칙 집합을 조사함으로써 적용 가능한 호스트, 사용자 및 허용된 명령을 식별할 수 있습니다.
2022-10-22 14:44:59 +00:00
```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
```
2024-02-10 21:30:13 +00:00
### 역할 기반 접근 제어
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
**역할**은 여러 **권한**으로 구성되며, 각 권한은 **허가**의 모음을 포함합니다. 이러한 역할은 사용자, 사용자 **그룹**, **호스트**, 호스트 그룹 및 서비스에 할당할 수 있습니다. 예를 들어, 이 구조를 설명하기 위해 FreeIPA의 기본 "사용자 관리자" 역할을 고려해 보겠습니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
`사용자 관리자` 역할에는 다음과 같은 권한이 있습니다:
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
* **사용자 관리자**
* **그룹 관리자**
* **단계 사용자 관리자**
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
다음 명령을 사용하여 역할, 권한 및 허가를 열거할 수 있습니다:
2022-10-22 14:44:59 +00:00
```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
2024-02-10 21:30:13 +00:00
ipa privilege-find
2022-10-22 14:44:59 +00:00
ipa privilege-show <privilege> --all
ipa permission-find
ipa permission-show <permission> --all
```
2024-02-10 21:30:13 +00:00
### 공격 시나리오 예제
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
[https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e)에서 도메인을 침해하기 위해 일부 권한을 남용하는 간단한 예제를 찾을 수 있습니다.
2022-10-22 14:44:59 +00:00
### Linikatz/LinikatzV2
* [https://github.com/Orange-Cyberdefense/LinikatzV2](https://github.com/Orange-Cyberdefense/LinikatzV2)
* [https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
2024-02-10 21:30:13 +00:00
## 권한 상승
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
### ~~root 사용자 생성~~
2022-10-22 14:44:59 +00:00
{% hint style="warning" %}
2024-02-10 21:30:13 +00:00
`root`라는 이름의 새 사용자를 **생성할 수 있다면**, 그를 가장할 수 있으며 **root로서 어떤 기계에든 SSH로 접속할 수 있습니다.**
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
**이는 패치되었습니다.**
2022-10-22 14:44:59 +00:00
{% endhint %}
2024-02-10 21:30:13 +00:00
자세한 설명은 [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)에서 확인할 수 있습니다.
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
## 참고 자료
2024-02-05 02:28:59 +00:00
* [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)
2022-10-22 14:44:59 +00:00
<details>
2024-02-10 21:30:13 +00:00
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
2022-10-22 14:44:59 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2023-12-30 20:49:23 +00:00
2024-02-10 21:30:13 +00:00
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 상품**](https://peass.creator-spring.com)을 구매하세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **자신의 해킹 기법을 공유**하세요.
2022-10-22 14:44:59 +00:00
</details>