Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Dop2Mop — Collecteur OpenGraph pour BloodHound qui cartographie les chemins d'attaque de l'infrastructure DevOps à l'infrastructure MLOps, en collectant les ressources de pipeline CI/CD, de principal de service et de plateforme ML pour l'analyse des mouvements latéraux. | Kitploit
Outils/GitHubGitHub/h4wkst3r/dop2mop
Sécurité de l'Infrastructure CloudReconnaissanceSécurité des ConteneursAnalyse des VulnérabilitésCollecte d'InformationsTests d'IntrusionSécurité CloudDevSecOpsGestion des Identités et des Accès (IAM)Sécurité de la Chaîne LogistiqueRed Teaming
41il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
GitHub
h4wkst3r/dop2mop

Dop2Mop

Collecteur OpenGraph pour BloodHound qui cartographie les chemins d'attaque de l'infrastructure DevOps à l'infrastructure MLOps, en collectant les ressources de pipeline CI/CD, de principal de service et de plateforme ML pour l'analyse des mouvements latéraux.

Voir le dépôt
Partager

Dop2Mop

Un collecteur OpenGraph de preuve de concept pour BloodHound qui cartographie les chemins d'attaque entre l'infrastructure DevOps et MLOps.

Basé sur Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure par Brett Hawkins (@h4wkst3r).

Table des matières

  • Remerciements
  • Aperçu
    • Plateformes prises en charge
    • Périmètres de confiance cartographiés
  • Installation
    • Dépendances optionnelles
  • Démarrage rapide
    • Générer des données de démonstration
    • Importer dans BloodHound
  • Configuration
    • Fichier de configuration
    • Validation des identifiants
  • Référence CLI
    • Aperçu des commandes
    • Options globales
    • dop2mop collect
    • dop2mop demo
  • Exemples d'utilisation CLI
    • Collecte de base
    • Collecte sur une seule plateforme
    • Collecte sur plusieurs plateformes
    • Exemples de collecte GitHub
    • Exemples de collecte Azure DevOps
    • Exemples de collecte Azure ML
    • Exemples de collecte AWS SageMaker
    • Collecte complète de l'environnement
  • Variables d'environnement
  • Types de nœuds
    • Nœuds DevOps
    • Nœuds MLOps
    • Nœuds d'identité
    • Nœuds d'artefact
  • Types d'arêtes
    • Arêtes de chemin d'attaque
    • Arêtes structurelles
  • Exemples de requêtes
  • Icônes personnalisées
    • Téléchargement des icônes dans BloodHound
  • API Python
    • Utilisation des collecteurs individuels
    • Construction de graphes personnalisés
  • Dépannage
    • Problèmes courants
  • Licence

Remerciements

  • SpecterOps pour BloodHound et OpenGraph

Aperçu

Dop2Mop collecte des données provenant des plateformes DevOps et MLOps afin d'identifier les chemins d'attaque permettant un mouvement latéral depuis les pipelines CI/CD vers l'infrastructure d'entraînement de machine learning. Il génère du JSON OpenGraph compatible avec BloodHound pour la visualisation et l'analyse.

Plateformes prises en charge

Plateformes DevOpsPlateformes MLOpsFournisseurs d'identité
GitHub (Actions, Repos, Secrets)Azure Machine LearningPrincipaux de service Azure AD
Azure DevOps (Pipelines, Service Connections)Amazon SageMakerRôles IAM AWS
Identité OIDC/Fédérée

Périmètres de confiance cartographiés

Dop2Mop modélise les cinq périmètres de confiance critiques identifiés dans la recherche :

  1. P1 : Dépôt de code vers pipeline CI/CD - Déclenchement automatique des pipelines à partir des commits de code
  2. P2 : Authentification du principal de service - Identifiants NHI utilisés par les pipelines pour accéder aux plateformes ML
  3. P3 : Confiance dans les artefacts conteneurisés - Confiance implicite dans les images conteneur provenant de registres internes
  4. P4 : Exécution des définitions de tâches - Les plateformes ML exécutent des définitions de tâches sans validation
  5. P5 : Désérialisation de code - Désérialisation non sécurisée des ensembles de données (pickle, joblib)

Installation```bash

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

root@kitploit:~
## Ce qui est collecté

Chaque collecteur rassemble des ressources spécifiques à la plateforme et cartographie les limites de confiance entre elles :

| Collecteur | Ressources collectées |
|-----------|-------------------|
| **GitHub** | Organisations, dépôts, workflows, secrets, règles de protection de branches, configurations OIDC, références d'images de conteneurs, références de buckets S3 |
| **Azure DevOps** | Organisations, projets, pipelines (YAML), connexions de service (avec détails de portée), groupes de variables, pools d'agents, dépôts |
| **Azure ML** | Espaces de travail, clusters/instances de calcul, magasins de données, environnements ML, modèles enregistrés, jobs/expériences, endpoints en ligne et par lots |
| **SageMaker** | Jobs d'entraînement, modèles, endpoints, domaines, instances de notebooks, rôles d'exécution IAM (avec analyse de politique), dépôts/images ECR, buckets S3 (filtrés pour le ML) |

## Démarrage rapide

### Générer des données de démonstration

Le moyen le plus rapide de voir Dop2Mop en action est de générer des données de démonstration montrant les scénarios d'attaque issus de la recherche :```bash
dop2mop demo -o demo.json

Ingestion dans BloodHound

  1. Ouvrir BloodHound CE (v8.0+)

  2. Naviguer vers Administration → Import de fichiers

  3. Télécharger le fichier JSON généré

  4. Interroger avec Cypher :

    root@kitploit:~
    MATCH (g:Group {highvalue: true})
    OPTIONAL MATCH (g)-[:Contains*1..]->(n:User)
    RETURN g.name, COUNT(n) AS MemberCount
    ``````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:~
---

## Configuration

### Fichier de configuration

Au lieu de passer les identifiants à chaque exécution, vous pouvez les sauvegarder dans un fichier de configuration. Copiez l'exemple inclus et remplissez vos valeurs :```bash
cp dop2mop.yaml.example dop2mop.yaml
# Edit dop2mop.yaml with your credentials

Dop2Mop vérifie ces emplacements dans l'ordre :

  1. Chemin spécifié par --config
  2. dop2mop.yaml / dop2mop.yml / .dop2mop.yaml dans le répertoire courant
  3. ~/.dop2mop.yaml

Note : dop2mop.yaml est dans .gitignore pour éviter de commettre accidentellement des informations d'identification. Le fichier d'exemple (dop2mop.yaml.example) peut être commité en toute sécurité.

Voir dop2mop.yaml.example pour toutes les options disponibles avec commentaires.

Ordre de priorité : arguments CLI > fichier de configuration > variables d'environnement.

Validation des identifiants

Testez les identifiants avant d'exécuter une collecte complète :```bash

Validate all configured collectors

dop2mop collect --validate -v

Validate specific collectors

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

root@kitploit:~
Cela effectue un appel API léger par plateforme pour vérifier que les jetons sont valides avant de commencer la collecte.

### Alias des collecteurs

Vous pouvez utiliser des noms courts au lieu des noms de classe complets avec `--collectors` :

| Alias | Collecteur |
|-------|------------|
| `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

Référence CLI

Vue d'ensemble des commandes```

dop2mop [options]

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

root@kitploit:~
### Options globales

| Option | Description |
|--------|-------------|
| `-v, --verbose` | Activer la sortie détaillée (journalisation niveau INFO) |
| `--debug` | Activer la sortie de débogage (journalisation niveau DEBUG) |

---

### `dop2mop collect`

Collecter les données depuis les plateformes DevOps et MLOps configurées.```bash
dop2mop collect [OPTIONS]

Options Générales

Options GitHub

OptionDescription
--github-token TOKENJeton d'accès personnel GitHub
--github-org ORGNom de l'organisation GitHub
--github-enterprise-url URLURL du serveur GitHub Enterprise

Options Azure DevOps

OptionDescription
--azure-devops-token TOKENJeton d'accès personnel Azure DevOps (PAT)
--azure-devops-access-token TOKENJeton d'accès Azure DevOps (authentification Bearer, facultatif)
--azure-devops-org ORGNom de l'organisation Azure DevOps

Options Azure ML

Options AWS SageMaker

OptionDescription

Collecteurs Disponibles


dop2mop demo

Générer des données de démonstration illustrant les quatre scénarios d'attaque issus de la recherche.```bash dop2mop demo [OPTIONS]

root@kitploit:~
| Option | Description |
|--------|-------------|
| `-o, --output FILE` | Chemin du fichier de sortie (par défaut : `dop2mop_demo.json`) |

---

### `dop2mop icons`

Générer une configuration d'icônes personnalisée pour les types de nœuds BloodHound.```bash
dop2mop icons [OPTIONS]
OptionDescription
-o, --output FILEChemin du fichier de sortie (par défaut : dop2mop_icons.json)

Exemples d'utilisation en CLI

Collecte de 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

root@kitploit:~
### Collection mono-plateforme```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

Collection multi-plateforme```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:~
### Exemples de collection 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

Exemples de la collection 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:~
> **Remarque :** Priorité d'authentification Azure DevOps : jeton d'accès (Bearer) > PAT (Basic).
> Les jetons d'accès peuvent être obtenus via `az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798`.

### Exemples de la collection 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

Remarque : Priorité d'authentification Azure ML : jeton d'accès > principal de service > DefaultAzureCredential (az login). Les jetons d'accès peuvent être obtenus via az account get-access-token --resource https://management.azure.com/.

Exemples de collection 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:~
### Collecte complète de l'environnement```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

Variables d'environnement

Toutes les options de ligne de commande peuvent être définies via des variables d'environnement :

Priorité : Arguments CLI > fichier de configuration > variables d'environnement.


Types de nœuds

Nœuds DevOps

Nœuds MLOps

Nœuds d'identité

TypeDescription
ServicePrincipalPrincipal de service Azure AD
IAMRoleRôle IAM AWS
OIDCIdentity

Nœuds d'artéfact

TypeDescription
ContainerRegistryRegistre de conteneurs (ECR, ACR)
ContainerImageImage de conteneur

Types d'arêtes

Arêtes de chemin d'attaque

Arêtes inférées

Ces arêtes sont créées par analyse heuristique lorsque les données d'API explicites ne sont pas disponibles (par exemple, les ARN de rôles stockés dans des secrets). Elles utilisent des types d'arêtes distincts afin que vous puissiez les filtrer dans les requêtes BloodHound.

TypeDescription
InferredCanAssumeRole

Arêtes structurelles

Exemples de requêtes

Consultez queries/dop2mop_queries.cypher pour des exemples complets de requêtes.


Icônes personnalisées

Dop2Mop inclut un fichier d'icônes préconfiguré pour les types de nœuds personnalisés BloodHound dans data/custom_icons.json.

Téléchargement des icônes vers BloodHound

Option 1 : Explorateur d'API (Plus simple)

  1. Ouvrez BloodHound CE et allez dans Paramètres → API Explorer
  2. Trouvez POST /api/v2/custom-nodes
  3. Cliquez sur « Try it out »
  4. Collez le contenu de custom_icons.json
  5. Cliquez sur « Execute »

Option 2 : Authentification HMAC (Recommandé pour l'automatisation)

D'abord, créez un jeton API dans BloodHound :

  1. Allez dans Paramètres → Administration → Gérer les utilisateurs
  2. Cliquez sur votre utilisateur → Créer un jeton
  3. Sauvegardez l'ID du jeton et la Clé du jeton

Ensuite, utilisez ce script Python pour télécharger :```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 )

root@kitploit:~
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}"

root@kitploit:~
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()

root@kitploit:~
#### Option 3: Bearer Token (Test rapide)

Obtenez un JWT depuis l'onglet Réseau des DevTools de votre navigateur tout en étant connecté à 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

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())

root@kitploit:~
### Utilisation des collecteurs individuels```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")

Construire des graphes personnalisés```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")

root@kitploit:~
---

## Dépannage

### Valider d'abord

Commencez toujours par la validation des identifiants pour détecter rapidement les problèmes d'authentification :```bash
dop2mop collect --validate --collectors github,sm -v

La sortie affichera OK/ÉCHEC par collecteur avant le début de toute collecte.

Résumé de la collecte

Après chaque exécution, Dop2Mop imprime un résumé indiquant ce qui a été collecté et ce qui a échoué :```

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

root@kitploit:~
### Problèmes courants

**"Collecteur GitHub non configuré, ignoré"**
- Assurez-vous que les variables d'environnement `GITHUB_TOKEN` et `GITHUB_ORG` sont définies, ou passez `--github-token` et `--github-org`

**"Collecteur Azure ML non configuré, ignoré"**
- Assurez-vous que `AZURE_SUBSCRIPTION_ID` et `AZURE_TENANT_ID` sont définies
- Exécutez `az login` si vous utilisez DefaultAzureCredential
- Alternativement, passez `--azure-access-token` avec un jeton valide provenant de `az account get-access-token`

**"Collecteur SageMaker non configuré, ignoré"**
- Définissez `AWS_PROFILE` ou les deux `AWS_ACCESS_KEY_ID` et `AWS_SECRET_ACCESS_KEY`
- Assurez-vous que les identifiants disposent des permissions de lecture SageMaker

**La protection de branche renvoie 403**
- L'API GitHub nécessite un accès admin pour lire les règles de protection de branche
- Les jetons non-admin ignoreront la collecte de la protection de branche (signalé dans le résumé)

**Limitation de débit (erreurs 429)**
- Dop2Mop réessaie automatiquement avec un backoff exponentiel en cas de réponse de limitation de débit
- Pour les grandes organisations, utilisez `--max-items` pour réduire les appels API
- Limites de débit GitHub : 5 000 requêtes/heure pour les utilisateurs authentifiés

**Aucun résultat dans la console Cypher de BloodHound**
- Assurez-vous que les requêtes renvoient des nœuds complets (`RETURN a, b`) et non des propriétés (`RETURN a.name, b.name`)
- La console Cypher de BloodHound est destinée à la visualisation de graphes, pas aux données tabulaires
- Utilisez Neo4j Browser (localhost:7474) pour les requêtes basées sur les propriétés

**Filtrage des arêtes inférées par rapport aux arêtes collectées**
- Les arêtes inférées utilisent des types distincts (par exemple, `InferredCanAssumeRole` au lieu de `CanAssumeRole`)
- Interrogez uniquement les arêtes confirmées : `MATCH p=()-[:CanAssumeRole]->() RETURN p`
- Interrogez les arêtes inférées : `MATCH p=()-[:InferredCanAssumeRole]->() RETURN p`

---

## Licence

Licence MIT - Voir [LICENSE](https://github.com/h4wkst3r/dop2mop/blob/HEAD/LICENSE) pour plus de détails.
Télécharger l’outil
OptionDescription
-o, --output FILEChemin du fichier de sortie (par défaut : dop2mop_output.json)
--zipCompresser la sortie en fichier ZIP
--config FILEChemin vers un fichier de configuration YAML/JSON
--validateValider les informations d'identification avant la collecte
--collectors LISTListe séparée par des virgules de collecteurs ou d'alias (ex. github,sm)
--max-items NNombre maximal d'éléments à collecter par type
--no-secretsIgnorer l'énumération des secrets/informations d'identification
OptionDescription
--azure-subscription-id IDID d'abonnement Azure
--azure-tenant-id IDID de locataire Azure AD
--azure-client-id IDID client du principal de service (facultatif)
--azure-client-secret SECRETSecret client du principal de service (facultatif)
--azure-access-token TOKENJeton d'accès Azure pour l'authentification Azure ML (facultatif)
--aws-access-key-id KEY
ID de clé d'accès AWS
--aws-secret-access-key SECRETClé d'accès secrète AWS
--aws-region REGIONRégion AWS (par défaut : us-east-1)
--aws-profile PROFILENom du profil AWS CLI
Nom du CollecteurPlateformeInformations d'Identification Requises
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
Variable d'environnementÉquivalent CLIDescription
GITHUB_TOKEN--github-tokenJeton d'accès personnel GitHub
GITHUB_ORG--github-orgNom de l'organisation GitHub
GITHUB_ENTERPRISE_URL--github-enterprise-urlURL du serveur GitHub Enterprise
AZURE_DEVOPS_TOKEN--azure-devops-tokenPAT Azure DevOps
AZURE_DEVOPS_ACCESS_TOKEN--azure-devops-access-tokenJeton d'accès Azure DevOps (Bearer)
AZURE_DEVOPS_ORG--azure-devops-orgOrganisation Azure DevOps
AZURE_SUBSCRIPTION_ID--azure-subscription-idID de l'abonnement Azure
AZURE_TENANT_ID--azure-tenant-idID du locataire Azure AD
AZURE_CLIENT_ID--azure-client-idID du client du principal de service Azure
AZURE_CLIENT_SECRET--azure-client-secretSecret du principal de service Azure
AZURE_ACCESS_TOKEN--azure-access-tokenJeton d'accès Azure pour Azure ML
AWS_ACCESS_KEY_ID--aws-access-key-idID de la clé d'accès AWS
AWS_SECRET_ACCESS_KEY--aws-secret-access-keyClé d'accès secrète AWS
AWS_REGION--aws-regionRégion AWS (par défaut : us-east-1)
AWS_PROFILE--aws-profileNom du profil AWS CLI
TypeDescription
GHOrganizationOrganisation GitHub
GHRepositoryDépôt GitHub
GHWorkflowWorkflow GitHub Actions
GHSecretSecret GitHub Actions
ADOOrganizationOrganisation Azure DevOps
ADOProjectProjet Azure DevOps
ADOPipelinePipeline Azure DevOps
ADOServiceConnectionConnexion de service Azure DevOps (NHI) avec détails de portée
ADOAgentPool d'agents Azure DevOps (hébergé ou auto-hébergé)
ADOVariableGroupGroupe de variables Azure DevOps
TypeDescription
AzMLWorkspaceEspace de travail Azure ML
AzMLComputeCluster/instance de calcul Azure ML
AzMLExperimentTâche/expérience Azure ML
AzMLDatastoreMagasin de données Azure ML
AzMLEnvironmentEnvironnement Azure ML (définition de conteneur)
AzMLModelModèle enregistré Azure ML
SMDomainDomaine SageMaker Studio
SMTrainingJobTâche d'entraînement SageMaker
SMModelModèle SageMaker
SMEndpointPoint de terminaison SageMaker (également utilisé pour les points de terminaison Azure ML)
SMNotebookInstance de notebook SageMaker
Identité fédérée OIDC
ManagedIdentityIdentité managée Azure
S3Bucket
Bucket S3 AWS
DatasetJeu de données ML
TypeLimite de confianceDescription
TriggersPipelineTB1Un commit de code déclenche CI/CD
HasBranchProtectionTB1Le dépôt a des règles de protection de branche
BypassesProtectionTB1Protection de branche faible/absente (exploitable)
AuthenticatesAsTB2Le pipeline utilise un principal de service
CanAssumeRoleTB2L'identité OIDC peut assumer un rôle IAM
OIDCTrustTB2Le workflow utilise la fédération OIDC
UsesServiceConnectionTB2Le pipeline utilise une connexion de service ADO
PullsImageTB3La tâche d'entraînement tire une image de conteneur
CanPoisonImageTB3Le pipeline peut modifier l'image de conteneur
SubmitsJobTB4Le principal de service soumet une tâche ML
CodeExecutionTB4La tâche exécute du code sur le calcul
LoadsDatasetTB5La tâche d'entraînement charge un jeu de données
CanPoisonDatasetTB5Le pipeline peut modifier le jeu de données
DeserializesTB5Désérialisation non sécurisée
L'identité OIDC peut être en mesure d'assumer un rôle (inféré)
InferredSubmitsJobLe workflow peut soumettre une tâche d'entraînement via OIDC (inféré)
InferredPullsImageLa tâche d'entraînement peut tirer une image de conteneur empoisonnée (inféré)
InferredLoadsDatasetLa tâche d'entraînement peut charger un jeu de données empoisonné (inféré)
TypeDescription
ContainsRelation parent-enfant
MemberOfAppartenance à un groupe
HasAccessToPermission d'accéder à une ressource
HasExecutionRoleLa ressource utilise un rôle d'exécution IAM
OwnsRelation de propriété