주제
Windows Kerberos 및 악용
내용
Kerberos는 네트워크 인증을 위해 사용되는 보안 프로토콜로, 클라이언트와 서버가 통신할 때 암호화된 티켓을 이용해 신뢰할 수 있는 인증을 제공합니다. Kerberos의 핵심 개념과 티켓 기반 인증 방식, 중앙 인증 서버(KDC)의 역할, 커버로스 인증의 취약한 설정으로 인해 발생 가능한 공격에 대해 설명합니다.
1. Kerberos 인증의 특징
- 티켓 기반 인증
- 비밀번호를 직접적으로 노출하지 않고, 클라이언트가 인증 서버로부터 받은 암호화된 티켓을 사용해 인증을 수행
- KDC라는 중앙 서버가 인증을 관리
- Authentication Server(AS) 역할: 사용자의 신원을 확인하고 TGT(Ticket Granting Ticket)을 발급
- TGS(Ticket Granting Server) 역할: 사용자가 요청한 서비스에 접근할 수 있도록 서비스 티켓을 발급
※ AD 환경에서는 도메인 컨트롤러가 KDC로서 동작
2. Kerberos 인증 흐름
- AS-REQ / AS-REP (TGT 발급)
- 클라이언트는 KDC의 AS에 사용자를 인증합니다. TGT를 발급받습니다.
- TGT는 클라이언트의 신원을 증명하며, 이후 TGS에 접근할 수 있는 권한을 제공합니다.
- TGS-REQ / TGS-REP (ST 발급)
- 클라이언트는 TGT를 사용해 KDC의 TGS로 ST(Service Ticket)를 요청합니다.
- 요청에 SPN을 포함
- SPN: Service Principal Name. Kereros를 통해 접근할 수 있는 서비스 인스턴스에 대한 고유 식별자
- TGT는 krbtgt 계정의 해시로 암호화
- TGS는 TGT를 검증한 후, 클라이언트에게 ST를 발급합니다.
- TGS는 SPN을 통해 해당 서비스와 연결된 서비스 계정을 찾고, 그 서비스 의 해시로 ST를 암호화한 뒤, 발급
- 클라이언트는 TGT를 사용해 KDC의 TGS로 ST(Service Ticket)를 요청합니다.
- 서비스 요청 (ST 사용)
- 클라이언트는 ST를 사용하여 원하는 서비스에 인증 후 접근합니다.
[참고] Kerberos 5 authentication protocol 흐름
3. Kerberos 악용
3.1. Kerberoasting
Kerberos 인증 시스템의 특징을 악용하여, 특정 서비스 계정의 비밀번호 해시를 획득한 뒤 이를 오프라인에서 크랙하는 방식입니다.
- Kerberos 환경의 모든 사용자는 모든 서비스에 대해 TGS-REQ 요청을 보낼 수 있습니다.
- 사용자가 해당 서비스에 실제로 접근할 수 있는 권한이 있든 없든, KDC는 요청에 응답하여 서비스 티켓(ST)을 발급합니다. → Kerberos는 인증 서비스이지, 인가 서비스가 아니기 때문
- 사용자가 요청한 서비스에 실제로 접근할 수 있는지 여부는 서비스 서버에서 판단합니다.
가정: 도메인 자격 증명 획득(권한 상관 없음)
익스플로잇 흐름:
Step 1) TGS-REQ
impacket-GetUserSPNs -request {domain/id:pw} -dc-ip {ip} -outputfile {outputfilename}
- impacket-GetUserSPNs: SPN 열거, ST 요청 및 저장, PtH 인증 가능
Step 2) KDC-TGS가 암호화된 티켓(ST)을 제공
- svc-admin 계정으로 ST를 요청(TGS-REQ)하고, 그에대한 결과(TGS-REP)을 확인
- sql-user, http-user라는 서비스 계정으로 암호화된 ST 획득
Step 3) ST 해시 크래킹 → 서비스 계정의 패스워드 습득 가능
- ST는 서비스 계정의 NTLM 해시에서 파생된 키로 암호화되었기 때문에, 서비스 계정의 패스워드를 크래킹
3.2. AS-Rep Roasting
Kerberos 사전 인증(Pre-Authentication)이 비활성화된 계정의 암호화된 인증 데이터를 수집한 뒤, 이를 오프라인에서 크랙하여 NTLM 해시를 획득할 수 있는 공격입니다.
- 사전 인증은 기본적으로 활성화된 상태이며, 사용자가 유효한 패스워드를 제공해야 AS-REP을 반환합니다. (TGT 제공)
- 하지만 Do not require Kerberos pre-authentication 옵션이 활성화된 경우, KDC-AS는 사용자 인증 없이도 암호화된 AS-REP 데이터를 반환합니다.
가정: 사전 인증이 비활성화된 계정 존재(svc-admin)
익스플로잇 흐름:
Step 1) 사전 인증이 비활성화된 계정을 이용하여 AS-REQ
impacket-GetNPUsers {domain/id} -dc-ip {ip} -no-pass -outputfile {outputfilename}
- 계정명을 알지 못하는 경우, -userfile 옵션 사용하여 사전 대입 가능 (이 경우 -no-pass 옵션 불필요)
Step 2) KDC-AS가 AS-REP 제공
- svc-admin 계정으로 AS-REQ 하고, 그에 대한 결과(AS-REP)를 확인
Step 3) 해당 데이터 크래킹 → 사용자 계정(svc-admin)의 패스워드 습득 가능
- AS-REP에는 krbtgt 계정의 해시로 암호화된 TGT와 사용자 계정의 NTLM 해시로 암호화된 세션키가 존재. 사용자 계정의 NTLM 해시 추출 후 크래킹
레퍼런스
- TryHackMe: Attacktive Directory (링크)
- Kerberos - A Domains Achille's Heel (링크)
- Forestall Security: How to Secure Kerberos Authentication Protocol - 1 (링크)
- Pentesting Wiki (링크)
- ver.miun.se: Key Management and Authentication-Daniel Bosk (링크)
- Microsoft: Kerberos Authentication Overview (링크)
'System > 침투' 카테고리의 다른 글
DLL Search Order Hijacking (0) | 2024.12.24 |
---|---|
DLL Hijacking 실습 (2) (0) | 2024.10.26 |
THM - Offensive Pentesting-Skynet (0) | 2023.10.24 |
THM - Enumerating Active Directory(2) (0) | 2023.10.20 |
THM - Enumerating Active Directory(1) (0) | 2023.10.19 |