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 с). Работают и до, и после сабкоманды.
Примеры
# Сводка по домену — начинай отсюда
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 (без ключа) более узкое окно.
api.bgpview.io не резолвится с этой машины, поэтому основной источник BGP — RIPEstat. Это учтено, менять не нужно.
- 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.
Этика и границы
Инструмент — для проверки инфраструктуры и контрагентов: домены, 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 |
1---2name: osint-recon-23description: Разведка инфраструктуры домена/IP CLI osint_client.py: DNS, whois, субдомены, порты/CVE, санкции. Триггеры: «пробей домен». НЕ люди→social-intel.4---56# OSINT Recon (публичные источники, request-driven)78`python ~/.claude/tools/osint_client.py <команда> [аргументы] [--json]`910**Философия: никаких демонов, поллеров и докера.** Спросил → сходил в публичный API → напечатал.11Всё, что требует постоянного опроса (живые карты самолётов/судов/спутников), **не входит в скилл принципиально** — см. «Чего здесь нет».1213## Когда использовать1415- Пришёл незнакомый домен/IP (контрагент, партнёр, подрядчик, подозрительная ссылка) — надо быстро понять, что это.16- Due diligence перед сделкой/интеграцией: кто регистратор, когда истекает домен, где хостится, что торчит наружу.17- Проверка своего/клиентского периметра «глазами снаружи»: субдомены в CT-логах, открытые порты, гигиена HTTP-заголовков.18- Санкционный скрининг компании или физлица перед платежом/договором.19- Быстрый ответ «есть ли известные CVE» по продукту или по конкретному CVE-ID.2021Ключи **не обязательны** — все команды работают без них.2223## Команды2425| Команда | Что делает | Источник |26|---------|-----------|----------|27| `ip <addr>` | Геолокация, ASN, ISP/организация, reverse DNS, флаги (VPN/proxy/hosting) | ip-api.com → ipinfo.io (фолбэк) |28| `dns <domain>` | A/AAAA/MX/NS/TXT/CNAME/SOA. `--types A,MX` · `--doh` | dnspython (быстрый путь) → DoH dns.google / cloudflare-dns.com |29| `whois <domain\|ip>` | RDAP: регистратор, даты регистрации/истечения, статусы, NS, abuse-контакт. Это HTTP+JSON, не порт 43 | rdap.org → rdap.arin.net |30| `asn <asn\|ip>` | Holder, анонсируемые префиксы, upstream/downstream соседи. `--all-prefixes` | stat.ripe.net (RIPE RIS) |31| `certs <domain>` | Имена из Certificate Transparency + топ-эмитенты. `--limit` | crt.sh → api.certspotter.com (фолбэк) |32| `ports <ip>` | Открытые порты, CPE, теги, известные CVE хоста. `--no-key` | internetdb.shodan.io (**бесплатно, без ключа**) |33| `headers <url>` | Аудит security-заголовков + вердикт по каждому и оценка A–F. `--show-all` · `--no-redirect` | сам сайт |34| `sanctions <query>` | Санкционные списки / PEP по имени компании или человека | OpenSanctions (с ключом) → OFAC SDN CSV (без ключа) |35| `cve <keyword\|CVE-ID>` | Уязвимости: CVSS, severity, CWE, описание, ссылки. `--limit` · `--oldest` · `--exact` | services.nvd.nist.gov (NVD API 2.0) |36| `subdomains <domain>` | CT-имена + проверка живости DNS (resolved/dead). `--limit` · `--workers` · `--no-resolve` · `--exclude-apex` | crt.sh/CertSpotter + резолвер |37| `recon <domain>` | **Сводка одной командой**: dns + whois + asn + ip + certs + ports + headers + таблица вердиктов | все выше |3839Глобальные флаги: `--json` (машинный вывод) и `--timeout N` (деф. 15 с). Работают **и до, и после** сабкоманды.4041## Примеры4243```bash44# Сводка по домену — начинай отсюда45python ~/.claude/tools/osint_client.py recon example.com4647# Чей IP и где стоит48python ~/.claude/tools/osint_client.py ip YOUR_PUBLIC_IP4950# Что торчит наружу у хоста + известные CVE51python ~/.claude/tools/osint_client.py ports YOUR_PUBLIC_IP5253# Живые субдомены (карта поверхности атаки)54python ~/.claude/tools/osint_client.py subdomains github.com --limit 1005556# Гигиена заголовков с оценкой A-F57python ~/.claude/tools/osint_client.py headers https://example.com5859# Санкционный скрининг контрагента60python ~/.claude/tools/osint_client.py sanctions "Название Компании"6162# Свежие CVE по продукту / конкретный CVE63python ~/.claude/tools/osint_client.py cve "openssl" --limit 564python ~/.claude/tools/osint_client.py cve CVE-2024-30946566# Машинный вывод для дальнейшей обработки67python ~/.claude/tools/osint_client.py recon example.com --json68```6970## Опциональные ключи7172Читаются из `~/.claude/.credentials.master.env`. Без них всё работает, просто скромнее:7374| Переменная | Что даёт | Без неё |75|-----------|----------|---------|76| `SHODAN_API_KEY` | `ports`: баннеры сервисов, продукт/версия, org, last-seen | бесплатный InternetDB: порты, CPE, теги, CVE |77| `OPENSANCTIONS_API_KEY` | `sanctions`: полная база (ЕС/ООН/UK/PEP), нечёткий матчинг, score | фолбэк на OFAC SDN — **только список США**, точное вхождение подстроки |7879Значения не выдумывать: нет переменной — работаем на фолбэке и говорим об этом в выводе.8081## Гочи8283- **crt.sh регулярно отдаёт 502/404** под нагрузкой. Клиент пробует две формы запроса и автоматически падает на CertSpotter — в выводе видно, какой источник сработал. Числа `certs` и `subdomains` от разных источников будут отличаться: это нормально, у CertSpotter (без ключа) более узкое окно.84- **`api.bgpview.io` не резолвится с этой машины**, поэтому основной источник BGP — RIPEstat. Это учтено, менять не нужно.85- **OpenSanctions с 2025 отдаёт 401 без ключа.** Фолбэк OFAC качает `sdn.csv` + `alt.csv` (~6 МБ) в `~/.claude/cache/osint/`, TTL 7 дней. Первый вызов — минуту, дальше мгновенно.86- **NVD без ключа: ~5 запросов / 30 с.** `cve` по ключевому слову делает 2 запроса (счётчик + последняя страница, чтобы отдать НОВЫЕ, а не CVE из 1999-го). Подряд не долбить — иначе 429. **Страница NVD ограничена 100 записями**: `--limit` больше 100 срезается до 100 (в stderr будет сказано). Нужно больше — сужай запрос, а не задирай лимит.87- **`sanctions` печатает ПОЛНОЕ число совпадений, а показывает `--limit` (деф. 10).** Если в выводе `[WARN] showing 10 of 88` — это не «88 однофамильцев неважно», это значит, что 78 записей ты не видел. Перед выводом «чисто/не чисто» подними лимит. В `--json` это поля `total_matches` / `shown` / `truncated`.88- **IDN-домены (`.рф`, `.中国`) переводятся в punycode** перед запросом в CT/RDAP/HTTP, и в stderr печатается во что именно (`пример.рф -> xn--e1afmkfd.xn--p1ai`). Имена в выводе тоже будут в punycode — это форма, в которой они реально лежат в сертификатах.89- **ip-api.com — 45 запросов/минуту** с одного IP и только по HTTP на бесплатном тарифе. При лимите клиент переключается на ipinfo.io.90- **Данные публичные и могут быть неполными/устаревшими.** Shodan — снимок периодического скана, не живая проверка (порт мог закрыться час назад). CT-логи историчны: имя в сертификате ≠ имя работает сейчас; поэтому в `subdomains` есть отметка resolved/dead. RDAP есть не у всех зон — у `.ru`, `.su`, `.рф` и ряда ccTLD публичного RDAP-сервера нет, команда честно об этом скажет.91- **`ip` и `ports` принимают и хостнейм** — он будет отрезолвлен, и в stderr напечатается, во что именно.92- **SSRF-guard**: приватные, loopback, link-local, reserved и cloud-metadata адреса блокируются — включая случай, когда публичное имя резолвится в 127.0.0.1. Отказ — понятный текст, exit-код 3.93- **Коды выхода**: 0 — ок, 2 — ошибка источника/ввода, 3 — блокировка SSRF-гардом, 4 — rate-limit, 130 — прервано.94- `requests` и `dnspython` используются как быстрый путь, если установлены (оба есть); иначе всё работает на stdlib.9596## Этика и границы9798Инструмент — для проверки **инфраструктуры и контрагентов**: домены, IP, сети, компании, санкционные списки, CVE. Это данные, которые организации публикуют о себе сами (DNS, RDAP, CT-логи, BGP-анонсы, HTTP-заголовки) плюс официальные государственные списки.99100**НЕ для слежки за частными лицами.** Не использовать для составления досье на человека, отслеживания перемещений, поиска домашнего адреса, преследования. `sanctions` — комплаенс-скрининг перед платежом/договором, а не способ «пробить» человека.101102Совпадение по имени в санкционном списке **не является подтверждением личности** — это повод запросить документы (ДР, паспорт, регистрационный номер), а не основание для решения. Юридическую значимость имеет только первоисточник.103104Ничего активного: тут нет сканера портов, брутфорса и эксплуатации. Все данные берутся из чужих публичных API — мы не касаемся исследуемого хоста, кроме одного обычного HTTP-запроса в `headers` (как открыть сайт в браузере).105106## Чего здесь нет107108**Живые карты самолётов, судов и спутников — не в этом скилле.** Они требуют постоянного опроса (поллер каждые N секунд, фоновый демон, хранилище треков), что противоречит философии `osint-recon`: спросил → сходил → напечатал. Вопросы вида «что летает над», «покажи живую карту», «военные борта рядом» — это отдельный фоновый сервис поверх открытых фидов ADS-B/AIS/спутниковых TLE; готового скилла под него в паке нет, поднимается своим демоном под ресурс-гардом.109110Также вне скилла: активное сканирование, парсинг соцсетей, поиск утечек паролей, работа с даркнетом.111112## Разграничение со смежными скиллами113114| Задача | Куда идти |115|--------|-----------|116| Домены, IP, сети, порты, CT, CVE, санкции | **`osint-recon`** (этот) |117| Живая обстановка: самолёты, суда, спутники, события в реальном времени | свой фоновый сервис поверх ADS-B/AIS-фидов — в пак не входит |118| Обогащение лидов, цифровой след компании, квалификация заявок | `account-research` + `social-intel` (готового навыка обогащения в паке нет) |119| Досье по соцсетям, профили людей, KYC по цифровому следу | `social-intel` |120| Проверка контрагентов РФ (ФНС, реквизиты, арбитраж) | свой источник по ИНН/ОГРН (DaData/Checko/kad.arbitr.ru — готового клиента в паке нет) |121| Аудит СВОЕГО кода и инфраструктуры, OWASP, уязвимости в репо | `security-audit`, `threat-hunting` |122| Обезличивание перед публикацией, поиск PII в своих файлах | `privacy-filter` |123| Реклама конкурентов, их креативы | `ad-spy` |