hacktricks/linux-hardening/freeipa-pentesting.md

13 KiB

FreeIPA Pentesting

htARTE (HackTricks AWS Red Team 전문가)로부터 제로에서 영웅까지 AWS 해킹 배우기

HackTricks를 지원하는 다른 방법:

기본 정보

FreeIPA는 Unix 환경을 위한 Microsoft Windows Active Directory 대체 오픈 소스입니다. Active Directory와 유사한 관리를 위해 MIT Kerberos 키 분배 센터와 완전한 LDAP 디렉터리를 결합합니다. CA 및 RA 인증서 관리를 위해 Dogtag Certificate System을 활용하며, 스마트카드를 포함한 다중 인증을 지원합니다. Unix 인증 프로세스에는 SSSD가 통합되어 있습니다.

지문

파일 및 환경 변수

  • /etc/krb5.conf에있는 파일은 도메인에 등록하는 데 필요한 Kerberos 클라이언트 정보를 저장합니다. 이에는 KDC 및 관리 서버의 위치, 기본 설정 및 매핑이 포함됩니다.
  • IPA 클라이언트 및 서버의 시스템 전역 기본값은 /etc/ipa/default.conf에 위치한 파일에 설정됩니다.
  • 도메인 내 호스트는 인증 프로세스를 위해 /etc/krb5.keytabkrb5.keytab 파일을 가져야 합니다.
  • 다양한 환경 변수 (KRB5CCNAME, KRB5_KTNAME, KRB5_CONFIG, KRB5_KDC_PROFILE, KRB5RCACHETYPE, KRB5RCACHEDIR, KRB5_TRACE, KRB5_CLIENT_KTNAME, KPROP_PORT)는 Kerberos 인증과 관련된 특정 파일 및 설정을 가리키는 데 사용됩니다.

이진 파일

ipa, kdestroy, kinit, klist, kpasswd, ksu, kswitch, kvno와 같은 도구는 FreeIPA 도메인을 관리하고 Kerberos 티켓을 처리하며 비밀번호를 변경하고 서비스 티켓을 획들하는 데 중요합니다.

네트워크

전형적인 FreeIPA 서버 설정을 나타내는 그림이 제공됩니다.

인증

Kerberos를 활용한 FreeIPA의 인증은 Active Directory와 유사합니다. 도메인 리소스에 액세스하려면 유효한 Kerberos 티켓이 필요하며, FreeIPA 도메인 구성에 따라 다양한 위치에 저장될 수 있습니다.

CCACHE 티켓 파일

일반적으로 **/tmp**에 600 권한으로 저장되는 CCACHE 파일은 이동성으로 인해 사용자의 평문 암호없이 인증에 중요한 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 티켓을 재사용하는 것은 도전적일 수 있으며, Tickey와 같은 도구를 사용하여 Kerberos 티켓을 추출할 수 있습니다.

Keytab

Kerberos 주체와 암호화된 키를 포함하는 Keytab 파일은 주체의 암호를 필요로하지 않고 유효한 티켓 발급 티켓(TGT)을 얻는 데 중요합니다. Keytab 파일에서 자격 증명을 구문 분석하고 재사용하는 것은 klistKeytabParser와 같은 스크립트를 사용하여 쉽게 수행할 수 있습니다.

치트 시트

리눅스에서 티켓을 사용하는 방법에 대한 자세한 정보는 다음 링크에서 찾을 수 있습니다:

{% content-ref url="privilege-escalation/linux-active-directory.md" %} linux-active-directory.md {% endcontent-ref %}

열거

{% hint style="warning" %} ldap 및 기타 이진 도구를 통해 열거를 수행하거나 FreeIPA 서버의 포트 443에 웹 페이지에 연결할 수 있습니다. {% endhint %}

호스트, 사용자 및 그룹

호스트, 사용자그룹을 생성할 수 있습니다. 호스트 및 사용자는 각각 "호스트 그룹" 및 "사용자 그룹"이라는 컨테이너로 분류됩니다. 이는 조직 단위(OU)와 유사합니다.

기본적으로 FreeIPA에서 LDAP 서버는 익명 바인드를 허용하며, 인증되지 않은 상태에서 많은 데이터가 열거 가능합니다. 이를 통해 모든 데이터를 인증되지 않은 상태로 열거할 수 있습니다:

ldapsearch -x

더 많은 정보를 얻으려면 인증된 세션을 사용해야 합니다 (인증된 세션을 준비하는 방법은 인증 섹션을 확인하세요).

# 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"

도메인에 가입된 컴퓨터에서는 설치된 이진 파일을 사용하여 도메인을 열람할 수 있습니다:

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" %} FreeIPA관리자 사용자는 AD도메인 관리자와 동등합니다. {% endhint %}

해시

IPA 서버루트 사용자는 암호 해시에 액세스할 수 있습니다.

  • 사용자의 암호 해시는 “userPassword속성base64로 저장됩니다. 이 해시는 SSHA512 (이전 버전의 FreeIPA) 또는 PBKDF2_SHA256일 수 있습니다.
  • 시스템이 AD통합되어 있다면 암호의 Nthash는 “ipaNTHash”에 base64로 저장됩니다.

이러한 해시를 해독하려면:

  • FreeIPA가 AD와 통합되어 있다면, ipaNTHash를 쉽게 해독할 수 있습니다: base64디코딩 -> ASCII 16진수로 다시 인코딩 -> John The Ripper 또는 hashcat을 사용하여 빠르게 해독할 수 있습니다.

  • 이전 버전의 FreeIPA를 사용하고 있다면, SSHA512를 사용하고 있을 것입니다: base64를 디코딩 -> SSHA512 해시를 찾아야 합니다 -> John The Ripper 또는 hashcat을 사용하여 해독할 수 있습니다.

  • 새 버전의 FreeIPA를 사용하고 있다면, PBKDF2_SHA256를 사용하고 있을 것입니다: base64를 디코딩 -> PBKDF2_SHA256을 찾아야 합니다 -> 길이는 256바이트입니다. John은 256비트(32바이트)와 함께 작동할 수 있습니다 -> SHA-265가 의사 난수 함수로 사용되며 블록 크기는 32바이트입니다 -> PBKDF2_SHA256 해시의 처음 256비트만 사용할 수 있습니다 -> John The Ripper 또는 hashcat을 사용하여 해독할 수 있습니다.

해시를 추출하려면 FreeIPA 서버의 루트여야 하며, 여기서 dbscan 도구를 사용하여 해시를 추출할 수 있습니다:

HBAC-Rules

이는 사용자 또는 호스트에게 특정 권한을 부여하는 규칙입니다(호스트, 서비스, 서비스 그룹 등).

# 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 권한을 중앙에서 제어할 수 있도록 sudo 규칙을 활성화합니다. 이러한 규칙은 도메인 내 호스트에서 sudo를 사용하여 명령을 실행하는 것을 허용하거나 제한합니다. 공격자는 이러한 규칙 집합을 조사함으로써 적용 가능한 호스트, 사용자 및 허용된 명령을 식별할 수 있습니다.

# 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

역할 기반 액세스 제어

역할은 여러 권한으로 구성되어 있으며, 각 권한은 허가의 모음을 포함합니다. 이러한 역할은 사용자, 사용자 그룹, 호스트, 호스트 그룹 및 서비스에 할당할 수 있습니다. 예를 들어, 이 구조를 보여주기 위해 FreeIPA의 기본 "사용자 관리자" 역할을 고려해 보겠습니다.

사용자 관리자 역할에는 다음과 같은 권한이 있습니다:

  • 사용자 관리자
  • 그룹 관리자
  • 단계 사용자 관리자

다음 명령을 사용하여 역할, 권한 및 허가를 나열할 수 있습니다:

# 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에서 도메인을 compromise하기 위해 일부 권한을 악용하는 간단한 예제를 찾을 수 있습니다.

Linikatz/LinikatzV2

Privesc

루트 사용자 생성

{% hint style="warning" %} 만약 **root**라는 이름의 새로운 사용자를 생성할 수 있다면, 그를 흉내내어 어떤 머신에서든 root로 SSH할 수 있습니다.

이는 패치되었습니다. {% endhint %}

자세한 설명은 https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b에서 확인할 수 있습니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 전문가로 배우세요

HackTricks를 지원하는 다른 방법: