From 7599001092cfa848d656e6a18223e53a523e4de4 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 16 Jun 2025 10:47:51 +0200 Subject: [PATCH 1/4] additional queries --- queries/Circular AD group memberships.yml | 15 ++++++ queries/Circular AZ group memberships.yml | 15 ++++++ .../Collection health of CA Registry Data.yml | 22 +++++++++ .../Collection health of DC Registry Data.yml | 17 +++++++ ...Tier Zero Inbound Execution Privileges.yml | 17 +++++++ .../Direct Principal Rights Assignment.yml | 15 ++++++ ...ign AZ Service Principals in Tier Zero.yml | 18 +++++++ ... Principals in control of Azure tenant.yml | 17 +++++++ ...oreign External AZ users in Tier Zero.yaml | 16 ++++++ ...vice Principals With Group Memberships.yml | 17 +++++++ ... Principals With an EntraID Admin Role.yml | 17 +++++++ ... Abusable MS Graph App Role Assignment.yml | 17 +++++++ ...Potential GPO 'Apply' misconfiguration.yml | 25 ++++++++++ queries/Uncommon permission on containers.yml | 49 +++++++++++++++++++ 14 files changed, 277 insertions(+) create mode 100644 queries/Circular AD group memberships.yml create mode 100644 queries/Circular AZ group memberships.yml create mode 100644 queries/Collection health of CA Registry Data.yml create mode 100644 queries/Collection health of DC Registry Data.yml create mode 100644 queries/Collection health of Tier Zero Inbound Execution Privileges.yml create mode 100644 queries/Direct Principal Rights Assignment.yml create mode 100644 queries/Foreign AZ Service Principals in Tier Zero.yml create mode 100644 queries/Foreign AZ Service Principals in control of Azure tenant.yml create mode 100644 queries/Foreign External AZ users in Tier Zero.yaml create mode 100644 queries/Foreign Service Principals With Group Memberships.yml create mode 100644 queries/Foreign Service Principals With an EntraID Admin Role.yml create mode 100644 queries/Foreign Service Principals With any Abusable MS Graph App Role Assignment.yml create mode 100644 queries/Potential GPO 'Apply' misconfiguration.yml create mode 100644 queries/Uncommon permission on containers.yml diff --git a/queries/Circular AD group memberships.yml b/queries/Circular AD group memberships.yml new file mode 100644 index 0000000..7fffb30 --- /dev/null +++ b/queries/Circular AD group memberships.yml @@ -0,0 +1,15 @@ +name: Circular AD group memberships +guid: fcaa5ffc-3d22-481f-a2a2-18a4eec30058 +prebuilt: false +platforms: Active Directory +category: Active Directory Hygiene +description: Detects circular group membership chains where groups are members of themselves through one or more intermediate groups. This causes an administrative complexity. +query: |- + MATCH p=(x:Group)-[:MemberOf*2..]->(y:Group) + WHERE x.objectid=y.objectid + RETURN p + LIMIT 100 +revision: 1 +resources: https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Circular AZ group memberships.yml b/queries/Circular AZ group memberships.yml new file mode 100644 index 0000000..d79b531 --- /dev/null +++ b/queries/Circular AZ group memberships.yml @@ -0,0 +1,15 @@ +name: Circular AZ group memberships +guid: b005669c-d8af-47ae-a0f1-4f36cd5334ab +prebuilt: false +platforms: Azure +category: Azure Hygiene +description: Detects circular group membership chains where groups are members of themselves through one or more intermediate groups. This causes an administrative complexity. +query: |- + MATCH p=(x:AZGroup)-[:AZMemberOf*2..]->(y:AZGroup) + WHERE x.objectid=y.objectid + RETURN p + LIMIT 100 +revision: 1 +resources: https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Collection health of CA Registry Data.yml b/queries/Collection health of CA Registry Data.yml new file mode 100644 index 0000000..3b084ad --- /dev/null +++ b/queries/Collection health of CA Registry Data.yml @@ -0,0 +1,22 @@ +name: Collection health of CA Registry Data +guid: c8dd3479-8063-450a-9456-557bc5f39e10 +prebuilt: false +platforms: Active Directory +category: Domain Information +description: BloodHound's ADCS analysis requires collecting CA registry data to increase accuracy/enable more edges. Collection by default requires SharpHound has Administrators membership. Requires SharpHound v2.3.5 or above. It only requires one misconfigured CA to potentially a full forest compromise by any principal. CAs returned by this query have not been collected. +query: |- + MATCH p=(eca:EnterpriseCA)<-[:HostsCAService]-(c:Computer) + WHERE ( + eca.isuserspecifiessanenabledcollected = false + OR eca.casecuritycollected = false + OR eca.enrollmentagentrestrictionscollected = false + OR eca.roleseparationenabledcollected = false + ) + // Exclude inactive CAs + AND c.enabled = true + AND c.lastlogontimestamp > (datetime().epochseconds - (30 * 86400)) + RETURN p +revision: 1 +resources: https://bloodhound.specterops.io/collect-data/enterprise-collection/permissions#ca-registry +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Collection health of DC Registry Data.yml b/queries/Collection health of DC Registry Data.yml new file mode 100644 index 0000000..29106cd --- /dev/null +++ b/queries/Collection health of DC Registry Data.yml @@ -0,0 +1,17 @@ +name: Collection health of DC Registry Data +guid: 3f0fa2f3-fbdf-42c0-9e7d-97e689009161 +prebuilt: false +platforms: Active Directory +category: Domain Information +description: BloodHound's ADCS analysis requires collecting CA registry data to increase accuracy/enable more edges. Collection by default requires SharpHound has Administrators membership. Requires SharpHound v2.3.5 or above. It only requires one misconfigured DC to potentially a full forest compromise by any principal. DCs returned by this query have not been collected. +query: |- + MATCH p=(:Domain)<-[:DCFor]-(c:Computer) + WHERE c.strongcertificatebindingenforcementraw IS NULL + // Exclude inactive DCs + AND c.enabled = true + AND c.lastlogontimestamp > (datetime().epochseconds - (30 * 86400)) + RETURN p +revision: 1 +resources: https://bloodhound.specterops.io/collect-data/enterprise-collection/permissions#dc-registry +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Collection health of Tier Zero Inbound Execution Privileges.yml b/queries/Collection health of Tier Zero Inbound Execution Privileges.yml new file mode 100644 index 0000000..943d6f6 --- /dev/null +++ b/queries/Collection health of Tier Zero Inbound Execution Privileges.yml @@ -0,0 +1,17 @@ +name: Collection health of specific computer +guid: bb95c9c5-984c-4057-a430-000d684c069a +prebuilt: false +platforms: Active Directory +category: Domain Information +description: Returns Local groups and their members, and Principals with privileges +query: |- + MATCH p=(m:Base)-[:RemoteInteractiveLogonRight|AdminTo|CanRDP|LocalToComputer|MemberOfLocalGroup]-(n:Base) + + // Insert computer FQDN + WHERE m.name ENDS WITH "HOSTNAME.DOMAIN.LOCAL" + + RETURN p +revision: 1 +resources: +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Direct Principal Rights Assignment.yml b/queries/Direct Principal Rights Assignment.yml new file mode 100644 index 0000000..a2d08ab --- /dev/null +++ b/queries/Direct Principal Rights Assignment.yml @@ -0,0 +1,15 @@ +name: Direct Principal Rights Assignment +guid: 1d9c6ae3-38fc-4089-b5ad-fc3be0fa8eec +prebuilt: false +platforms: Active Directory +category: Active Directory Hygiene +description: This query identifies rights assigned directly to users or computers instead of groups. Active Directory best practice requires granting rights to groups, then adding users as group members. This role-based access control (RBAC) approach ensures permissions are easily auditable and manageable. Results include inherited rights, which must be modified at the parent container level. +query: |- + MATCH p=(n:Base)-[r:GenericAll|GenericWrite|WriteOwner|WriteDacl|ForceChangePassword|AllExtendedRights|AddMember|AllowedToDelegate|AllowedToAct|AdminTo|CanPSRemote|CanRDP|ExecuteDCOM|AddSelf|DCSync|ReadLAPSPassword|ReadGMSAPassword|DumpSMSAPassword|AddAllowedToAct|WriteSPN|AddKeyCredentialLink|SyncLAPSPassword|WriteAccountRestrictions|WriteGPLink|ADCSESC1|ADCSESC3|ADCSESC4|ADCSESC6a|ADCSESC6b|ADCSESC9a|ADCSESC9b|ADCSESC10a|ADCSESC10b|ADCSESC13]->(:Base) + WHERE (n:User OR n:Computer) + RETURN p + LIMIT 1000 +revision: 1 +resources: https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Foreign AZ Service Principals in Tier Zero.yml b/queries/Foreign AZ Service Principals in Tier Zero.yml new file mode 100644 index 0000000..274f8ff --- /dev/null +++ b/queries/Foreign AZ Service Principals in Tier Zero.yml @@ -0,0 +1,18 @@ +name: Foreign AZ Service Principals in Tier Zero +guid: 4d567239-2e68-43e2-8f26-97655b8a37fb +prebuilt: false +platforms: Azure +category: Azure Hygiene +description: +query: |- + MATCH (sp:AZServicePrincipal) + WHERE toUpper(sp.appownerorganizationid) <> toUpper(sp.tenantid) + AND ((sp:Tag_Tier_Zero) OR COALESCE(sp.system_tags, '') CONTAINS 'admin_tier_0') + // Ensure AZServicePrincipal has a valid appownerorganizationid + AND sp.appownerorganizationid CONTAINS "-" + RETURN sp + LIMIT 1000 +revision: 1 +resources: https://posts.specterops.io/microsoft-breach-how-can-i-see-this-in-bloodhound-33c92dca4c65 +acknowledgements: Stephen Hinck + diff --git a/queries/Foreign AZ Service Principals in control of Azure tenant.yml b/queries/Foreign AZ Service Principals in control of Azure tenant.yml new file mode 100644 index 0000000..88a7e87 --- /dev/null +++ b/queries/Foreign AZ Service Principals in control of Azure tenant.yml @@ -0,0 +1,17 @@ +name: Foreign AZ Service Principals in control of Azure tenant +guid: c82c17f1-7253-4e3a-b5d2-3647aa388f4a +prebuilt: false +platforms: Azure +category: Dangerous Privileges +description: +query: |- + MATCH p = (sp:AZServicePrincipal)-[]->(t:AZTenant) + WHERE toUpper(sp.appownerorganizationid) <> toUpper(t.tenantid) + // Ensure AZServicePrincipal has a valid appownerorganizationid + AND sp.appownerorganizationid CONTAINS "-" + RETURN p + LIMIT 1000 +revision: 1 +resources: https://posts.specterops.io/microsoft-breach-how-can-i-see-this-in-bloodhound-33c92dca4c65 +acknowledgements: Stephen Hinck + diff --git a/queries/Foreign External AZ users in Tier Zero.yaml b/queries/Foreign External AZ users in Tier Zero.yaml new file mode 100644 index 0000000..9e86343 --- /dev/null +++ b/queries/Foreign External AZ users in Tier Zero.yaml @@ -0,0 +1,16 @@ +name: Foreign External AZ users in Tier Zero +guid: 3a2b7588-522f-4039-8a07-d971e0b214cb +prebuilt: false +platforms: Azure +category: Azure Hygiene +description: +query: |- + MATCH (n:AZUser) + WHERE n.name CONTAINS "#EXT#@" + AND ((n:Tag_Tier_Zero) OR COALESCE(n.system_tags, '') CONTAINS 'admin_tier_0') + RETURN p + LIMIT 1000 +revision: 1 +resources: https://learn.microsoft.com/en-us/entra/external-id/user-properties#key-properties-of-the-microsoft-entra-b2b-collaboration-user +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Foreign Service Principals With Group Memberships.yml b/queries/Foreign Service Principals With Group Memberships.yml new file mode 100644 index 0000000..7c2573c --- /dev/null +++ b/queries/Foreign Service Principals With Group Memberships.yml @@ -0,0 +1,17 @@ +name: Foreign Service Principals With Group Memberships +guid: 327ef6a5-bfa8-4c92-b35a-d3df85264a24 +prebuilt: false +platforms: Azure +category: Azure Hygiene +description: Review each to validate whether their presence is expected and whether the assigned group memberships are appropriate for the foreign service principal. +query: |- + MATCH p = (sp:AZServicePrincipal)-[:AZMemberOf]->(g:AZGroup) + WHERE toUpper(sp.appownerorganizationid) <> toUpper(g.tenantid) + // Ensure AZServicePrincipal has a valid appownerorganizationid + AND sp.appownerorganizationid CONTAINS "-" + RETURN p + LIMIT 1000 +revision: 1 +resources: https://posts.specterops.io/microsoft-breach-how-can-i-see-this-in-bloodhound-33c92dca4c65 +acknowledgements: Stephen Hinck + diff --git a/queries/Foreign Service Principals With an EntraID Admin Role.yml b/queries/Foreign Service Principals With an EntraID Admin Role.yml new file mode 100644 index 0000000..12fdec4 --- /dev/null +++ b/queries/Foreign Service Principals With an EntraID Admin Role.yml @@ -0,0 +1,17 @@ +name: Foreign Service Principals With an EntraID Admin Role +guid: b6235820-4e0d-4dfa-af5b-729b5644feb5 +prebuilt: false +platforms: Azure +category: Dangerous Privileges +description: Entra ID admin roles grant significant control over a tenant environment, even if the role is not a default Tier Zero / High Value role +query: |- + MATCH p = (sp:AZServicePrincipal)-[:AZHasRole]->(r:AZRole) + WHERE toUpper(sp.appownerorganizationid) <> toUpper(sp.tenantid) + // Ensure AZServicePrincipal has a valid appownerorganizationid + AND sp.appownerorganizationid CONTAINS "-" + RETURN p + LIMIT 1000 +revision: 1 +resources: https://posts.specterops.io/microsoft-breach-how-can-i-see-this-in-bloodhound-33c92dca4c65 +acknowledgements: Stephen Hinck + diff --git a/queries/Foreign Service Principals With any Abusable MS Graph App Role Assignment.yml b/queries/Foreign Service Principals With any Abusable MS Graph App Role Assignment.yml new file mode 100644 index 0000000..12283da --- /dev/null +++ b/queries/Foreign Service Principals With any Abusable MS Graph App Role Assignment.yml @@ -0,0 +1,17 @@ +name: Foreign Service Principals With any Abusable MS Graph App Role Assignment +guid: d7a180c8-5624-4fc1-a407-deeb2ad3054c +prebuilt: false +platforms: Azure +category: Dangerous Privileges +description: MS Graph app role assignments provide significant power within an Entra ID tenant, similar to an Admin role. +query: |- + MATCH p = (sp1:AZServicePrincipal)-[r:AZMGGroupMember_ReadWrite_All|AZMGServicePrincipalEndpoint_ReadWrite_All|AZMGAppRoleAssignment_ReadWrite_All|AZMGGroup_ReadWrite_All|AZMGDirectory_ReadWrite_All|AZMGRoleManagement_ReadWrite_Directory]->(sp2:AZServicePrincipal) + WHERE toUpper(sp1.appownerorganizationid) <> toUpper(sp1.tenantid) + // Ensure AZServicePrincipal has a valid appownerorganizationid + AND sp1.appownerorganizationid CONTAINS "-" + RETURN p + LIMIT 1000 +revision: 1 +resources: https://posts.specterops.io/microsoft-breach-how-can-i-see-this-in-bloodhound-33c92dca4c65 +acknowledgements: Stephen Hinck + diff --git a/queries/Potential GPO 'Apply' misconfiguration.yml b/queries/Potential GPO 'Apply' misconfiguration.yml new file mode 100644 index 0000000..8da3809 --- /dev/null +++ b/queries/Potential GPO 'Apply' misconfiguration.yml @@ -0,0 +1,25 @@ +name: Potential GPO 'Apply' misconfiguration +guid: f5f2455e-afdc-4708-9a34-98f539ce52d8 +prebuilt: true +platforms: Active Directory +category: Dangerous Privileges +description: In Active Directory, GPO's are applied to objects in the Group Policy Management Console by ticking “Allow: Apply group policy”, but administrators can mistakenly tick “Allow: Write” or “Allow: Full Control” resulting in a misconfigured GPO that allows a principal to compromise other principals the GPO also applies to. Results are potential risks and must be audited for for correctness. +query: |- + MATCH p=(n:Base)-[:GenericAll|GenericWrite]->(g:GPO) + + // Exclude Enterprise Admins and Domain Admins + WHERE NOT n.objectid =~ "-(519|512)$" + + // Exclude unresolved SIDs + AND NOT (n.distinguishedname IS NULL) + + // Asset description may reveal if it's a delegation group (false-positive) or a filter group (true-positive) + //AND n.description is not null + //AND n.description =~ "(?i)apply" + + RETURN p + LIMIT 1000 +revision: 1 +resources: +acknowledgements: Martin Sohn Christensen, @martinsohndk + diff --git a/queries/Uncommon permission on containers.yml b/queries/Uncommon permission on containers.yml new file mode 100644 index 0000000..8898dde --- /dev/null +++ b/queries/Uncommon permission on containers.yml @@ -0,0 +1,49 @@ +name: Circular AD group memberships +guid: 018c2b45-e30f-47d8-a751-22419c3d0736 +prebuilt: false +platforms: Active Directory +category: Active Directory Hygiene +description: BloodHound typically identifies risk on Active Directory objects stored in OUs, however behind the scenes; Active Directory has a hieracy of containers e.g. CN=SYSTEM and CN=CONFIGURATION, on which control can lead to risk. Results are prone to false-positives but can assist auditing containers permissions. +query: |- + MATCH p=(:Domain)-[:Contains*1..]->(c:Container)<-[r]-(n:Base) + + // Exclude Tier Zero + WHERE NOT ((n:Tag_Tier_Zero) OR COALESCE(n.system_tags, '') CONTAINS 'admin_tier_0') + + // Scope edges to ACLs + AND r.isacl + + // Exclude CN=Users and CN=Computers containers + AND NOT c.distinguishedname STARTS WITH "CN=COMPUTERS,DC=" + AND NOT c.distinguishedname STARTS WITH "CN=USERS,DC=" + + // Exclude same-domain unresolved SIDs + AND NOT (n.distinguishedname IS NULL AND n.domainsid = c.domainsid) + + // Exclude default: Cert Publishers + AND NOT (c.distinguishedname CONTAINS ",CN=PUBLIC KEY SERVICES,CN=SERVICES,CN=CONFIGURATION,DC=" AND n.objectid ENDS WITH "-517") + + // Exclude default: RAS and IAS Servers + AND NOT (c.distinguishedname CONTAINS "CN=RAS AND IAS SERVERS ACCESS CHECK,CN=SYSTEM,DC=" AND n.objectid ENDS WITH "-553") + + // Exclude default: DNS + AND NOT (c.distinguishedname CONTAINS "CN=MICROSOFTDNS,CN=SYSTEM,DC=" AND n.name STARTS WITH "DNSADMINS@") + + // Exclude default: ConfigMgr + AND NOT (c.distinguishedname STARTS WITH "CN=SYSTEM MANAGEMENT,CN=SYSTEM,DC=" AND n.samaccountname ENDS WITH "$") + + // Exclude default: Exchange pt1 + AND NOT (c.distinguishedname CONTAINS "CN=MICROSOFT EXCHANGE,CN=SERVICES,CN=CONFIGURATION,DC=" AND (n.name STARTS WITH "EXCHANGE TRUSTED SUBSYSTEM@" OR n.name STARTS WITH "ORGANIZATION MANAGEMENT@" OR n.name STARTS WITH "EXCHANGE SERVICES@")) + + // Exclude default: Exchange pt2 + AND NOT ((c.distinguishedname CONTAINS "CN=MONITORING MAILBOXES,CN=MICROSOFT EXCHANGE SYSTEM OBJECTS,DC=" OR c.distinguishedname CONTAINS "CN=MICROSOFT EXCHANGE SYSTEM OBJECTS,DC=") AND n.name STARTS WITH "EXCHANGE ENTERPRISE SERVERS@") + + // Exclude default: Exchange pt3 + AND NOT ((c.distinguishedname CONTAINS "CN=ACTIVE DIRECTORY CONNECTIONS,CN=MICROSOFT EXCHANGE,CN=SERVICES,CN=CONFIGURATION,DC=" OR c.distinguishedname CONTAINS "CN=MICROSOFT EXCHANGE SYSTEM OBJECTS,DC=" OR c.distinguishedname =~ "CN=RECIPIENT UPDATE SERVICES,CN=ADDRESS LISTS CONTAINER,CN=.*,CN=MICROSOFT EXCHANGE,CN=SERVICES,CN=CONFIGURATION,DC=") AND n.name STARTS WITH "EXCHANGE DOMAIN SERVERS@") + + RETURN p + LIMIT 2000 +revision: 1 +resources: +acknowledgements: Martin Sohn Christensen, @martinsohndk + From ebece1de40733bede443680bcb95d95c6e31db9e Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 16 Jun 2025 10:48:10 +0200 Subject: [PATCH 2/4] Update README and add CODE_OF_CONDUCT --- CODE_OF_CONDUCT.md | 133 ++++++++++++++++++++++++++++++++++++++ README.md | 33 ++++++++-- queries.specterops.io.png | Bin 0 -> 63300 bytes 3 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 queries.specterops.io.png diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4c0c795 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[@martinsohn.dk on BlueSky](https://bsky.app/profile/martinsohn.dk) or [@martinsohndk on X](https://x.com/martinsohndk). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/README.md b/README.md index 9ea7620..fbcb766 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,37 @@ +

+ + Sponsored by SpecterOps + + + Slack + + + Syntax check + +

+ + # BloodHound Query Library -![Syntax test](https://github.com/SpecterOps/BloodHoundQueryLibrary/actions/workflows/syntax.yml/badge.svg) The BloodHound Query Library is a community-driven collection of [Cypher queries](https://support.bloodhoundenterprise.io/hc/en-us/articles/16721164740251) designed to help [BloodHound Community Edition](https://github.com/SpecterOps/BloodHound) and [BloodHound Enterprise](https://specterops.io/bloodhound-overview/) users to unlock the full potential of the flexible BloodHound platform by creating an open query ecosystem. The library is a free tool for the community maintained in a human-readable format (YAML) through this repository and the sleek and searchable front-end is found at https://queries.specterops.io/ +For more of an introduction to the project, please reference our blog post: + +- [Introducing the BloodHound Query Library](https://posts.specterops.io/....) + +# Overview + The library contains queries that demonstrate BloodHound's versatility beyond traditional attack path analysis. This includes: - All existing pre-built queries from BloodHound - Cherry-picked community queries - SpecterOps-created queries BloodHound Enterprise customers found valuable -- Novel queries to further showcase BloodHound's security assessment capabilities, see [security-assessment-mapping.md](/docs/security-assessment-mapping.md) +- Community contributed queries (see [Contributing](#contributing)) +- Novel queries to further showcase BloodHound's security assessment capabilities (see [security-assessment-mapping.md](/docs/security-assessment-mapping.md)) Individual query files are stored in stored in [/Queries](/Queries/) as `.yml` and are automatically combined into a single [Queries.json](/Queries.json) file that powers the front-end. @@ -19,7 +41,7 @@ The query files use the YAML structure found in [query-structure.yml](/docs/quer name: Entra ID SSO accounts not rolling Kerberos decryption key guid: 1867abf8-08e3-4ea8-8f65-8366079d35c4 prebuilt: false -platform: +platforms: - Active Directory - Azure category: Configuration Weakness @@ -29,13 +51,14 @@ query: |- WHERE n.name STARTS WITH "AZUREADSSOACC." AND n.pwdlastset < (datetime().epochseconds - (30 * 86400)) RETURN n -note: revision: 1 resources: https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-faq#how-can-i-roll-over-the-kerberos-decryption-key-of-the--azureadsso--computer-account- acknowledgements: Martin Sohn Christensen, @martinsohndk ``` -## Learning Cypher +Whenever new queries are added, the syntax is automatically validated, ensuring that only syntactically compatible queries are added. + +## Learning Cypher Queries One of BloodHound’s key features is its flexibility through Cypher queries – a query language to search the BloodHound graph database. Queries can answer anything from simple questions (e.g., “*Which users haven’t reset their passwords in 180 days?*”), to complex identity attack path problems (e.g., “*Which low-privileged users can compromise computers hosting a gMSA with unconstrained delegation?*”). diff --git a/queries.specterops.io.png b/queries.specterops.io.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca8b0d9f752de7690962505dce05f4f15b022b4 GIT binary patch literal 63300 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 E0NPl{d;kCd literal 0 HcmV?d00001 From 36e729db49377988d0c3b9c56b34986b15b3ef0c Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 16 Jun 2025 10:53:05 +0200 Subject: [PATCH 3/4] add README image --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fbcb766..294df29 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ The BloodHound Query Library is a community-driven collection of [Cypher queries The library is a free tool for the community maintained in a human-readable format (YAML) through this repository and the sleek and searchable front-end is found at https://queries.specterops.io/ +![BloodHound Query Library frontend screenshot](queries.specterops.io.png) + For more of an introduction to the project, please reference our blog post: - [Introducing the BloodHound Query Library](https://posts.specterops.io/....) From 0abd71e7252ae8f71571176407adbf1cf39906df Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 16 Jun 2025 10:58:09 +0200 Subject: [PATCH 4/4] Update README with blog link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 294df29..cb16860 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,9 @@ The library is a free tool for the community maintained in a human-readable form ![BloodHound Query Library frontend screenshot](queries.specterops.io.png) -For more of an introduction to the project, please reference our blog post: +For an introduction to the project, please read our blog post: -- [Introducing the BloodHound Query Library](https://posts.specterops.io/....) +- [Introducing the BloodHound Query Library](https://specterops.io/blog/2025/06/17/introducing-the-bloodhound-query-library/) # Overview