
Pivotable Reverse WhoIs / PDNS Fusion con Registrant Tracking e Alerting più API per query automatizzate (JSON/CSV/TXT)
NOTA: Durante lo sviluppo di PyDat 5, le operazioni interne hanno cambiato direzione, portando al ritiro del progetto PyDat. Sebbene gran parte del lavoro sia stato fatto per finalizzare le capacità di PyDat 5, alcune capacità rimangono non completamente testate.
Il progetto WhoDat è un'interfaccia per i dati whoisxmlapi, o per qualsiasi dato whois presente in ElasticSearch. Integra dati whois, risoluzioni IP correnti e DNS passivo. Oltre a fornire un'applicazione interattiva e orientabile per gli analisti per effettuare ricerche, dispone anche di un'API che consente l'output in formato JSON.
WhoDat è stato originariamente scritto da Chris Clark. L'implementazione originale è in PHP ed è disponibile in questo repository nella directory legacy_whodat. Il codice è stato riscritto da zero da Wesley Shields e Murad Khan in Python, ed è disponibile nella directory pydat.
La versione PHP è lasciata per coloro che vogliono eseguirla, ma non è completa o estensibile come l'implementazione Python, e non è supportata.
Per maggiori informazioni sull'implementazione PHP, consulta il readme. Per maggiori informazioni sull'implementazione Python, continua a leggere...
pyDat è un'implementazione Python del codice WhoDat di Chris Clark. È progettato per essere più estensibile e ha più funzionalità rispetto all'implementazione PHP.
pyDat è un'applicazione Python 3.6+ che richiede quanto segue per essere eseguita:
Per aiutare a popolare correttamente il database, viene fornito un programma chiamato pydat-populator per popolare automaticamente i dati. Nota che i dati provenienti da whoisxmlapi non sembrano essere sempre coerenti, quindi è necessario prestare attenzione durante l'importazione dei dati. Sono necessari ulteriori test per garantire che tutti i dati vengano importati correttamente. Chiunque configuri il proprio database dovrebbe leggere i flag disponibili per lo script prima di eseguirlo per assicurarsi di averlo adattato alla propria configurazione. Di seguito è riportato l'output di pydat-populator -h:
usage: pydat-populator [-h] [-c CONFIG] [--debug] [--debug-level DEBUG_LEVEL]
[-x EXCLUDE [EXCLUDE ...]] [-n INCLUDE [INCLUDE ...]]
[--ignore-field-prefixes [IGNORE_FIELD_PREFIXES [IGNORE_FIELD_PREFIXES ...]]]
[-e EXTENSION] [-v] [-s] [--pipelines PIPELINES]
[--shipper-threads SHIPPER_THREADS]
[--fetcher-threads FETCHER_THREADS]
[--bulk-ship-size BULK_SHIP_SIZE]
[--bulk-fetch-size BULK_FETCH_SIZE]
[-u [ES_URI [ES_URI ...]]] [--es-user ES_USER]
[--es-pass ES_PASSWORD] [--cacert ES_CA_CERT]
[--es-disable-sniffing] [-p ES_INDEX_PREFIX]
[--rollover-size ES_ROLLOVER_DOCS] [--ask-pass]
[-r | --config-template-only | --clear-interrupted-flag]
[-f INGEST_FILE | -d INGEST_DIRECTORY] [-D INGEST_DAY]
[-o COMMENT]
optional arguments:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
location of configuration file for
environmentparameter configuration (example yaml file
in /backend)
--debug Enables debug logging
--debug-level DEBUG_LEVEL
Debug logging level [0-3] (default: 1)
-x EXCLUDE [EXCLUDE ...], --exclude EXCLUDE [EXCLUDE ...]
list of keys to exclude if updating entry
-n INCLUDE [INCLUDE ...], --include INCLUDE [INCLUDE ...]
list of keys to include if updating entry (mutually
exclusive to -x)
--ignore-field-prefixes [IGNORE_FIELD_PREFIXES [IGNORE_FIELD_PREFIXES ...]]
list of fields (in whois data) to ignore when
extracting and inserting into ElasticSearch
-e EXTENSION, --extension EXTENSION
When scanning for CSV files only parse files with
given extension (default: csv)
-v, --verbose Be verbose
-s, --stats Print out Stats after running
-r, --redo Attempt to re-import a failed import or import more
data, uses stored metadata from previous run
--config-template-only
Configure the ElasticSearch template and then exit
--clear-interrupted-flag
Clear the interrupted flag, forcefully (NOT
RECOMMENDED)
-f INGEST_FILE, --file INGEST_FILE
Input CSV file
-d INGEST_DIRECTORY, --directory INGEST_DIRECTORY
Directory to recursively search for CSV files --
mutually exclusive to '-f' option
-D INGEST_DAY, --ingest-day INGEST_DAY
Day to use for metadata, in the format 'YYYY-MM-dd',
e.g., '2021-01-01'. Defaults to todays date, use
'YYYY-MM-00' to indicate a quarterly ingest, e.g.,
2021-04-00
-o COMMENT, --comment COMMENT
Comment to store with metadata
Performance Options:
--pipelines PIPELINES
Number of pipelines (default: 2)
--shipper-threads SHIPPER_THREADS
How many threads per pipeline to spawn to send bulk ES
messages. The larger your cluster, the more you can
increase this, defaults to 1
--fetcher-threads FETCHER_THREADS
How many threads to spawn to search ES. The larger
your cluster, the more you can increase this, defaults
to 2
--bulk-ship-size BULK_SHIP_SIZE
Size of Bulk Elasticsearch Requests (default: 10)
--bulk-fetch-size BULK_FETCH_SIZE
Number of documents to search for at a time (default:
50), note that this will be multiplied by the number
of indices you have, e.g., if you have 10
pydat-<number> indices it results in a request for 500
documents
Elasticsearch Options:
-u [ES_URI [ES_URI ...]], --es-uri [ES_URI [ES_URI ...]]
Location(s) of ElasticSearch Server (e.g.,
foo.server.com:9200) Can take multiple endpoints
--es-user ES_USER Username for ElasticSearch when Basic Auth is enabled
--es-pass ES_PASSWORD
Password for ElasticSearch when Basic Auth is enabled
--cacert ES_CA_CERT Path to a CA Certicate bundle to enable https support
--es-disable-sniffing
Disable ES sniffing, useful when ssl
hostnameverification is not working properly
-p ES_INDEX_PREFIX, --index-prefix ES_INDEX_PREFIX
Index prefix to use in ElasticSearch (default: pydat)
--rollover-size ES_ROLLOVER_DOCS
Set the number of documents after which point a new
index should be created, defaults to 50 million, note
that this is fuzzy since the index count isn't
continuously updated, so should be reasonably below 2
billion per ES shard and should take your ES
configuration into consideration
--ask-pass Prompt for ElasticSearch password
Nota che quando si aggiunge una nuova versione dei dati al database, si dovrebbe usare il flag -x per escludere determinati campi che non sono importanti per tenere traccia delle modifiche, oppure il flag -n per includere campi specifici soggetti a controllo. Ciò ridurrà significativamente la quantità di dati memorizzati tra le versioni. Puoi usare solo -x o -n, non entrambi contemporaneamente, ma puoi scegliere quello più adatto al tuo ambiente. Ad esempio, se ricevi aggiornamenti giornalieri, potresti decidere che per gli aggiornamenti giornalieri ti interessa solo se contactEmail cambia, ma ogni trimestre potresti invece voler escludere solo alcuni campi che non ritieni importanti.
Per risparmiare tempo sull'uso ripetitivo dei flag, pydat-populator accetta un file di configurazione. Consulta il config di esempio per un esempio di come creare un file di configurazione.
pyDat non fornisce alcun dato da solo. Devi fornire i tuoi dati whois in un archivio dati ElasticSearch.
pydat-populator -u localhost:9200 -f ~/whois/data/1.csv -v -s -x Audit_auditUpdatedDate,updatedDate,standardRegUpdatedDate,expiresDate,standardRegExpiresDate
PyDat 5 è un'applicazione suddivisa in backend/frontend che utilizza Python Flask per fornire un'API REST e ReactJS per fornire un'interfaccia utente web interattiva. Il modo più semplice per usare l'app è creare un'immagine docker.
cd pydat/
docker build -t mitrecnd/pydat:5
L'immagine creata compilerà e installerà i componenti frontend nel backend, consentendo il deployment dell'app completa.
L'app può quindi essere distribuita creando un file di configurazione del deployment e usando docker-compose:
version: '3'
services:
pydat:
image: mitrecnd/pydat:5
volumes:
- "./config.py:/opt/pydat/config.py:ro"
ports:
- 127.0.0.1:8888:8888
Genera un file di configurazione copiando il file config_example.py come config.py nella stessa directory del file docker-compose.yml.
Il backend Python può anche essere installato usando pip. Questo è utile se vuoi eseguire nativamente la funzionalità di popolamento dei dati. Nota che questo non contiene alcun componente frontend poiché non vengono pre-compilati. Fai riferimento al dockerfile se desideri compilare e installare manualmente il frontend.
cd pydat/backend/
pip install ./
L'installazione del pacchetto ti darà accesso al programma pydat-populator menzionato sopra.
PyDat 5 introduce un'API REST aggiornata ma mantiene un insieme di endpoint API v1 per approssimare l'output che sarebbe stato restituito da Pydat 4. A causa di alcuni cambiamenti strutturali tra pyDat 4 e 5, l'output non sarà esattamente lo stesso.
v1I seguenti endpoint sono esposti:
api/v1/metadata/
api/v1/metadata/<version>/
L'endpoint metadata restituisce i metadati disponibili per i dati nel database. Specificare una versione restituirà i metadati per quella versione specifica.
api/v1/domain/<domainName>/
api/v1/domain/<domainName>/latest/
api/v1/domain/<domainName>/<version>/
api/v1/domain/<domainName>/<version1>/<version2>/
api/v1/domain/<domainName>/diff/<version1>/<version2>/
L'endpoint domain ti consente di ottenere informazioni su un nome di dominio specifico. Per impostazione predefinita, restituirà informazioni per qualsiasi versione di un dominio trovato nel database. Puoi specificare più informazioni per ottenere versioni specifiche delle informazioni sul dominio o per ottenere l'ultima voce. Puoi anche ottenere un diff tra due versioni di un dominio per vedere cosa è cambiato.
api/v1/domains/<searchKey>/<searchValue>/
api/v1/domains/<searchKey>/<searchValue>/latest/
api/v1/domains/<searchKey>/<searchValue>/<version>/
api/v1/domains/<searchKey>/<searchValue>/<version1>/<version2>/
L'endpoint domains ti consente di cercare domini in base a una chiave specificata. Attualmente sono supportate le seguenti chiavi:
domainName
registrant_name
contactEmail
registrant_telephone
Simile all'endpoint domain, puoi specificare quali versioni dei dati stai cercando.
Query di esempio:
curl http://pydat.myorg.domain/ajax/domain/google.com/latest/
curl http://pydat.myorg.domain/ajax/domains/domainName/google.com/
api/v1/query
Questo endpoint accetta 4 parametri tramite una richiesta GET:
query - La query con cui cercare ES
size - Il numero di elementi da restituire (dimensione della pagina)
page - La pagina da restituire, combinandola con size puoi ottenere i risultati a blocchi
unique - Tenta di restituire l'ultima voce per domainName
Nota sul parametro unique: Se stai usando il parametro unique, nota che l'impaginazione dei risultati è disabilitata, ma il parametro size verrà comunque utilizzato per controllare il numero di risultati restituiti.
v2I seguenti endpoint sono esposti:
api/v2/metadata
api/v2/metadata/<version>
Questi endpoint sono simili alle loro controparti v1 ma il formato della risposta differisce.
api/v2/resolve/<domain>
Questo è un nuovo endpoint che ti consente di risolvere un nome di dominio in indirizzi IP. Nota che questa funzionalità può essere disabilitata dal backend. Effettua una chiamata all'endpoint /settings per assicurarti che questa funzionalità sia abilitata prima di chiamarlo.
api/v2/domains/diff [POST]
Questo endpoint ti consente di ottenere un diff tra due versioni di un dominio per vedere cosa è cambiato. Si aspetta una richiesta JSON con la seguente forma:
{
domain: "mydomain.example",
version1: 1,
version2: 2
}
api/v2/domain [POST]
Questo endpoint restituisce informazioni per un dato nome di dominio e si aspetta una richiesta JSON con la seguente forma:
{
value: "mydomain.example",
version: 1, # Optional
chunk_size: 50, # Optional
offset: 0 # Optional
}
api/v2/query [POST]
Questo endpoint supporta la funzionalità di sintassi di query 'avanzata'. Si aspetta una richiesta JSON con la seguente forma:
{
query: "myquery",
chunk_size: 50, # Optional
offset: 0, #Optional
unique: false, # Optional
sort_keys: [ # Optional
"domainName",
"registrant_name",
"contactEmail",
"standardRegCreatedDate",
"registrant_telephone",
"dataVersion",
"_score",
]
}
api/v2/info
Questo endpoint fornisce informazioni sullo stato del cluster Elastic.
api/v2/settings
Questo endpoint è principalmente utilizzato dal frontend per determinare dinamicamente quali funzionalità sono abilitate dall'applicazione backend.
Sfortunatamente, a causa di cambiamenti strutturali nel modo in cui i dati vengono memorizzati in Elastic, pyDat 5 non è compatibile con le versioni precedenti di pydat 4. Ciò significa che i dati dovranno essere nuovamente importati in un cluster ElasticSearch per essere utilizzati con pyDat 5.
pyDat è protetto da copyright di The MITRE Corporation 2021.
L'implementazione PHP è protetta da copyright di Chris Clark, 2013. Contattalo all'indirizzo [email protected].
Le versioni PHP e Python sono concesse in licenza con la stessa licenza.
pyDat è software libero: puoi ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License come pubblicata dalla Free Software Foundation, versione 3 della Licenza, o (a tua scelta) qualsiasi versione successiva.
pyDat è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO. Vedi la GNU General Public License per maggiori dettagli.
Dovresti aver ricevuto una copia della GNU General Public License insieme a pyDat. Se non è così, vedi http://www.gnu.org/licenses/.
Approved for Public Release; Distribution Unlimited 14-1633