Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Dop2Mop — Коллектор OpenGraph для BloodHound, который отображает пути атак от инфраструктуры DevOps до инфраструктуры MLOps, собирая ресурсы CI/CD pipeline, service principal и ML platform для анализа латерального перемещения. | Kitploit
Инструменты/GitHubGitHub/h4wkst3r/dop2mop
Безопасность облачной инфраструктурыРазведкаБезопасность контейнеровАнализ уязвимостейСбор информацииТестирование на ПроникновениеБезопасность облачных средDevSecOpsУправление идентификацией и доступом (IAM)Безопасность Цепочки ПоставокRed Teaming
4135 месяцев назадЕщё не проверено
GitHub
h4wkst3r/dop2mop

Dop2Mop

Коллектор OpenGraph для BloodHound, который отображает пути атак от инфраструктуры DevOps до инфраструктуры MLOps, собирая ресурсы CI/CD pipeline, service principal и ML platform для анализа латерального перемещения.

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Dop2Mop

Прототип сборщика OpenGraph для BloodHound, отображающего пути атак от DevOps до инфраструктуры MLOps.

Основано на Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure авторства Brett Hawkins (@h4wkst3r).

Содержание

  • Благодарности
  • Обзор
    • Поддерживаемые платформы
    • Сопоставленные границы доверия
  • Установка
    • Необязательные зависимости
  • Быстрый старт
    • Создать демо-данные
    • Загрузить в BloodHound
  • Конфигурация
    • Файл конфигурации
    • Проверка учётных данных
  • Справочник CLI
    • Обзор команд
    • Глобальные опции
    • dop2mop collect
    • dop2mop demo
  • Примеры использования CLI
  • Базовая коллекция
  • Сбор с одной платформы
  • Сбор с нескольких платформ
  • Примеры сбора из GitHub
  • Примеры сбора из Azure DevOps
  • Примеры сбора из Azure ML
  • Примеры сбора из AWS SageMaker
  • Полный сбор окружения
  • Переменные окружения
  • Типы узлов
    • Узлы DevOps
    • Узлы MLOps
    • Узлы идентификации
    • Узлы артефактов
  • Типы рёбер
    • Рёбра путей атак
    • Структурные рёбра
  • Примеры запросов
  • Пользовательские иконки
    • Загрузка иконок в BloodHound
  • Python API
    • Использование отдельных сборщиков
    • Построение пользовательских графов
  • Устранение неполадок
    • Частые проблемы
  • Лицензия
  • Благодарности

    • SpecterOps за BloodHound и OpenGraph

    Обзор

    Dop2Mop собирает данные с платформ DevOps и MLOps для выявления путей атак, обеспечивающих боковое перемещение из конвейеров CI/CD в инфраструктуру обучения машинного обучения. Он выводит JSON OpenGraph, совместимый с BloodHound, для визуализации и анализа.

    Поддерживаемые платформы

    Платформы DevOpsПлатформы MLOpsПоставщики идентификации
    GitHub (Actions, Repos, Secrets)Azure Machine LearningAzure AD Service Principals
    Azure DevOps (Pipelines, Service Connections)Amazon SageMakerAWS IAM Roles
    OIDC/Federated Identity

    Сопоставленные границы доверия

    Dop2Mop моделирует пять критических границ доверия, выявленных в исследовании:

    1. TB1: Репозиторий кода в конвейер CI/CD - Автоматический запуск конвейеров из коммитов кода
    2. TB2: Аутентификация сервисного принципала - Учётные данные NHI, используемые конвейерами для доступа к платформам ML
    3. TB3: Доверие к контейнерным артефактам - Неявное доверие к образам контейнеров из внутренних реестров
    4. TB4: Выполнение определения задания - Платформы ML выполняют определения заданий без проверки
    5. TB5: Десериализация кода - Небезопасная десериализация наборов данных (pickle, joblib)

    Установка```bash

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

    root@kitploit:~
    ## What's Collected
    
    Each collector gathers platform-specific resources and maps the trust boundaries between them:
    
    | Collector | Resources Collected |
    |-----------|-------------------|
    | **GitHub** | Organizations, repositories, workflows, secrets, branch protection rules, OIDC configurations, container image references, S3 bucket references |
    | **Azure DevOps** | Organizations, projects, pipelines (YAML), service connections (with scope details), variable groups, agent pools, repositories |
    | **Azure ML** | Workspaces, compute clusters/instances, datastores, ML environments, registered models, jobs/experiments, online & batch endpoints |
    | **SageMaker** | Training jobs, models, endpoints, domains, notebook instances, IAM execution roles (with policy analysis), ECR repositories/images, S3 buckets (filtered to ML-relevant) |
    
    ## Quick Start
    
    ### Generate Demo Data
    
    The fastest way to see Dop2Mop in action is to generate demo data showing the attack scenarios from the research:```bash
    dop2mop demo -o demo.json
    

    Импорт в BloodHound

    1. Откройте BloodHound CE (v8.0+)
    2. Перейдите в Administration → File Ingest
    3. Загрузите сгенерированный JSON-файл
    4. Выполните запрос с помощью Cypher:```cypher // Azure DevOps to Azure ML Lateral Movement MATCH p=(repo)-[:TriggersPipeline]->(pipeline)-[:UsesServiceConnection]->(svcconn)-[:AuthenticatesAs]->(workspace)-[:CodeExecution]->(compute) RETURN p

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

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

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

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

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

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

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

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

    root@kitploit:~
    ## Конфигурация
    
    ### Файл конфигурации
    
    Вместо того чтобы передавать учетные данные при каждом запуске, вы можете сохранить их в конфигурационном файле. Скопируйте прилагаемый пример и заполните свои значения:```bash
    cp dop2mop.yaml.example dop2mop.yaml
    # Edit dop2mop.yaml with your credentials
    

    Dop2Mop проверяет следующие местоположения по порядку:

    1. Путь, указанный в --config
    2. dop2mop.yaml / dop2mop.yml / .dop2mop.yaml в текущей директории
    3. ~/.dop2mop.yaml

    Примечание: dop2mop.yaml находится в .gitignore, чтобы предотвратить случайную фиксацию учетных данных. Файл примера (dop2mop.yaml.example) безопасен для фиксации.

    Смотрите dop2mop.yaml.example для всех доступных опций с комментариями.

    Приоритет: аргументы CLI > файл конфигурации > переменные окружения.

    Проверка учетных данных

    Протестируйте учетные данные перед запуском полного сбора:```bash

    Validate all configured collectors

    dop2mop collect --validate -v

    Validate specific collectors

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

    root@kitploit:~
    Это позволяет выполнять облегчённый API-вызов для каждой платформы, чтобы проверить действительность токенов перед началом сбора.
    
    ### Псевдонимы сборщиков
    
    Вы можете использовать короткие имена вместо полных имён классов с помощью `--collectors`:
    
    | Псевдоним | Сборщик |
    |-----------|---------|
    | `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
    

    Справочник по CLI

    Обзор команд```

    dop2mop [options]

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

    root@kitploit:~
    ### Глобальные опции
    
    | Опция | Описание |
    |--------|-------------|
    | `-v, --verbose` | Включить подробный вывод (логирование уровня INFO) |
    | `--debug` | Включить отладочный вывод (логирование уровня DEBUG) |
    
    ---
    
    ### `dop2mop collect`
    
    Сбор данных из настроенных платформ DevOps и MLOps.```bash
    dop2mop collect [OPTIONS]
    

    Основные параметры

    ПараметрОписание
    -o, --output FILEПуть к выходному файлу (по умолчанию: dop2mop_output.json)
    --zipСжать вывод в ZIP-файл
    --config FILEПуть к конфигурационному файлу YAML/JSON
    --validateПроверить учетные данные перед сбором
    --collectors LISTСписок сборщиков или псевдонимов через запятую (например, github,sm)
    --max-items NМаксимальное количество элементов для сбора на тип
    --no-secretsПропустить перечисление секретов/учетных данных

    Параметры GitHub

    ПараметрОписание
    --github-token TOKENПерсональный токен доступа GitHub
    --github-org ORGИмя организации GitHub
    --github-enterprise-url URLURL сервера GitHub Enterprise

    Параметры Azure DevOps

    ПараметрОписание
    --azure-devops-token TOKENПерсональный токен доступа Azure DevOps (PAT)
    --azure-devops-access-token TOKENТокен доступа Azure DevOps (аутентификация Bearer, опционально)
    --azure-devops-org ORGИмя организации Azure DevOps

    Параметры Azure ML

    ПараметрОписание
    --azure-subscription-id IDИдентификатор подписки Azure
    --azure-tenant-id IDИдентификатор арендатора Azure AD
    --azure-client-id IDИдентификатор клиента субъекта-службы (опционально)
    --azure-client-secret SECRETСекрет клиента субъекта-службы (опционально)
    --azure-access-token TOKENТокен доступа Azure для аутентификации Azure ML (опционально)

    Параметры AWS SageMaker

    ПараметрОписание
    --aws-access-key-id KEYИдентификатор ключа доступа AWS
    --aws-secret-access-key SECRETСекретный ключ доступа AWS
    --aws-region REGIONРегион AWS (по умолчанию: us-east-1)
    --aws-profile PROFILEИмя профиля AWS CLI

    Доступные сборщики

    Имя сборщикаПлатформаНеобходимые учетные данные
    GitHubCollectorGitHub--github-token, --github-org
    AzureDevOpsCollectorAzure DevOps--azure-devops-token или --azure-devops-access-token, --azure-devops-org
    AzureMLCollectorAzure ML--azure-subscription-id, --azure-tenant-id
    SageMakerCollectorAWS SageMaker--aws-profile или --aws-access-key-id

    dop2mop demo

    Сгенерировать демонстрационные данные, показывающие четыре сценария атак из исследования.```bash dop2mop demo [OPTIONS]

    root@kitploit:~
    | Option | Description |
    |--------|-------------|
    | `-o, --output FILE` | Путь к выходному файлу (по умолчанию: `dop2mop_demo.json`) |
    
    ---
    
    ### `dop2mop icons`
    
    Сгенерировать пользовательскую конфигурацию иконок для типов узлов BloodHound.```bash
    dop2mop icons [OPTIONS]
    
    ОпцияОписание
    -o, --output FILEПуть к выходному файлу (по умолчанию: dop2mop_icons.json)

    Примеры использования CLI

    Базовая коллекция```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:~
    ### Коллекция одной платформы```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
    

    Многоплатформенная коллекция```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:~
    ### Примеры коллекций 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
    

    Примеры коллекций 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:~
    > **Примечание:** Приоритет аутентификации Azure DevOps: токен доступа (Bearer) > PAT (Basic).
    > Токены доступа можно получить с помощью `az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798`.
    
    ### Примеры коллекций 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
    

    Примечание: Приоритет аутентификации Azure ML: токен доступа > субъект-служба > DefaultAzureCredential (az login). Токены доступа можно получить через az account get-access-token --resource https://management.azure.com/.

    Примеры коллекции 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:~
    ### Полный сбор окружения```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
    

    Переменные окружения

    Все параметры командной строки могут быть заданы через переменные окружения:

    Переменная окруженияЭквивалент CLIОписание
    GITHUB_TOKEN--github-tokenПерсональный токен доступа GitHub
    GITHUB_ORG--github-orgИмя организации GitHub
    GITHUB_ENTERPRISE_URL--github-enterprise-urlURL сервера GitHub Enterprise
    AZURE_DEVOPS_TOKEN--azure-devops-tokenPAT Azure DevOps
    AZURE_DEVOPS_ACCESS_TOKEN--azure-devops-access-tokenТокен доступа Azure DevOps (Bearer)
    AZURE_DEVOPS_ORG--azure-devops-orgОрганизация Azure DevOps
    AZURE_SUBSCRIPTION_ID--azure-subscription-idИдентификатор подписки Azure
    AZURE_TENANT_ID--azure-tenant-idИдентификатор клиента Azure AD
    AZURE_CLIENT_ID--azure-client-idИдентификатор клиента субъекта-службы Azure
    AZURE_CLIENT_SECRET--azure-client-secretСекрет субъекта-службы Azure
    AZURE_ACCESS_TOKEN--azure-access-tokenТокен доступа Azure для Azure ML
    AWS_ACCESS_KEY_ID--aws-access-key-idИдентификатор ключа доступа AWS
    AWS_SECRET_ACCESS_KEY--aws-secret-access-keyСекретный ключ доступа AWS
    AWS_REGION--aws-regionРегион AWS (по умолчанию: us-east-1)
    AWS_PROFILE--aws-profileИмя профиля AWS CLI

    Приоритет: аргументы CLI > файл конфигурации > переменные окружения.


    Типы узлов

    Узлы DevOps

    ВидОписание
    GHOrganizationОрганизация GitHub
    GHRepositoryРепозиторий GitHub
    GHWorkflowРабочий процесс GitHub Actions
    GHSecretСекрет GitHub Actions
    ADOOrganizationОрганизация Azure DevOps
    ADOProjectПроект Azure DevOps
    ADOPipelineКонвейер Azure DevOps
    ADOServiceConnectionПодключение к службе Azure DevOps (NHI) с деталями области
    ADOAgentПул агентов Azure DevOps (размещенный или локальный)
    ADOVariableGroupГруппа переменных Azure DevOps

    Узлы MLOps

    ВидОписание
    AzMLWorkspaceРабочая область Azure ML
    AzMLComputeКластер/экземпляр вычислений Azure ML
    AzMLExperimentЗадание/эксперимент Azure ML
    AzMLDatastoreХранилище данных Azure ML
    AzMLEnvironmentСреда Azure ML (определение контейнера)
    AzMLModelЗарегистрированная модель Azure ML
    SMDomainДомен SageMaker Studio
    SMTrainingJobОбучающее задание SageMaker
    SMModelМодель SageMaker
    SMEndpointКонечная точка SageMaker (также используется для конечных точек Azure ML)
    SMNotebookЭкземпляр блокнота SageMaker

    Узлы идентификации

    ВидОписание
    ServicePrincipalСубъект-служба Azure AD
    IAMRoleРоль IAM AWS
    OIDCIdentityФедеративная идентичность OIDC
    ManagedIdentityУправляемое удостоверение Azure

    Узлы артефактов

    ВидОписание
    ContainerRegistryРеестр контейнеров (ECR, ACR)
    ContainerImageОбраз контейнера
    S3BucketКорзина S3 AWS
    DatasetНабор данных ML

    Типы рёбер

    Рёбра путей атаки

    ВидГраница доверияОписание
    TriggersPipelineTB1Коммит кода запускает CI/CD
    HasBranchProtectionTB1Репозиторий имеет правила защиты ветки
    BypassesProtectionTB1Слабая/отсутствующая защита ветки (эксплуатируемая)
    AuthenticatesAsTB2Конвейер использует субъект-службу
    CanAssumeRoleTB2Идентичность OIDC может принять роль IAM
    OIDCTrustTB2Рабочий процесс использует федерацию OIDC
    UsesServiceConnectionTB2Конвейер использует подключение к службе ADO
    PullsImageTB3Обучающее задание извлекает образ контейнера
    CanPoisonImageTB3Конвейер может изменить образ контейнера
    SubmitsJobTB4Субъект-служба отправляет задание ML
    CodeExecutionTB4Задание выполняет код на вычислительном узле
    LoadsDatasetTB5Обучающее задание загружает набор данных
    CanPoisonDatasetTB5Конвейер может изменить набор данных
    DeserializesTB5Небезопасная десериализация

    Выведенные рёбра

    Эти рёбра создаются эвристическим анализом, когда нет явных данных API (например, ARN ролей, хранящиеся в секретах). Они используют отдельные типы рёбер, чтобы вы могли фильтровать их в запросах BloodHound.

    ВидОписание
    InferredCanAssumeRoleИдентичность OIDC может иметь возможность принять роль (выведено)
    InferredSubmitsJobРабочий процесс может отправлять обучающее задание через OIDC (выведено)
    InferredPullsImageОбучающее задание может извлечь отравленный образ контейнера (выведено)
    InferredLoadsDatasetОбучающее задание может загрузить отравленный набор данных (выведено)

    Структурные рёбра

    ВидОписание
    ContainsОтношение «родитель-потомок»
    MemberOfЧленство в группе
    HasAccessToРазрешение на доступ к ресурсу
    HasExecutionRoleРесурс использует роль IAM/выполнения
    OwnsОтношение владения

    Примеры запросов

    См. файл queries/dop2mop_queries.cypher с полными примерами запросов.


    Пользовательские значки

    Dop2Mop включает предварительно настроенный файл значков для пользовательских типов узлов BloodHound в data/custom_icons.json.

    Загрузка значков в BloodHound

    Вариант 1: API Explorer (самый простой)

    1. Откройте BloodHound CE и перейдите в Settings → API Explorer
    2. Найдите POST /api/v2/custom-nodes
    3. Нажмите «Try it out»
    4. Вставьте содержимое custom_icons.json
    5. Нажмите «Execute»

    Вариант 2: HMAC-аутентификация (рекомендуется для автоматизации)

    Сначала создайте токен API в BloodHound:

    1. Перейдите в Settings → Administration → Manage Users
    2. Нажмите на своего пользователя → Create Token
    3. Сохраните Token ID и Token Key

    Затем используйте этот скрипт Python для загрузки:```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:~
    #### Вариант 3: Bearer Token (Quick Testing)
    
    Получите JWT из вкладки Network в DevTools вашего браузера, будучи авторизованным в 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
    

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

    root@kitploit:~
    ### Использование отдельных сборщиков```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")
    

    Создание пользовательских графов```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:~
    ---
    
    ## Устранение неполадок
    
    ### Сначала проверка
    
    Всегда начинайте с проверки учетных данных, чтобы на раннем этапе выявить проблемы с аутентификацией:```bash
    dop2mop collect --validate --collectors github,sm -v
    

    Вывод покажет OK/FAILED для каждого сборщика до начала любой сборки.

    Сводка сбора

    После каждого запуска Dop2Mop выводит сводку, показывающую, что было собрано и что завершилось с ошибкой:```

    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:~
    ### Часто возникающие проблемы
    
    **"Коллектор GitHub не настроен, пропускаем"**
    - Убедитесь, что переменные окружения `GITHUB_TOKEN` и `GITHUB_ORG` установлены, или передайте `--github-token` и `--github-org`
    
    **"Коллектор Azure ML не настроен, пропускаем"**
    - Убедитесь, что установлены `AZURE_SUBSCRIPTION_ID` и `AZURE_TENANT_ID`
    - Запустите `az login`, если используете DefaultAzureCredential
    - В качестве альтернативы передайте `--azure-access-token` с действительным токеном из `az account get-access-token`
    
    **"Коллектор SageMaker не настроен, пропускаем"**
    - Установите `AWS_PROFILE` или обе `AWS_ACCESS_KEY_ID` и `AWS_SECRET_ACCESS_KEY`
    - Убедитесь, что учетные данные имеют права на чтение SageMaker
    
    **Защита ветки возвращает 403**
    - GitHub API требует права администратора для чтения правил защиты веток
    - Токены не администраторов пропустят сбор защиты веток (отображается в сводке)
    
    **Ограничение скорости (ошибки 429)**
    - Dop2Mop автоматически повторяет попытки с экспоненциальной задержкой при ответах об ограничении скорости
    - Для больших организаций используйте `--max-items`, чтобы уменьшить количество API-запросов
    - Ограничения GitHub: 5 000 запросов в час для аутентифицированных пользователей
    
    **Нет результатов в консоли Cypher BloodHound**
    - Убедитесь, что запросы возвращают полные узлы (`RETURN a, b`), а не свойства (`RETURN a.name, b.name`)
    - Консоль Cypher BloodHound предназначена для визуализации графов, а не табличных данных
    - Используйте Neo4j Browser (localhost:7474) для запросов на основе свойств
    
    **Фильтрация предполагаемых и собранных ребер**
    - Предполагаемые ребра используют отдельные типы (например, `InferredCanAssumeRole` вместо `CanAssumeRole`)
    - Запрос только подтвержденных ребер: `MATCH p=()-[:CanAssumeRole]->() RETURN p`
    - Запрос предполагаемых ребер: `MATCH p=()-[:InferredCanAssumeRole]->() RETURN p`
    
    ---
    
    ## Лицензия
    
    Лицензия MIT — Подробности см. в [LICENSE](https://github.com/h4wkst3r/dop2mop/blob/main/LICENSE).
    
    Скачать инструмент