Active Directory(AD) 환경에서 Kerberos는 기본 인증 프로토콜로 사용되지만, 서비스 티켓의 특성상 오프라인 크래킹에 취약한 구조를 가지고 있습니다. 본 글에서는 Kerberoasting 기법과 Mimikatz를 연동하여 티켓을 탈취하고 권한을 상승시키는 전체 공격 체인을 기술적 관점에서 분석합니다.
1. SPN(Service Principal Name) 열거 및 타겟 식별
Kerberoasting의 첫 단계는 도메인 내에서 SPN이 등록된 서비스 계정을 찾는 것입니다. 공격자는 LDAP 쿼리를 통해 사용자 계정에 매핑된 SPN을 열거합니다. PowerShell을 활용한 열거 스크립트는 다음과 같이 실행될 수 있습니다.
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName | Select-Object Name, ServicePrincipalName
이 과정을 통해 MSSQL, IIS 등 특정 서비스를 실행하는 계정과 해당 SPN(예: MSSQLSvc/db-node01.corp.local:1433)을 식별할 수 있습니다.
2. TGS(Service Ticket) 요청 및 추출
식별된 SPN을 대상으로 KDC(Key Distribution Center)에 TGS를 요청합니다. 요청된 티켓은 NTLM 해시 형태로 암호화되어 공격자에게 전달됩니다. Python 기반의 요청 도구를 사용하여 티켓을 파일로 저장하는 과정은 다음과 같습니다.
python3 kerberoast.py --domain-cmd "CORP.LOCAL" --target-spn "MSSQLSvc/db-node01.corp.local:1433" --out-ticket db_mssql.kirbi --rid 1105
또는 네트워크 캡처 파일(PCAP)에서 TGS-REP 패킷을 필터링하여 티켓 데이터를 추출할 수도 있습니다.
3. 오프라인 비밀번호 크래킹
추출한 .kirbi 티켓 파일은 로컬 환경에서 사전 공격(Dictionary Attack)을 통해 평문 비밀번호를 복원할 수 있습니다. 기존 도구 대신 최적화된 해시 크래킹 도구를 활용하면 다음과 같이 처리할 수 있습니다.
python3 tgsrepcrack.py --wordlist /opt/dictionaries/custom_words.txt --ticket-file db_mssql.kirbi
크래킹이 성공하면 서비스 계정의 평문 자격 증명을 확보하게 되며, 이를 통해 도메인 내 횡적 이동(Lateral Movement)이 가능해집니다.
4. Mimikatz를 활용한 패스 더 티켓(Pass-the-Ticket)
확보한 티켓을 현재 세션에 주입하여 인증을 우회하거나 권한을 상승시키기 위해 Mimikatz를 사용합니다.
먼저, 현재 메모리에 캐시된 Kerberos 티켓을 확인하고 내보냅니다.
mimikatz # kerberos::list /export
이후, 크래킹을 통해 얻거나 탈취한 유효한 TGS 티켓을 현재 프로세스의 로그온 세션에 주입(Pass-the-Ticket)합니다.
mimikatz # kerberos::ptt "C:\Tickets\db_mssql.kirbi"
티켓 주입이 완료되면, 공격자는 별도의 비밀번호 입력 없이 해당 SPN이 가리키는 대상 서비스(예: 데이터베이스 서버)에 관리자 권한으로 접근할 수 있습니다.
5. 공격 방어 및 완화 전략
이러한 Kerberos 공격 체인을 차단하기 위해서는 다음과 같은 보안 통제가 필요합니다.
- SPN 계정 감사: 불필요하게 등록된 SPN을 정기적으로 제거하고, 서비스 계정의 권한을 최소 권한 원칙에 따라 제한합니다.
- 강력한 비밀번호 정책: 서비스 계정은 자동 생성된 25자 이상의 복잡한 비밀번호를 사용하도록 강제하여 오프라인 크래킹 시도를 무력화합니다.
- 이상 징후 모니터링: 단일 호스트에서 다수의 SPN에 대해 연속적으로 TGS를 요청하는 행위(이벤트 ID 4769)를 탐지하는 SIEM 규칙을 구축합니다.
- 엔드포인트 탐지 및 대응(EDR): 메모리 상의 티켓 조작 및 Mimikatz와 같은 크레덴셜 덤프 도구의 실행을 실시간으로 차단합니다.