Мультиагентный OSINT-агент на LangGraph с Subfinder, Shodan и автоматической генерацией отчётов
OSINT-инструмент для поиска username-ов на сотнях платформ одновременно. Позволяет быстро установить цифровой след человека: найти аккаунты …
OSINT-инструмент для поиска аккаунтов по username в 3000+ сайтах. Форк и эволюция Sherlock: помимо поиска собирает …
Сканирует git-репозитории (включая всю историю коммитов) на предмет утёкших секретов: API-ключей, паролей, токенов, приватных ключей. Незаменим …
Сканер для поиска утёкших секретов, токенов и учётных данных в git-репозиториях, S3-бакетах, файловых системах и других …
git clone git@github.com:dazzyddos/OSINT_AI_Agent.git cd osint-agent docker build -t osint-tools:latest -f docker/Dockerfile.tools . python -m venv venv source venv/bin/activate pip install -r requirements.txt cp .env.example .env
Многокластерная OSINT (разведка по открытым источникам) система разведки, построенная на LangGraph. Этот проект демонстрирует, как оркестрировать специализированных ИИ-агентов, которые сотрудничают для проведения комплексной разведки безопасности целевых доменов.
Примечание: Это простой инструмент, созданный в учебных целях для демонстрации того, как начать создавать ИИ-агентов в сфере кибербезопасности. Подробное руководство и объяснение см. в сопровождающей статье блога: Building Your First Cybersecurity AI Agent with LangGraph.
Эта система использует архитектуру супервизора, где координирующий агент управляет тремя специализированными агентами через рабочий процесс разведки:
┌─────────────────────────────────────────────────────────────────┐
│ COORDINATOR │
│ (Supervisor Agent) │
└───────────────────────────┬─────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ RECON │ │ SHODAN │ │ FINGERPRINT │
│ AGENT │ │ AGENT │ │ AGENT │
└────┬─────┘ └────┬─────┘ └──────┬───────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│Subfinder │ │ Shodan │ │ WhatWeb │
│ (Docker) │ │ API │ │ (Docker) │
└──────────┘ └──────────┘ └──────────────┘
Этапы рабочего процесса: 1. Разведка → Перечисление поддоменов с использованием Subfinder 2. Shodan Intelligence → Запрос экспонированных сервисов и уязвимостей 3. Фингерпринтинг → Идентификация технологического стека с WhatWeb 4. Отчётность → ИИ-генерируемый отчёт об оценке безопасности
osint_agent/
├── agents/
│ ├── __init__.py
│ ├── state.py # Shared state definition (TypedDict)
│ ├── coordinator.py # Supervisor agent & graph definition
│ ├── recon_agent.py # Subdomain enumeration agent
│ ├── shodan_agent.py # Shodan reconnaissance agent
│ └── fingerprint_agent.py # Technology detection agent
├── tools/
│ ├── __init__.py
│ ├── docker_runner.py # Docker execution wrapper
│ ├── subdomain_tools.py # Subfinder integration
│ ├── shodan_tools.py # Shodan API tools
│ └── fingerprint_tools.py # WhatWeb integration
├── docker/
│ └── Dockerfile.tools # Container with recon tools
├── config.py # Application configuration
├── main.py # CLI entry point
├── requirements.txt
└── .env.example
git clone git@github.com:dazzyddos/OSINT_AI_Agent.git
cd osint-agent
Docker-образ содержит Subfinder, WhatWeb и httpx для разведки:
docker build -t osint-tools:latest -f docker/Dockerfile.tools .
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
Отредактируйте .env с вашими API-ключами:
DEEPSEEK_API_KEY=your-deepseek-api-key
SHODAN_API_KEY=your-shodan-api-key
# Optional configuration
OSINT_DOCKER_IMAGE=osint-tools:latest
DOCKER_TIMEOUT=300
LLM_MODEL=deepseek-chat
LLM_TEMPERATURE=0
python main.py example.com
python main.py example.com --checkpoint
from agents.coordinator import create_coordinator
from langgraph.checkpoint.memory import MemorySaver
# Create coordinator with optional checkpointing
checkpointer = MemorySaver()
coordinator = create_coordinator(checkpointer=checkpointer)
# Initialize state
initial_state = {
"target": "example.com",
"messages": [],
"subdomains": [],
"live_hosts": [],
"shodan_hosts": [],
"shodan_details": [],
"technologies": [],
"current_phase": "",
"completed_phases": [],
"errors": [],
"report": "",
}
# Run investigation
config = {"configurable": {"thread_id": "osint-example"}}
for event in coordinator.stream(initial_state, config):
print(event)
Координатор реализует конечный автомат, который направляет выполнение через этапы рабочего процесса:
def supervisor_node(state: OSINTState) -> Command:
completed = state.get("completed_phases", [])
if "recon" not in completed:
return Command(goto="recon_node", update={"current_phase": "recon"})
elif "shodan" not in completed:
return Command(goto="shodan_node", update={"current_phase": "shodan"})
# ... continues through phases
Специализируется на перечислении поддоменов с использованием пассивных техник: - Журналы Certificate Transparency - DNS-датасеты - Веб-архивы - Публичные источники через Subfinder
Опрашивает Shodan для экспонированной инфраструктуры: - Открытые порты и сервисы - Известные уязвимости (CVE) - Определение операционной системы - Баннеры сервисов
Идентифицирует технологические стеки с помощью WhatWeb: - Веб-серверы (Apache, Nginx, IIS) - CMS-платформы (WordPress, Drupal) - JavaScript-фреймворки - Языки программирования - Заголовки безопасности
Общее состояние использует TypedDict LangGraph с аннотацией сообщений:
class OSINTState(TypedDict):
target: str # Domain being investigated
messages: Annotated[list, add_messages] # LLM conversation history
subdomains: list[str] # Discovered subdomains
live_hosts: list[dict] # Responsive hosts
shodan_hosts: list[dict] # Shodan search results
shodan_details: list[dict] # Detailed host lookups
technologies: list[dict] # Fingerprint results
current_phase: str # Active workflow phase
completed_phases: list[str] # Finished phases
errors: list[str] # Error collection
report: str # Final report
Рабочий процесс LangGraph:
┌─────────┐
│ START │
└────┬────┘
│
▼
┌────────────┐
┌──────│ SUPERVISOR │◄─────────────────┐
│ └────────────┘ │
│ │ │
│ ┌─────────┼─────────┐ │
│ │ │ │ │
▼ ▼ ▼ ▼ │
┌────────┐ ┌─────────┐ ┌─────────────┐ │
│ RECON │ │ SHODAN │ │ FINGERPRINT │ │
│ NODE │ │ NODE │ │ NODE │ │
└───┬────┘ └────┬────┘ └──────┬──────┘ │
│ │ │ │
└────────────┴──────────────┴───────────┘
│
▼ (all phases complete)
┌────────────┐
│ REPORT │
│ NODE │
└─────┬──────┘
│
▼
┌───────┐
│ END │
└───────┘
+==============================================================+
| OSINT Multi-Agent Investigation |
+==============================================================+
| Target: example.com |
+==============================================================+
[*] Starting investigation...
[->] Moving to phase: recon
[OK] Recon complete: found 47 subdomains
[->] Moving to phase: shodan
[OK] Shodan complete: found 12 hosts
[->] Moving to phase: fingerprint
[OK] Fingerprinting complete: scanned 10 targets
[->] Moving to phase: reporting
[OK] Report generated
============================================================
INVESTIGATION COMPLETE
============================================================
# OSINT Reconnaissance Report: example.com
## Executive Summary
...
| Переменная | По умолчанию | Описание |
|---|---|---|
DEEPSEEK_API_KEY |
Обязательно | API-ключ для DeepSeek LLM |
SHODAN_API_KEY |
Обязательно | API-ключ для запросов к Shodan |
OSINT_DOCKER_IMAGE |
osint-tools:latest |
Docker-образ для инструментов |
DOCKER_TIMEOUT |
300 |
Макс. время выполнения (секунды) |
LLM_MODEL |
deepseek-chat |
Идентификатор модели LLM |
LLM_TEMPERATURE |
0 |
Настройка temperature LLM |
agents/:# agents/new_agent.py
from langgraph.prebuilt import create_react_agent
def create_new_agent():
llm = ChatOpenAI(...)
return create_react_agent(
model=llm,
tools=[your_tools],
prompt="Your system prompt"
)
tools/:# tools/new_tools.py
from langchain_core.tools import tool
@tool
def your_new_tool(param: str) -> dict:
"""Tool description for the LLM."""
# Implementation
return result
# In coordinator.py
builder.add_node("new_node", new_node_function)
builder.add_edge("new_node", "supervisor")
Измените инициализацию LLM в файлах агентов:
# For OpenAI
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
# For Anthropic
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-sonnet-4-20250514")
shlex.quote()MIT License — см. LICENSE для деталей.
Отказ от ответственности: Этот инструмент предназначен только для авторизованного тестирования безопасности и образовательных целей. Всегда получайте надлежащее разрешение перед проведением разведки на любой цели.