FreeIPA Pentesting

Support HackTricks

Basic Information

FreeIPA는 주로 Unix 환경을 위한 Microsoft Windows Active Directory의 오픈 소스 대안입니다. 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.keytabkrb5.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 파일에서 자격 증명을 파싱하고 재사용하는 것은 klistKeytabParser와 같은 유틸리티를 사용하여 쉽게 수행할 수 있습니다.

Cheatsheet

Linux에서 티켓을 사용하는 방법에 대한 더 많은 정보는 다음 링크에서 확인할 수 있습니다:

Linux Active Directory

Enumeration

ldap 및 기타 binary 도구를 통해 enumeration을 수행하거나 FreeIPA 서버의 포트 443에 있는 웹 페이지에 연결할 수 있습니다.

Hosts, Users, and Groups

호스트, 사용자그룹을 생성할 수 있습니다. 호스트와 사용자는 각각 “Host Groups” 및 “User Groups”라는 컨테이너로 정렬됩니다. 이는 조직 단위(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

FreeIPAadmin 사용자는 ADdomain admins와 동등합니다.

해시

IPA 서버root 사용자는 비밀번호 해시에 접근할 수 있습니다.

  • 사용자의 비밀번호 해시는 “userPassword속성base64로 저장됩니다. 이 해시는 SSHA512 (구버전 FreeIPA) 또는 PBKDF2_SHA256일 수 있습니다.

  • 시스템이 AD통합되어 있으면 비밀번호의 Nthash는 “ipaNTHash”에 base64로 저장됩니다.

이 해시를 크랙하려면:

• FreeIPA가 AD와 통합된 경우, ipaNTHash는 쉽게 크랙할 수 있습니다: base64디코드한 후 ASCII 헥스로 재인코딩 -> 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 서버에서 root여야 하며, 그곳에서 dbscan 도구를 사용하여 추출할 수 있습니다:

HBAC-규칙

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

# 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로 명령을 실행할 수 있도록 허용하거나 제한합니다. 공격자는 이러한 규칙 세트를 조사하여 적용 가능한 호스트, 사용자 및 허용된 명령을 식별할 수 있습니다.

# 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로 구성되며, 각 privilegepermissions의 모음을 포함합니다. 이러한 역할은 사용자, 사용자 그룹, 호스트, 호스트 그룹 및 서비스에 할당될 수 있습니다. 예를 들어, 이 구조를 설명하기 위해 FreeIPA의 기본 “User Administrator” 역할을 고려해 보십시오.

역할 User Administrator는 다음과 같은 권한을 가지고 있습니다:

  • User Administrators

  • Group Administrators

  • Stage User Administrators

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

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

Linikatz/LinikatzV2

권한 상승

root 사용자 생성

만약 root라는 이름의 새 사용자를 생성할 수 있다면, 당신은 그를 가장할 수 있으며 어떤 머신에도 root로 SSH 접속할 수 있습니다.

이것은 패치되었습니다.

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

참고자료

HackTricks 지원하기

Last updated