Версия: 1.0
Цель: Документация всех API-методов для разработчиков модулей и SaaS-интеграции
Файл: pentool/api/proxy_api.py
Назначение: Управление HTTP прокси-сервером
Запустить прокси-сервер.
Параметры:
host— адрес для прослушивания (обычно "127.0.0.1")port— порт (обычно 8080)
Исключения:
OSError— если порт уже занят
Пример:
from pentool.api.proxy_api import ProxyAPI
proxy = ProxyAPI()
await proxy.start("127.0.0.1", 8080)Остановить прокси-сервер.
Пример:
await proxy.stop()Проверить, запущен ли прокси.
Возвращает: True если запущен, иначе False
Пример:
if proxy.is_running:
print("Proxy is running")Получить историю перехваченных запросов.
Параметры:
limit— максимальное количество записей
Возвращает: Список словарей с полями:
id(int)method(str)url(str)status_code(int)timestamp(float)host(str)length(int)
Пример:
requests = await proxy.get_requests(limit=50)
for req in requests:
print(f"{req['method']} {req['url']}")Экспортировать данные прокси для сохранения проекта.
Возвращает: Словарь с ключами:
requests— список перехваченных запросовmatch_replace_rules— правила Match/Replacescope— настройки scope
Пример:
data = await proxy.export_project_data()
# Сохранить в JSONИмпортировать данные прокси из проекта.
Параметры:
data— словарь, полученный изexport_project_data()
Пример:
await proxy.import_project_data(saved_data)Файл: pentool/api/scanner_api.py
Назначение: Управление сканером уязвимостей
Запустить сканирование.
Параметры:
targets— список URL для сканированияchecks— список имён checks (None = все)
Пример:
from pentool.api.scanner_api import ScannerAPI
scanner = ScannerAPI()
await scanner.start_scan(
targets=["https://example.com"],
checks=["xss", "sqli", "ssti"]
)Получить найденные уязвимости.
Возвращает: Список объектов Finding с полями:
severity(str): "critical", "high", "medium", "low", "info"title(str)url(str)description(str)evidence(str)confidence(str): "certain", "firm", "tentative"
Пример:
findings = scanner.get_findings()
for f in findings:
print(f"{f.severity.upper()}: {f.title} at {f.url}")Получить статистику сканирования.
Возвращает: Словарь:
total_findings(int)by_severity(dict): подсчёт по критичностиscanned_urls(int)duration_seconds(float)
Файл: pentool/api/intruder_api.py
Назначение: Управление атаками Intruder
class AttackType(str, Enum):
SNIPER = "sniper" # Один payload set, по очереди
BATTERING_RAM = "battering_ram" # Один payload set, во все позиции
PITCHFORK = "pitchfork" # N payload sets, синхронно
CLUSTER_BOMB = "cluster_bomb" # N payload sets, все комбинации@dataclass
class IntruderConfig:
template: str # Шаблон запроса с маркерами §§
attack_type: AttackType
payloads: list[list[str]] # Один список на каждую позицию
threads: int = 10
delay_ms: int = 0@dataclass
class IntruderResult:
payload: str | tuple[str, ...] # Один или несколько payloads
status_code: int
length: int
response_time_ms: float
response_body: strЗапустить атаку.
Параметры:
config— конфигурация атаки
Возвращает: Список результатов
Пример:
from pentool.api.intruder_api import IntruderAPI, IntruderConfig, AttackType
intruder = IntruderAPI()
config = IntruderConfig(
template="GET /search?q=§payload§ HTTP/1.1\r\nHost: example.com\r\n\r\n",
attack_type=AttackType.SNIPER,
payloads=[["admin", "user", "test", "root"]],
threads=5,
)
results = await intruder.start_attack(config)
for r in results:
print(f"{r.payload}: {r.status_code} ({r.length} bytes)")Приостановить атаку.
Возобновить атаку.
Остановить атаку.
Файл: pentool/api/spider_api.py
Назначение: Краулинг веб-приложений
@dataclass
class SpiderResult:
pages: list[str] # Найденные URL
forms: list[FormData] # Найденные формы
endpoints: list[Endpoint] # Найденные эндпоинты
js_files: list[str] # Найденные JS-файлыКраулить сайт.
Параметры:
base_url— начальный URLmax_depth— максимальная глубинаmax_pages— максимум страниц
Возвращает: SpiderResult
Пример:
from pentool.api.spider_api import SpiderAPI
spider = SpiderAPI()
result = await spider.crawl("https://example.com", max_depth=2)
print(f"Found {len(result.pages)} pages")
print(f"Found {len(result.forms)} forms")Файл: pentool/api/repeater_api.py
Назначение: Отправка модифицированных HTTP-запросов
Отправить HTTP-запрос.
Параметры:
raw_request— полный HTTP-запрос (заголовки + тело)
Возвращает: ParsedResponse с полями:
status(int)headers(dict)body(str)
Пример:
from pentool.api.repeater_api import RepeaterAPI
repeater = RepeaterAPI()
request = """GET /api/users HTTP/1.1
Host: example.com
User-Agent: Pentool/1.0
"""
response = await repeater.send_request(request)
print(f"Status: {response.status}")
print(f"Body: {response.body}")Файл: pentool/api/target_api.py
Назначение: Управление site map
Добавить URL в site map.
Добавить запрос из истории прокси в site map.
Получить дерево site map.
Возвращает: Вложенный словарь вида:
{
"example.com": {
"": ["/", "/about"], # Корневая директория
"api": ["/api/users", "/api/posts"],
"admin": ["/admin/login"]
}
}Файл: pentool/api/decoder_api.py
Назначение: Кодирование/декодирование данных
Закодировать данные.
Параметры:
data— исходные данныеoperation— имя операции (см. список ниже)
Возвращает: Закодированная строка
Поддерживаемые операции:
"base64"— Base64"url"— URL encoding"html"— HTML entities"hex"— Hex encoding"rot13"— ROT13"md5"— MD5 hash"sha1"— SHA1 hash"sha256"— SHA256 hash"jwt_decode"— JWT decode (без проверки подписи)- ... (всего 19 операций)
Пример:
from pentool.api.decoder_api import DecoderAPI
decoder = DecoderAPI()
encoded = decoder.encode("Hello World", "base64")
print(encoded) # "SGVsbG8gV29ybGQ="
decoded = decoder.decode(encoded, "base64")
print(decoded) # "Hello World"Файл: pentool/api/comparer_api.py
Назначение: Сравнение текстов (diff)
Сравнить два текста.
Параметры:
text1— первый текстtext2— второй текстmode— режим diff: "unified", "context", "html"
Возвращает: Diff в выбранном формате
Пример:
from pentool.api.comparer_api import ComparerAPI
comparer = ComparerAPI()
diff = comparer.compare(
"Hello World",
"Hello Pentool",
mode="unified"
)
print(diff)Файл: pentool/api/sequencer_api.py
Назначение: Анализ энтропии токенов
Проанализировать последовательность токенов.
Параметры:
tokens— список токенов для анализа
Возвращает: SequencerReport с полями:
entropy(float) — энтропия в битахis_predictable(bool) — предсказуема ли последовательностьpatterns(list[str]) — найденные паттерны
Пример:
from pentool.api.sequencer_api import SequencerAPI
sequencer = SequencerAPI()
tokens = ["abc123", "abc124", "abc125", "abc126"]
report = sequencer.analyze(tokens)
print(f"Entropy: {report.entropy:.2f} bits")
print(f"Predictable: {report.is_predictable}")Все методы, выполняющие I/O операции, являются async и должны вызываться с await:
result = await api.method() # ✅ Правильно
result = api.method() # ❌ НеправильноAPI методы могут выбрасывать исключения:
ValueError— некорректные параметрыRuntimeError— ошибка во время выполненияTimeoutError— таймаут операции
Пример обработки:
try:
result = await scanner.start_scan(targets)
except ValueError as e:
print(f"Invalid parameters: {e}")
except RuntimeError as e:
print(f"Runtime error: {e}")Все API методы аннотированы типами. Используйте mypy для проверки:
mypy pentool/api/Всегда импортируйте из pentool.api.*, а не из pentool.modules.*:
from pentool.api.scanner_api import ScannerAPI # ✅ Правильно
from pentool.modules.scanner import Scanner # ❌ НеправильноAPI-методы могут генерировать события через EventBus. Подписаться можно так:
from pentool.core.event_bus import get_event_bus
from pentool.core.events import FindingDiscovered
bus = get_event_bus()
def on_finding(event: FindingDiscovered):
print(f"New finding: {event.finding.title}")
bus.subscribe(FindingDiscovered, on_finding)ProxyRequestDoneEvent— перехвачен HTTP-запросFindingDiscovered— найдена уязвимостьScanStarted,ScanFinished— сканирование начато/завершеноIntruderResultAdded,IntruderFinished— результаты атакиSpiderFinished,UrlCrawled— краулинг
Некоторые API-методы требуют лицензии. Проверка:
from pentool.core.license import get_session_license
lic = get_session_license()
if lic.has_feature("scanner_extended"):
# Запустить расширенные checks
pass
else:
print("Extended scanner requires PRO license")Методы с ограничениями:
ScannerAPI.start_scan()— расширенные checks требуютscanner_extendedIntruderAPI.start_attack()— все типы атак требуютintruder_all_types- Лимиты (threads, max_pages) берутся из
lic.get_limit()
Все API имеют unit-тесты в tests/api/:
pytest tests/api/test_scanner_api.py -v
pytest tests/api/test_intruder_api.py -vПример теста:
import pytest
from pentool.api.scanner_api import ScannerAPI
@pytest.mark.asyncio
async def test_scanner_start():
scanner = ScannerAPI()
await scanner.start_scan(["https://httpbin.org"])
findings = scanner.get_findings()
assert isinstance(findings, list)- Начальная версия контрактов
- Документация всех основных API
- Добавлен StorageInterface для SaaS-готовности
Для разработчиков: При добавлении новых методов в API, обязательно обновите этот документ!