Timeroasting

Windows 2000 이후의 모든 컴퓨터 계정 패스워드는 240 바이트 랜덤 값으로 설정되며, 이 값은 30일마다 변경됩니다. 오늘날 환경에서 실제 OS를 Windows 2000 이전으로 사용하는 경우는 드물지만, OS는 최신 버전이더라도 초기 패스워드 설정은 과거 정책을 따르는 경우가 있습니다.

  1. 컴퓨터 계정 생성 시 Assign this computer account as a pre-Windows 2000 computer 속성 체크

  2. 도메인에 조인된 컴퓨터 계정에 대한 Reset Account 적용

Pre Windows 2000는 컴퓨터 초기 패스워드가 NetBIOS 앞 14글자를 소문자로 변환한 값이었습니다.

위에서 언급한 두가지 경우라고 하더라도 30일 뒤에는 다시 240바이트 랜덤 값으로 변경되며, 이후 30일마다 이 값은 갱신되지만, 최초 30일 이전에는 컴퓨터 계정의 시스템 권한을 쉽게 탈취할 수 있습니다.

Abuse

# Timeroast 설치
git clone https://github.com/SecuraBV/Timeroast.git
cd Timeroast

# 타임 해시 획득
python3 timeroast.py 192.168.1.11 | tee timehashs.txt

# 해시 크랙
python3 ./extra-scripts/timecrack.py timehashs.txt wordlists

Root Cause

컴퓨터 이름이 preWindows2000 일 때, NT4 컴퓨터 기본 패스워드는 prewindows2000이 됩니다.

pre-Windows 2000의 암호는 NT4 default computer password 라고 부릅니다.

흔히 타임로스팅 기법에 대해서 설명할 때 NT4 기본 컴퓨터 패스워드는 NetBIOS의 첫 14글자를 소문자로 한 것이 기본 값으로 설정된다고 설명하지만 이것을 Microsoft에서 공식적으로 밝힌 적은 없습니다.

초기 패스워드가 14글자 소문자로 설정되는 이유를 추측하자면 컴퓨터 계정의 초기 패스워드는 NetBIOS 이름이라는 것과, NetBIOS 이름은 15글자를 초과하지 못한다는 점, 그리고 과거 LM 해시를 사용하던 시절은 14바이트 이상은 NULL 값으로 처리한다는 것들이 있습니다.

컴퓨터 패스워드 초기 값
NetBIOS 이름 정책

패스워드 초기화 로직이 실제 Pre-Windows 2000의 NT4 기본 패스워드 로직과 동일한지는 컴퓨터 계정을 초기화 시킨 이후 와이어샤크로 로컬 패킷을 분석하면 확인됩니다.

Computer 계정 초기화
KPASSWD Request

위 두가지 상황에서는 컴퓨터 계정의 패스워드가 소문자 NetBIOS의 앞 14글자로 설정된다는 것을 알았으니 패스워드 해시만 탈취할 수 있다면 컴퓨터 계정을 장악하는 것이 가능합니다.

Tom Tervoort의 TIMEROASTING, TRUSTROASTING AND COMPUTER SPRAYING 백서에서는 계정을 식별하고, 해당 계정을 소문자로 변환하여 앞 14글자로 스프레이를 진행하는 과정에 대해 상세히 다루며, PoC를 깃허브로 공개했습니다.

도메인 환경에서 클라이언트와 서버 간의 정상적 통신을 위해 시간 동기화를 주기적으로 하는데, 이때 사용하는 프로토콜이 NTP(Network Time Protocol)입니다.

기존의 NTP 프로토콜 인증 과정에서는 누구나 인증 정보 없이 시간 동기화 요청을 보내고 응답 받을 수 있는 구조로 되어있었기 때문에, 공격자는 MitM 공격으로 시간을 위변조하여 클라이언트의 시간을 변경할 수 있었습니다. 이러한 공격을 방어하기 위해 Microsoft에서는 Microsoft's Secure NTP(MS-SNTP)를 도입하였습니다.

MS-SNTP 구조

표준 NTP 헤더는 총 48 바이트 크기이며 MS-SNTP는 여기서 MAC을 생성할 때 사용한 사용자의 패스워드를 식별하기 위해 Key Identifier와 MD5(MD4((사용자 패스워드)(표준 NTP 헤더))) 정보인 MAC을 추가하여 최종적으로 68 바이트 크기로 구성됩니다.

NTP Request에서 Key ID는 순차적으로 값을 올려가며 서버에 질의하는 RID 값입니다. Key ID 값은 리틀 앤디안 방식의 Hex값이므로 이것을 십진수로 변환하면 1137입니다.

NTP Request
NTP Response

클라이언트는 단순히 서버에 수천개의 NTP 동기화 요청을 전송하고 존재하는 RID에 대한 요청일 경우에만 서버는 응답을 합니다.

언급한 것처럼 NTP Response는 표준 NTP 헤더 48바이트, Key 4바이트, MAC 16바이트로 구성됩니다.

NTP Response 구조

MAC은 사용자의 패스워드를 MD4 해시화 한 값과 Salt 값을 추가한 결과인데, Salt 값은 앞 48바이트(표준 NTP 헤더)를 그대로 사용하기 때문에 오프라인 브루트포스를 통한 크랙이 가능합니다.

NTP 요청 헤더가 MAC의 salt 값으로 사용되기 때문에 요청마다 달라지는 Origin Timestamp 필드는 매번 다른 결과를 만들게 됩니다. 때문에 10개의 해시를 획득했다고 하면, 각각의 10개에 대한 해시 포맷이 달라지게 되어 Tom Tervoort는 Origin Timestamp를 특정 시간으로 고정시켜둔 것이 소스코드에서 확인됩니다.

References

Last updated

Was this helpful?