
Utility per annotare dataset Internet con metadati contestuali (es. AS di origine, MaxMind GeoIP2, DNS inverso e WHOIS)
ZAnnotate è un'utilità Go che facilita l'annotazione di grandi set di dati IP con metadati di rete. Al momento include:
| Flag CLI | Descrizione | Necessita API Key | Necessita Download Dati |
|---|---|---|---|
--censys | Intelligence internet Censys (API live) | Sì | |
--cymru | Dettagli ASN di Origine/Peer IP e dettagli ASN Cymru | ||
--geoasn | Dati ASN MaxMind GeoIP | Sì | |
--geoip2 | Dati città e geolocalizzazione MaxMind GeoIP2 | Sì | |
--greynoise | Intelligence sulle minacce Psychic e dati CVE di GreyNoise | Sì (per scaricare) | Sì |
--ipinfo | Dati ASN e geolocalizzazione IPInfo.io | Sì | |
--rdap | Ricerche RDAP (successore di WHOIS) (live) | ||
--rdns | Ricerche DNS inverse (live) | ||
--routing | Dati BGP/Routing da una tabella di routing MRT | Sì | |
--spur | Intelligence Spur (ASN, organizzazione, classificazione infrastruttura, geolocalizzazione) | Sì |
Vai alla configurazione del modulo: Censys · Cymru · GeoASN · GeoIP · GreyNoise · IPInfo.io · RDAP · RDNS/DNS inverso · Routing/BGP · Spur
Puoi usare qualsiasi combinazione degli annotatori; ad esempio ecco insieme DNS inverso e annotazioni IPInfo:
echo "1.1.1.1" | zannotate --rdns --ipinfo --ipinfo-database=./data-snapshots/ipinfo_lite.mmdb
{
"ip":"1.1.1.1",
"ipinfo":{"country":"Australia","country_code":"AU","continent":"Oceania","continent_code":"OC","asn":"AS13335","as_name":"Cloudflare, Inc.","as_domain":"cloudflare.com"},
"rdns":{"domain_names":["one.one.one.one"]}
}
Il flag --help ha maggiori dettagli su ogni annotatore e i suoi flag disponibili
zannotate --help
ZAnnotate può essere installato usando make install
make install
oppure se non hai make installato, puoi usare il seguente comando:
cd cmd/zannotate && go install
In entrambi i casi, questo installerà il binario zannotate nella directory $GOPATH/bin.
Verifica che sia stato installato correttamente con:
zannotate --help
Di default, ZAnnotate si aspetta indirizzi IP delimitati da nuova riga sull'input standard. Ad esempio:
printf "1.1.1.1\n8.8.8.8" | zannotate --rdns
{"ip":"1.1.1.1","rdns":{"domain_names":["one.one.one.one"]}}
{"ip":"8.8.8.8","rdns":{"domain_names":["dns.google"]}}
Potresti voler annotare dati già in formato JSON. In tal caso devi usare il flag --input-file-type=json.
Questo inserirà un campo zannotate nell'oggetto JSON esistente. Ad esempio:
echo '{"ip": "1.1.1.1"}' | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb --input-file-type=json
{"ip":"1.1.1.1","zannotate":{"geoasn":{"asn":13335,"org":"CLOUDFLARENET"},"rdns":{"domain_names":["one.one.one.one"]}}}
Se i tuoi oggetti JSON hanno un campo diverso per l'indirizzo IP rispetto al default ip, puoi specificarlo con il flag --input-ip-field. Ad esempio, se i tuoi oggetti JSON hanno un campo ip_address:
echo '{"ip_address": "1.1.1.1"}' | zannotate --rdns --input-file-type=json --input-ip-field=ip_address
{"ip_address":"1.1.1.1","zannotate":{"rdns":{"domain_names":["one.one.one.one"]}}}
Se i tuoi dati di input sono in formato CSV, puoi usare il flag --input-file-type=csv.
printf "name,ip,date\n cloudflare,1.1.1.1,04-04-26\n google,8.8.8.8,04-04-26" | zannotate --rdns --input-file-type=csv
{"name":" cloudflare","ip":"1.1.1.1","date":"04-04-26","zannotate":{"rdns":{"domain_names":["one.one.one.one"]}}}
{"name":" google","ip":"8.8.8.8","date":"04-04-26","zannotate":{"rdns":{"domain_names":["dns.google"]}}}
Analogamente al JSON, puoi usare il flag --input-ip-field per specificare una colonna diversa da ip che contiene l'indirizzo IP.
printf "name,ip_address,date\n cloudflare,1.1.1.1,04-04-26\n google,8.8.8.8,04-04-26" | zannotate --rdns --input-file-type=csv --input-ip-field=ip_address
{"date":"04-04-26","zannotate":{"rdns":{"domain_names":["dns.google"]}},"name":" google","ip_address":"8.8.8.8"}
{"date":"04-04-26","zannotate":{"rdns":{"domain_names":["one.one.one.one"]}},"name":" cloudflare","ip_address":"1.1.1.1"}
Di default, ZAnnotate legge indirizzi IP delimitati da nuova riga dall'input standard e produce un oggetto JSON per riga sull'output standard come:
echo "1.1.1.1" | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb
{"ip":"1.1.1.1","geoasn":{"asn":13335,"org":"CLOUDFLARENET"},"rdns":{"domain_names":["one.one.one.one"]}}
Se un indirizzo IP non può essere annotato, a causa di un errore o mancanza di dati, ci sarà un campo vuoto per quella annotazione. Ad esempio, se un indirizzo IP è privato e quindi non ha dati RDNS o ASN, l'output sarà simile a:
echo "127.0.0.1" | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb
{"geoasn":{},"rdns":{},"ip":"127.0.0.1"}
Il flag --output-annotation-field può essere usato per specificare un nome di campo diverso per le annotazioni invece di zannotate sia per input CSV che JSON.
Ad esempio usando il tag di output --output-annotation-field="info" con input JSON:
printf "name,ip_address,date\n cloudflare,1.1.1.1,04-04-26\n google,8.8.8.8,04-04-26" | zannotate --rdns --input-file-type=csv --input-ip-field=ip_address --output-annotation-field="info"
{"name":" cloudflare","ip_address":"1.1.1.1","date":"04-04-26","info":{"rdns":{"domain_names":["one.one.one.one"]}}}
{"ip_address":"8.8.8.8","date":"04-04-26","info":{"rdns":{"domain_names":["dns.google"]}},"name":" google"}
[!NOTE] URL e istruzioni potrebbero cambiare nel tempo. Questi sono aggiornati a maggio 2026.
Censys fornisce dati host e di rete a livello Internet, incluse informazioni su quali servizi sono in esecuzione su un IP, quali certificati TLS ha, e altro ancora. Offrono un livello gratuito che permette un numero limitato di query al mese, che può essere usato per arricchire le annotazioni IP con i dati Censys.
[!NOTE] L'account gratuito (ad aprile 2026) permette una singola richiesta concorrente e 100 richieste al mese. Una volta utilizzati tutti i crediti, l'API Censys restituirà un errore per ulteriori richieste fino a quando i crediti non verranno resettati all'inizio del mese successivo o acquisterai crediti aggiuntivi. ZAnnotate terminerà con un errore se ciò accade per evitare errori silenziosi, quindi se hai un set di dati grande da annotare, fai attenzione all'uso dei crediti e dai priorità solo agli IP per cui hai crediti. Con l'account gratuito che offre solo una singola richiesta concorrente, ti conviene lasciare
--censys-threads=1a meno che non paghi per un livello superiore.
echo "8.8.8.8" | zannotate --censys --censys-pat="CENSYS_PAT_HERE"
Risultati troncati per brevità:
{
"ip":"8.8.8.8",
"censys": {
"whois":{
"network":{ "name":"Google LLC","cidrs":["8.8.8.0/24"],"created":"2023-12-28T00:00:00Z","updated":"2023-12-28T00:00:00Z","allocation_type":"ALLOCATION","handle":"GOGL"},
"organization":{"state":"CA","postal_code":"94043","country":"US","tech_contacts":[{"handle":"ZG39-ARIN","name":"Google LLC","email":"[email protected]"}],
"handle":"GOGL","street":"1600 Amphitheatre Parkway","abuse_contacts":[{"handle":"ABUSE5250-ARIN","name":"Abuse","email":"[email protected]"}],
"admin_contacts":[{"handle":"ZG39-ARIN","name":"Google LLC","email":"[email protected]"}],
"name":"Google LLC",
"city":"Mountain View"}},
"services":[{
"port":53,"protocol":"DNS","transport_protocol":"udp","ip":"8.8.8.8","scan_time":"2026-04-10T02:55:53Z"}]}}
Cymru fornisce informazioni ASN e di peering BGP per indirizzi IP. Puoi usare il flag --cymru per interrogare Cymru per queste informazioni.
Cymru ha impostato un servizio DNS per fornire queste informazioni e di default ZAnnotate utilizzerà i resolver DNS di sistema predefiniti per interrogare.
Se riscontri timeout usando il resolver DNS locale, puoi specificare resolver personalizzati con il flag --cymru-dns-servers.
Sono disponibili anche --cymru-threads e --cymru-timeout per configurare le prestazioni delle annotazioni Cymru; i valori predefiniti sono impostati per ottenere buone prestazioni evitando timeout con la maggior parte dei resolver DNS.
Di default, l'annotatore Cymru recupera gli AS di origine e peer, nonché i dettagli AS su tutti gli ASN. Se desideri un sottoinsieme, sono disponibili i seguenti flag:
--cymru-annotate-origin-as, --cymru-annotate-peer-as, e --cymru-annotate-as-details
printf "1.1.1.1" | ./zannotate --cymru --cymru-dns-servers=1.1.1.1,1.0.0.1
{"ip":"207.243.195.103","cymru":{"origin_asns":[7018],"peer_asns":[6939,1299,2914,3257,6461,6762],"asn_details":{"7018":{"asn":7018,"country_code":"US","registry":"arin","asn_allocation_date":"1996-07-30","asn_description":"ATT-INTERNET4 - AT&T Enterprises, LLC, US"},"6939":{"asn":6939,"country_code":"US","registry":"arin","asn_allocation_date":"1996-06-28","asn_description":"HURRICANE - Hurricane Electric LLC, US"},"1299":{"asn":1299,"country_code":"SE","registry":"ripencc","asn_allocation_date":"1993-09-01","asn_description":"TWELVE99 Arelion, fka Telia Carrier, SE"},"2914":{"asn":2914,"country_code":"US","registry":"arin","asn_allocation_date":"1998-12-07","asn_description":"NTT-DATA-2914 - NTT America, Inc., US"},"3257":{"asn":3257,"country_code":"US","registry":"ripencc","asn_allocation_date":"1994-09-30","asn_description""GTT-BACKBONE GTT, US"},"6461":{"asn":6461,"country_code":"US","registry":"arin","asn_allocation_date":"1996-04-22","asn_description":"ZAYO-6461 - Zayo Bandwidth, US"},"6762":{"asn":6762,"country_code":"IT","registry":"ripencc","asn_allocation_date":"1996-09-12","asn_description":"SEABONE-NET TELECOM ITALIA SPARKLE S.p.A., IT"}},"prefix_details":{"207.242.0.0/15":{"prefix":"207.242.0.0/15","origin_asns":[7018],"peer_asns":[1299,2914,3257,6461,6762,6939],"country_code":"US","registry":"arin","allocation_date":"1996-11-01" }}}}
GreyNoise è un feed di intelligence IP che fornisce metadati come la classificazione delle minacce e i CVE associati.
I loro download di dati Psychic forniscono il loro feed dati in un database adatto per l'arricchimento dati offline.
Per usare il loro download con zannotate, ti conviene scaricare un file in formato .mmdb usando la tua chiave API GreyNoise.
Ad aprile 2026, la registrazione con un account gratuito dà accesso ai download di dati.
mmdb. Il comando seguente scarica dati per una singola data (7 aprile 2026). Puoi anche scaricare dati per un intervallo di giorni e per modelli con vari livelli di dettaglio — consulta la documentazione Psychic di GreyNoise documentazione per maggiori dettagli.curl -H "key: GREYNOISE_API_KEY_HERE" \
https://psychic.labs.greynoise.io/v1/psychic/download/2026-04-07/3/mmdb \
-o /tmp/m3.mmdb
[!NOTE] Gli esempi seguenti usano il download esatto dei dati dal comando
curlsopra. I risultati che vedrai dipenderanno dai dati scaricati.
echo "14.1.105.157" | zannotate --greynoise --greynoise-database=/tmp/m3.mmdb
{"greynoise":{"classification":"malicious","cves":["CVE-2015-2051","CVE-2016-20016","CVE-2018-10561","CVE-2018-10562","CVE-2016-6277","CVE-2024-12847"],"date":"2026-04-07","handshake_complete":true,"last_seen":"2026-04-07T00:00:00Z","seen":true,"tags":["Mirai TCP Scanner","Mirai","Telnet Protocol","Generic IoT Default Password Attempt","Web Crawler","Generic Suspicious Linux Command in Request","HNAP Crawler","Telnet Login Attempt","D-Link Devices HNAP SOAPAction Header RCE Attempt","MVPower CCTV DVR RCE CVE-2016-20016 Attempt","JAWS Webserver RCE","GPON CVE-2018-10561 Router Worm","Generic ${IFS} Use in RCE Attempt","CCTV-DVR RCE","NETGEAR Command Injection CVE-2016-6277","NETGEAR DGN setup.cgi CVE-2024-12847 Command Execution Attempt","CGI Script Scanner"],"actor":"unknown"},"ip":"14.1.105.157"}
Nota che molti IP non saranno presenti nel dataset GreyNoise, quindi potresti vedere un output come il seguente:
echo "1.1.1.1" | zannotate --greynoise --greynoise-database=/tmp/m3.mmdb
{"ip":"1.1.1.1","greynoise":{}}
IPInfo.io fornisce un dataset gratuito che include dati ASN e geolocalizzazione, limitati al livello di paese. I livelli a pagamento forniscono dati di geolocalizzazione più granulari.
mmdb

echo "1.1.1.1" | zannotate --ipinfo --ipinfo-database=./path-to-ipinfo-db.mmdb
{"ip":"1.1.1.1","ipinfo":{"country":"Australia","country_code":"AU","continent":"Oceania","continent_code":"OC","asn":"AS13335","as_name":"Cloudflare, Inc.","as_domain":"cloudflare.com"}}
MaxMind fornisce dataset per geolocalizzazione IP e dati ASN sia in versione gratuita (GeoLite) che a pagamento (GeoIP). Inoltre, sia i dataset GeoLite che GeoIP sono disponibili in due modalità di accesso: un file di database scaricabile che può essere interrogato localmente e un'API web. Il modulo GeoIP in ZAnnotate supporta il database locale sia per le versioni GeoLite che GeoIP.
Quanto segue presuppone che tu voglia usare i dataset gratuiti GeoLite, ma il processo è simile per i dati GeoIP a pagamento.

.mmdb da qualche parte e testa con quanto segue.echo "171.67.71.209" | zannotate --geoip2 --geoip2-database=./path-to-geolite2.mmdb
{
"ip":"171.67.71.209",
"geoip2":{
"city":{"name":"Vallejo","id":5405380},
"country":{"name":"United States","code":"US","id":6252001},
"continent":{"name":"North America","code":"NA","id":6255149},
"postal":{"code":"94590"},
"latlong":{"accuracy_radius":50,"latitude":38.1043,"longitude":-122.2442,"metro_code":807,"time_zone":"America/Los_Angeles"},
"represented_country":{},
"registered_country":{"name":"United States","code":"US","id":6252001},
"metadata":{}}
}
echo "171.67.71.209" | zannotate --geoasn --geoasn-database=/path-to-asn-file.mmdb
{"ip":"171.67.71.209","geoasn":{"asn":32,"org":"STANFORD"}}
RDAP (Registration Data Access Protocol) è un protocollo utilizzato per accedere ai dati di registrazione per risorse Internet come indirizzi IP e nomi di dominio ed è il successore di WHOIS. ZAnnotate può interrogare i server RDAP per ottenere i dati di registrazione per gli IP.
echo "1.1.1.1" | zannotate --rdap
Risultati troncati per brevità:
{
"ip":"1.1.1.1",
"whois": {
"DecodeData": {},
"Lang": "",
"Conformance": [
"history_version_0",
"nro_rdap_profile_0",
"cidr0",
"rdap_level_0"
],
"ObjectClassName": "ip network"
}
}
Questo dovrebbe darti lo stesso output di una query diretta a un server RDAP, ad esempio:
rdap 1.1.1.1
IP Network:
Handle: 1.1.1.0 - 1.1.1.255
Start Address: 1.1.1.0
End Address: 1.1.1.255
IP Version: v4
Name: APNIC-LABS
Type: ASSIGNED PORTABLE
...<ulteriore output troncato per brevità>
ZAnnotate può eseguire ricerche DNS inverse per ogni indirizzo IP. Non è richiesto alcun download di dati, --rdns interroga direttamente i server DNS live.
printf "1.1.1.1\n8.8.8.8" | zannotate --rdns
{"ip":"1.1.1.1","rdns":{"domain_names":["one.one.one.one"]}}
{"ip":"8.8.8.8","rdns":{"domain_names":["dns.google"]}}
Se un IP non ha un record PTR, il campo rdns sarà vuoto:
echo "127.0.0.1" | zannotate --rdns
{"ip":"127.0.0.1","rdns":{}}
2025.09)RIBS/rib.20250923.1200.bz2)bzip2 -d ./path-to-downloaded-file/rib.20250923.1200.bz2
echo "1.1.1.1" | zannotate --routing --routing-mrt-file=/tmp/rib.20250923.1200
{"ip":"1.1.1.1","routing":{"prefix":"1.1.1.0/24","asn":13335,"path":[3561,209,3356,13335]}}
spur.us fornisce intelligence per IP quali ASN e organizzazione, classificazione dell'infrastruttura (es. datacenter, CDN, mobile) e metadati di geolocalizzazione. Possiamo interrogare spur.us insieme ad altre fonti per arricchire le annotazioni e aiutare a identificare deploy in datacenter/Anycast, CDN e proprietà ISP.
export SPUR_API_KEY=your_api_key_here
(Se vuoi renderla permanente, aggiungi la riga sopra al tuo profilo shell, es. ~/.bashrc o ~/.zshrc)
echo "1.1.1.1" | zannotate --spur
{"ip":"1.1.1.1","spur":{"as":{"number":13335,"organization":"Cloudflare, Inc."},"infrastructure":"DATACENTER","ip":"1.1.1.1","location":{"city":"Anycast","country":"ZZ","state":"Anycast"},"organization":"Taguchi Digital Marketing System"}}