Active Directory 데이터파일 NTDS.dit 추출 및 비밀번호 NT hash 획득하기

Active Directory(이하 “AD”)의 데이터 보안 기능에 대해 알아보다 확인한 내용들을 공유한다. 모든 정보는 학습 목적으로만 사용하길 바란다.

AD의 모든 정보는 Domain Controller의 NTDS.dit 파일에 저장된다. AD는 Jet Database Engine을 사용하며, NTDS.dit 파일은 그 데이터 파일이다. AD User Object를 예로 들자면, 사용자 이름, 전화번호, 이메일주소 등의 정보는 물론, NT hash 형태의 비밀번호도 이 파일에 저장된다.

Active Directory Data Store Physical Structure

NTDS.dit 파일의 데이터는 NT hash 형태의 비밀번호를 제외하면 모두 평문으로 저장된다. 비밀번호가 hash 형태로 저장되기 때문에 암호화 된다는 것이 아니라, NT hash 값 자체가 암호화되어 저장된다. 그 암호화 키는 해당 NTDS.dit 파일에 암호화되어 저장되는데, 이 때의 암호화 키는 NTDS.dit 파일을 가지고 있던 서버의 BootKey이다. 구체적으로 정리하자면 아래와 같다.

즉, NTDS.dit 및 BootKey만 있으면 NTDS.dit의 모든 정보를 해독할 수 있다. NTDS.dit를 추출하고 해독하는 방법은 다양하게 존재하지만, 이 글에서는 가장 쉬운 방법을 사용하여 그 과정을 소개한다.

먼저 NTDS.dit 및 BootKey를 추출해야 한다. NTDS.dit 파일은 AD를 설치할 때 따로 변경하지 않았다면, Domain Controller(이하 “DC”)의 C:\Windows\NTDS에 위치한다.

C:\Windows\NTDS에 위치한 NTDS.dit 파일

해당 파일은 Windows에 의해 보호되고 있으므로, 단순하게 복사/붙여넣기로는 해당 파일을 빼낼 수 없다. 파일을 빼네는 데에는 크게 4가지 방법이 존재한다.

  1. ntdsutil.exe 사용
  2. vssadmin.exe 사용
  3. 백업 솔루션 사용
  4. 특수목적으로 제작된 프로그램 사용

가장 쉬운 방법인 1번 방법을 사용해 보겠다. DC에서 관리자 권한으로 명령 프롬포트(CMD)를 열고 아래처럼 명령어를 입력한다.

C:\Users\Administrator>ntdsutil
ntdsutil: activate instance ntds
Active instance set to "ntds".
ntdsutil: ifm
ifm: create full c:\ntdsexport

그러면 C:\ntdsexport 경로에 Active Directory와 registry라는 폴더가 생성되며, Active Directory 폴더에는 NTDS.dit 파일이, registry 폴더에는 BootKey를 포함하고 있는 SYSTEM 레지스트리 파일이 저장되는 것을 확인할 수 있다.

ntdsutil.exe를 활용하여 NTDS.dit 및 BootKey를 추출하는 화면
ntdsutil.exe에 의해 추출된 NTDS.dit 및 BootKey(HKLM\SYSTEM)

필요한 파일은 모두 획득하였으므로, 해당 파일을 로컬 머신으로 가져와 정보 추출을 하면 된다. 정보 추출에는 다양한 도구들이 존재하지만, 가장 간단한 도구인 DSInternals Powershell Module을 사용하겠다. 관리자 권한으로 PowerShell을 열고, 아래 명령어로 모듈을 설치한다.

Install-Module -Name DSInternals -Scope CurrentUser

설치 후 실행을 위해 ExecutionPolicy를 Unrestricted로 변경해 주고, 설치한 모듈을 로드한다.

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
Import-Module DSInternals

추출한 NTDS.dit 파일에서 TestUser001의 정보를 추출하려면, 아래 명령어를 입력하면 된다.

Get-ADDBAccount -DBPath "C:\ntdsexport\Active Directory\ntds.dit" -SamAccountName TestUser001

그러면 아래처럼 해당 사용자의 정보가 모두 표시된다.

TestUser001 사용자의 정보

Secrets 부분이 비어있는 것을 알 수 있는데, Get-ADDBAccount 명령어를 수행하면서 BootKey를 제공하지 않아서 비어있는 것이다. 아래 명령어로 BootKey를 획득하고, Get-ADDBAccount 명령어에 획득한 BootKey를 넘겨주면 Secrets 부분이 표시되는 것을 확인할 수 있다.

$bootKey = Get-BootKey -SystemHiveFilePath "C:\ntdsexport\registry\SYSTEM"
Get-ADDBAccount -DBPath "C:\ntdsexport\Active Directory\ntds.dit" -SamAccountName TestUser001 -BootKey $bootKey
NT hash 비밀번호를 포함한 TestUser001 사용자 정보

같은 비밀번호를 사용하는 사용자의 NT hash 값은 동일하다. 즉, 취약한 비밀번호를 사용하는 사용자의 비밀번호는 그만큼 쉽게 NT hash 비밀번호 사전을 사용하여 알아낼 수 있다. 이는 공격에도 활용될 수 있지만, 기업에서 사용자들의 AD 비밀번호를 점검하여 취약한 비밀번호를 사용하는 사용자들을 걸러내고, 해당 사용자들에게 강력한 비밀번호를 사용하도록 권고하는 데에도 응용할 수 있다.

Leave a Comment