
BloodHound OpenGraph collector para GitHub que mapeia a estrutura da organização, permissões e caminhos de ataque entre nuvens em um grafo navegável para auditorias de segurança e resposta a incidentes.

GitHound é um coletor OpenGraph do BloodHound para GitHub, projetado para mapear a estrutura e as permissões da sua organização em um grafo navegável de caminhos de ataque. Ele:
Modela as Principais Entidades do GitHub
Visualize e Analise no BloodHound
Com o GitHound, você obtém um grafo claro e interativo do panorama de permissões do GitHub — perfeito para revisões de segurança, auditorias de conformidade e investigações rápidas de incidentes.
Para documentação detalhada, consulte BloodHound Docs - GitHound.
# 1. Load the collector
. ./githound.ps1
# 2. Create a session with your Personal Access Token
$session = New-GitHubSession -OrganizationName "YourOrgName" -Token (Get-Clipboard)
# 3. Run the collection
Invoke-GitHound -Session $session
# 4. Upload the resulting githound_<orgId>.json file to BloodHound
Se a coleta for interrompida, retome de onde parou:
Invoke-GitHound -Session $session -Resume
O GitHound suporta tanto sessões de Personal Access Token quanto sessões de instalação do GitHub App. O fluxo de trabalho existente do GitHub App com escopo de organização permanece inalterado:
. ./githound.ps1
$session = New-GitHubJwtSession `
-OrganizationName "YourOrgName" `
-ClientId $clientId `
-PrivateKeyPath $privateKeyPath `
-InstallationId $installationId
Invoke-GitHound -Session $session -CollectAll
A mesma função também pode criar sessões com capacidade enterprise:
. ./githound.ps1
$session = New-GitHubJwtSession `
-EnterpriseName "YourEnterpriseSlug" `
-ClientId $clientId `
-PrivateKeyPath $privateKeyPath `
-InstallationId $installationId `
-PersonalAccessToken $pat
Sessões com capacidade enterprise mantêm múltiplos contextos de autenticação no GitHound.Session retornado:
Headers: os cabeçalhos do token de instalação do GitHub App usados para a coleta normalJwtHeaders: cabeçalhos JWT do GitHub App usados para endpoints de nível de aplicativo, como a enumeração de instalaçõesPatHeaders: cabeçalhos opcionais de Personal Access Token para caminhos de coleta que exigem autenticação por token de usuárioPara enumerar as instalações que pertencem ao GitHub App autenticado:
Get-GitHubAppInstallation -Session $session |
Select-Object TargetType, InstallationId, Login, Name, SuspendedAt
O parsing de workflow agora está integrado ao Invoke-GitHound quando você usa -CollectAll. O coletor
irá:
GH_Workflow e conteúdos de workflowGH_WorkflowJob e GH_WorkflowStepGH_CanPwnRequest e GH_CanDispatchTogithound_<orgId>.jsonPara fins de retomada/depuração, o checkpoint intermediário da análise de workflow é gravado como
githound_WorkflowAnalysis_<orgId>.json.
O GitHound agora inclui uma base mínima de coleta enterprise por meio do Git-HoundEnterprise.
Esse coletor atualmente cria:
GH_EnterpriseGH_Organization para organizações membroGH_Contains da enterprise para suas organizaçõesA coleta de usuários enterprise por meio do Git-HoundEnterpriseUser adiciona:
GH_UserGH_HasMember da enterprise para esses usuáriosA coleta SAML enterprise por meio do Git-HoundEnterpriseSamlProvider adiciona:
GH_SamlIdentityProviderGH_ExternalIdentityGH_HasSamlIdentityProvider da enterprise para o provedorEsse caminho exige uma sessão baseada em PAT porque o GitHub expõe o SAML enterprise por meio de
enterprise.ownerInfo.
A coleta de equipes enterprise por meio do Git-HoundEnterpriseTeam adiciona:
GH_EnterpriseTeamGH_AssignedTo de equipes enterprise para organizações designadasGH_MemberOf de equipes enterprise para nós GH_Team ent: visíveis na org usando correspondência de propriedadesmembers de equipe enterprise e arestas GH_HasRole de usuários para essas funçõesA coleta de funções enterprise por meio do Git-HoundEnterpriseRole adiciona:
GH_EnterpriseRoleGH_Contains da enterprise para essas funçõesGH_HasRole de usuários e equipes enterprise designados diretamenteowners preenchida a partir de enterprise.ownerInfo.admins quando dados administrativos enterprise baseados em PAT estão disponíveisPor enquanto, as strings brutas de permissão enterprise são preservadas no nó GH_EnterpriseRole em sua propriedade permissions, em vez de serem expandidas em arestas de permissão dedicadas.
A coleta SCIM enterprise atualmente adiciona:
SCIM_UserSCIM_GroupSCIM_Provisioned de SCIM_User para GH_ExternalIdentitySCIM_Provisioned de SCIM_Group para GH_EnterpriseTeam quando o GitHub expõe o group_id da equipe enterpriseSCIM_MemberOf de SCIM_User para SCIM_GroupIsso dá ao GitHound uma ponte agnóstica de provedor do esquema SCIM compartilhado para o modelo nativo de identidade e equipe enterprise do GitHub.
Quando um GH_SamlIdentityProvider coletado identifica o IdP upstream, o GitHound também pode adicionar arestas de correlação SCIM cientes do provedor dentro da saída sidecar SCIM:
Okta_User -> SCIM_User
Okta_User.id = SCIM_User.externalIdOkta_Group -> SCIM_Group
Okta_Group.name = SCIM_Group.externalIdOkta_Group.oktaDomain = GH_SamlIdentityProvider.foreign_environmentidO GitHound mantém a camada SCIM em sua própria saída sidecar para que esses mapeamentos permaneçam visíveis sem misturar nós nativos SCIM no grafo enterprise principal nativo do GitHub:
githound_<entId>.json contém dados enterprise nativos do GitHubgithound_scim_<entId>.json contém nós nativos SCIM e arestas de ponte SCIMgithound_saml_<entId>.json contém dados de identidade SAML e externagithound_hybrid_<entId>.json contém arestas entre modelos, como SAML_Implements, SAML_HasAccount e GH_SyncedTogithound_saml_<entId>.json também contém a topologia SAML normalizada para o provedor de serviços GitHub, incluindo SAML_TrustsIssuer e SAML_HasAssertionConsumerServiceO modelo nativo de provedor de identidade do GitHub permanece intacto nas saídas nativas GitHub/SAML:
GH_ExternalIdentityGH_HasExternalIdentityGH_MapsToUserA camada SAML normalizada em githound_hybrid_<entId>.json agora coloca SAML_HasAccount diretamente em GH_User, ao mesmo tempo que deriva match_values das propriedades voltadas para SAML do GH_ExternalIdentity vinculado, como saml_identity_name_id e saml_identity_username.