Domain Cached Credentials

Active Directory 환경에서 Domain Cached Credentials 기능이 활성화 되어있다면 사용자는 도메인 컨트롤러와 통신할 수 없는 환경에서도 도메인에 인증이 가능합니다. 노트북을 사용하는 직원이 회사 밖에서 도메인 계정으로 활동하고자 할 때, DC와 연결되어 있지 않은 상태임에도 마지막으로 사용한 도메인 비밀번호로 로그인 할 수 있도록 최근 인증 정보를 캐시해두는 것입니다. 단, SMB와 같은 프로토콜을 통한 네트워크 상의 인증은 캐시를 남기지 않고 오직 대화형 로그온을 성공했을 시에만 캐시됩니다. 기본적으로 Windows 시스템은 가장 최근 10개 사용자의 도메인 로그온 자격증명을 캐시하며, 이 값은 레지스트리를 통해 변경할 수 있습니다.

캐시된 자격증명은 해시 형태이지만 PtH 기법으로 사용할 수 없는 해시이기 때문에 크래킹이 필수적입니다.

Windows에서는 DCC 데이터를 시스템 레지스트리인 HKLM\Security\Cache 키 하위에 저장합니다. NL$1, NL$2 등의 이름과 함께 로그온 시각을 저장합니다. 숫자가 가장 낮은 NL$1 값에 있는 사용자가 가장 최근에 로그인 한 사용자 정보입니다.

DCC 출력 결과

DCC2 해시는 꽤나 복잡한 방법을 통해서 계산되기 때문에 해시 크래킹 속도가 매우 느린 편입니다.

  1. 사용자 NTLM 해시 계산

  2. 계정명(소문자) 문자열을 유니코드로 변환하여 NTLM 해시 뒤에 추가

  3. 2번의 결과에 MD4 해시 알고리즘을 적용한 해시 계산

  4. 3번의 결과를 패스워드, 계정명을 솔트로 하여 PBKDF2-HMAC-SHA1을 10240번 반복 수행

  5. 4번의 결과로 나온 160비트 중 맨 앞 128비트를 DCC2 해시로 저장

Windows XP와 Windows Server 2003 까지는 MS-Cache v1이라고도 불리는 DCC1 해시 알고리즘을 사용했으며 이 해시 계산 방법은 위 DCC2 해시 계산 방법 중 3번까지의 결과입니다. 하지만 Windows Vista부터는 보안 강화를 위해 4, 5번 과정을 추가함으로써 크랙에 성공하는 시간을 수 만배 늦추는데 성공했습니다.

DCC 데이터가 저장된 레지스트리에는 누구나 접근할 수 있지만 사용자명과 해시 등의 민감한 정보는 암호화된 형태로 저장됩니다. 암호화에 사용된 키는 NL$KM 키가 사용되며 이는 Windows 부팅 시 생성되는 Syskey(시스템 마스터 키)로 보호됩니다. 즉 로컬 시스템 계정이나 관리자 권한이 없다면 이 NL$KM 키에도 접근하지 못해 DCC2 해시를 알아내는 것 조차 불가능하기 때문에 SYSTEM 권한이 필요합니다.

해시 크래킹을 위해 DCC2 해시를 $DCC2$<iteration>#<username>#<hash> 형태로 변경해줘야 합니다. 위 사진에서 나온 해시의 경우 반복 횟수는 기본적인 10240이기 때문에 다음과 같이 변환됩니다.

$DCC2$10240#bfarmer#98e6eec9c0ce004078a48d4fd03f2419

해시캣으로 크랙할 경우 2100 모드를 사용하여 크랙할 수 있습니다.

└─# hashcat -D 1,2 -w 3 -a 0 -m 2100 hash wordlists.txt
hashcat (v6.2.6) starting                                  
...
$DCC2$10240#bfarmer#98e6eec9c0ce004078a48d4fd03f2419:Sup3rman
                                                          
Session..........: hashcat
Status...........: Cracked

References

Last updated

Was this helpful?