# Osint Recon

> Разведка инфраструктуры домена/IP CLI osint_client.py: DNS, whois, субдомены, порты/CVE, санкции. Триггеры: «пробей домен». НЕ люди→social-intel.

- Skill: `jhamidun/osint-recon` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jhamidun/osint-recon`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jhamidun/osint-recon/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: JHamidun (https://skillmd.com/u/jhamidun)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/jhamidun/osint-recon

---


# OSINT Recon (публичные источники, request-driven)

`python ~/.claude/tools/osint_client.py <команда> [аргументы] [--json]`

**Философия: никаких демонов, поллеров и докера.** Спросил → сходил в публичный API → напечатал.
Всё, что требует постоянного опроса (живые карты самолётов/судов/спутников), **не входит в скилл принципиально** — см. «Чего здесь нет».

## Когда использовать

- Пришёл незнакомый домен/IP (контрагент, партнёр, подрядчик, подозрительная ссылка) — надо быстро понять, что это.
- Due diligence перед сделкой/интеграцией: кто регистратор, когда истекает домен, где хостится, что торчит наружу.
- Проверка своего/клиентского периметра «глазами снаружи»: субдомены в CT-логах, открытые порты, гигиена HTTP-заголовков.
- Санкционный скрининг компании или физлица перед платежом/договором.
- Быстрый ответ «есть ли известные CVE» по продукту или по конкретному CVE-ID.

Ключи **не обязательны** — все команды работают без них.

## Команды

| Команда | Что делает | Источник |
|---------|-----------|----------|
| `ip <addr>` | Геолокация, ASN, ISP/организация, reverse DNS, флаги (VPN/proxy/hosting) | ip-api.com → ipinfo.io (фолбэк) |
| `dns <domain>` | A/AAAA/MX/NS/TXT/CNAME/SOA. `--types A,MX` · `--doh` | dnspython (быстрый путь) → DoH dns.google / cloudflare-dns.com |
| `whois <domain\|ip>` | RDAP: регистратор, даты регистрации/истечения, статусы, NS, abuse-контакт. Это HTTP+JSON, не порт 43 | rdap.org → rdap.arin.net |
| `asn <asn\|ip>` | Holder, анонсируемые префиксы, upstream/downstream соседи. `--all-prefixes` | stat.ripe.net (RIPE RIS) |
| `certs <domain>` | Имена из Certificate Transparency + топ-эмитенты. `--limit` | crt.sh → api.certspotter.com (фолбэк) |
| `ports <ip>` | Открытые порты, CPE, теги, известные CVE хоста. `--no-key` | internetdb.shodan.io (**бесплатно, без ключа**) |
| `headers <url>` | Аудит security-заголовков + вердикт по каждому и оценка A–F. `--show-all` · `--no-redirect` | сам сайт |
| `sanctions <query>` | Санкционные списки / PEP по имени компании или человека | OpenSanctions (с ключом) → OFAC SDN CSV (без ключа) |
| `cve <keyword\|CVE-ID>` | Уязвимости: CVSS, severity, CWE, описание, ссылки. `--limit` · `--oldest` · `--exact` | services.nvd.nist.gov (NVD API 2.0) |
| `subdomains <domain>` | CT-имена + проверка живости DNS (resolved/dead). `--limit` · `--workers` · `--no-resolve` · `--exclude-apex` | crt.sh/CertSpotter + резолвер |
| `recon <domain>` | **Сводка одной командой**: dns + whois + asn + ip + certs + ports + headers + таблица вердиктов | все выше |

Глобальные флаги: `--json` (машинный вывод) и `--timeout N` (деф. 15 с). Работают **и до, и после** сабкоманды.

## Примеры

```bash
# Сводка по домену — начинай отсюда
python ~/.claude/tools/osint_client.py recon example.com

# Чей IP и где стоит
python ~/.claude/tools/osint_client.py ip YOUR_PUBLIC_IP

# Что торчит наружу у хоста + известные CVE
python ~/.claude/tools/osint_client.py ports YOUR_PUBLIC_IP

# Живые субдомены (карта поверхности атаки)
python ~/.claude/tools/osint_client.py subdomains github.com --limit 100

# Гигиена заголовков с оценкой A-F
python ~/.claude/tools/osint_client.py headers https://example.com

# Санкционный скрининг контрагента
python ~/.claude/tools/osint_client.py sanctions "Название Компании"

# Свежие CVE по продукту / конкретный CVE
python ~/.claude/tools/osint_client.py cve "openssl" --limit 5
python ~/.claude/tools/osint_client.py cve CVE-2024-3094

# Машинный вывод для дальнейшей обработки
python ~/.claude/tools/osint_client.py recon example.com --json
```

## Опциональные ключи

Читаются из `~/.claude/.credentials.master.env`. Без них всё работает, просто скромнее:

| Переменная | Что даёт | Без неё |
|-----------|----------|---------|
| `SHODAN_API_KEY` | `ports`: баннеры сервисов, продукт/версия, org, last-seen | бесплатный InternetDB: порты, CPE, теги, CVE |
| `OPENSANCTIONS_API_KEY` | `sanctions`: полная база (ЕС/ООН/UK/PEP), нечёткий матчинг, score | фолбэк на OFAC SDN — **только список США**, точное вхождение подстроки |

Значения не выдумывать: нет переменной — работаем на фолбэке и говорим об этом в выводе.

## Гочи

- **crt.sh регулярно отдаёт 502/404** под нагрузкой. Клиент пробует две формы запроса и автоматически падает на CertSpotter — в выводе видно, какой источник сработал. Числа `certs` и `subdomains` от разных источников будут отличаться: это нормально, у CertSpotter (без ключа) более узкое окно.
- **Основной источник BGP — RIPEstat, а не `api.bgpview.io`.** У BGPView бывает, что домен не резолвится из целых сетей и стран, а выглядит это как «команда молча ничего не нашла». RIPEstat стабильнее; менять источник не нужно, даже если у тебя BGPView открывается.
- **OpenSanctions с 2025 отдаёт 401 без ключа.** Фолбэк OFAC качает `sdn.csv` + `alt.csv` (~6 МБ) в `~/.claude/cache/osint/`, TTL 7 дней. Первый вызов — минуту, дальше мгновенно.
- **NVD без ключа: ~5 запросов / 30 с.** `cve` по ключевому слову делает 2 запроса (счётчик + последняя страница, чтобы отдать НОВЫЕ, а не CVE из 1999-го). Подряд не долбить — иначе 429. **Страница NVD ограничена 100 записями**: `--limit` больше 100 срезается до 100 (в stderr будет сказано). Нужно больше — сужай запрос, а не задирай лимит.
- **`sanctions` печатает ПОЛНОЕ число совпадений, а показывает `--limit` (деф. 10).** Если в выводе `[WARN] showing 10 of 88` — это не «88 однофамильцев неважно», это значит, что 78 записей ты не видел. Перед выводом «чисто/не чисто» подними лимит. В `--json` это поля `total_matches` / `shown` / `truncated`.
- **IDN-домены (`.рф`, `.中国`) переводятся в punycode** перед запросом в CT/RDAP/HTTP, и в stderr печатается во что именно (`пример.рф -> xn--e1afmkfd.xn--p1ai`). Имена в выводе тоже будут в punycode — это форма, в которой они реально лежат в сертификатах.
- **ip-api.com — 45 запросов/минуту** с одного IP и только по HTTP на бесплатном тарифе. При лимите клиент переключается на ipinfo.io.
- **Данные публичные и могут быть неполными/устаревшими.** Shodan — снимок периодического скана, не живая проверка (порт мог закрыться час назад). CT-логи историчны: имя в сертификате ≠ имя работает сейчас; поэтому в `subdomains` есть отметка resolved/dead. RDAP есть не у всех зон — у `.ru`, `.su`, `.рф` и ряда ccTLD публичного RDAP-сервера нет, команда честно об этом скажет.
- **`ip` и `ports` принимают и хостнейм** — он будет отрезолвлен, и в stderr напечатается, во что именно.
- **SSRF-guard**: приватные, loopback, link-local, reserved и cloud-metadata адреса блокируются — включая случай, когда публичное имя резолвится в 127.0.0.1. Отказ — понятный текст, exit-код 3.
- **Коды выхода**: 0 — ок, 2 — ошибка источника/ввода, 3 — блокировка SSRF-гардом, 4 — rate-limit, 130 — прервано.
- `requests` и `dnspython` используются как быстрый путь, если установлены; если нет — всё работает на stdlib, ставить ничего не обязательно (`pip install requests dnspython` только ускорит).

## Этика и границы

Инструмент — для проверки **инфраструктуры и контрагентов**: домены, IP, сети, компании, санкционные списки, CVE. Это данные, которые организации публикуют о себе сами (DNS, RDAP, CT-логи, BGP-анонсы, HTTP-заголовки) плюс официальные государственные списки.

**НЕ для слежки за частными лицами.** Не использовать для составления досье на человека, отслеживания перемещений, поиска домашнего адреса, преследования. `sanctions` — комплаенс-скрининг перед платежом/договором, а не способ «пробить» человека.

Совпадение по имени в санкционном списке **не является подтверждением личности** — это повод запросить документы (ДР, паспорт, регистрационный номер), а не основание для решения. Юридическую значимость имеет только первоисточник.

Ничего активного: тут нет сканера портов, брутфорса и эксплуатации. Все данные берутся из чужих публичных API — мы не касаемся исследуемого хоста, кроме одного обычного HTTP-запроса в `headers` (как открыть сайт в браузере).

## Чего здесь нет

**Живые карты самолётов, судов и спутников — не в этом скилле.** Они требуют постоянного опроса (поллер каждые N секунд, фоновый демон, хранилище треков), что противоречит философии `osint-recon`: спросил → сходил → напечатал. Вопросы вида «что летает над», «покажи живую карту», «военные борта рядом» — это отдельный фоновый сервис поверх открытых фидов ADS-B/AIS/спутниковых TLE; готового скилла под него в паке нет, поднимается своим демоном под ресурс-гардом.

Также вне скилла: активное сканирование, парсинг соцсетей, поиск утечек паролей, работа с даркнетом.

## Разграничение со смежными скиллами

| Задача | Куда идти |
|--------|-----------|
| Домены, IP, сети, порты, CT, CVE, санкции | **`osint-recon`** (этот) |
| Живая обстановка: самолёты, суда, спутники, события в реальном времени | свой фоновый сервис поверх ADS-B/AIS-фидов — в пак не входит |
| Обогащение лидов, цифровой след компании, квалификация заявок | `account-research` + `social-intel` (готового навыка обогащения в паке нет) |
| Досье по соцсетям, профили людей, KYC по цифровому следу | `social-intel` |
| Проверка контрагентов РФ (ФНС, реквизиты, арбитраж) | свой источник по ИНН/ОГРН (DaData/Checko/kad.arbitr.ru — готового клиента в паке нет) |
| Аудит СВОЕГО кода и инфраструктуры, OWASP, уязвимости в репо | `security-audit`, `threat-hunting` |
| Обезличивание перед публикацией, поиск PII в своих файлах | `privacy-filter` |
| Реклама конкурентов, их креативы | `ad-spy` |

