Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Dop2Mop — Coletor OpenGraph para BloodHound que mapeia caminhos de ataque de infraestrutura DevOps para MLOps, coletando recursos de pipelines CI/CD, service principals e plataformas de ML para análise de movimento lateral. | Kitploit
Ferramentas/GitHubGitHub/h4wkst3r/dop2mop
Segurança de Infraestrutura em NuvemReconhecimentoSegurança de ContêineresAnálise de VulnerabilidadesColeta de InformaçõesTestes de PenetraçãoSegurança na NuvemDevSecOpsGerenciamento de Identidade e Acesso (IAM)Segurança da Cadeia de SuprimentosRed Teaming
413há 5 mesesAinda não revisado
GitHub
h4wkst3r/dop2mop

Dop2Mop

Coletor OpenGraph para BloodHound que mapeia caminhos de ataque de infraestrutura DevOps para MLOps, coletando recursos de pipelines CI/CD, service principals e plataformas de ML para análise de movimento lateral.

Ver Repositório

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Dop2Mop

Um coletor OpenGraph de prova de conceito para BloodHound que mapeia caminhos de ataque de infraestrutura DevOps para MLOps.

Baseado em Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure por Brett Hawkins (@h4wkst3r).

Table of Contents

  • Agradecimentos
  • Visão Geral
    • Plataformas Suportadas
    • Limites de Confiança Mapeados
  • Instalação
    • Dependências Opcionais
  • Início Rápido
    • Gerar Dados de Demonstração
    • Ingerir no BloodHound
  • Configuração
    • Arquivo de Configuração
    • Validação de Credenciais
  • Referência da CLI
    • Visão Geral dos Comandos
    • Opções Globais
    • dop2mop collect
    • dop2mop demo
  • Exemplos de Uso da CLI
    • Coleta Básica
    • Coleta em Plataforma Única
    • Coleta em Múltiplas Plataformas
    • Exemplos de Coleta no GitHub
    • Exemplos de Coleta no Azure DevOps
    • Exemplos de Coleta no Azure ML
    • Exemplos de Coleta no AWS SageMaker
    • Coleta Completa do Ambiente
  • Variáveis de Ambiente
  • Tipos de Nó
    • Nós DevOps
    • Nós MLOps
    • Nós de Identidade
    • Nós de Artefato
  • Tipos de Aresta
    • Arestas de Caminho de Ataque
    • Arestas Estruturais
  • Exemplos de Consultas
  • Ícones Personalizados
    • Carregando Ícones para o BloodHound
  • API Python
    • Usando Coletores Individuais
    • Construindo Gráficos Personalizados
  • Solução de Problemas
    • Problemas Comuns
  • Licença
  • Agradecimentos

    • SpecterOps pelo BloodHound e OpenGraph

    Visão Geral

    O Dop2Mop coleta dados de plataformas DevOps e MLOps para identificar caminhos de ataque que permitem movimento lateral de pipelines CI/CD para infraestrutura de treinamento de machine learning. Ele gera JSON OpenGraph compatível com BloodHound para visualização e análise.

    Plataformas Suportadas

    Plataformas DevOpsPlataformas MLOpsProvedores de Identidade
    GitHub (Actions, Repos, Secrets)Azure Machine LearningAzure AD Service Principals
    Azure DevOps (Pipelines, Service Connections)Amazon SageMakerAWS IAM Roles
    OIDC/Federated Identity

    Limites de Confiança Mapeados

    O Dop2Mop modela os cinco limites críticos de confiança identificados na pesquisa:

    1. TB1: Code Repository to CI/CD Pipeline - Gatilho automático de pipelines a partir de commits de código
    2. TB2: Service Principal Authentication - Credenciais NHI usadas por pipelines para acessar plataformas ML
    3. TB3: Container Artifact Trust - Confiança implícita em imagens de contêiner de registros internos
    4. TB4: Job Definition Execution - Plataformas ML executando definições de job sem validação
    5. TB5: Code Deserialization - Desserialização insegura de conjuntos de dados (pickle, joblib)

    Instalação```bash

    git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .

    root@kitploit:~
    ## O Que é Coletado
    
    Cada coletor reúne recursos específicos da plataforma e mapeia os limites de confiança entre eles:
    
    | Coletor | Recursos Coletados |
    |-----------|-------------------|
    | **GitHub** | Organizações, repositórios, fluxos de trabalho, segredos, regras de proteção de branch, configurações OIDC, referências de imagens de contêineres, referências de buckets S3 |
    | **Azure DevOps** | Organizações, projetos, pipelines (YAML), conexões de serviço (com detalhes de escopo), grupos de variáveis, pools de agentes, repositórios |
    | **Azure ML** | Workspaces, clusters/instâncias de computação, datastores, ambientes de ML, modelos registrados, trabalhos/experimentos, endpoints online e em lote |
    | **SageMaker** | Trabalhos de treinamento, modelos, endpoints, domínios, instâncias de notebook, funções de execução IAM (com análise de políticas), repositórios/imagens ECR, buckets S3 (filtrados para relevantes a ML) |
    
    ## Início Rápido
    
    ### Gerar Dados de Demonstração
    
    A maneira mais rápida de ver o Dop2Mop em ação é gerar dados de demonstração mostrando os cenários de ataque da pesquisa:```bash
    dop2mop demo -o demo.json
    

    Ingestão no BloodHound

    1. Abra o BloodHound CE (v8.0+)
    2. Navegue até Administration → File Ingest
    3. Faça upload do arquivo JSON gerado
    4. Consulte com Cypher:```cypher // Azure DevOps to Azure ML Lateral Movement MATCH p=(repo)-[:TriggersPipeline]->(pipeline)-[:UsesServiceConnection]->(svcconn)-[:AuthenticatesAs]->(workspace)-[:CodeExecution]->(compute) RETURN p

    // Container Image Poisoning (Supply Chain Attack) MATCH p=(workflow)-[:CanPoisonImage]->(image)<-[:PullsImage]-(job) RETURN p

    // OIDC/Federated Identity Abuse (confirmed edges) MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:CanAssumeRole]->(role)-[:SubmitsJob]->(job) RETURN p

    // OIDC abuse including inferred paths MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:InferredCanAssumeRole]->(role) RETURN p

    // Dataset Poisoning via Pickle Deserialization MATCH p=(workflow)-[:CanPoisonDataset]->(dataset)<-[:LoadsDataset]-(job) RETURN p

    // Find repos with weak/no branch protection (TB1 exploitable) MATCH (repo)-[:BypassesProtection]->(repo) RETURN repo.name, repo.default_branch

    // Find overprivileged SageMaker IAM roles MATCH (role:IAMRole) WHERE role.is_admin = true OR role.has_s3_full_access = true RETURN role.name, role.attached_policies

    // Find SageMaker notebooks with root + internet access MATCH (nb:SMNotebook) WHERE nb.root_access = 'Enabled' AND nb.direct_internet_access = 'Enabled' RETURN nb.name, nb.status

    // Find self-hosted ADO agent pools MATCH (agent:ADOAgent) WHERE agent.is_hosted = false RETURN agent.name, agent.pool_type

    root@kitploit:~
    ---
    
    ## Configuração
    
    ### Arquivo de Configuração
    
    Em vez de passar credenciais a cada execução, você pode salvá-las em um arquivo de configuração. Copie o exemplo incluído e preencha seus valores:```bash
    cp dop2mop.yaml.example dop2mop.yaml
    # Edit dop2mop.yaml with your credentials
    

    Dop2Mop verifica estes locais em ordem:

    1. Caminho especificado por --config
    2. dop2mop.yaml / dop2mop.yml / .dop2mop.yaml no diretório atual
    3. ~/.dop2mop.yaml

    Nota: dop2mop.yaml está em .gitignore para evitar o commit acidental de credenciais. O arquivo de exemplo (dop2mop.yaml.example) é seguro para comitar.

    Veja dop2mop.yaml.example para todas as opções disponíveis com comentários.

    Ordem de prioridade: argumentos CLI > arquivo de configuração > variáveis de ambiente.

    Validação de Credenciais

    Teste as credenciais antes de executar uma coleta completa:```bash

    Validate all configured collectors

    dop2mop collect --validate -v

    Validate specific collectors

    dop2mop collect --validate --collectors github,sagemaker -v

    root@kitploit:~
    Isso faz uma chamada de API leve por plataforma para verificar se os tokens são válidos antes de iniciar a coleta.
    
    ### Aliases de Coletores
    
    Você pode usar nomes curtos em vez de nomes de classes completos com `--collectors`:
    
    | Alias | Coletor |
    |-------|-----------|
    | `github`, `gh` | GitHubCollector |
    | `ado`, `azuredevops`, `azure-devops` | AzureDevOpsCollector |
    | `azureml`, `azure-ml` | AzureMLCollector |
    | `sagemaker`, `sm` | SageMakerCollector |```bash
    # These are equivalent:
    dop2mop collect --collectors GitHubCollector,SageMakerCollector
    dop2mop collect --collectors github,sagemaker
    dop2mop collect --collectors gh,sm
    

    Referência da CLI

    Visão Geral dos Comandos```

    dop2mop [options]

    Commands: collect Collect data from DevOps/MLOps platforms demo Generate demo data with attack scenarios

    root@kitploit:~
    ### Opções Globais
    
    | Opção | Descrição |
    |--------|-------------|
    | `-v, --verbose` | Ativar saída detalhada (logging no nível INFO) |
    | `--debug` | Ativar saída de depuração (logging no nível DEBUG) |
    
    ---
    
    ### `dop2mop collect`
    
    Coletar dados das plataformas DevOps e MLOps configuradas.```bash
    dop2mop collect [OPTIONS]
    

    Opções Gerais

    OpçãoDescrição
    -o, --output FILECaminho do arquivo de saída (padrão: dop2mop_output.json)
    --zipComprimir saída para arquivo ZIP
    --config FILECaminho para arquivo de configuração YAML/JSON
    --validateValidar credenciais antes da coleta
    --collectors LISTLista separada por vírgulas de coletores ou aliases (ex.: github,sm)
    --max-items NNúmero máximo de itens a coletar por tipo
    --no-secretsPular enumeração de segredos/credenciais

    Opções do GitHub

    OpçãoDescrição
    --github-token TOKENToken de acesso pessoal do GitHub
    --github-org ORGNome da organização do GitHub
    --github-enterprise-url URLURL do GitHub Enterprise Server

    Opções do Azure DevOps

    OpçãoDescrição
    --azure-devops-token TOKENToken de acesso pessoal do Azure DevOps (PAT)
    --azure-devops-access-token TOKENToken de acesso do Azure DevOps (autenticação Bearer, opcional)
    --azure-devops-org ORGNome da organização do Azure DevOps

    Opções do Azure ML

    OpçãoDescrição
    --azure-subscription-id IDID da assinatura do Azure
    --azure-tenant-id IDID do inquilino do Azure AD
    --azure-client-id IDID do cliente do principal de serviço (opcional)
    --azure-client-secret SECRETSegredo do cliente do principal de serviço (opcional)
    --azure-access-token TOKENToken de acesso do Azure para autenticação no Azure ML (opcional)

    Opções do AWS SageMaker

    OpçãoDescrição
    --aws-access-key-id KEYID da chave de acesso AWS
    --aws-secret-access-key SECRETChave de acesso secreta AWS
    --aws-region REGIONRegião AWS (padrão: us-east-1)
    --aws-profile PROFILENome do perfil da AWS CLI

    Coletores Disponíveis

    Nome do ColetorPlataformaCredenciais Necessárias
    GitHubCollectorGitHub--github-token, --github-org
    AzureDevOpsCollectorAzure DevOps--azure-devops-token ou --azure-devops-access-token, --azure-devops-org
    AzureMLCollectorAzure ML--azure-subscription-id, --azure-tenant-id
    SageMakerCollectorAWS SageMaker--aws-profile ou --aws-access-key-id

    dop2mop demo

    Gerar dados de demonstração mostrando os quatro cenários de ataque da pesquisa.```bash dop2mop demo [OPTIONS]

    root@kitploit:~
    | Opção | Descrição |
    |--------|-------------|
    | `-o, --output FILE` | Caminho do ficheiro de saída (padrão: `dop2mop_demo.json`) |
    
    ---
    
    ### `dop2mop icons`
    
    Gerar configuração personalizada de ícones para os tipos de nó do BloodHound.```bash
    dop2mop icons [OPTIONS]
    
    OpçãoDescrição
    -o, --output FILECaminho do arquivo de saída (padrão: dop2mop_icons.json)

    Exemplos de Uso da CLI

    Coleção Básica```bash

    Collect from all configured platforms (uses environment variables)

    dop2mop collect -o output.json

    Use a config file

    dop2mop collect --config dop2mop.yaml -o output.json -v

    Validate credentials first, then collect

    dop2mop collect --validate -o output.json -v

    Collect with verbose logging

    dop2mop collect -o output.json -v

    Collect with debug logging

    dop2mop collect -o output.json --debug

    Collect and compress to ZIP

    dop2mop collect -o output.json --zip

    Limit collection size

    dop2mop collect --max-items 100 -o output.json

    Skip secret enumeration

    dop2mop collect --no-secrets -o output.json

    root@kitploit:~
    ### Coleção de Plataforma Única```bash
    # GitHub only (aliases: github, gh)
    dop2mop collect --collectors github -o github.json -v
    
    # Azure DevOps only (aliases: ado, azuredevops)
    dop2mop collect --collectors ado -o ado.json -v
    
    # Azure ML only (aliases: azureml, azure-ml)
    dop2mop collect --collectors azureml -o azureml.json -v
    
    # SageMaker only (aliases: sagemaker, sm)
    dop2mop collect --collectors sm -o sagemaker.json -v
    

    Coleção de Múltiplas Plataformas```bash

    GitHub + SageMaker

    dop2mop collect --collectors github,sagemaker -o output.json -v

    GitHub + Azure DevOps

    dop2mop collect --collectors github,ado -o output.json -v

    Azure DevOps + Azure ML (full Azure stack)

    dop2mop collect --collectors ado,azureml -o azure.json -v

    All collectors explicitly

    dop2mop collect --collectors github,ado,azureml,sagemaker -o full.json -v

    root@kitploit:~
    ### Exemplos de Coleções do GitHub```bash
    # Using environment variables
    export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
    export GITHUB_ORG="your-org"
    dop2mop collect --collectors GitHubCollector -o github.json -v
    
    # Using command-line arguments
    dop2mop collect --collectors GitHubCollector \
      --github-token ghp_xxxxxxxxxxxx \
      --github-org your-org \
      -o github.json -v
    
    # GitHub Enterprise Server
    dop2mop collect --collectors GitHubCollector \
      --github-token ghp_xxxxxxxxxxxx \
      --github-org your-org \
      --github-enterprise-url https://github.yourcompany.com/api/v3 \
      -o github.json -v
    
    # Skip secret enumeration
    dop2mop collect --collectors GitHubCollector \
      --github-token ghp_xxxxxxxxxxxx \
      --github-org your-org \
      --no-secrets \
      -o github.json -v
    
    # Limit to 50 repositories
    dop2mop collect --collectors GitHubCollector \
      --github-token ghp_xxxxxxxxxxxx \
      --github-org your-org \
      --max-items 50 \
      -o github.json -v
    

    Exemplos de Coleção do Azure DevOps```bash

    Using environment variables

    export AZURE_DEVOPS_TOKEN="your-pat" export AZURE_DEVOPS_ORG="your-org" dop2mop collect --collectors AzureDevOpsCollector -o ado.json -v

    Using command-line arguments (PAT)

    dop2mop collect --collectors AzureDevOpsCollector
    --azure-devops-token your-pat
    --azure-devops-org your-org
    -o ado.json -v

    Using access token (Bearer auth)

    dop2mop collect --collectors AzureDevOpsCollector
    --azure-devops-access-token eyJ0...
    --azure-devops-org your-org
    -o ado.json -v

    root@kitploit:~
    > **Nota:** Prioridade de autenticação do Azure DevOps: access token (Bearer) > PAT (Basic).
    > Tokens de acesso podem ser obtidos via `az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798`.
    
    ### Exemplos de Coleções do Azure ML```bash
    # Using environment variables
    export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    dop2mop collect --collectors AzureMLCollector -o azureml.json -v
    
    # Using DefaultAzureCredential (az login)
    dop2mop collect --collectors AzureMLCollector \
      --azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      --azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      -o azureml.json -v
    
    # Using Service Principal
    dop2mop collect --collectors AzureMLCollector \
      --azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      --azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      --azure-client-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      --azure-client-secret your-secret \
      -o azureml.json -v
    
    # Using Access Token
    dop2mop collect --collectors AzureMLCollector \
      --azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      --azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
      --azure-access-token eyJ0... \
      -o azureml.json -v
    

    Nota: Prioridade de autenticação do Azure ML: token de acesso > principal de serviço > DefaultAzureCredential (az login). Tokens de acesso podem ser obtidos via az account get-access-token --resource https://management.azure.com/.

    Exemplos de Coleções AWS SageMaker```bash

    Using AWS profile (environment variable)

    export AWS_PROFILE="your-profile" dop2mop collect --collectors SageMakerCollector -o sagemaker.json -v

    Using AWS profile (command-line)

    dop2mop collect --collectors SageMakerCollector
    --aws-profile your-profile
    -o sagemaker.json -v

    Using access keys

    dop2mop collect --collectors SageMakerCollector
    --aws-access-key-id AKIAXXXXXXXXXXXXXXXX
    --aws-secret-access-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    --aws-region us-east-1
    -o sagemaker.json -v

    Different AWS region

    dop2mop collect --collectors SageMakerCollector
    --aws-profile your-profile
    --aws-region us-west-2
    -o sagemaker.json -v

    root@kitploit:~
    ### Coleção Completa de Ambiente```bash
    # Set all environment variables
    export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
    export GITHUB_ORG="your-org"
    export AZURE_DEVOPS_TOKEN="your-pat"
    export AZURE_DEVOPS_ORG="your-org"
    export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    export AWS_PROFILE="your-profile"
    
    # Collect from all platforms (auto-detects configured collectors)
    dop2mop collect -o full_collection.json -v
    
    # Or with explicit collectors
    dop2mop collect \
      --collectors GitHubCollector,AzureDevOpsCollector,AzureMLCollector,SageMakerCollector \
      -o full_collection.json -v
    

    Variáveis de Ambiente

    Todas as opções de linha de comando podem ser definidas por variáveis de ambiente:

    Variável de AmbienteEquivalente CLIDescrição
    GITHUB_TOKEN--github-tokenToken de acesso pessoal do GitHub
    GITHUB_ORG--github-orgNome da organização no GitHub
    GITHUB_ENTERPRISE_URL--github-enterprise-urlURL do GitHub Enterprise Server
    AZURE_DEVOPS_TOKEN--azure-devops-tokenPAT do Azure DevOps
    AZURE_DEVOPS_ACCESS_TOKEN--azure-devops-access-tokenToken de acesso do Azure DevOps (Bearer)
    AZURE_DEVOPS_ORG--azure-devops-orgOrganização do Azure DevOps
    AZURE_SUBSCRIPTION_ID--azure-subscription-idID da assinatura do Azure
    AZURE_TENANT_ID--azure-tenant-idID do tenant do Azure AD
    AZURE_CLIENT_ID--azure-client-idID do cliente do service principal do Azure
    AZURE_CLIENT_SECRET--azure-client-secretSegredo do service principal do Azure
    AZURE_ACCESS_TOKEN--azure-access-tokenToken de acesso do Azure para Azure ML
    AWS_ACCESS_KEY_ID--aws-access-key-idID da chave de acesso AWS
    AWS_SECRET_ACCESS_KEY--aws-secret-access-keyChave de acesso secreta AWS
    AWS_REGION--aws-regionRegião AWS (padrão: us-east-1)
    AWS_PROFILE--aws-profileNome do perfil AWS CLI

    Prioridade: argumentos CLI > arquivo de configuração > variáveis de ambiente.


    Tipos de Nó

    Nós de DevOps

    TipoDescrição
    GHOrganizationOrganização do GitHub
    GHRepositoryRepositório do GitHub
    GHWorkflowFluxo de trabalho do GitHub Actions
    GHSecretSegredo do GitHub Actions
    ADOOrganizationOrganização do Azure DevOps
    ADOProjectProjeto do Azure DevOps
    ADOPipelinePipeline do Azure DevOps
    ADOServiceConnectionConexão de serviço do Azure DevOps (NHI) com detalhes de escopo
    ADOAgentPool de agentes do Azure DevOps (hospedado ou auto-hospedado)
    ADOVariableGroupGrupo de variáveis do Azure DevOps

    Nós de MLOps

    TipoDescrição
    AzMLWorkspaceWorkspace do Azure ML
    AzMLComputeCluster/instância de computação do Azure ML
    AzMLExperimentJob/experimento do Azure ML
    AzMLDatastoreDatastore do Azure ML
    AzMLEnvironmentAmbiente do Azure ML (definição de contêiner)
    AzMLModelModelo registrado do Azure ML
    SMDomainDomínio do SageMaker Studio
    SMTrainingJobJob de treinamento do SageMaker
    SMModelModelo do SageMaker
    SMEndpointEndpoint do SageMaker (também usado para endpoints do Azure ML)
    SMNotebookInstância de notebook do SageMaker

    Nós de Identidade

    TipoDescrição
    ServicePrincipalService principal do Azure AD
    IAMRoleFunção IAM da AWS
    OIDCIdentityIdentidade federada OIDC
    ManagedIdentityIdentidade gerenciada do Azure

    Nós de Artefato

    TipoDescrição
    ContainerRegistryRegistro de contêineres (ECR, ACR)
    ContainerImageImagem de contêiner
    S3BucketBucket S3 da AWS
    DatasetDataset de ML

    Tipos de Aresta

    Arestas de Caminho de Ataque

    TipoLimite de ConfiançaDescrição
    TriggersPipelineTB1Commit de código dispara CI/CD
    HasBranchProtectionTB1Repositório possui regras de proteção de branch
    BypassesProtectionTB1Proteção de branch fraca/ausente (explorável)
    AuthenticatesAsTB2Pipeline usa service principal
    CanAssumeRoleTB2Identidade OIDC pode assumir função IAM
    OIDCTrustTB2Fluxo de trabalho usa federação OIDC
    UsesServiceConnectionTB2Pipeline usa conexão de serviço ADO
    PullsImageTB3Job de treinamento puxa imagem de contêiner
    CanPoisonImageTB3Pipeline pode modificar imagem de contêiner
    SubmitsJobTB4Service principal submete job de ML
    CodeExecutionTB4Job executa código na computação
    LoadsDatasetTB5Job de treinamento carrega dataset
    CanPoisonDatasetTB5Pipeline pode modificar dataset
    DeserializesTB5Desserialização insegura

    Arestas Inferidas

    Estas arestas são criadas por análise heurística quando dados explícitos de API não estão disponíveis (ex.: ARNs de funções armazenados em segredos). Usam tipos de aresta distintos para que possa filtrá-las nas consultas do BloodHound.

    TipoDescrição
    InferredCanAssumeRoleIdentidade OIDC pode ser capaz de assumir função (inferido)
    InferredSubmitsJobFluxo de trabalho pode submeter job de treinamento via OIDC (inferido)
    InferredPullsImageJob de treinamento pode puxar imagem de contêiner envenenada (inferido)
    InferredLoadsDatasetJob de treinamento pode carregar dataset envenenado (inferido)

    Arestas Estruturais

    TipoDescrição
    ContainsRelação pai-filho
    MemberOfAssociação a grupo
    HasAccessToPermissão para acessar recurso
    HasExecutionRoleRecurso usa uma função de execução IAM
    OwnsRelação de propriedade

    Consultas de Exemplo

    Consulte queries/dop2mop_queries.cypher para exemplos completos de consultas.


    Ícones Personalizados

    O Dop2Mop inclui um arquivo de ícones pré-configurado para tipos de nó personalizados do BloodHound em data/custom_icons.json.

    Enviando Ícones para o BloodHound

    Opção 1: API Explorer (Mais Fácil)

    1. Abra o BloodHound CE e vá em Settings → API Explorer
    2. Encontre POST /api/v2/custom-nodes
    3. Clique "Try it out"
    4. Cole o conteúdo de custom_icons.json
    5. Clique "Execute"

    Opção 2: Autenticação HMAC (Recomendado para Automação)

    Primeiro, crie um token de API no BloodHound:

    1. Vá em Settings → Administration → Manage Users
    2. Clique no seu usuário → Create Token
    3. Salve o Token ID e o Token Key

    Em seguida, use este script Python para enviar:

    root@kitploit:~
    # Install the BloodHound SDK
    # pip install bloodhound
    
    from bloodhound import BloodHound
    import json
    
    # Initialize client with HMAC auth
    bh = BloodHound(
        base_url="http://localhost:8080",
        token_id="your_token_id",
        token_key="your_token_key"
    )
    
    # Load custom icons
    with open("data/custom_icons.json") as f:
        icons = json.load(f)
    
    # Upload custom icons
    response = bh.custom_nodes.upload(icons)
    print(response)
    ``````python
    #!/usr/bin/env python3
    """Upload custom icons to BloodHound CE using HMAC authentication."""
    
    import base64
    import hashlib
    import hmac
    import json
    from datetime import datetime, timezone
    import requests
    
    # Configuration
    BLOODHOUND_URL = "http://localhost:8080"
    TOKEN_ID = "your-token-id"
    TOKEN_KEY = "your-token-key"
    ICONS_FILE = "custom_icons.json"
    
    def hmac_auth(method: str, uri: str, body: bytes = b"") -> dict:
        """Generate HMAC authentication headers."""
        digester = hmac.new(
            base64.b64decode(TOKEN_KEY),
            msg=None,
            digestmod=hashlib.sha256
        )
        
        now = datetime.now(timezone.utc)
        timestamp = now.strftime("%Y-%m-%dT%H:%M:%SZ")
        
        digester.update(f"{method}".encode())
        digester.update(f"{uri}".encode())
        digester.update(timestamp.encode())
        if body:
            digester.update(body)
        
        signature = base64.b64encode(digester.digest()).decode()
        
        return {
            "Authorization": f"bhesignature {TOKEN_ID}",
            "RequestDate": timestamp,
            "Signature": signature,
            "Content-Type": "application/json",
        }
    
    def upload_icons():
        """Upload custom icons to BloodHound."""
        uri = "/api/v2/custom-nodes"
        url = f"{BLOODHOUND_URL}{uri}"
        
        with open(ICONS_FILE, "rb") as f:
            body = f.read()
        
        headers = hmac_auth("POST", uri, body)
        response = requests.post(url, headers=headers, data=body)
        
        print(f"Status: {response.status_code}")
        print(f"Response: {response.text}")
        return response.status_code == 200
    
    if __name__ == "__main__":
        upload_icons()
    

    Opção 3: Bearer Token (Teste Rápido)

    Obtenha um JWT da aba Network do DevTools do seu navegador enquanto estiver logado no BloodHound:```bash curl -X POST http://localhost:8080/api/v2/custom-nodes
    -H "Authorization: Bearer eyJ..."
    -H "Content-Type: application/json"
    -d @custom_icons.json

    root@kitploit:~
    ## Python API```python
    from dop2mop import Dop2MopCollector, CollectorConfig
    
    # Configure collection
    config = CollectorConfig(
        github_token="ghp_xxx",
        github_org="myorg",
        aws_profile="default",
    )
    
    # Validate credentials first
    collector = Dop2MopCollector(config)
    results = collector.validate_all()
    print(results)  # {'GitHubCollector': True, 'SageMakerCollector': True, ...}
    
    # Run collection (supports aliases)
    collector.run(collectors=["github", "sm"])
    
    # Save output
    collector.save("output.json")
    
    # Get statistics
    print(collector.get_stats())
    
    # Get per-collector failure/skip details
    print(collector.get_collection_summary())
    

    Usando Coletores Individuais```python

    from dop2mop import CollectorConfig, GitHubCollector, SageMakerCollector from dop2mop.graph import OpenGraphBuilder

    Create shared builder

    builder = OpenGraphBuilder(source_kind="MLOpsBase")

    Configure

    config = CollectorConfig( github_token="ghp_xxx", github_org="myorg", aws_profile="default", )

    Run individual collectors

    github = GitHubCollector(config, builder) github.collect()

    sagemaker = SageMakerCollector(config, builder) sagemaker.collect()

    Save combined output

    builder.save("combined.json")

    root@kitploit:~
    ### Construindo Gráficos Personalizados```python
    from dop2mop.graph import OpenGraphBuilder
    from dop2mop.models import NodeKind, EdgeType
    
    builder = OpenGraphBuilder(source_kind="CustomSource")
    
    # Add nodes
    builder.create_node(
        id="my-pipeline",
        kinds=[NodeKind.AZURE_DEVOPS_PIPELINE.value],
        name="My Pipeline",
        displayname="Production Pipeline",
    )
    
    builder.create_node(
        id="my-ml-workspace",
        kinds=[NodeKind.AZURE_ML_WORKSPACE.value],
        name="ML Workspace",
        displayname="Training Workspace",
    )
    
    # Add edge
    builder.create_edge(
        start_id="my-pipeline",
        end_id="my-ml-workspace",
        kind=EdgeType.SUBMITS_JOB,
        properties={"trust_boundary": "TB4"}
    )
    
    # Export
    builder.save("custom_graph.json")
    

    Resolução de Problemas

    Valide Primeiro

    Sempre comece com a validação de credenciais para detectar problemas de autenticação precocemente.```bash dop2mop collect --validate --collectors github,sm -v

    root@kitploit:~
    A saída mostrará OK/FAILED por coletor antes do início de qualquer coleta.
    
    ### Resumo da Coleta
    
    Após cada execução, o Dop2Mop imprime um resumo mostrando o que foi coletado e o que falhou:```
    ============================================================
      Dop2Mop Collection Summary
    ============================================================
      Total Nodes: 142
        DevOps:   45
        MLOps:    38
        Identity: 12
        Artifact: 47
    
      Total Edges: 201
        Contains: 62
        TriggersPipeline: 15
        ...
    
      ────────────────────────────────────────────────────────
      Collection Issues:
        GitHubCollector: 45 collected, 3 failed, 1 skipped
          FAIL: branch_protection:org/repo - 404 Not Found
          SKIP: branch_protection:org/private - Insufficient permissions
    
      Output: output.json
    ============================================================
    

    Problemas Comuns

    "Coletor GitHub não configurado, ignorando"

    • Certifique-se de que as variáveis de ambiente GITHUB_TOKEN e GITHUB_ORG estão definidas, ou passe --github-token e --github-org

    "Coletor Azure ML não configurado, ignorando"

    • Certifique-se de que AZURE_SUBSCRIPTION_ID e AZURE_TENANT_ID estão definidas
    • Execute az login se estiver usando DefaultAzureCredential
    • Alternativamente, passe --azure-access-token com um token válido de az account get-access-token

    "Coletor SageMaker não configurado, ignorando"

    • Defina AWS_PROFILE ou ambos AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY
    • Certifique-se de que as credenciais tenham permissões de leitura do SageMaker

    Proteção de branch retorna 403

    • A API do GitHub requer acesso de administrador para ler regras de proteção de branch
    • Tokens não administradores ignorarão a coleta de proteção de branch (relatado no resumo)

    Limitação de taxa (erros 429)

    • Dop2Mop tenta novamente automaticamente com backoff exponencial em respostas de limite de taxa
    • Para grandes organizações, use --max-items para reduzir chamadas de API
    • Limites de taxa do GitHub: 5.000 solicitações/hora para usuários autenticados

    Nenhum resultado no console Cypher do BloodHound

    • Certifique-se de que as consultas retornem nós completos (RETURN a, b) e não propriedades (RETURN a.name, b.name)
    • O console Cypher do BloodHound é para visualização de grafos, não dados tabulares
    • Use o Neo4j Browser (localhost:7474) para consultas baseadas em propriedades

    Filtrando arestas inferidas vs. coletadas

    • Arestas inferidas usam tipos distintos (por exemplo, InferredCanAssumeRole em vez de CanAssumeRole)
    • Consulte apenas arestas confirmadas: MATCH p=()-[:CanAssumeRole]->() RETURN p
    • Consulte arestas inferidas: MATCH p=()-[:InferredCanAssumeRole]->() RETURN p

    Licença

    Licença MIT - Consulte LICENSE para detalhes.

    Baixar ferramenta