kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

IT 용어 사전

NTLM이란?

까마기 2022. 12. 26. 19:39
반응형

NTLM(NT LanMan)

Windows NT 제품군의 모든 구성원이 사용하는 인증 절차이며, 
이전의 LanMAn처럼 NTLM은 클라이언트의 신원을 확인하기 위해 네트워크를 통해 암호나 해시도니 암호를 전송하지 않고 challenge / response 절차를 사용한다.

NTLM 인증은 네트워크에 사용자 암호(혹은 해시된 상태의 암호)를 전송하지 않는다.
대신에 NTLM 인증은 실제 암호가 네트워크를 거치지 않도록 하기 위해 challenge / response 방식을 사용한다.
 

NTLM 인증 방식

 NTLM 프로토콜은 크게 "Connection-Oriented(연결지향성)" 와 "Connectionless(비연결형)" 으로 나뉘지만 이번 포스팅에서는 연결지향성 NTLM 만 다룬다. 두 방식은 큰 차이점은 없으며 NEGOTIATE 메시지를 먼저 보내는지 안보내는지 정도의 차이만 이해하고 있으면 될 것 같다.

NTLM 절차

  1. 클라이언트가 서버로 사용자 이름을 보낸다.
  2. 서버는 이에 대한 요청 값(challenge)을 생성해 클라이언트로 보낸다.
  3. 클라이언트는 이 요청 값을 사용자 암호로 암호화해 서버로 응답(response)을 보낸다.
  4. Access Token을 발급하고 세션을 맺는다.

 

- Challenge-Response 인증 프로토콜

 NTLM 이 Challenge-Response 프로토콜 방식으로 동작하기 때문에 NTLM 프로토콜을 시작하기전에 Challenge-Response 프로토콜에 대해 이해하고 있는 것이 좋다. Challenge-Response 프로토콜은 인증 프로토콜 중 하나로 다음과 같은 방식으로 키 값을 인증한다.



  1. Alice 는 Bob 의 자원에 접근하기 위해 인증을 요청
  2. Bob 은 Alice 에게 임의의 값인 Challenge(도전) 을 전송
  3. Alice 는 Bob 이 보낸 도전에 대해 Alice 와 Bob 이 사전에 알고 있는 키와 알고리즘으로 계산한 Response(응답)를
    Bob에게 전송
  4. Bob 은 전달 받은 응답이 사전에 알고 있는 값으로 계산한 값이 맞는지 확인 후 인증완료

 Challenge-Response 인증 프로토콜은 위와 같은 방식으로 동작하여 몇가지 변형이 있으나 큰틀은 바뀌지 않는다. NTLM 역시 위와 같은 방식으로 인증을 수행한다.

 

 

- NTLM 인증 흐름

NTLM 의 인증 흐름은 다음과 같다.

 

 

  1. 클라이언트 어플리케이션에서 세션인증이 필요하여 NEGOTIATE_MESSAGE 를 서버로 전송
    - 이때 클라이언트가 인증과정에 필요한 각종 정보를 명세하여 전달 (Security feature)
    - (클라이언트의 이름, 사용할 NTLM 버전, 해싱 방식 등)

  2. 서버는 CHALLENGE_MESSAGE 를 클라이언트로 전송
    - 클라이언트가 요청한 인증요소에 맞춰 서버가 생성한 임의의 Challenge(도전) 값을 포함하여 전달
    - Challenge(도전)는 서버가 생성한 64Bit(8Byte) 의 의사난수 값

  3. 클라이언트는 AUTHENTICATE_MESSAGE 를 서버로 전송
    - 유저의 암호를 기반으로 생성한 해시 값을 '응답' 값으로 포함하여 전달
    - 'LM응답' 과 'NT응답' 이 전달됨

  4. 서버는 유저의 '응답' 이 유효한 값인지 확인후 인증완료

 

각 단계에서 보이는 NEGOTIATE_MESSAGE, CHALLENGE_MESSAGE, AUTHENTICATE_MESSAGE 는 NTLM 인증에서 사용하는 메시지 구조체이다. 

 

 

- NTLM Message 구조체

 NTLM 은 인증 과정 중에 전송되는 메시지 구조체를 통해 Challenge 값, Response 값, 클라이언트와 서버간의 NTLM 인증을 위한 동기화 정보 등을 교환한다. 
 NEGOTIATE_MESSAGE 는 클라이언트가 서버로 가장먼저 전달하는 메시지이다.  

 

 

 

- LM 해시와 NT 해시

 

 상기의 NTLM 인증 흐름에서 봤듯이 NTLM 은 해싱된 유저 암호를 사용하여 인증 응답 값을 생성한다. 이때 사용되는 해싱방식은 LM 해시 NT 해시 두가지가 사용된다. 두 방식은 NTLM 버전에 따라 내부적으로 구현되는 방식이 다르다. 두 해싱 방식의 차이는 다음과 같다.

 

NTLM 버전   LM 해시 NT 해시
 NTLMv1  해싱방식 DES 방식 MD4 방식
 암호길이 14자까지만 가능 제한없음
 해시길이 128Bit(16Byte) 128Bit(16Byte) 
 함수명 LMOWFv1() NTOWFv1() 
 NTLMv2  해싱방식 NTLMv2 의 NT 해시와 동일 HMAC-MD5 와 MD4 방식
 암호길이 NTLMv2 의 NT 해시와 동일 제한없음
 해시길이 NTLMv2 의 NT 해시와 동일 128Bit(16Byte)
 함수명 LMOWFv2() NTOWFv2()

(LMOWF(), NTOWF() 에서 OWF 는 One Way Function 을 의미)        

 

 NTLMv1 에서 사용하는 LM 해시방식의 경우 구조상의 문제로 유저 암호를 14자까지만 사용 가능하다. 또한 NTLMv2 에서는 LM 해시와 NT 해시의 함수가 동일하다. 이는 NTLM 버전이 상승하면서 취약한 LM 해시 함수를 교체한 것으로 보인다.

 

 

- 해시함수 LMOWF(), NTOWF()

 LM, NT 해시의 구현은 NTLM 버전에 따라 다르며 MS 에서 정의한 내용은 다음과 같다.

- LMOWFv1()

 



Define LMOWFv1(Passwd, User, UserDom) as
    ConcatenationOf( DES( UpperCase( Passwd)[0..6],"KGS!@#$%"), DES( UpperCase( Passwd)[7..13],"KGS!@#$%")) 
EndDefine


* C = DES(K, D)
C : 8Byte Message
K : 7Byte Key
D : 8Byte Data

 

 LMOWFv1() 은 14자리의 사용자 암호를 반으로 나눈 두 값을 각각의 DES key 로 사용한다. 따라서 LMOWFv1() 함수를 사용 할때 암호는 14자리를 넘을 수없다. 암호가 14자리 이하일 경우 빈 값은 널 값으로 처리된다. 또한 입력되는 암호를 모두 대문자로 치환하여 연산한다.

 

 DES 로 암호화는 값은 MS 에서 지정한 임의의 고정 값이다("KGS!@#$%"). DES 로 암호화한 두 값을 이어 붙여 LMOWFv1() 의 해시 값으로 사용한다. 즉 최종해시 값은 16Byte 의 값이다.



- LMOWFv2()

 



NTOWFv2() 와 동일

 

 NTLMv2 에서 사용되는 LMOWFv2() 함수는 함수와 내부적으로 NTOWFv2() 를 호출한다.

 

- NTOWFv1()

 



Define NTOWFv1(Passwd, User, UserDom) as 
    MD4(UNICODE(Passwd))
EndDefine

 

 NTOWFv1() 은 MD4 해시를 사용하여 16Byte 의 해시 값을 생성한다.

 

- NTOWFv2()

 



Define NTOWFv2(Passwd, User, UserDom) as 
    HMAC_MD5MD4(UNICODE(Passwd)), UNICODE(ConcatenationOf( Uppercase(User), UserDom ) ) )
EndDefine

 

 NTOWFv1() 는 MD5 를 사용하는 HMAC 방식을 사용한다. 이때 사용자 암호는 MD4 로 해시화 되어 사용된다. 또한 유저 이름과 도메인명이 메시지로 사용된다. 출력값은 16Byte 이다.

 

 

 

- NTLM 의 인증 키 계산 (Response 값 계산)

 

 NTLM 에서는 연결형이든 비연결형이든 클라이언트 측에서 "Challenge(도전)" 에 대한 "Response(응답)" 을 계산하여 전달해야 한다. 서버는 클라이언트로부터 전달받은 응답값을 생성과 동일한 방식으로 검증해야 한다.



- NTLMv1 에서의 인증 키 계산

(* 괄호안의 숫자는 해당 데이터의 바이트 크기)

 

@ NEGOTIATE 메시지에서 NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY 셋팅되어 있을 경우

 

1. ServerChallenge(8) 값과 ClientChallenge(8) 값을 연결. (16Byte 의 난수 생성)

* ServerChallenge: 서버에서 생성한 8Byte Challenege 값

* ClientChallenge: 클라이언트에서 생성한 8Byte Challenege 값

 

2. 상기의 16Byte 난수 값에 MD5 해싱을 적용하여 만든 메시지를 0~7 번째 바이트만 취함. 해당 값을 'Data' 라 함

 

3. NTOWFv1() 함수를 사용하여 'ResponseKeyNT(16)' 를 구함

 

4. DESL(ResponseKeyNT, Data) 를 연산하여 'NtChallengeResponse(24)' 값으로 사용

* DESL(K, D) 는 24Byte 값을 반환. (K: 16Byte, D: 8Byte)

 

5. 클라이언트 Challenge 값(8) 과 16Byte 의 제로 패딩을 연결하여 'LmChallengeResponse(24)' 를 만듬.

 

@ NEGOTIATE 메시지에서 NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY 값이 셋팅되어 있지 않을 경우

 

1. NTOWFv1() 함수를 사용하여 'ResponseKeyNT(16)' 를 구함

 

2. DESL(ResponseKeyNT, ServerChallenge) 를 연산하여 'NtChallengeResponse(24)' 값으로 사용

 

@ NoLMResponseNTLMv1 값이 셋팅 되어 있을 경우 다음 과정을 진행

 

i) 'LmChallengeResponse' 를 'NtChallengeResponse' 와 동일한 값으로 설정

 

@ NoLMResponseNTLMv1 값이 셋팅 되어 있지 않을 경우 다음 과정을 진행

 

i) LMOWFv1() 함수를 사용하여 'ResponseKeyLM(16)' 을 구함

ii) DESL(ResponseKeyLM, ServerChallenge) 를 연산하여 'LmChallengeResponse(24)' 값으로 사용

 

 

- NTLMv2 에서의 인증 키 계산

 

1. 다음 값들을 연결하여 'TempMsg' 를 만듬

- ResponseVersion(1) : 버전정보. 1로 셋팅

- HiResponseVersion(1) : 클라이언트가 알고있는 가장 높은 응답 버전. 1로 셋팅

- Zero(6) : 패딩

- Time(8) : GMT 시간

- ClientChallenge(8) : 클라이언트에서 생성한 Challenge 메시지

- Zero(4) : 패딩

- ServerName(가변) : NTLMv2_RESPONSE.NTLMv2_CLIENT_CHALLENGE.AvPairs 값 (서버이름)

- Zero(4) : 패딩

 

2. NTOWFv2() 함수를 사용하여 'ResponseKeyNT(16)' 을 구함

 

3. 'ServerChallenge(8)' 와 'TempMsg' 를 연결하여 'Data' 를 만듬

 

4. HMAC_MD5( ResponseKeyNT, Data ) 를 연산하여 'NTProofStr(16)' 값으로 사용

 

5. 'NTProofStr(16)' 값과 'TempMsg(가변)' 값을 연결하여 'NtChallegeResponse(가변)' 를 만듬

 

6. LMOWFv2() 함수를 사용하여 'ResponseKeyLM(16)' 을 구함

 

7. 'ServerChallenge(8)', 'ClientChallege(8)' 를 연결한 값을 'TempData' 라 함

 

8. HMAC_MD5( ResponseKeyLM, TempData ) 를 연산하여 'LmChallengeResponse(16)' 값으로 사용

 

 

 

 

 


 

Last update ::

  - 2019.11.03
  - 2020.05.25 : 본문 내용 수정

 

Keywords ::

  - NTLM

  - LM Hash

  - NT Hash

  - LMOWF

  - NTOWF

  - Challenge-Response 인증

 

References ::

  - [MS-NLMP] NT LAN Manager (NTLM) Authentication Protocol :: MS NTLM Specification

  - https://en.wikipedia.org/wiki/NT_LAN_Manager :: NTLM 위키백과

  - https://en.wikipedia.org/wiki/Challenge%E2%80%93response_authentication :: Challenge-response authentication 위키백과

  - https://docs.microsoft.com/ko-kr/windows/win32/secauthn/microsoft-ntlm?redirectedfrom=MSDN :: MS NTLM 인증 설명

  - https://m.blog.naver.com/PostView.nhn?blogId=snailswalk&logNo=60136563088&proxyReferer=https%3A%2F%2Fwww.google.com%2F :: NTLM 설명

  - https://github.com/SecureAuthCorp/impacket/blob/master/impacket/ntlm.py :: impacket 의 ntlm.py 소스코드

  - https://ko.wikipedia.org/wiki/MD4 :: MD4 위키백과

  - https://en.wikipedia.org/wiki/HMAC :: HMAC 위키백과

반응형