Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/h4wkst3r/dop2mop
Cloud-Infrastruktur-SicherheitAufklärungContainer-SicherheitSchwachstellenanalyseInformationsbeschaffungPenetrationstestsCloud-SicherheitDevSecOpsIdentitäts- & Zugriffsmanagement (IAM)LieferkettensicherheitRed Teaming
413vor 5 MonatenNoch nicht geprüft
GitHub
h4wkst3r/dop2mop

Dop2Mop

OpenGraph-Sammler für BloodHound, der Angriffspfade von DevOps- zu MLOps-Infrastrukturen abbildet und CI/CD-Pipeline-, Dienstprinzipal- und ML-Plattform-Ressourcen für die Lateral-Movement-Analyse sammelt.

Repository anzeigen

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Dop2Mop

Ein Proof-of-Concept OpenGraph-Collector für BloodHound, der Angriffspfade von DevOps- zu MLOps-Infrastruktur abbildet.

Basierend auf Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure von Brett Hawkins (@h4wkst3r).

Inhaltsverzeichnis

  • Danksagungen
  • Übersicht
    • Unterstützte Plattformen
    • Abgebildete Vertrauensgrenzen
  • Installation
    • Optionale Abhängigkeiten
  • Schnellstart
    • Demo-Daten generieren
    • In BloodHound importieren
  • Konfiguration
    • Konfigurationsdatei
    • Anmeldeinformationsprüfung
  • CLI-Referenz
    • Befehlsübersicht
    • Globale Optionen
    • dop2mop collect
    • dop2mop demo
  • CLI-Anwendungsbeispiele
    • Grundlegende Sammlung
    • Sammlung einer einzelnen Plattform
    • Sammlung mehrerer Plattformen
    • GitHub-Sammlungsbeispiele
    • Azure DevOps-Sammlungsbeispiele
    • Azure ML-Sammlungsbeispiele
    • AWS SageMaker-Sammlungsbeispiele
    • Vollständige Umgebungssammlung
  • Umgebungsvariablen
  • Knotentypen
    • DevOps-Knoten
    • MLOps-Knoten
    • Identitätsknoten
    • Artefakt-Knoten
  • Kantentypen
    • Angriffspfad-Kanten
    • Strukturelle Kanten
  • Beispielabfragen
  • Benutzerdefinierte Icons
    • Icons in BloodHound hochladen
  • Python-API
    • Verwendung einzelner Collector
    • Erstellen benutzerdefinierter Graphen
  • Fehlerbehebung
    • Häufige Probleme
  • Lizenz
  • Danksagungen

    • SpecterOps für BloodHound und OpenGraph

    Übersicht

    Dop2Mop sammelt Daten von DevOps- und MLOps-Plattformen, um Angriffspfade zu identifizieren, die laterale Bewegungen von CI/CD-Pipelines zur Trainingsinfrastruktur für maschinelles Lernen ermöglichen. Die Ausgabe erfolgt als BloodHound-kompatibles OpenGraph-JSON zur Visualisierung und Analyse.

    Unterstützte Plattformen

    DevOps-PlattformenMLOps-PlattformenIdentitätsanbieter
    GitHub (Actions, Repos, Secrets)Azure Machine LearningAzure AD-Dienstprinzipale
    Azure DevOps (Pipelines, Serviceverbindungen)Amazon SageMakerAWS IAM-Rollen
    OIDC/Föderierte Identität

    Abgebildete Vertrauensgrenzen

    Dop2Mop modelliert die fünf in der Forschung identifizierten kritischen Vertrauensgrenzen:

    1. TB1: Code-Repository zu CI/CD-Pipeline – Automatische Auslösung von Pipelines durch Code-Commits
    2. TB2: Dienstprinzipal-Authentifizierung – NHI-Anmeldeinformationen, die von Pipelines für den Zugriff auf ML-Plattformen verwendet werden
    3. TB3: Vertrauen in Container-Artefakte – Implizites Vertrauen in Container-Images aus internen Registries
    4. TB4: Ausführung von Jobdefinitionen – ML-Plattformen führen Jobdefinitionen ohne Validierung aus
    5. TB5: Deserialisierung von Code – Unsichere Deserialisierung von Datensätzen (pickle, joblib)

    Installation```bash

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

    root@kitploit:~
    ## Was gesammelt wird
    
    Jeder Collector sammelt plattformspezifische Ressourcen und kartiert die Vertrauensgrenzen zwischen ihnen:
    
    | Collector | Gesammelte Ressourcen |
    |-----------|----------------------|
    | **GitHub** | Organisationen, Repositories, Workflows, Secrets, Branch-Protection-Regeln, OIDC-Konfigurationen, Container-Image-Referenzen, S3-Bucket-Referenzen |
    | **Azure DevOps** | Organisationen, Projekte, Pipelines (YAML), Serviceverbindungen (mit Umfangsdetails), Variablengruppen, Agent-Pools, Repositories |
    | **Azure ML** | Workspaces, Compute-Cluster/-Instanzen, Datastores, ML-Umgebungen, registrierte Modelle, Jobs/Experimente, Online- und Batch-Endpunkte |
    | **SageMaker** | Training-Jobs, Modelle, Endpoints, Domains, Notebook-Instanzen, IAM-Ausführungsrollen (mit Richtlinienanalyse), ECR-Repositories/-Images, S3-Buckets (gefiltert auf ML-relevante) |
    
    ## Schnellstart
    
    ### Demo-Daten generieren
    
    Der schnellste Weg, Dop2Mop in Aktion zu sehen, besteht darin, Demo-Daten zu generieren, die die Angriffsszenarien aus der Forschung zeigen:```bash
    dop2mop demo -o demo.json
    

    In Daten in BloodHound einlesen

    1. BloodHound CE öffnen (v8.0+)
    2. Zu Administration → Dateiimport navigieren
    3. Die generierte JSON-Datei hochladen
    4. Mit Cypher abfragen:
    root@kitploit:~
    MATCH (u:User)
    RETURN u
    ``````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
    

    Konfiguration

    Konfigurationsdatei

    Anstatt bei jeder Ausführung Anmeldeinformationen zu übergeben, können Sie diese in einer Konfigurationsdatei speichern. Kopieren Sie das beigefügte Beispiel und füllen Sie Ihre Werte ein:

    root@kitploit:~
    cp config.example.yml config.yml```bash
    

    cp dop2mop.yaml.example dop2mop.yaml

    Edit dop2mop.yaml with your credentials

    root@kitploit:~
    Dop2Mop überprüft diese Orte in der folgenden Reihenfolge:
    
    1. Pfad, der mit `--config` angegeben wurde
    2. `dop2mop.yaml` / `dop2mop.yml` / `.dop2mop.yaml` im aktuellen Verzeichnis
    3. `~/.dop2mop.yaml`
    
    > **Hinweis:** `dop2mop.yaml` befindet sich in `.gitignore`, um ein versehentliches Committen von Anmeldedaten zu verhindern. Die Beispieldatei (`dop2mop.yaml.example`) kann bedenkenlos committet werden.
    
    Siehe [dop2mop.yaml.example](https://github.com/h4wkst3r/dop2mop/blob/main/dop2mop.yaml.example) für alle verfügbaren Optionen mit Kommentaren.
    
    **Prioritätsreihenfolge:** CLI-Argumente > Konfigurationsdatei > Umgebungsvariablen.
    
    ### Anmeldedatenvalidierung
    
    Testen Sie Anmeldedaten vor dem Durchführen einer vollständigen Sammlung:```bash
    # Validate all configured collectors
    dop2mop collect --validate -v
    
    # Validate specific collectors
    dop2mop collect --validate --collectors github,sagemaker -v
    

    Dies führt einen leichten API-Aufruf pro Plattform durch, um die Gültigkeit der Tokens vor Beginn der Sammlung zu überprüfen.

    Collector-Aliase

    Sie können kurze Namen anstelle der vollständigen Klassennamen mit --collectors verwenden:

    AliasCollector
    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:~
    ## CLI-Referenz
    
    ### Befehlsübersicht```
    dop2mop <command> [options]
    
    Commands:
      collect    Collect data from DevOps/MLOps platforms
      demo       Generate demo data with attack scenarios
    

    Globale Optionen

    OptionBeschreibung
    -v, --verboseAusführliche Ausgabe aktivieren (Protokollierung auf INFO-Ebene)
    --debugDebug-Ausgabe aktivieren (Protokollierung auf DEBUG-Ebene)

    dop2mop collect

    Sammle Daten von konfigurierten DevOps- und MLOps-Plattformen.```bash dop2mop collect [OPTIONS]

    root@kitploit:~
    #### Allgemeine Optionen
    
    | Option | Beschreibung |
    |--------|-------------|
    | `-o, --output FILE` | Ausgabedateipfad (Standard: `dop2mop_output.json`) |
    | `--zip` | Ausgabe in ZIP-Datei komprimieren |
    | `--config FILE` | Pfad zur YAML/JSON-Konfigurationsdatei |
    | `--validate` | Anmeldeinformationen vor der Sammlung validieren |
    | `--collectors LIST` | Kommagetrennte Liste von Collectors oder Aliasen (z.B. `github,sm`) |
    | `--max-items N` | Maximale Anzahl zu sammelnder Elemente pro Typ |
    | `--no-secrets` | Geheimnis-/Anmeldeinformationsaufzählung überspringen |
    
    #### GitHub-Optionen
    
    | Option | Beschreibung |
    |--------|-------------|
    | `--github-token TOKEN` | GitHub persönlicher Zugriffstoken |
    | `--github-org ORG` | GitHub-Organisationsname |
    | `--github-enterprise-url URL` | URL des GitHub Enterprise Servers |
    
    #### Azure DevOps-Optionen
    
    | Option | Beschreibung |
    |--------|-------------|
    | `--azure-devops-token TOKEN` | Azure DevOps persönlicher Zugriffstoken (PAT) |
    | `--azure-devops-access-token TOKEN` | Azure DevOps-Zugriffstoken (Bearer-Authentifizierung, optional) |
    | `--azure-devops-org ORG` | Azure DevOps-Organisationsname |
    
    #### Azure ML-Optionen
    
    | Option | Beschreibung |
    |--------|-------------|
    | `--azure-subscription-id ID` | Azure-Abonnement-ID |
    | `--azure-tenant-id ID` | Azure AD-Mandanten-ID |
    | `--azure-client-id ID` | Client-ID des Dienstprinzipals (optional) |
    | `--azure-client-secret SECRET` | Client-Geheimnis des Dienstprinzipals (optional) |
    | `--azure-access-token TOKEN` | Azure-Zugriffstoken für die Azure ML-Authentifizierung (optional) |
    
    #### AWS SageMaker-Optionen
    
    | Option | Beschreibung |
    |--------|-------------|
    | `--aws-access-key-id KEY` | AWS-Zugriffsschlüssel-ID |
    | `--aws-secret-access-key SECRET` | AWS-Geheimzugriffsschlüssel |
    | `--aws-region REGION` | AWS-Region (Standard: `us-east-1`) |
    | `--aws-profile PROFILE` | AWS CLI-Profilname |
    
    #### Verfügbare Collectors
    
    | Collectorname | Plattform | Erforderliche Anmeldeinformationen |
    |----------------|----------|---------------------|
    | `GitHubCollector` | GitHub | `--github-token`, `--github-org` |
    | `AzureDevOpsCollector` | Azure DevOps | `--azure-devops-token` oder `--azure-devops-access-token`, `--azure-devops-org` |
    | `AzureMLCollector` | Azure ML | `--azure-subscription-id`, `--azure-tenant-id` |
    | `SageMakerCollector` | AWS SageMaker | `--aws-profile` oder `--aws-access-key-id` |
    
    ---
    
    ### `dop2mop demo`
    
    Demodaten generieren, die die vier Angriffsszenarien aus der Forschung zeigen.```bash
    dop2mop demo [OPTIONS]
    

    dop2mop icons

    Generieren Sie eine benutzerdefinierte Icon-Konfiguration für BloodHound-Knotentypen.

    OptionBeschreibung
    -o, --output FILEAusgabedateipfad (Standard: dop2mop_demo.json)
    dop2mop icons [OPTIONS]
    root@kitploit:~
    | Option | Beschreibung |
    |--------|-------------|
    | `-o, --output FILE` | Pfad zur Ausgabedatei (Standard: `dop2mop_icons.json`) |
    
    ---
    
    ## CLI-Nutzungsbeispiele
    
    ### Grundlegende Sammlung```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
    

    Einzelplattform-Sammlung```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:~
    ### Sammlung für mehrere Plattformen```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
    

    GitHub-Sammlungsbeispiele```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:~
    ### Azure DevOps Sammlungsbeispiele```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
    

    Hinweis: Azure DevOps-Authentifizierungspriorität: Zugriffstoken (Bearer) > PAT (Basic). Zugriffstoken können mit az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798 abgerufen werden.

    Azure ML Collection-Beispiele```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:~
    > **Hinweis:** Azure ML-Authentifizierungspriorität: Zugriffstoken > Dienstprinzipal > DefaultAzureCredential (az login).
    > Zugriffstoken können über `az account get-access-token --resource https://management.azure.com/` bezogen werden.
    
    ### AWS SageMaker Sammlungsbeispiele```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
    

    Vollständige Umgebungssammlung```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:~
    ---
    
    ## Umgebungsvariablen
    
    Alle Befehlszeilenoptionen können über Umgebungsvariablen gesetzt werden:
    
    | Umgebungsvariable | CLI-Äquivalent | Beschreibung |
    |---------------------|----------------|-------------|
    | `GITHUB_TOKEN` | `--github-token` | GitHub persönlicher Zugriffstoken |
    | `GITHUB_ORG` | `--github-org` | GitHub Organisationsname |
    | `GITHUB_ENTERPRISE_URL` | `--github-enterprise-url` | GitHub Enterprise Server URL |
    | `AZURE_DEVOPS_TOKEN` | `--azure-devops-token` | Azure DevOps PAT |
    | `AZURE_DEVOPS_ACCESS_TOKEN` | `--azure-devops-access-token` | Azure DevOps Zugriffstoken (Bearer) |
    | `AZURE_DEVOPS_ORG` | `--azure-devops-org` | Azure DevOps Organisation |
    | `AZURE_SUBSCRIPTION_ID` | `--azure-subscription-id` | Azure Abonnement-ID |
    | `AZURE_TENANT_ID` | `--azure-tenant-id` | Azure AD Mandanten-ID |
    | `AZURE_CLIENT_ID` | `--azure-client-id` | Azure Dienstprinzipal-Client-ID |
    | `AZURE_CLIENT_SECRET` | `--azure-client-secret` | Azure Dienstprinzipal-Geheimnis |
    | `AZURE_ACCESS_TOKEN` | `--azure-access-token` | Azure Zugriffstoken für Azure ML |
    | `AWS_ACCESS_KEY_ID` | `--aws-access-key-id` | AWS Zugriffsschlüssel-ID |
    | `AWS_SECRET_ACCESS_KEY` | `--aws-secret-access-key` | AWS geheimer Zugriffsschlüssel |
    | `AWS_REGION` | `--aws-region` | AWS Region (Standard: us-east-1) |
    | `AWS_PROFILE` | `--aws-profile` | AWS CLI-Profilname |
    
    **Priorität:** CLI-Argumente > Konfigurationsdatei > Umgebungsvariablen.
    
    ---
    
    ## Knotentypen
    
    ### DevOps-Knoten
    
    | Art | Beschreibung |
    |------|-------------|
    | `GHOrganization` | GitHub Organisation |
    | `GHRepository` | GitHub Repository |
    | `GHWorkflow` | GitHub Actions Workflow |
    | `GHSecret` | GitHub Actions Geheimnis |
    | `ADOOrganization` | Azure DevOps Organisation |
    | `ADOProject` | Azure DevOps Projekt |
    | `ADOPipeline` | Azure DevOps Pipeline |
    | `ADOServiceConnection` | Azure DevOps Dienstverbindung (NHI) mit Bereichsdetails |
    | `ADOAgent` | Azure DevOps Agentenpool (gehostet oder selbst gehostet) |
    | `ADOVariableGroup` | Azure DevOps Variablengruppe |
    
    ### MLOps-Knoten
    
    | Art | Beschreibung |
    |------|-------------|
    | `AzMLWorkspace` | Azure ML Arbeitsbereich |
    | `AzMLCompute` | Azure ML Compute-Cluster/-Instanz |
    | `AzMLExperiment` | Azure ML Auftrag/Experiment |
    | `AzMLDatastore` | Azure ML Datenspeicher |
    | `AzMLEnvironment` | Azure ML Umgebung (Containerdefinition) |
    | `AzMLModel` | Azure ML registriertes Modell |
    | `SMDomain` | SageMaker Studio Domäne |
    | `SMTrainingJob` | SageMaker Trainingsauftrag |
    | `SMModel` | SageMaker Modell |
    | `SMEndpoint` | SageMaker Endpunkt (auch für Azure ML Endpunkte verwendet) |
    | `SMNotebook` | SageMaker Notebook-Instanz |
    
    ### Identitätsknoten
    
    | Art | Beschreibung |
    |------|-------------|
    | `ServicePrincipal` | Azure AD Dienstprinzipal |
    | `IAMRole` | AWS IAM-Rolle |
    | `OIDCIdentity` | OIDC föderierte Identität |
    | `ManagedIdentity` | Azure verwaltete Identität |
    
    ### Artefaktknoten
    
    | Art | Beschreibung |
    |------|-------------|
    | `ContainerRegistry` | Container-Repository (ECR, ACR) |
    | `ContainerImage` | Container-Image |
    | `S3Bucket` | AWS S3 Bucket |
    | `Dataset` | ML Datensatz |
    
    ## Kantentypen
    
    ### Angriffspfad-Kanten
    
    | Art | Vertrauensgrenze | Beschreibung |
    |------|----------------|-------------|
    | `TriggersPipeline` | TB1 | Code-Commit löst CI/CD aus |
    | `HasBranchProtection` | TB1 | Repository hat Branch-Schutzregeln |
    | `BypassesProtection` | TB1 | Schwacher/fehlender Branch-Schutz (ausnutzbar) |
    | `AuthenticatesAs` | TB2 | Pipeline verwendet Dienstprinzipal |
    | `CanAssumeRole` | TB2 | OIDC-Identität kann IAM-Rolle annehmen |
    | `OIDCTrust` | TB2 | Workflow verwendet OIDC-Föderation |
    | `UsesServiceConnection` | TB2 | Pipeline verwendet ADO Dienstverbindung |
    | `PullsImage` | TB3 | Trainingsauftrag zieht Container-Image |
    | `CanPoisonImage` | TB3 | Pipeline kann Container-Image ändern |
    | `SubmitsJob` | TB4 | Dienstprinzipal reicht ML-Auftrag ein |
    | `CodeExecution` | TB4 | Auftrag führt Code auf Compute aus |
    | `LoadsDataset` | TB5 | Trainingsauftrag lädt Datensatz |
    | `CanPoisonDataset` | TB5 | Pipeline kann Datensatz ändern |
    | `Deserializes` | TB5 | Unsicheres Deserialisieren |
    
    ### Abgeleitete Kanten
    
    Diese Kanten werden durch heuristische Analyse erstellt, wenn keine expliziten API-Daten verfügbar sind (z.B. Rollen-ARNs, die in Geheimnissen gespeichert sind). Sie verwenden unterschiedliche Kantentypen, sodass Sie sie in BloodHound-Abfragen filtern können.
    
    | Art | Beschreibung |
    |------|-------------|
    | `InferredCanAssumeRole` | OIDC-Identität kann möglicherweise Rolle annehmen (abgeleitet) |
    | `InferredSubmitsJob` | Workflow kann möglicherweise Trainingsauftrag über OIDC einreichen (abgeleitet) |
    | `InferredPullsImage` | Trainingsauftrag kann möglicherweise vergiftetes Container-Image ziehen (abgeleitet) |
    | `InferredLoadsDataset` | Trainingsauftrag kann möglicherweise vergifteten Datensatz laden (abgeleitet) |
    
    ### Strukturelle Kanten
    
    | Art | Beschreibung |
    |------|-------------|
    | `Contains` | Eltern-Kind-Beziehung |
    | `MemberOf` | Gruppenmitgliedschaft |
    | `HasAccessTo` | Berechtigung auf Ressource zuzugreifen |
    | `HasExecutionRole` | Ressource verwendet eine IAM/Ausführungsrolle |
    | `Owns` | Eigentümerschaftsbeziehung |
    
    ## Beispielabfragen
    
    Siehe [queries/dop2mop_queries.cypher](https://github.com/h4wkst3r/dop2mop/blob/main/queries/dop2mop_queries.cypher) für umfassende Abfragebeispiele.
    
    ---
    
    ## Benutzerdefinierte Symbole
    
    Dop2Mop enthält eine vorkonfigurierte Symboldatei für benutzerdefinierte BloodHound-Knotentypen in [data/custom_icons.json](https://github.com/h4wkst3r/dop2mop/blob/main/data/custom_icons.json).
    
    ### Hochladen von Symbolen in BloodHound
    
    #### Option 1: API-Explorer (Einfachste)
    
    1. Öffnen Sie BloodHound CE und gehen Sie zu **Einstellungen** → **API-Explorer**
    2. Suchen Sie **POST /api/v2/custom-nodes**
    3. Klicken Sie auf "Try it out"
    4. Fügen Sie den Inhalt von `custom_icons.json` ein
    5. Klicken Sie auf "Execute"
    
    #### Option 2: HMAC-Authentifizierung (Empfohlen für Automatisierung)
    
    Erstellen Sie zuerst einen API-Token in BloodHound:
    1. Gehen Sie zu **Einstellungen** → **Administration** → **Benutzer verwalten**
    2. Klicken Sie auf Ihren Benutzer → **Token erstellen**
    3. Speichern Sie die **Token-ID** und den **Token-Schlüssel**
    
    Verwenden Sie dann dieses Python-Skript zum Hochladen:```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()
    

    Option 3: Bearer Token (Schnelltest)

    Holen Sie sich ein JWT aus dem DevTools-Netzwerk-Tab Ihres Browsers, während Sie in BloodHound angemeldet sind:```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())
    

    Verwendung einzelner Collectors```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:~
    ### Benutzerdefinierte Graphen erstellen```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")
    

    Fehlerbehebung

    Zuerst validieren

    Beginnen Sie immer mit der Validierung von Anmeldeinformationen, um Authentifizierungsprobleme frühzeitig zu erkennen:```bash dop2mop collect --validate --collectors github,sm -v

    root@kitploit:~
    Die Ausgabe zeigt OK/FEHLGESCHLAGEN pro Collector, bevor eine Sammlung beginnt.
    
    ### Sammlungszusammenfassung
    
    Nach jedem Durchlauf gibt Dop2Mop eine Zusammenfassung aus, die zeigt, was gesammelt wurde und was fehlgeschlagen ist:```
    ============================================================
      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
    ============================================================
    

    Häufige Probleme

    "GitHub-Collector nicht konfiguriert, wird übersprungen"

    • Stellen Sie sicher, dass die Umgebungsvariablen GITHUB_TOKEN und GITHUB_ORG gesetzt sind, oder übergeben Sie --github-token und --github-org

    "Azure-ML-Collector nicht konfiguriert, wird übersprungen"

    • Stellen Sie sicher, dass AZURE_SUBSCRIPTION_ID und AZURE_TENANT_ID gesetzt sind
    • Führen Sie az login aus, wenn Sie DefaultAzureCredential verwenden
    • Alternativ übergeben Sie --azure-access-token mit einem gültigen Token von az account get-access-token

    "SageMaker-Collector nicht konfiguriert, wird übersprungen"

    • Setzen Sie AWS_PROFILE oder sowohl AWS_ACCESS_KEY_ID als auch AWS_SECRET_ACCESS_KEY
    • Stellen Sie sicher, dass die Anmeldeinformationen Leseberechtigungen für SageMaker haben

    Branch-Schutz gibt 403 zurück

    • Die GitHub-API erfordert Administratorzugriff, um Branch-Schutzregeln zu lesen
    • Nicht-Admin-Token überspringen die Erfassung des Branch-Schutzes (im Bericht angegeben)

    Ratenbegrenzung (429-Fehler)

    • Dop2Mop wiederholt automatisch mit exponentiellem Backoff bei Antworten zur Ratenbegrenzung
    • Für große Organisationen verwenden Sie --max-items, um API-Aufrufe zu reduzieren
    • GitHub-Ratenbegrenzung: 5.000 Anfragen pro Stunde für authentifizierte Benutzer

    Keine Ergebnisse in der BloodHound Cypher-Konsole

    • Stellen Sie sicher, dass Abfragen vollständige Knoten (RETURN a, b) zurückgeben, nicht Eigenschaften (RETURN a.name, b.name)
    • Die Cypher-Konsole von BloodHound dient der Graphenvisualisierung, nicht tabellarischen Daten
    • Verwenden Sie den Neo4j-Browser (localhost:7474) für eigenschaftsbasierte Abfragen

    Filtern von abgeleiteten vs. erfassten Kanten

    • Abgeleitete Kanten verwenden eigene Typen (z. B. InferredCanAssumeRole statt CanAssumeRole)
    • Nur bestätigte Kanten abfragen: MATCH p=()-[:CanAssumeRole]->() RETURN p
    • Abgeleitete Kanten abfragen: MATCH p=()-[:InferredCanAssumeRole]->() RETURN p

    Lizenz

    MIT-Lizenz – Einzelheiten finden Sie in LICENSE.

    Tool herunterladen