
Panthera(P.)uncia - Официальная CLI-утилита для Subdomain Center & Exploit Observer.
Puncia — официальный клиент командной строки для двух разведывательных API A.R.P. Syndicate: укажите домен, бренд или идентификатор уязвимости и получите структурированный JSON за считанные секунды, без необходимости открывать браузер:
$ puncia subdomain arpsyndicate.io
╭──────────────────────────────────────────────────────────────────────╮
│ Panthera(P.)uncia v0.38 │
│ subdomain recon · brand impersonation · exploit intel · sbom analysis│
│ A.R.P. Syndicate — https://www.arpsyndicate.io │
╰──────────────────────────────────────────────────────────────────────╯
[
"advisories.arpsyndicate.io",
"asm.arpsyndicate.io",
"blog.arpsyndicate.io",
...
]
$ puncia sbom bom.json ./out
puncia ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% (128/128) 0:00:41
Обратите внимание: хотя эти результаты иногда могут быть довольно неточными и ненадёжными, они могут сильно различаться со временем благодаря возможностям самообучения.
Агрессивных ограничений скорости можно избежать с помощью API-ключа: https://www.arpsyndicate.io/pricing.html
pip3 install punciapip3 install .pip3 install puncia
# subdomain footprint of a target (shadow IT / attack surface / takeover recon)
puncia subdomain example.com
# lookalike / typosquat / brand-impersonation domains
puncia replica example.com
# what's known about a CVE
puncia exploit CVE-2021-44228
puncia <mode> <query> [output] [--match M] [--domain D] [--limit N] [--offset N]
[--crawl] [--api-key K] [--concurrency N]
[--timeout S] [--retries N] [--quiet]
Запустите puncia --help для полной справки. Результаты выводятся в stdout;
баннер, индикаторы выполнения, предупреждения и ошибки направляются в stderr, поэтому
puncia subdomain example.com > out.json всегда даёт чистый, валидный JSON.
Коды выхода: 0 успех · 1 ошибка запроса или ввода · 2 ошибка использования.
(ПЛАТНО) Сохранить API-ключ (storekey) - puncia storekey <api-key>
~/.puncia с правами 0600. $PUNCIA_API_KEY переопределяет его,
что обычно и нужно в CI.(FREEMIUM) Запрос доменов, сгруппированных по домену (движок subdomain / cuttlefish) - puncia subdomain <domain> <output-file>
subdomain/replica/keyword проходят все страницы и объединяют
их за вас. Передайте --offset (с --limit или без него), чтобы вместо этого получить ровно
одну сырую страницу самостоятельно, например для возобновляемого или потокового обхода:
puncia subdomain bigco.com --limit 50000 --offset 0
# stderr prints: note: more results available — continue with --offset 50000
puncia subdomain bigco.com --limit 50000 --offset 50000
import asyncio
import puncia
async def main():
# Without an API key (ratelimited)
print(await puncia.query_api("exploit", "CVE-2021-3450"))
print(await puncia.query_api("subdomain", "arpsyndicate.io"))
# With an API key
await puncia.store_key("ARPS-xxxxxxxxxx")
api_key = await puncia.read_key()
print(await puncia.query_api("subdomain", "arpsyndicate.io", apikey=api_key))
print(await puncia.query_api("replica", "arpsyndicate.io", match="exact", apikey=api_key))
print(await puncia.query_api("enrich", "CVE-2021-3450", apikey=api_key))
print(await puncia.query_api("noncve", "exploitable", apikey=api_key))
# Static endpoints (unauthenticated, unlimited)
print(await puncia.query_api("subdomain", "^HEALTH"))
print(await puncia.query_api("exploit", "^STATS"))
# Live crawl, with the outcome surfaced via a callback
await puncia.query_api(
"subdomain", "bigco.com", apikey=api_key, crawl=True,
on_crawl=lambda h: print("crawl status:", h.get("X-Crawl-Status")),
)
# Write straight to disk
await puncia.query_api("subdomain", "arpsyndicate.io", "out.json", apikey=api_key)
asyncio.run(main())
При сбоях возникает puncia.PunciaError; пустой результат ({} / []) возвращается
как есть, а не трактуется как ошибка. Переиспользуйте одну сессию для множества
запросов, передавая session= и общий limiter=, точно так же, как
это делает process_bulk().
from puncia import PunciaError, query_api
try:
data = await query_api("exploit", "CVE-2021-3450", apikey=api_key)
except PunciaError as exc:
print(f"lookup failed: {exc}")
git clone https://github.com/ARPSyndicate/puncia && cd puncia
pip install --upgrade pip # editable installs need pip >= 21.3
pip install -e ".[dev]"
pytest # 42 offline tests, no API calls or network access
Набор тестов полностью офлайн — он охватывает построение URL, изоляцию выходных путей, разбор SBOM, планирование массовых операций и тайминг ограничителя скорости без обращения к сети, поэтому его безопасно запускать в любом окружении.
--limit--offset--crawl дополняет сохранённые результаты
проходом живого обнаружения. Конкретный домен фактически повторно обходится
только раз в ~6 ч — запросы внутри этого окна мгновенно получают кэшированный результат обхода.
Puncia сообщает результат в stderr:
crawl: fresh, 12 newly discovered name(s) (также partial / cooldown /
disabled).
puncia subdomain bigco.com --crawl
(FREEMIUM) Запрос доменов-реплик, сгруппированных по бренду (движок replica / octopus) - puncia replica <domain> --match <prefix|exact|substring> <output-file>
(FREEMIUM) Запрос по ключевому слову, сгруппированный по ключевому слову (движок keyword / ammonites) - puncia keyword <keyword> --match <exact|prefix> <output-file>
--domain:
puncia keyword blog --domain bandcamp.comЗапрос идентификаторов эксплойтов и уязвимостей (exploit)
puncia exploit ^WATCHLIST_IDES <output-file>puncia exploit ^WATCHLIST_INFO <output-file>puncia exploit ^WATCHLIST_TECH <output-file>puncia exploit ^STATS <output-file>puncia exploit ^HEALTH <output-file>puncia exploit <eoidentifier> --match <substring|prefix|exact> <output-file>(FREEMIUM) Обогащение идентификаторов CVE/GHSA (enrich) - puncia enrich <cve-id/ghsa-id> <output-file>
enrich=true действует только для идентификаторов CVE-/GHSA-; он объединяет
полную запись вышестоящего бюллетеня с оценкой EPSS + VEDAS.(ПЛАТНО) Идентификаторы не-CVE по группе VEDAS (noncve) - puncia noncve <browser/china/russia/europe/exploitable> <output-file>
(БЕСПЛАТНО) Состояние сервиса Subdomain Center (^HEALTH) - puncia subdomain ^HEALTH <output-file>
Множественные запросы (bulk/sbom)
puncia bulk <json-file> <output-directory>
{
"subdomain": [
"domainA.com",
"domainB.com"
],
"replica": [
"domainA.com",
"domainB.com"
],
"keyword": [
"keywordA",
"keywordB"
],
"exploit": [
"eoidentifierA",
"eoidentifierB"
],
"enrich": [
"eoidentifierA",
"eoidentifierB"
]
}
puncia sbom <json-file> <output-directory>Массовые запуски и запуски SBOM дедуплицируют запросы, ограничивают параллелизм значением --concurrency
(по умолчанию 10) и — при отсутствии API-ключа — автоматически задают темп запросов, чтобы оставаться в рамках
бюджета бесплатного уровня.
(FREEMIUM) Внешний импорт