AD CS Certificate Theft
Reading time: 6 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
이것은 https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf에서의 훌륭한 연구의 도난 장에 대한 간단한 요약입니다.
인증서로 무엇을 할 수 있나요
인증서를 훔치는 방법을 확인하기 전에 인증서가 무엇에 유용한지 찾는 방법에 대한 정보가 있습니다:
# Powershell
$CertPath = "C:\path\to\cert.pfx"
$CertPass = "P@ssw0rd"
$Cert = New-Object
System.Security.Cryptography.X509Certificates.X509Certificate2 @($CertPath, $CertPass)
$Cert.EnhancedKeyUsageList
# cmd
certutil.exe -dump -v cert.pfx
인증서 내보내기 – THEFT1
인터랙티브 데스크탑 세션에서 사용자 또는 머신 인증서와 개인 키를 추출하는 것은 개인 키가 내보낼 수 있는 경우 특히 쉽게 수행할 수 있습니다. 이는 certmgr.msc
에서 인증서를 찾아 마우스 오른쪽 버튼을 클릭하고 모든 작업 → 내보내기
를 선택하여 비밀번호로 보호된 .pfx 파일을 생성함으로써 달성할 수 있습니다.
프로그래밍 방식 접근법으로는 PowerShell ExportPfxCertificate
cmdlet 또는 TheWover의 CertStealer C# 프로젝트와 같은 도구가 있습니다. 이들은 Microsoft CryptoAPI (CAPI) 또는 Cryptography API: Next Generation (CNG)을 사용하여 인증서 저장소와 상호작용합니다. 이러한 API는 인증서 저장 및 인증에 필요한 다양한 암호화 서비스를 제공합니다.
그러나 개인 키가 내보낼 수 없는 것으로 설정된 경우, CAPI와 CNG는 일반적으로 이러한 인증서의 추출을 차단합니다. 이 제한을 우회하기 위해 Mimikatz와 같은 도구를 사용할 수 있습니다. Mimikatz는 개인 키의 내보내기를 허용하기 위해 해당 API를 패치하는 crypto::capi
및 crypto::cng
명령을 제공합니다. 구체적으로, crypto::capi
는 현재 프로세스 내의 CAPI를 패치하고, crypto::cng
는 패치를 위해 lsass.exe의 메모리를 타겟팅합니다.
DPAPI를 통한 사용자 인증서 도난 – THEFT2
DPAPI에 대한 더 많은 정보는 다음에서 확인할 수 있습니다:
Windows에서 인증서 개인 키는 DPAPI에 의해 보호됩니다. 사용자 및 머신 개인 키의 저장 위치가 다르며, 파일 구조는 운영 체제가 사용하는 암호화 API에 따라 다르다는 점을 인식하는 것이 중요합니다. SharpDPAPI는 DPAPI 블롭을 해독할 때 이러한 차이를 자동으로 탐색할 수 있는 도구입니다.
사용자 인증서는 주로 HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates
의 레지스트리에 저장되지만, 일부는 %APPDATA%\Microsoft\SystemCertificates\My\Certificates
디렉토리에서도 찾을 수 있습니다. 이러한 인증서에 대한 해당 개인 키는 일반적으로 CAPI 키의 경우 %APPDATA%\Microsoft\Crypto\RSA\User SID\
에, CNG 키의 경우 %APPDATA%\Microsoft\Crypto\Keys\
에 저장됩니다.
인증서와 관련된 개인 키를 추출하기 위해 과정은 다음과 같습니다:
- 사용자의 저장소에서 대상 인증서를 선택하고 해당 키 저장소 이름을 검색합니다.
- 해당 개인 키를 해독하기 위해 필요한 DPAPI 마스터 키를 찾습니다.
- 평문 DPAPI 마스터 키를 사용하여 개인 키를 해독합니다.
평문 DPAPI 마스터 키를 획득하기 위해 다음 접근 방식을 사용할 수 있습니다:
# With mimikatz, when running in the user's context
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc
# With mimikatz, if the user's password is known
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS
마스터키 파일과 개인 키 파일의 복호화를 간소화하기 위해, SharpDPAPI의 certificates
명령이 유용합니다. 이 명령은 개인 키와 연결된 인증서를 복호화하기 위해 /pvk
, /mkfile
, /password
또는 {GUID}:KEY
를 인수로 받아들여, 이후 .pem
파일을 생성합니다.
# Decrypting using SharpDPAPI
SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt
# Converting .pem to .pfx
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Machine Certificate Theft via DPAPI – THEFT3
Windows에 의해 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
레지스트리에 저장된 머신 인증서와 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys
(CAPI의 경우) 및 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys
(CNG의 경우)에 위치한 관련 개인 키는 머신의 DPAPI 마스터 키를 사용하여 암호화됩니다. 이러한 키는 도메인의 DPAPI 백업 키로 복호화할 수 없으며, 대신 DPAPI_SYSTEM LSA 비밀이 필요합니다. 이 비밀은 오직 SYSTEM 사용자만 접근할 수 있습니다.
수동 복호화는 Mimikatz에서 lsadump::secrets
명령을 실행하여 DPAPI_SYSTEM LSA 비밀을 추출한 다음, 이 키를 사용하여 머신 마스터 키를 복호화함으로써 달성할 수 있습니다. 또는, 이전에 설명한 대로 CAPI/CNG를 패치한 후 Mimikatz의 crypto::certificates /export /systemstore:LOCAL_MACHINE
명령을 사용할 수 있습니다.
SharpDPAPI는 인증서 명령을 통해 보다 자동화된 접근 방식을 제공합니다. /machine
플래그가 상승된 권한으로 사용될 때, SYSTEM으로 상승하고 DPAPI_SYSTEM LSA 비밀을 덤프하며, 이를 사용하여 머신 DPAPI 마스터 키를 복호화한 다음, 이러한 평문 키를 조회 테이블로 사용하여 모든 머신 인증서 개인 키를 복호화합니다.
Finding Certificate Files – THEFT4
인증서는 때때로 파일 공유나 다운로드 폴더와 같은 파일 시스템 내에서 직접 발견됩니다. Windows 환경을 대상으로 하는 가장 일반적으로 접하는 인증서 파일 유형은 .pfx
및 .p12
파일입니다. 덜 자주 나타나는 파일 확장자로는 .pkcs12
및 .pem
이 있습니다. 추가로 주목할 만한 인증서 관련 파일 확장자는 다음과 같습니다:
- 개인 키용
.key
, - 인증서 전용
.crt
/.cer
, - 인증서나 개인 키를 포함하지 않는 인증서 서명 요청용
.csr
, - Java 애플리케이션에서 사용되는 인증서와 개인 키를 포함할 수 있는 Java Keystore용
.jks
/.keystore
/.keys
.
이 파일들은 언급된 확장자를 찾아 PowerShell 또는 명령 프롬프트를 사용하여 검색할 수 있습니다.
PKCS#12 인증서 파일이 발견되고 비밀번호로 보호되는 경우, pfx2john.py
를 사용하여 해시를 추출할 수 있으며, 이는 fossies.org에서 사용할 수 있습니다. 이후 JohnTheRipper를 사용하여 비밀번호를 크랙하려고 시도할 수 있습니다.
# Example command to search for certificate files in PowerShell
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys
# Example command to use pfx2john.py for extracting a hash from a PKCS#12 file
pfx2john.py certificate.pfx > hash.txt
# Command to crack the hash with JohnTheRipper
john --wordlist=passwords.txt hash.txt
NTLM 자격 증명 도용 via PKINIT – THEFT5
주어진 내용은 PKINIT를 통한 NTLM 자격 증명 도용 방법, 특히 THEFT5로 레이블이 붙은 도용 방법을 설명합니다. 다음은 수동태로 재설명하며, 내용이 익명화되고 요약된 것입니다:
Kerberos 인증을 지원하지 않는 애플리케이션을 위해 NTLM 인증 [MS-NLMP]을 지원하기 위해, KDC는 PKCA가 사용될 때 권한 속성 인증서(PAC) 내에서 사용자의 NTLM 일방향 함수(OWF)를 반환하도록 설계되었습니다. 따라서 계정이 PKINIT를 통해 티켓 부여 티켓(TGT)을 인증하고 확보할 경우, 현재 호스트가 TGT에서 NTLM 해시를 추출하여 레거시 인증 프로토콜을 유지할 수 있도록 하는 메커니즘이 본질적으로 제공됩니다. 이 과정은 NTLM 평문을 NDR 직렬화된 형태로 나타내는 PAC_CREDENTIAL_DATA
구조체의 복호화를 포함합니다.
유틸리티 Kekeo는 https://github.com/gentilkiwi/kekeo에서 접근할 수 있으며, 이 특정 데이터를 포함하는 TGT를 요청할 수 있는 기능이 있다고 언급됩니다. 이를 위한 명령은 다음과 같습니다:
tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local
추가적으로, Kekeo는 핀을 검색할 수 있는 경우 스마트카드 보호 인증서를 처리할 수 있다는 점이 언급되며, https://github.com/CCob/PinSwipe에 대한 참조가 있습니다. 동일한 기능이 Rubeus에서도 지원된다고 하며, 이는 https://github.com/GhostPack/Rubeus에서 사용할 수 있습니다.
이 설명은 PKINIT을 통한 NTLM 자격 증명 도용 과정과 관련 도구를 요약하며, PKINIT을 사용하여 얻은 TGT를 통해 NTLM 해시를 검색하는 데 중점을 두고, 이 과정을 용이하게 하는 유틸리티를 다룹니다.
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.