NTLM 인증

윈도우 운영체제의 NTLM (New-Technology LAN Manager) 유저 인증 프로토콜은 Msv1_0.dll 에 속해있는 사용자 인증 프로토콜들의 집합이다. 설명에 앞서 NTLM 인증과 관련된 단어 몇 가지를 정의하고 간다.

  • NTLM 인증 (NTLM Authentication) - NTLMv1, NTLMv2 등을 통트는 NTLM 인증 프로토콜들의 집합이다.

  • NTLMv1 (Net-NTLMv1) - 네트워크 기반의 NTLM 인증 프로토콜. 1993년도에 나와 문제가 많다.

  • NTLMv2 (Net-NVLMv2) - 네트워크 기반의 NTLM 인증 프로토콜. 1998년도에 나왔다.

  • NT 해시 - 다양한 NTLM 인증시 사용되는 해시. (NTLM 해시가 아니다!)

  • LM 해시 - 80년대때 나온 크래킹 하기 아주 쉬운 해시. 위 NT 해시가 나온뒤 윈도우 서버 2000 이후 부터는 기본적으로 사용되지 않는다. 오래된 AD 환경에서는 아직도 몇 개씩 발견된다.

NTLM 인증 프로토콜은 1993년도에 제로 트러스트 (Zero Trust)를 의식해 나온 프로토콜이다. 네트워크상 평문 비밀번호가 전달되지 않도록 특별한 Challenge/Response 형태의 사용자 인증을 구현했다. NTLM 인증은 다음과 같이 이뤄진다:

  1. 클라 -> 서버: 인증하고 싶은 유저의 이름을 평문으로 보내 NTLM 인증 프로토콜을 시작한다.

  2. 서버 -> 클라: 랜덤한 8 바이트 챌린지(Challenge) 문자열을 보내면서 클라이언트가 갖고 있는 유저의 비밀번호를 NT 해시화한 뒤 챌린지를 암호화 해 서버에게 보내도록 지시한다.

  3. 클라: 서버로부터 받은 챌린지를 NT 해시로 암호화 한다.

  4. 클라 -> 서버: 암호화된 챌린지를 서버에게 다시 보내준다.

  5. 서버: 서버에 있는 SAM (Security Account Manager) 데이터베이스 안의 NT 해시화된 유저의 비밀번호를 찾은 뒤 서버의 챌린지를 암호화한다.

  6. 서버: 2개의 챌린지 - 클라의 챌린지와 서버의 챌린지를 비교한다. 2개의 챌린지가 동일 하다면 클라가 제공한 유저의 비밀번호가 맞는 것이다. 둘이 다르면 클라가 제공한 비밀번호가 틀린 것이다.

  7. 서버 -> 클라: 2개의 챌린지 동일 여부에 따라 사용자 인증을 허가/불허한다.

액티브 디렉토리 기반 NTLM 인증

NTLM 인증은 대부분 액티브 디렉토리에서 이뤄지는 경우가 많다. 액티브 디렉토리 기반의 NTLM 인증도 로컬 NTLM과 크게 다른 점은 없지만, 중간에 챌린지를 복호화해 사용자 인증을 허가/불허하는 것이 도메인 컨트롤러로 바뀐다는 점이 다르다.

큰 틀은 비슷하다. 다만 다른 점이 있다면 서버가 사실상의 "중간자" 역할을 하고 있다는 점, 사용자 인증 허가/불허를 내주는 것이 도메인 컨트롤러가 됐다는 점, 그리고 SAM 데이터베이스를 보는 것이 아니라 액티브 디렉토리내의 모든 유저의 NT 해시가 담긴 NTDS.dit 파일을 참고해 도메인 컨트롤러가 자신의 챌린지를 암호화한 뒤 2개의 챌린지를 비교한다는 점이다.

패스 더 해시와 NTLM 릴레이 공격

위 다이어그램들을 보면 Pass-the-Hash 공격과 NTLM 릴레이 공격을 떠올릴 수 있을 것이다.

  1. Pass-the-Hash: 결국 평문 비밀번호는 필요 없다. NT 해시를 알기만 해도 특정 유저로 사용자 인증이 가능하다.

  2. NTLM 릴레이: 가운데의 "서버" 호스트가 공격자가 된다면 중간자 포지션을 잡고 클라이언트로부터 Challenge 만 받은 뒤, 공격자가 사용자 인증을 사용할 수 있다.

마치며

이처럼 NTLM 인증은 그 시도는 좋았으나 여러모로 악용될 여지가 있는 사용자 인증 프로토콜이다. 악용될 여지가 많지만, 여전히 레거시 프로그램, 스크립트, 호스트들이 NTLM 인증을 쓰기 때문에 많은 액티브 디렉토리 기반의 네트워크에서 계속 사용되고 있다. 안전한 NTLM 인증을 위해서는 SMB Signing, NTLMv2 강제 사용 등의 설정을 해야한다. 이에 대해서는 PTH 기법과 NTLM 릴레이 공격 페이지에서 더 서술한다.

가장 안전한 방법은 액티브 디렉토리를 커버로스 인증이나 ADCS 인증서 기반의 인증만 사용하도록 바꾸는 것이다. 그러나 하위 호환 때문에 이는 거의 불가능한 경우가 많다. NTLM 인증을 어쩔 수 없이 사용해야한다면, 최대한 패치를 자주하고 보안과 관련된 설정을 제대로 해 피해를 최소화 해야한다.

Last updated