Non-PKINIT
PKINIT & Kerberos
PKINIT은 Kerberos 프로토콜의 확장으로, 초기 인증 과정에서 공개키 암호화를 사용할 수 있게 해줍니다.
기존 Kerberos 인증은 대칭키 암호화 방식에 의존하기 때문에 클라이언트와 KDC가 비밀키를 공유해야 합니다.
반면 PKINIT은 공개키 방식을 사용하기 때문에 비밀키를 안전하게 공유해야 하는 대칭키 방식이 어려운
환경에서도 안전하게 키를 교환할 수 있는 장점이 있습니다.
이를 위해 PKINIT은 Kerberos 초기 인증 단계에서 공개키 암호화를 지원하기 위해 AD CS가 발급한
X.509 인증서를 활용하는데, AD CS는 PKINIT 과정에 참여하는 개체들에게 필요한 인증서를 발급하여
이들이 공개키/개인키 쌍을 이용해 Kerberos 프로토콜을 이용하여 인증을 수행할 수 있도록 합니다.
Schannel
반면 Schannel은 TLS/SSL 연결을 위한 Windows의 보안 지원 공급자이며,
클라이언트 인증을 처리하여 원격 서버가 접속 중인 사용자의 신원을 확인할 수 있게 해줍니다.
이 과정에서 PKI(Public Key Infrastructure)에 기반하며, 인증서가 주된 자격 증명으로 사용됩니다.
TLS 3-Way HandShake 과정에서 서버는 클라이언트에게 인증서를 요청하고,
클라이언트는 서버가 신뢰하는 CA에서 발급된 클라이언트 인증서를 제공합니다.
그리고 해당 인증서에 문제가 없다면 서버는 접근을 허용합니다.
How to abuse the PFX File
기본적으로 Active Directory 환경 내에서 Schannel 인증을 통해 이용 가능한 프로토콜은 많지 않습니다.
WinRM, RDP 등의 서비스들은 추가적인 설정을 해야지 Schannel을 통한 인증 후 접근이 가능하여
ESC 공격 등을 이용하여 인증서를 가져온다고 하더라도 PKINIT을 사용하지 않는다면 무용지물입니다.
객체에 대해 GenericAll/GenericWrite 권한이 있다고 하더라도 서버에서 PKINIT을 지원하지 않는다면
Targeted Kerberoasting 공격을 사용하며 공격 성공률을 낮출 수밖에 없는 것과 동일한 맥락입니다.
하지만 LDAPS 프로토콜은 AD CS가 설정되어 있다면 Schannel을 이용한 접근이 가능합니다.
LDAPS는 LDAP 프로토콜에서 SSL 프로토콜이 더해져 암호화가 되어 통신하는 프로토콜인데,
Schannel 인증 방식이 3-Way HandShake 과정에서 인증서를 통한 사용자 인증이기 때문에
결과적으로 LDAPS 통신 과정에서 사용자 인증이 인증서를 통해서 이루어 질 수 있게됩니다.
따라서 관리자 계정의 인증서를 탈취했을 때 LDAPS 프로토콜을 사용하여 관리자 권한 사용이 가능합니다.
PassTheCert
Yannick Meheut가 제작한 PassTheCert는 인증서를 통해 LDAPS으로 인증하도록 돕는 도구입니다.
1현재 PassTheCert에는 다음 네가지 공격만 구현되어 있습니다.
네가지 공격는 조건 없이 가능한 것이 아닌, 각 공격 별 요구되는 권한들이 존재합니다.
사용자에게 DCSync 권한 부여
도메인 머신의
msDS-AllowedToActOnBehalfOfOtherIdentity
속성 수정도메인에 컴퓨터 추가
계정 비밀번호 초기화
PassTheCert는 다음 깃허브 링크에서 다운로드 가능합니다.
PassTheCert는 획득한 pfx 파일에 포함되어 있는 개인키와 공개키를 기반으로 인증합니다.
따라서 pfx 파일로부터 이 둘을 먼저 추출해줘야 합니다.
개인키와 공개키를 추출하는 방법에는 openssl을 사용해도 되지만, 종종 파일에 오류가 발생할 수 있어
Certipy-ad 도구를 사용해서 개인키 / 공개키를 추출합니다.
RBCD
References
Last updated
Was this helpful?