Kerberos Introduction

 

※ 원문 : Kerberos Authentication, HackTricks

 

1. 커버로스(kerberos)란?

 

커버로스는 인증 프로토콜이다. 인가 프로토콜이 아니다.

즉, 비밀번호로 각 사용자를 식별하지만, 사용자가 액세스할 수 있는 서비스 및 리소스를 검증하지 않는다.

커버로스는 AD(Active Directory)에서 사용한다.

AD에서 커버로스는 각 사용자의 권한에 관련된 정보를 제공하지만, 리소스에 대한 사용자의 액세스를 결정하는 것은 각 서비스의 책임이다.

 

 

2. 커버로스 주요 컴포넌트

 

2.1. 전송 계층

 

커버로스는 TCP 및 UDP 모두를 전송 프로토콜로 사용한다.

TCP 및 UDP는 데이터를 평문으로 보낸다.

따라서, 커버로스는 암호화를 제공해야 한다.

커버로스는 TCP/88 및 UDP/88번 포트를 사용한다.

KDC에서 이 포트로 리스닝한다.

 

2.2. 에이전트

 

  • 클라이언트 / 사용자 : 서비스에 액세스를 요청
  • AP(Application Server) : AP는 사용자가 요구하는 서비스를 제공
  • KDC(Key Distribution Center) : 커버로스의 메인 서비스, 티켓 발행 책임, DC(Domain Controller)에 설치, TGT를 발행하는 AS(Authentication Service)가 지원

 

2.3. 암호키

 

  • KDC / krbtgt key : krbtgt 계정 NTLM 해시에서 파생
  • User key : 사용자 NTLM 해시에서 파생
  • Service key : 서비스 오너의 NTLM 해시에서 파생, 서비스 오너는 사용자 또는 컴퓨터 계정일 수 있음.
  • Session key : 사용자-KDC 간 협상에 사용
  • Service Session key : 사용자-서비스 간 사용

 

2.4. 티켓

 

  • TGS(Ticket Granting Service) : 사용자가 서비스에 대한 인증을 위해 사용. 서비스 키로 암호화.
  • TGT(Ticket Granting Ticket) : TGS를 요청하기 위해 KDC에 제출. KDC 키로 암호화.

 

2.5. PAC

 

PAC(Privilege Attribute Certificate)는 대부분의 티켓에 포함되어 있는 구조이다.

이 구조는 사용자의 권한을 포함하고 있고, 이 권한은 KDC 키로 서명되어 있다.

서비스들은 KDC와 통신하여 PAC를 검증할 수 있지만, 이런 일은 거의 발생하지 않는다.

PAC 검증이란, 단지 서명을 확인하는 것이다. PAC에 포함된 권한이 올바른지 확인하지 않는다.

따라서, 클라이언트는 티켓의 PAC에 권한을 포함하지 않고, KERB-PA-PAC REQUEST에 권한을 명시할 수 있다.

 

2.6. 메시지

 

  • KRB_AS_REQ : KDC에 TGT를 요청할 때 사용
  • KRB_AS_REP : KDC가 TGT를 제공할 때 사용
  • KRB_TGS_REQ : TGT를 사용하여, KDC에 TGS를 요청할 때 사용
  • KRB_TGS_REP : KDC가 TGS를 제공할 때 사용
  • KRB_AP_REQ : TGS를 사용하여, 서비스에서 사용자를 인증할 때 사용
  • KRB_AP_REP : 서비스가 자체적으로 사용자를 식별할 때 사용(옵션)
  • KRB_ERROR : 에러 컨디션을 통신하기 위한 메시지

 

AP는 선택적으로 KERB_VERIFY_PAC_REQUEST를 사용할 수 있다.

KERB_VERIFY_PAC_REQUEST는 PAC 서명을 KDC로 보내서, 서명이 올바른지 검증하기 위해 사용한다.

KERB_VERIFY_PAC_REQUEST는 커버로스의 메시지는 아니다. NRPC에 속하는 메시지이다.

 

 

3. 인증 프로세스

 

3.1. KRB_AS_REQ

 

사용자는 KDC에서 TGT를 받아야 한다.

이를 위해 KRB_AS_REQ를 보내야 한다.

 

 

KRB_AS_REQ는 아래와 같은 필드로 구성된다.

  • 클라이언트 키로 암호화된 타임 스탬프. 사용자를 인증하고, 리플레이 공격을 방어.
  • 인증된 사용자의 이름
  • krbtgt 계정과 관련된 서비스 SPN(Service Principal Name)
  • 사용자가 생성한 논스(nonce)

 

암호화된 타임 스탬프는 사용자가 사전 인증을 요청할 때만 필요하다.

즉, 사용자 계정에 DONT_REQ_PREAUTH 플래그가 설정된 경우를 제외하고는 일반적으로 사용된다.

 

3.2. KRB_AS_REP

 

KRB_AS_REQ를 받은 후, KDC는 타임 스탬프를 복호화하여 사용자 신원을 확인한다.

메시지가 올바르면, KRB_AS_REP로 응답한다.

 

 

KRB_AS_REP는 아래 정보를 포함한다.

  • Username
  • TGT

    • Username
    • Session Key
    • TGT 유효기간
    • PAC(사용자 권한 포함, KDC로 서명)
  • 사용자 키로 암호화된 데이터

    • Session Key
    • TGT 유효기간
    • 사용자 논스(리플레이 공격 방어)

 

완료되면, 사용자는 TGT를 갖는다.

TGT는 TGS를 요청하기 위해 사용된다.

 

3.3. KRB_TGS_REQ

 

TGS를 요청하기 위해서, KRB_TGS_REQ 메시지를 KDC로 보내야 한다.

 

 

KRB_TGS_REQ는 아래 정보를 포함한다.

  • 세션 키로 암호화된 데이터

    • Username
    • 타임 스탬프
  • TGT
  • 요청하는 서비스의 SPN
  • 사용자가 생성한 논스

 

3.4. KRB_TGS_REP

 

KRB_TGS_REQ를 받은 후, KDC는 KRB_TGS_REP에 TGS를 넣어 보낸다.

 

 

KRB_TGS_REP는 아래 정보를 포함한다.

  • Username
  • TGS

    • 서비스 세션 키
    • Username
    • TGS의 유효기간
    • PAC(사용자 권한 포함, KDC로 서명)
  • 세션 키로 암호화한 데이터

    • 서비스 세션 키
    • TGS 유효기간
    • 사용자 논스(리플레이 공격 방어)

 

3.5. KRB_AP_REQ

 

모든 것이 잘 수행된 경우, 사용자는 서비스와 상호 작용할 수 있는 유효한 TGS를 갖는다.

TGS를 사용하기 위해, 사용자는 AP에 KRB_AP_REQ를 보내야 한다.

 

 

KRB_AP_REQ는 아래 정보를 포함한다.

  • TGS
  • 서비스 세션 키로 암호화한 데이터

    • Username
    • 타임 스탬프(리플레이 공격 회피)

 

사용자 권한이 올바르면, 서비스에 액세스할  수 있다.

일반적으로 발생하지 않지만, AP는 KDC에 PAC를 검증한다.

또한, 상호 인증이 필요한 경우, 사용자에게 KRB_AP_REP로 응답한다.