Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Dop2Mop — Collettore OpenGraph per BloodHound che mappa i percorsi di attacco dall'infrastruttura DevOps a quella MLOps, raccogliendo risorse di pipeline CI/CD, service principal e piattaforma ML per l'analisi del movimento laterale. | Kitploit
Strumenti/GitHubGitHub/h4wkst3r/dop2mop
Sicurezza dell'Infrastruttura CloudRicognizioneSicurezza dei ContenitoriAnalisi delle VulnerabilitàRaccolta InformazioniPenetration TestingSicurezza CloudDevSecOpsGestione Identità e Accessi (IAM)Sicurezza della Supply ChainRed Teaming
4135 mesi faNon ancora revisionato
GitHub
h4wkst3r/dop2mop

Dop2Mop

Collettore OpenGraph per BloodHound che mappa i percorsi di attacco dall'infrastruttura DevOps a quella MLOps, raccogliendo risorse di pipeline CI/CD, service principal e piattaforma ML per l'analisi del movimento laterale.

Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Dop2Mop

Un raccoglitore OpenGraph proof-of-concept per BloodHound che mappa i percorsi di attacco dall'infrastruttura DevOps all'infrastruttura MLOps.

Basato su Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure di Brett Hawkins (@h4wkst3r).

Indice

  • Riconoscimenti
  • Panoramica
    • Piattaforme Supportate
    • Confini di Fiducia Mappati
  • Installazione
    • Dipendenze Opzionali
  • Avvio Rapido
    • Generare Dati Demo
    • Importare in BloodHound
  • Configurazione
    • File di Configurazione
    • Validazione Credenziali
  • Riferimento CLI
    • Panoramica dei Comandi
    • Opzioni Globali
    • dop2mop collect
    • dop2mop demo
Esempi di Utilizzo CLI
  • Raccolta Base
  • Raccolta su Piattaforma Singola
  • Raccolta su Piattaforme Multiple
  • Esempi di Raccolta GitHub
  • Esempi di Raccolta Azure DevOps
  • Esempi di Raccolta Azure ML
  • Esempi di Raccolta AWS SageMaker
  • Raccolta Completa dell'Ambiente
  • Variabili d'Ambiente
  • Tipi di Nodi
    • Nodi DevOps
    • Nodi MLOps
    • Nodi Identità
    • Nodi Artefatto
  • Tipi di Archi
    • Archi di Percorso di Attacco
    • Archi Strutturali
  • Query di Esempio
  • Icone Personalizzate
    • Caricare Icone in BloodHound
  • API Python
    • Utilizzare Collettori Individuali
    • Costruire Grafici Personalizzati
  • Risoluzione dei Problemi
    • Problemi Comuni
  • Licenza
  • Riconoscimenti

    • SpecterOps per BloodHound e OpenGraph

    Panoramica

    Dop2Mop raccoglie dati dalle piattaforme DevOps e MLOps per identificare percorsi di attacco che consentono il movimento laterale dalle pipeline CI/CD all'infrastruttura di addestramento del machine learning. Produce JSON OpenGraph compatibile con BloodHound per visualizzazione e analisi.

    Piattaforme Supportate

    Piattaforme DevOpsPiattaforme MLOpsProvider di Identità
    GitHub (Actions, Repos, Secrets)Azure Machine LearningAzure AD Service Principals
    Azure DevOps (Pipelines, Service Connections)Amazon SageMakerAWS IAM Roles
    OIDC/Federated Identity

    Confini di Fiducia Mappati

    Dop2Mop modella i cinque confini di fiducia critici identificati nella ricerca:

    1. TB1: Repository del Codice alla Pipeline CI/CD - Attivazione automatica delle pipeline dai commit di codice
    2. TB2: Autenticazione del Principal del Servizio - Credenziali NHI utilizzate dalle pipeline per accedere alle piattaforme ML
    3. TB3: Fiducia negli Artefatti del Container - Fiducia implicita nelle immagini container provenienti da registri interni
    4. TB4: Esecuzione della Definizione del Job - Piattaforme ML che eseguono definizioni di job senza validazione
    5. TB5: Deserializzazione del Codice - Deserializzazione non sicura dei dataset (pickle, joblib)

    Installazione```bash

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

    root@kitploit:~
    ## Cosa viene raccolto
    
    Ogni collettore raccoglie risorse specifiche della piattaforma e mappa i confini di fiducia tra di esse:
    
    | Collettore | Risorse raccolte |
    |-----------|-------------------|
    | **GitHub** | Organizzazioni, repository, workflow, segreti, regole di protezione dei rami, configurazioni OIDC, riferimenti a immagini container, riferimenti a bucket S3 |
    | **Azure DevOps** | Organizzazioni, progetti, pipeline (YAML), connessioni di servizio (con dettagli sull'ambito), gruppi di variabili, pool di agent, repository |
    | **Azure ML** | Workspace, cluster/istanze di calcolo, datastore, ambienti ML, modelli registrati, job/esperimenti, endpoint online e batch |
    | **SageMaker** | Job di addestramento, modelli, endpoint, domini, istanze notebook, ruoli di esecuzione IAM (con analisi delle policy), repository/immagini ECR, bucket S3 (filtrati per rilevanza ML) |
    
    ## Avvio Rapido
    
    ### Genera Dati Demo
    
    Il modo più rapido per vedere Dop2Mop in azione è generare dati demo che mostrino gli scenari di attacco della ricerca:```bash
    dop2mop demo -o demo.json
    

    Importa in BloodHound

    1. Apri BloodHound CE (v8.0+)
    2. Vai su Administration → File Ingest
    3. Carica il file JSON generato
    4. Interroga con Cypher:
    root@kitploit:~
    MATCH (n) RETURN n LIMIT 25
    ``````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
    

    Configurazione

    File di Configurazione

    Invece di passare le credenziali ogni volta, puoi salvarle in un file di configurazione. Copia l'esempio incluso e inserisci i tuoi valori:```bash cp dop2mop.yaml.example dop2mop.yaml

    Edit dop2mop.yaml with your credentials

    root@kitploit:~
    Dop2Mop controlla queste posizioni in ordine:
    
    1. Percorso specificato da `--config`
    2. `dop2mop.yaml` / `dop2mop.yml` / `.dop2mop.yaml` nella directory corrente
    3. `~/.dop2mop.yaml`
    
    > **Nota:** `dop2mop.yaml` è in `.gitignore` per evitare di committare accidentalmente credenziali. Il file di esempio (`dop2mop.yaml.example`) è sicuro da committare.
    
    Vedi [dop2mop.yaml.example](https://github.com/h4wkst3r/dop2mop/blob/main/dop2mop.yaml.example) per tutte le opzioni disponibili con commenti.
    
    **Ordine di priorità:** argomenti CLI > file di configurazione > variabili d'ambiente.
    
    ### Validazione delle credenziali
    
    Verifica le credenziali prima di eseguire una raccolta completa:```bash
    # Validate all configured collectors
    dop2mop collect --validate -v
    
    # Validate specific collectors
    dop2mop collect --validate --collectors github,sagemaker -v
    

    Questo effettua una chiamata API leggera per piattaforma per verificare che i token siano validi prima di iniziare la raccolta.

    Alias dei Raccoglitori

    Puoi usare nomi brevi invece dei nomi completi delle classi con --collectors:

    AliasRaccoglitore
    github, ghGitHubCollector
    ado, azuredevops, azure-devopsAzureDevOpsCollector
    azureml, azure-mlAzureMLCollector
    sagemaker, smSageMakerCollector

    These are equivalent:

    dop2mop collect --collectors GitHubCollector,SageMakerCollector dop2mop collect --collectors github,sagemaker dop2mop collect --collectors gh,sm

    root@kitploit:~
    ---
    
    ## Riferimento CLI
    
    ### Panoramica dei Comandi```
    dop2mop <command> [options]
    
    Commands:
      collect    Collect data from DevOps/MLOps platforms
      demo       Generate demo data with attack scenarios
    

    Opzioni globali

    OpzioneDescrizione
    -v, --verboseAbilita output verbose (logging a livello INFO)
    --debugAbilita output debug (logging a livello DEBUG)

    dop2mop collect

    Raccogli dati dalle piattaforme DevOps e MLOps configurate.```bash dop2mop collect [OPTIONS]

    root@kitploit:~
    #### Opzioni Generali
    
    | Opzione | Descrizione |
    |--------|-------------|
    | `-o, --output FILE` | Percorso del file di output (default: `dop2mop_output.json`) |
    | `--zip` | Comprimi output in file ZIP |
    | `--config FILE` | Percorso del file di configurazione YAML/JSON |
    | `--validate` | Convalida le credenziali prima della raccolta |
    | `--collectors LIST` | Elenco separato da virgole di collector o alias (es. `github,sm`) |
    | `--max-items N` | Numero massimo di elementi da raccogliere per tipo |
    | `--no-secrets` | Salta l'enumerazione di segreti/credenziali |
    
    #### Opzioni GitHub
    
    | Opzione | Descrizione |
    |--------|-------------|
    | `--github-token TOKEN` | Token di accesso personale GitHub |
    | `--github-org ORG` | Nome dell'organizzazione GitHub |
    | `--github-enterprise-url URL` | URL di GitHub Enterprise Server |
    
    #### Opzioni Azure DevOps
    
    | Opzione | Descrizione |
    |--------|-------------|
    | `--azure-devops-token TOKEN` | Token di accesso personale Azure DevOps (PAT) |
    | `--azure-devops-access-token TOKEN` | Token di accesso Azure DevOps (autenticazione Bearer, opzionale) |
    | `--azure-devops-org ORG` | Nome dell'organizzazione Azure DevOps |
    
    #### Opzioni Azure ML
    
    | Opzione | Descrizione |
    |--------|-------------|
    | `--azure-subscription-id ID` | ID della sottoscrizione Azure |
    | `--azure-tenant-id ID` | ID del tenant Azure AD |
    | `--azure-client-id ID` | ID client del service principal (opzionale) |
    | `--azure-client-secret SECRET` | Segreto client del service principal (opzionale) |
    | `--azure-access-token TOKEN` | Token di accesso Azure per l'autenticazione Azure ML (opzionale) |
    
    #### Opzioni AWS SageMaker
    
    | Opzione | Descrizione |
    |--------|-------------|
    | `--aws-access-key-id KEY` | ID della chiave di accesso AWS |
    | `--aws-secret-access-key SECRET` | Chiave di accesso segreta AWS |
    | `--aws-region REGION` | Regione AWS (default: `us-east-1`) |
    | `--aws-profile PROFILE` | Nome del profilo CLI AWS |
    
    #### Collector Disponibili
    
    | Nome Collector | Piattaforma | Credenziali Richieste |
    |----------------|-------------|-----------------------|
    | `GitHubCollector` | GitHub | `--github-token`, `--github-org` |
    | `AzureDevOpsCollector` | Azure DevOps | `--azure-devops-token` o `--azure-devops-access-token`, `--azure-devops-org` |
    | `AzureMLCollector` | Azure ML | `--azure-subscription-id`, `--azure-tenant-id` |
    | `SageMakerCollector` | AWS SageMaker | `--aws-profile` o `--aws-access-key-id` |
    
    ---
    
    ### `dop2mop demo`
    
    Genera dati dimostrativi che mostrano i quattro scenari di attacco della ricerca.```bash
    dop2mop demo [OPTIONS]
    
    OpzioneDescrizione
    -o, --output FILEPercorso del file di output (default: dop2mop_demo.json)

    dop2mop icons

    Genera una configurazione personalizzata delle icone per i tipi di nodo di BloodHound.```bash dop2mop icons [OPTIONS]

    root@kitploit:~
    | Option | Description |
    |--------|-------------|
    | `-o, --output FILE` | Percorso del file di output (predefinito: `dop2mop_icons.json`) |
    
    ---
    
    ## Esempi di utilizzo da riga di comando
    
    ### Raccolta di base```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
    

    Collezione per Piattaforma Singola```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

    root@kitploit:~
    ### Raccolta Multi Piattaforma```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
    

    Esempi di raccolta 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

    root@kitploit:~
    ### Esempi di Azure DevOps Collection```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
    

    Nota: Priorità di autenticazione di Azure DevOps: token di accesso (Bearer) > PAT (Basic). I token di accesso possono essere ottenuti tramite az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798.

    Esempi di raccolta 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

    root@kitploit:~
    > **Nota:** Priorità di autenticazione di Azure ML: access token > service principal > DefaultAzureCredential (az login).
    > I token di accesso possono essere ottenuti tramite `az account get-access-token --resource https://management.azure.com/`.
    
    ### Esempi di Raccolta 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
    

    Raccolta Completa dell'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

    root@kitploit:~
    ---
    
    ## Variabili d'Ambiente
    
    Tutte le opzioni da riga di comando possono essere impostate tramite variabili d'ambiente:
    
    | Variabile d'Ambiente | Equivalente CLI | Descrizione |
    |---------------------|----------------|-------------|
    | `GITHUB_TOKEN` | `--github-token` | Token di accesso personale di GitHub |
    | `GITHUB_ORG` | `--github-org` | Nome dell'organizzazione GitHub |
    | `GITHUB_ENTERPRISE_URL` | `--github-enterprise-url` | URL del server GitHub Enterprise |
    | `AZURE_DEVOPS_TOKEN` | `--azure-devops-token` | PAT di Azure DevOps |
    | `AZURE_DEVOPS_ACCESS_TOKEN` | `--azure-devops-access-token` | Token di accesso Azure DevOps (Bearer) |
    | `AZURE_DEVOPS_ORG` | `--azure-devops-org` | Organizzazione Azure DevOps |
    | `AZURE_SUBSCRIPTION_ID` | `--azure-subscription-id` | ID sottoscrizione Azure |
    | `AZURE_TENANT_ID` | `--azure-tenant-id` | ID tenant Azure AD |
    | `AZURE_CLIENT_ID` | `--azure-client-id` | ID client dell'entità servizio Azure |
    | `AZURE_CLIENT_SECRET` | `--azure-client-secret` | Segreto dell'entità servizio Azure |
    | `AZURE_ACCESS_TOKEN` | `--azure-access-token` | Token di accesso Azure per Azure ML |
    | `AWS_ACCESS_KEY_ID` | `--aws-access-key-id` | ID chiave di accesso AWS |
    | `AWS_SECRET_ACCESS_KEY` | `--aws-secret-access-key` | Chiave di accesso segreta AWS |
    | `AWS_REGION` | `--aws-region` | Regione AWS (predefinita: us-east-1) |
    | `AWS_PROFILE` | `--aws-profile` | Nome del profilo CLI AWS |
    
    **Priorità:** Argomenti CLI > file di configurazione > variabili d'ambiente.
    
    ---
    
    ## Tipi di Nodo
    
    ### Nodi DevOps
    
    | Tipo | Descrizione |
    |------|-------------|
    | `GHOrganization` | Organizzazione GitHub |
    | `GHRepository` | Repository GitHub |
    | `GHWorkflow` | Workflow GitHub Actions |
    | `GHSecret` | Segreto GitHub Actions |
    | `ADOOrganization` | Organizzazione Azure DevOps |
    | `ADOProject` | Progetto Azure DevOps |
    | `ADOPipeline` | Pipeline Azure DevOps |
    | `ADOServiceConnection` | Connessione servizio Azure DevOps (NHI) con dettagli ambito |
    | `ADOAgent` | Pool di agenti Azure DevOps (hosted o self-hosted) |
    | `ADOVariableGroup` | Gruppo di variabili Azure DevOps |
    
    ### Nodi MLOps
    
    | Tipo | Descrizione |
    |------|-------------|
    | `AzMLWorkspace` | Workspace Azure ML |
    | `AzMLCompute` | Cluster/istanza di calcolo Azure ML |
    | `AzMLExperiment` | Job/esperimento Azure ML |
    | `AzMLDatastore` | Datastore Azure ML |
    | `AzMLEnvironment` | Ambiente Azure ML (definizione contenitore) |
    | `AzMLModel` | Modello registrato Azure ML |
    | `SMDomain` | Dominio SageMaker Studio |
    | `SMTrainingJob` | Job di addestramento SageMaker |
    | `SMModel` | Modello SageMaker |
    | `SMEndpoint` | Endpoint SageMaker (usato anche per endpoint Azure ML) |
    | `SMNotebook` | Istanza notebook SageMaker |
    
    ### Nodi Identità
    
    | Tipo | Descrizione |
    |------|-------------|
    | `ServicePrincipal` | Entità servizio Azure AD |
    | `IAMRole` | Ruolo IAM AWS |
    | `OIDCIdentity` | Identità federata OIDC |
    | `ManagedIdentity` | Identità gestita Azure |
    
    ### Nodi Artefatto
    
    | Tipo | Descrizione |
    |------|-------------|
    | `ContainerRegistry` | Registry contenitori (ECR, ACR) |
    | `ContainerImage` | Immagine contenitore |
    | `S3Bucket` | Bucket S3 AWS |
    | `Dataset` | Dataset ML |
    
    ## Tipi di Bordo
    
    ### Bordi Percorso di Attacco
    
    | Tipo | Boundary di Fiducia | Descrizione |
    |------|----------------|-------------|
    | `TriggersPipeline` | TB1 | Commit di codice attiva CI/CD |
    | `HasBranchProtection` | TB1 | Il repository ha regole di protezione ramo |
    | `BypassesProtection` | TB1 | Protezione ramo debole/mancante (sfruttabile) |
    | `AuthenticatesAs` | TB2 | La pipeline usa un'entità servizio |
    | `CanAssumeRole` | TB2 | L'identità OIDC può assumere il ruolo IAM |
    | `OIDCTrust` | TB2 | Il workflow usa federazione OIDC |
    | `UsesServiceConnection` | TB2 | La pipeline usa la connessione servizio ADO |
    | `PullsImage` | TB3 | Il job di addestramento tira l'immagine contenitore |
    | `CanPoisonImage` | TB3 | La pipeline può modificare l'immagine contenitore |
    | `SubmitsJob` | TB4 | L'entità servizio invia il job ML |
    | `CodeExecution` | TB4 | Il job esegue codice sul calcolo |
    | `LoadsDataset` | TB5 | Il job di addestramento carica il dataset |
    | `CanPoisonDataset` | TB5 | La pipeline può modificare il dataset |
    | `Deserializes` | TB5 | Deserializzazione non sicura |
    
    ### Bordi Inferiti
    
    Questi bordi sono creati da analisi euristica quando i dati espliciti dell'API non sono disponibili (es. ARN di ruoli memorizzati nei segreti). Usano tipi di bordo distinti per consentire il filtraggio nelle query BloodHound.
    
    | Tipo | Descrizione |
    |------|-------------|
    | `InferredCanAssumeRole` | L'identità OIDC potrebbe essere in grado di assumere il ruolo (inferito) |
    | `InferredSubmitsJob` | Il workflow potrebbe inviare il job di addestramento tramite OIDC (inferito) |
    | `InferredPullsImage` | Il job di addestramento potrebbe tirare l'immagine contenitore avvelenata (inferito) |
    | `InferredLoadsDataset` | Il job di addestramento potrebbe caricare il dataset avvelenato (inferito) |
    
    ### Bordi Strutturali
    
    | Tipo | Descrizione |
    |------|-------------|
    | `Contains` | Relazione genitore-figlio |
    | `MemberOf` | Appartenenza a gruppo |
    | `HasAccessTo` | Permesso di accedere alla risorsa |
    | `HasExecutionRole` | La risorsa usa un ruolo IAM/esecuzione |
    | `Owns` | Relazione di proprietà |
    
    ## Query di Esempio
    
    Vedi [queries/dop2mop_queries.cypher](https://github.com/h4wkst3r/dop2mop/blob/main/queries/dop2mop_queries.cypher) per esempi di query complete.
    
    ---
    
    ## Icone Personalizzate
    
    Dop2Mop include un file di icone preconfigurato per i tipi di nodo personalizzati di BloodHound in [data/custom_icons.json](https://github.com/h4wkst3r/dop2mop/blob/main/data/custom_icons.json).
    
    ### Caricamento Icone in BloodHound
    
    #### Opzione 1: API Explorer (La Più Semplice)
    
    1. Apri BloodHound CE e vai a **Settings** → **API Explorer**
    2. Trova **POST /api/v2/custom-nodes**
    3. Fai clic su "Try it out"
    4. Incolla il contenuto di `custom_icons.json`
    5. Fai clic su "Execute"
    
    #### Opzione 2: Autenticazione HMAC (Consigliata per Automazione)
    
    Prima, crea un token API in BloodHound:
    1. Vai a **Impostazioni** → **Amministrazione** → **Gestisci Utenti**
    2. Fai clic sul tuo utente → **Crea Token**
    3. Salva il **Token ID** e la **Token Key**
    
    Quindi usa questo script Python per caricare:```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()
    

    Opzione 3: Bearer Token (Test Rapido)

    Ottieni un JWT dalla scheda Rete degli DevTools del tuo browser mentre sei connesso a 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:~
    ## API Python```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())
    

    Utilizzo dei collettori individuali```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:~
    ### Costruire Grafici Personalizzati```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")
    

    Risoluzione dei problemi

    Convalida preliminare

    Inizia sempre con la convalida delle credenziali per individuare tempestivamente i problemi di autenticazione:```bash dop2mop collect --validate --collectors github,sm -v

    root@kitploit:~
    L'output mostrerà OK/FAILED per ogni collector prima che inizi qualsiasi raccolta.
    
    ### Riepilogo Raccolta
    
    Dopo ogni esecuzione, Dop2Mop stampa un riepilogo che mostra cosa è stato raccolto e cosa ha fallito:```
    ============================================================
      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
    ============================================================
    

    Problemi comuni

    "Collettore GitHub non configurato, saltato"

    • Assicurati che le variabili d'ambiente GITHUB_TOKEN e GITHUB_ORG siano impostate, oppure passa --github-token e --github-org

    "Collettore Azure ML non configurato, saltato"

    • Assicurati che AZURE_SUBSCRIPTION_ID e AZURE_TENANT_ID siano impostate
    • Esegui az login se usi DefaultAzureCredential
    • In alternativa, passa --azure-access-token con un token valido ottenuto da az account get-access-token

    "Collettore SageMaker non configurato, saltato"

    • Imposta AWS_PROFILE oppure sia AWS_ACCESS_KEY_ID che AWS_SECRET_ACCESS_KEY
    • Assicurati che le credenziali abbiano permessi di lettura su SageMaker

    La protezione dei rami restituisce 403

    • L'API GitHub richiede accesso amministratore per leggere le regole di protezione dei rami
    • I token non amministrativi salteranno la raccolta della protezione dei rami (riportato nel riepilogo)

    Limitazione della frequenza (errori 429)

    • Dop2Mop ritenta automaticamente con backoff esponenziale in caso di risposte di limitazione della frequenza
    • Per organizzazioni grandi, usa --max-items per ridurre le chiamate API
    • Limiti di frequenza GitHub: 5.000 richieste/ora per utenti autenticati

    Nessun risultato nella console Cypher di BloodHound

    • Assicurati che le query restituiscano nodi completi (RETURN a, b) non proprietà (RETURN a.name, b.name)
    • La console Cypher di BloodHound è per la visualizzazione di grafi, non per dati tabulari
    • Usa Neo4j Browser (localhost:7474) per query basate su proprietà

    Filtraggio degli archi inferiti rispetto a quelli raccolti

    • Gli archi inferiti usano tipi distinti (es. InferredCanAssumeRole invece di CanAssumeRole)
    • Query solo per archi confermati: MATCH p=()-[:CanAssumeRole]->() RETURN p
    • Query per archi inferiti: MATCH p=()-[:InferredCanAssumeRole]->() RETURN p

    Licenza

    Licenza MIT - Vedi LICENSE per i dettagli.

    Scarica lo strumento