
저관찰성 Active Directory 보안 열거 도구로, 네이티브 ADSI/COM 인터페이스를 사용합니다. ACL, 위임, 트러스트, ADCS, Kerberoast 대상, 공격 경로를 .NET이나 PowerShell 없이 열거하며, BloodHound 호환 출력을 생성합니다.
BloodHound는 경로를 보여줍니다. Kestrel은 이미 내부에 무엇이 있는지 보여줍니다.
모두가 같은 것을 매핑합니다: 공격 경로 - 누가 Domain Admin에 도달할 수 있는가. 올바른 질문이며, 이에 답하는 도구들은 훌륭합니다. 하지만 "누가 누구에게 도달할 수 있는가"의 그래프는 문제의 한 부류 전체를 보지 못합니다. Active Directory에서 가장 심각한 것들 중 일부는 경로가 아니기 때문입니다.
그것들은 속성에 용접된 백도어입니다. 비밀번호가 재설정된 후에도 오랫동안 계속 인증되는 인증서. 스키마 자체에 각인되어, 지금부터 생성되는 모든 객체가 조용히 상속받는 권한. 누군가 조용히 복원할 권한을 유지한 삭제된 계정. 단 하나의 deny-read ACE로 열거에서 숨겨진 객체.
그 중 어느 것도 그래프의 엣지가 아닙니다. 그 모두가 지금 당신의 디렉터리에 있습니다. Kestrel은 이를 읽습니다 - 네이티브 Windows 호출, 일반 도메인 사용자 권한, 서버 없음, Python 없음, 에이전트 없음, 그리고 도메인 컨트롤러에 남기는 흔적은 이벤트별로 문서화될 만큼 절제되어 있습니다.
하나의 .exe. 하나의 명령. 아래의 모든 것.
공격적 AD 생태계 - SharpHound, impacket, Certipy, 그리고 그 뒤의 그래프 - 는 뛰어나며, 모두 같은 표면을 봅니다: 도달 가능성. Kestrel은 그 표면이 표현할 수 없는 세 가지 차원을 봅니다.
defaultSecurityDescriptor 백도어, 숨겨진 객체, OWNER RIGHTS deny-ACE, AD FS DKM 키. 그래프 도구들은 그릴 엣지가 없기 때문에 이것들을 수집하지 않습니다.Kestrel이 그래프보다 빠르다는 것이 아닙니다. 그래프가 물을 수 없는 질문에 답합니다.
| 위험 요소 | Kestrel이 찾는 것 | 플래그 |
|---|---|---|
| 복제 및 위임 | DCSync 권한(복제를 할 수 있는 주체 - 실제로 복제하지 않고도), 제약 없는 / 제약된 / RBCD / S4U 위임 | --acl · --delegation |
| 인증서 악용 | AD CS ESC1–5/9, NTAuth 저장소의 악성 CA, 장기 유효 인증서 지속성, AD FS DKM 키 ACL - Golden SAML의 전제 조건 | --adcs · --adfs |
| 속성 내 지속성 | Shadow credentials, SID history 주입, tombstone-reanimation 권한, 숨겨진 객체, 스키마 defaultSecurityDescriptor 백도어, 고아 adminCount | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| 평문 및 크래킹 가능한 자격 증명 | GPP cpassword, SYSVOL 전반의 unattend/sysprep 비밀 및 스크립트 비밀번호, Kerberoastable 및 AS-REP-roastable 계정, LAPS 적용 공백 | --gpp · --roast · --laps |
| 교차 도메인 및 하이브리드 | 권한 있는 그룹 내 외부 주체, Tier-0로 태깅된 Entra Connect 동기화 계정, 트러스트 상태, MachineAccountQuota로 생성된 컴퓨터 계정(mS-DS-CreatorSID) | --groups · --trust · --machines |
| 보안 태세 및 정찰 | 비밀번호 / PSO 정책, krbtgt 나이, LLMNR / NBT-NS / WDigest / NTLMv1 GPO 설정, gMSA 판독자, 오래된 컴퓨터, 위임 토폴로지 | --pwdpolicy · --policy · --gmsa · --stale |
| 고고학 | 고아 위험 ACE(삭제된 주체가 보유한 권한 - SID가 아무에게도 해석되지 않음), 오래된 권한 있는 계정(잊혀진, 과도한 권한, 아주 오래된 비밀번호) | --archaeology |
| 도메인 강화 | dSHeuristics 익명 LDAP / AdminSDHolder 제외 플래그, Pre-Windows 2000 Compatible Access 광범위 멤버십 | --hardening |
| 서비스 태세 (AD에서 읽음, 서비스로 패킷 전송 없음) | Exchange-to-DA 권한 상승 및 EOL, SCCM 컨테이너 탈취 및 사이트 맵, ADIDNS 영역 중독(Authenticated Users가 레코드 생성 가능) | --exchange · --sccm · --dns |
보통 수십 개의 스크립트와 두 개의 언어에 흩어져 있는 20여 개 이상의 검사. 여기서는 하나의 바이너리이며 - 단일하고 심각도별로 정렬된 판정으로 끝납니다.
Kestrel.exe --all --report audit.html
모든 것을 실행합니다. 전체 HTML 보고서를 받습니다. 그리고 콘솔의 맨 끝에는, 중요한 부분이 있습니다:
═══ Kestrel - Prioritized Findings ═══
CRITICAL DCSync CORP\svc_sql - non-default principal can replicate directory changes (DCSync)
→ fix: remove GetChanges/GetChangesAll from the principal on the domain head (dsacls) unless it is a DC
CRITICAL AD FS CN=... - read access to the DKM key (Golden SAML precondition)
→ fix: remove non-default read ACEs on the DKM object (dsacls) and rotate the token-signing certificate
HIGH Persistence CN=... - object hidden from enumeration via a broad deny-read ACE
→ fix: inspect the hidden object and remove the broad deny-read ACE (dsacls)
[=] 2 critical · 1 high · 0 medium · 0 low
출력의 벽이 아니다. 중요한 발견들을 순위를 매겨, 각각을 해결할 명령과 함께 제시한다.
--opengraph), 임의의 주체에서 피벗한다(--from).--diff, 그리고 정확한 탐지 흔적이 공개되어 화이트리스트에 추가하고 그 주변으로 자체 경보를 조정할 수 있는 도구.Kestrel은 읽기 전용이다. 디렉터리에 절대 쓰지 않고, 복제하지 않으며, SeSecurityPrivilege가 필요 없고, 클라우드에 접근하지 않는다. 누가 DCSync를 할 수 있는지 읽는 것은 네트워크 상에서 DCSync를 수행하는 것과 전혀 다르다 - DRSUAPI도, 복제 서명 4662도 없다. 실행하는 모든 쿼리와 생성할 수 있는(그리고 생성할 수 없는) 모든 이벤트가 **FOOTPRINT.md**에 정리되어 있다. 감사 도구가 방어자에게 자신을 잡는 방법을 정확히 알려주는 것은 모순이 아니다 - 바로 그것이 핵심이다.
빌드를 받는다. 모든 성공한 CI 실행은 Kestrel.exe 아티팩트를 게시한다 - Actions 탭에서 다운로드하면 되고, 툴체인은 필요 없다.
또는 직접 빌드한다. Visual Studio(v143+) 또는 MSBuild:
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
순수 C, 서드파티 의존성 없음. /MT를 빌드하면 단일 자체 포함 실행 파일이 됩니다 - 도메인에 조인된 호스트에 놓고 일반 사용자로 실행하세요.
실행하세요.
Kestrel.exe --all --report audit.html # everything, HTML report + ranked findings
Kestrel.exe --acl --adcs --adfs # pick specific checks
Kestrel.exe --paths --from CORP\jdoe # attack paths from one principal
Kestrel.exe --all --diff last-week.json # what changed since the last snapshot
Kestrel.exe --all --opengraph graph.json # export to BloodHound CE OpenGraph
--all을 실행하거나 원하는 하위 집합을 선택하세요. 전체 도움말: Kestrel.exe --help.
| 플래그 | 스캔 |
|---|---|
--acl | ACL 엣지, DCSync 권한, 소유자/상속/정규 위생, 숨겨진 객체, reanimate-tombstones |
--groups | 전이적 권한 있는 멤버십 + 외부 보안 주체 |
--delegation | 비제약 / 제약 / RBCD / S4U2Self |
--paths / --from | Tier-0로의 공격 경로 분석 (선택적으로 지정된 주체로부터) |
--adcs | AD CS 인증서 템플릿 / CA 감사 (ESC1–5/9) + NTAuth 저장소 + 유효성 |
--adfs | AD FS DKM 키 ACL (Golden SAML 전제 조건) |
--schema | 스키마 defaultSecurityDescriptor 백도어 감사 |
--trust | 도메인 / 포리스트 트러스트 상태 |
--machines | MachineAccountQuota(mS-DS-CreatorSID)를 통해 생성된 머신 계정 |
--roast | Kerberoast 가능 + AS-REP-roast 가능 계정 |
--shadowcreds | 섀도 자격 증명 (msDS-KeyCredentialLink) |
--sidhistory | sIDHistory 주입 (권한 있음 / 외부) |
--adminsdholder | 고아 adminCount=1 객체 |
--gpp | SYSVOL 비밀 스윕 - GPP cpassword, unattend, 스크립트 자격 증명 |
--gpolateral | GPO 로컬 그룹 → 측면 엣지 (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
--policy | GPO 보안 정책 (LLMNR / NBT-NS / WDigest / NTLMv1) |
--pwdpolicy | 암호 / PSO 정책 · krbtgt 나이 · MachineAccountQuota |
--hygiene | 자격 증명 위생 (PASSWD_NOTREQD / DONT_EXPIRE / 가역 / 설명 유출) |
--gmsa | gMSA 암호 읽기 권한자 열거 |
--laps | LAPS 적용 범위 (레거시 + Windows LAPS 2023+) |
--stale | lastLogonTimestamp를 통한 오래된 컴퓨터 |
--topology | SPN 디코딩을 통한 컴퓨터 토폴로지 |
--adws | ADWS 엔드포인트 탐지 (DC당 9389/TCP) |
--archaeology | 고아 위험 ACE (죽은 소유자, 살아있는 권한) + 오래된 권한 있는 계정 |
--hardening | 도메인 강화 플래그: dSHeuristics 익명 액세스 / SDProp 제외 + Pre-Windows 2000 Compatible Access |
--exchange | Exchange 상태: 버전/EOL + Exchange-to-DA 에스컬레이션 (도메인에 대한 WriteDACL) (서비스; 옵트인) |
--sccm | SCCM/MECM 상태: System Management 컨테이너 ACL + 관리 지점 / 사이트 맵 (서비스; 옵트인) |
--dns | AD 통합 DNS (ADIDNS): 영역 CreateChild DACL + wpad/isatap/와일드카드 + DnsAdmins (서비스; 옵트인) |