返回市场
情报收集机器人-MCP

情报收集机器人-MCP

作者:dn9uy3n7 星标更新:2025-11-07

项目介绍

【技术文档摘要】

1. BBOT OSINT 连续监控堆栈(Docker)

英文版本: README_EN.md

OSINT连续监控系统基于BBOT、FastAPI,并使用Neo4j存储全部结果,通过MCP服务器从Cursor查询数据。

GitHub仓库: https://github.com/dn9uy3n/bbot-osint-mcp

参考资料:

1.1 快速安装

cd /opt
sudo git clone https://github.com/dn9uy3n/bbot-osint-mcp.git
cd bbot-osint-mcp

# (可选) 将您的init_config.json文件放置到repo目录中
# nano init_config.json

chmod +x scripts/quick-install.sh
./scripts/quick-install.sh

# 检查日志
sudo docker logs -f bbot_osint

脚本将:

1.2 项目描述

系统连续监控自动按周期扫描目标,将全部数据保存到Neo4j(DNS记录、开放端口、技术、事件),并通过API和MCP进行查询。优化为全天候运行,减少流量,降低被封锁的风险。

1.3 主要功能

  • 自动持续扫描根据配置的周期自动扫描所有目标,无需手动触发。
  • 两种类型的睡眠时间
    • target_sleep_seconds同一周期内每个目标之间的间隔(避免连续扫描)。
    • cycle_sleep_seconds扫描完所有目标后开始新周期前的暂停。
  • 全数据保真度将全部BBOT数据保存到Neo4j(DNS_NAME, OPEN_TCP_PORT, TECHNOLOGY, 原始事件数据)。
  • 增量更新后续扫描仅更新/添加新数据,不删除旧数据(除非根据保留策略清理)。
  • MCP查询接口:Cursor可以通过MCP连接查询数据(osint.query, osint.events.query, osint.status)。
    • 当前适配路径:/mcp/tools/osint.query, /mcp/tools/osint.events.query, /mcp/tools/osint.status
  • REST API通过HTTP API查询主机和事件。
  • 自动清理每次循环后删除过期事件、长时间离线主机和孤立节点。
  • Telegram通知每次扫描周期完成后发送通知。
  • 集中配置所有配置在init_config.json(目标、API密钥、睡眠时间)。
  • 分布式工作者支持多个BBOT工作者在不同VPS上运行,通过端点/ingest/output收集数据,使用自己的令牌;工作者可以在每次扫描后立即自动上传。

1.4 架构

  • docker-compose.ymlNeo4j和OSINT服务(FastAPI + MCP)。
  • init_config.json输入配置(目标、API密钥、Telegram、扫描参数)。
  • services/osintAPI源代码、BBOT运行器、MCP服务器。
  • reverse-proxy/Caddyfile自动配置Caddy和Let's Encrypt。

架构计划

graph TB
    subgraph "客户端层"
        A[Cursor IDE<br/>仅MCP查询]
        B[监控仪表板]
        C[API客户端/脚本]
    end
    
    subgraph "VPS服务器"
        D[Caddy反向代理<br/>端口80/443<br/>Let's Encrypt TLS]
        
        subgraph "内部网络"
            E[FastAPI服务<br/>端口8000<br/>+持续扫描器]
            F[Neo4j数据库<br/>端口7687]
            
            E -->|摄入数据| F
            E -->|自动扫描循环| E
        end
        
        D --> E
    end
    
    subgraph "外部服务"
        G[BBOT模块<br/>SecurityTrails, Shodan,<br/>VirusTotal等]
        H[Telegram Bot API]
    end
    
    A -->|MCP查询HTTPS| D
    B -->|HTTPS API| D
    C -->|HTTPS API| D
    E -->|持续扫描| G
    E -->|循环完成通知| H
    
    style D fill:#f9f,stroke:#333,stroke-width:2px
    style E fill:#bbf,stroke:#333,stroke-width:2px
    style F fill:#bfb,stroke:#333,stroke-width:2px

持续监控流程

sequenceDiagram
    participant S as 持续扫描器
    participant B as BBOT
    participant N as Neo4j
    participant T as Telegram
    
    Note over S: 服务启动
    S->>S: 从init_config.json加载目标
    
    loop 每个周期
        Note over S: 周期开始
        
        loop 对于每个目标
            S->>B: 扫描目标[i]
            B-->>S: 事件流
            S->>N: 摄入事件(增量)
            
            alt 不是最后一个目标
                Note over S: 睡眠target_sleep_seconds
            end
        end
        
        S->>N: 清理旧/离线数据
        S->>T: 发送周期总结
        Note over S: 睡眠cycle_sleep_seconds
    end

Neo4j 数据流

graph LR
    subgraph "BBOT事件"
        E1[DNS_NAME]
        E2[OPEN_TCP_PORT]
        E3[TECHNOLOGY]
        E4[URL]
        E5[EMAIL]
    end
    
    subgraph "Neo4j节点"
        N1[主机]
        N2[域名]
        N3[DNS_NAME]
        N4[OPEN_TCP_PORT]
        N5[TECHNOLOGY]
        N6[IP]
        N7[URL]
        N8[电子邮件]
        N9[模块]
        N10[事件]
    end
    
    E1 --> N3
    E2 --> N4
    E3 --> N5
    E4 --> N7
    E5 --> N8
    
    N1 -->|属于| N2
    N3 -->|解析为| N1
    N4 -->|在主机上| N1
    N1 -->|使用技术| N5
    N10 -->|关于| N1
    N10 -->|关于| N2
    N10 -->|由...发出| N9
    
    style N1 fill:#bbf,stroke:#333,stroke-width:2px
    style N2 fill:#bfb,stroke:#333,stroke-width:2px
    style N3 fill:#fbb,stroke:#333,stroke-width:2px
    style N4 fill:#fbf,stroke:#333,stroke-width:2px
    style N5 fill:#ffb,stroke:#333,stroke-width:2px

2. 从零开始的安装指南(逐步)

2.1 通用准备(适用于所有节点)

2.1.1 基础设施要求

  • VPS Ubuntu 22.04/24.04(至少2个vCPU,建议4GB内存)
  • 权限 sudo
  • 中央服务器需要一个指向IP地址A记录的域名(例如:osint.example.com
  • 根据角色打开网络端口:
    • 中心:80/443(反向代理)和8000(如果直接访问API可选)
    • 工作者:仅22/8000或内部端口,根据政策

2.1.2 系统更新和Docker安装

sudo apt-get update -y && sudo apt-get upgrade -y
sudo apt-get install -y ca-certificates curl gnupg lsb-release git

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
   https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update -y
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

sudo systemctl enable --now docker
sudo docker --version
sudo docker compose version

2.1.3 克隆仓库

cd /opt
sudo git clone https://github.com/dn9uy3n/bbot-osint-mcp.git
cd bbot-osint-mcp
sudo chown -R $USER:$USER .

2.1.4 强生秘密

bash scripts/init-secrets.sh
cat secrets/credentials.txt

保存API_TOKENNEO4J_PASSWORD以在下一步中配置。

2.2 中央部署(带域名)

2.2.1 创建文件.env给中央

cp .env.example .env
nano .env

变量:

LE_DOMAIN=osint.example.com
LE_EMAIL=admin@example.com
PUBLIC_BASE_URL=https://osint.example.com
NEO4J_USERNAME=neo4j
RATE_LIMIT_PER_MINUTE=120
MAX_CONCURRENT_SCANS=2
CLEANUP_ENABLED=true
EVENT_RETENTION_DAYS=30
OFFLINE_HOST_RETENTION_DAYS=30
ORPHAN_CLEANUP_ENABLED=true
  • 快速创建.env示例(使用init_config.json的值和secrets/文件夹):
cat <<'EOF' > .env
LE_DOMAIN=osint.example.com
LE_EMAIL=admin@example.com
NEO4J_PASSWORD="$(tr -d '\n' < secrets/neo4j_password)"
EOF

然后打开文件以添加其他变量(如PUBLIC_BASE_URLRATE_LIMIT_PER_MINUTE,...)。

  • API_TOKENNEO4J_PASSWORDDocker秘密会自行从secrets/目录读取。
  • 可以添加TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID如果您想接收通知。

2.2.2 配置init_config.json给中央

cp init_config.json.example init_config.json
nano init_config.json
{
  "targets": ["evilcorp.com", "target2.com"],
  "deployment_role": "central",
  "scan_defaults": {
    "presets": ["subdomain-enum"],
    "flags": ["safe"],
    "max_workers": 2,
    "target_sleep_seconds": 300,
    "cycle_sleep_seconds": 3600
  },
  "bbot_modules": {
    "securitytrails": { "api_key": "YOUR_SECURITYTRAILS_KEY" },
    "shodan_dns": { "api_key": "YOUR_SHODAN_KEY" },
    "virustotal": { "api_key": "YOUR_VIRUSTOTAL_KEY" }
  },
  "workers": [
    { "id": "worker-hcm", "token": "<64字节随机字符串>" },
    { "id": "worker-hn", "token": "<另一个字符串>" }
  ]
}
  • workers是一个允许上传的列表。
  • 令牌应≥64字符(十六进制/ base64)。当权限被撤销时,只需删除相应的条目。docker compose restart osint

2.2.3 启动中央堆栈并打开防火墙

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw allow 8000/tcp comment 'bbot-osint API (可选)'
sudo ufw enable
sudo ufw status

sudo docker compose up -d --build
sudo docker logs -f bbot_caddy
  • Caddy将申请Let's Encrypt证书。LE_DOMAIN

  • 等待日志证书成功获取确认HTTPS功能。

  • 如果您想限制资源:

docker ps -q | xargs -r -I{} docker update --cpus 0.8 {}

2.2.4 中央服务检查

API_TOKEN=$(grep '^API_TOKEN:' secrets/credentials.txt | awk '{print $2}')

curl -s -H "X-API-Token: $API_TOKEN" https://osint.example.com/healthz
curl -s -H "X-API-Token: $API_TOKEN" https://osint.example.com/status

也可以监视扫描过程:

sudo docker logs -f bbot_osint

2.3 部署工作者(不需要域名)

2.3.1 准备.env最小化

cp .env.example .env
nano .env
  • LE_DOMAINLE_EMAIL为空或注释这两行。
  • PUBLIC_BASE_URL可以设为http://127.0.0.1:8000(仅内部服务)。
  • 保留调度器工作的限制参数(速率限制、清理)。

2.3.2 配置init_config.json给工作者

{
  "targets": ["acme.example"],
  "deployment_role": "worker",
  "scan_defaults": {
    "presets": ["subdomain-enum"],
    "flags": ["safe"],
    "max_workers": 2,
    "target_sleep_seconds": 300,
    "cycle_sleep_seconds": 3600
  },
  "central_api": {
    "url": "https://osint.example.com/ingest/output",
    "worker_id": "worker-hcm",
    "worker_token": "<64字节随机字符串>",
    "auto_upload": true,
    "compress": true,
    "verify_tls": true,
    "timeout": 180
  }
}
  • central_api.url您可以使用中心域名或反向代理IP。
  • 当手动上传时,设置auto_uploadfalse然后使用CLI。python -m app.worker_ingest ...

2.3.3 启动容器工作者

工作者只需要服务。osint

sudo docker compose up -d --build --no-deps osint
sudo docker logs -f bbot_osint
  • 服务neo4jproxy不需要在工作者上运行。
  • 如果您想限制资源:
docker ps -q | xargs -r -I{} docker update --cpus 0.8 {}

2.3.4 确认成功上传

在日志bbot_osint中会出现一行:

[INFO] 上传了4373条记录给acme.example来自新的扫描目录:[...]

在中心日志检查bbot_osint以查看导入N条记录对应的worker_id

2.4 重要扫描参数

  1. targets: 自动扫描的目标列表。
  2. target_sleep_seconds(默认300):同一周期内目标之间的间隔。
  3. cycle_sleep_seconds(默认3600):完成整个列表后的休息时间。

📖 查看更多:SLEEP_PARAMETERS.md

workers(中心专用):通过init_config.json配置允许上传的列表。

central_api(工作者专用):指定端点、凭据和上传行为。

2.5 典型配置场景

1. 仅使用中央服务器(无工作者)

  • 保持deployment_rolecentral(未声明时默认)。
  • 移除锁workers或留空数组,如果您不想接受外部上传。
  • 内部扫描器将在内部扫描targets并将数据直接导入Neo4j。

2. 中心 + 多个工作者

  • 中心机器:deployment_role: "central",声明列表workers,每个工作者有id/token
  • 工作者:deployment_role: "worker",配置central_api,对应worker_id/worker_token,开启auto_upload,每个目标将调用自身。/ingest/output
  • 确保防火墙只允许工作者IP调用中心端点;暴露的令牌可以从workers中移除以禁用。

3. 临时工作者 / 手动发送

  • deployment_role: "worker"但设置central_api.auto_upload = false
  • 扫描完成后,运行CLI:python -m app.worker_ingest --file ... --url ... --worker-id ... --worker-token ... --domain ...随时推送数据。
  • 适合需要控制发货过程或工作者处于受限环境的情况。

2.6 预