88 - kerberos

커버로스는 네트워크 상에서 비밀키를 사용하여 사용자를 인증하는 프로토콜이며 Windows와 macOS 등에서 표준으로 사용되고 있습니다.

본 페이지는 Windows Kerberos를 기반으로 설명합니다.

Abuse

# kerbrute 설치
git clone https://github.com/ropnop/kerbrute.git
cd kerbrute
go build

# 사용자 이름 목록을 기반으로 존재하는 계정 확인
./kerbrute userenum username.txt -d 'contoso.com' --dc 'dc01.contoso.com'

프로토콜

도메인 사용자가 서비스에 접근할 때 TGT(Ticket Granting Ticket)가 없는 상태라면 인증 서버를 담당하는 도메인 컨트롤러에 TGT를 요청하게 됩니다. 생성된 TGT는 일정 기간동안 유효하며, 유효한 상태에서는 계정정보 대신 TGT를 통해 인증합니다.

TGT를 획득한 사용자는 서비스를 이용하기 위한 서비스 티켓을 발급하기 위해 도메인 컨트롤러에 TGT와 함께 사용하고자 하는 서비스를 제출합니다. 이때 도메인 컨트롤러는 TGT를 복호화하여 유효한 티켓이 맞는지 확인 후 서비스 티켓을 반환합니다.

마지막으로 클라이언트는 서비스 티켓을 통해 서비스 서버(서비스 호스트)에게 티켓을 제공함에 따라 서비스를 이용할 수 있습니다.

이때 각 단계에서 사용하는 비밀키는 다르며, 위에서 언급한 단계를 그림으로 표현하면 다음과 같습니다.

위 그림은 커버로스 인증 과정을 요약한 것이며 실제 패킷은 더 방대한 정보를 포함하지만, 분량 상 위 그림에서 설명하는 정보를 토대로 실제 커버로스 패킷을 확인하겠습니다.

AS-REQ

TGT를 획득하기 위해 클라이언트는 서버에게 누가 어떤 서비스를 언제 요청하는 것인지 알려야 합니다. 또한 클라이언트의 신분을 보장하기 위해서 요청하는 시간인 타임스탬프를 자신의 nt hash로 암호화하여 전송합니다.

AS-REP

AS-REP은 클라이언트의 nt hash로 암호화 되는 일반 응답 데이터와, krbtgt의 nt hash로 암호화 되는 TGT 데이터가 포함됩니다.

클라이언트 nt hash로 암호화된 일반 응답 데이터

클라이언트의 nt hash로 암호화 되는 일반 응답 데이터에서는 커버로스 인증에 사용될 TGT 세션키, 난수, 티켓의 유효기간, 서비스 등을 포함합니다.

krbtgt nt hash로 암호화된 TGT
TGT 내부 authorization-data

krbtgt nt hash로 암호화 되는 TGT는 클라이언트가 TGT 데이터를 복호화하지 못하기 때문에 인증 정보를 조작할 수 없습니다.

TGS-REQ

TGS-REQ에서는 클라이언트가 TGT 세션키로 암호화한 타임스탬프와 TGT, 그리고 어떤 서비스를 이용할 것인지 명시하여 요청합니다.

TGT, 타임스탬프
요청하는 서비스

앞서 언급한 것과 같이 도메인 컨트롤러는 krbtgt nt hash를 갖고있기 때문에 TGT를 복호화할 수 있습니다.

또한 TGT를 복호화하면 내부에 TGT 세션키가 저장되어 있기 때문에, 이 키를 가지고 클라이언트의 타임스탬프를 복호화하여 현재 시간과 비교할 수 있습니다.

AS-REQ와 마찬가지로 TGS-REQ에서도 타임스탬프를 확인하는 이유는 재사용 공격을 방지하기 위함이며, 기본적으로 도메인 정책은 5분 미만의 차이까지 허용합니다.

TGS-REP

TGS-REP는 TGT 세션키로 암호화된 응답 데이터와 서비스 계정 nt hash로 암호화된 서비스 티켓이 포함됩니다.

TGT 세션키로 암호화된 응답 데이터
서비스 계정 nt hash로 암호화된 서비스 티켓

TGT 세션키로 암호화된 데이터 내에는 서비스 티켓 사용을 위한 서비스 티켓 세션키가 포함되어 있으며, 서비스 계정 nt hash로 암호화된 서비스 티켓 내부에도 동일한 서비스 티켓 세션키가 포함되어 있습니다.

TGT와 마찬가지로 서비스 티켓은 해당 서비스 주체의 nt hash로 암호화 되기 때문에 클라이언트가 중간에 서비스에 대한 권한 정보를 변조할 수 없습니다.

AP-REQ

AP-REQ는 서비스 티켓 세션키로 암호화한 클라이언트 정보, 타임스탬프와 서비스 티켓이 포함됩니다.

서비스 티켓 세션키로 암호화된 클라이언트 정보, 타임스탬프
서비스 계정 nt hash로 암호화된 서비스 티켓

클라이언트가 도메인 컨트롤러와 인증을 마치고 서비스 티켓을 가진채 서비스 서버에 접근하면, 서비스 서버는 최초에 서비스 티켓 세션키가 없기 때문에 클라이언트의 타임스탬프를 복호화하지 못합니다.

하지만 서비스 티켓을 자신의 nt hash로 복호화한 이후 내부에 저장된 서비스 티켓 세션키를 사용하여 복호화가 가능하며, 최종적으로 티켓의 유효성, 클라이언트, 서비스, 타임스탬프가 모두 정상적일 경우에 서비스 접근을 허용합니다.

References

Last updated