
WhoIs Reverso Pivotável / Fusão PDNS com Rastreamento do Titular e Alertas, além de API para consultas automatizadas (JSON/CSV/TXT)
NOTA: Durante o desenvolvimento do PyDat 5, as operações internas mudaram de direção, levando à aposentadoria do projeto PyDat. Embora muito trabalho tenha sido feito para finalizar as capacidades do PyDat 5, algumas capacidades ainda não foram totalmente testadas.
O projeto WhoDat é uma interface para dados whoisxmlapi, ou qualquer dado whois armazenado no ElasticSearch. Ele integra dados whois, resoluções IP atuais e DNS passivo. Além de fornecer um aplicativo interativo e pivotável para analistas realizarem pesquisas, também possui uma API que permite saída em formato JSON.
WhoDat foi originalmente escrito por Chris Clark. A implementação original está em PHP e está disponível neste repositório no diretório legacy_whodat. O código foi reescrito do zero por Wesley Shields e Murad Khan em Python, e está disponível no diretório pydat.
A versão PHP é deixada para quem quiser executá-la, mas não é tão completa ou extensível quanto a implementação Python, e não é suportada.
Para mais informações sobre a implementação PHP, consulte o readme. Para mais informações sobre a implementação Python, continue lendo...
pyDat é uma implementação em Python do código WhoDat de Chris Clark. Ela foi projetada para ser mais extensível e possui mais recursos do que a implementação PHP.
pyDat é um aplicativo Python 3.6+ que requer o seguinte para ser executado:
Para ajudar a preencher corretamente o banco de dados, um programa chamado pydat-populator é fornecido para auto-povoar os dados.
Observe que os dados provenientes de whoisxmlapi parecem nem sempre ser consistentes, portanto, deve-se ter cuidado ao ingerir dados.
Mais testes precisam ser feitos para garantir que todos os dados sejam ingeridos corretamente.
Qualquer pessoa que configure seu banco de dados deve ler as flags disponíveis para o script antes de executá-lo para garantir que o ajustou para sua configuração.
A seguir está a saída de 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
Observe que ao adicionar uma nova versão de dados ao banco de dados, você deve usar a flag -x para excluir certos campos que não são importantes para rastrear alterações, ou a flag -n para incluir campos específicos que estão sujeitos a escrutínio. Isso diminuirá significativamente a quantidade de dados armazenados entre versões. Você só pode usar -x ou -n, não ambos ao mesmo tempo, mas pode escolher o que for melhor para seu ambiente. Por exemplo, se você receber atualizações diárias, pode decidir que nas atualizações diárias só se importa se contactEmail mudar, mas a cada trimestre pode querer excluir apenas certos campos que considera menos importantes.
Para economizar tempo no uso repetitivo de flags, pydat-populator aceita um arquivo de configuração. Consulte o arquivo de configuração de exemplo para um exemplo de como criar um arquivo de configuração.
pyDat não fornece dados por conta própria. Você deve fornecer seus próprios dados whois em um armazenamento de dados ElasticSearch.
pydat-populator -u localhost:9200 -f ~/whois/data/1.csv -v -s -x Audit_auditUpdatedDate,updatedDate,standardRegUpdatedDate,expiresDate,standardRegExpiresDate
PyDat 5 é um aplicativo com backend/frontend separados que utiliza Python Flask para fornecer uma API REST e ReactJS para fornecer uma interface web interativa. A maneira mais fácil de usar o aplicativo é construir uma imagem docker.
cd pydat/
docker build -t mitrecnd/pydat:5
A imagem criada compilará e instalará os componentes do frontend no backend, permitindo a implantação do aplicativo completo.
O aplicativo pode então ser implantado criando um arquivo de configuração de implantação 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
Gere um arquivo de configuração copiando o arquivo config_example.py como config.py para o mesmo diretório do arquivo docker-compose.yml.
O backend Python também pode ser instalado usando pip. Isso é útil se você deseja executar nativamente a capacidade de população de dados. Observe que isso não contém nenhum componente frontend, pois eles não vêm pré-compilados. Consulte o dockerfile se desejar compilar e instalar manualmente o frontend.
cd pydat/backend/
pip install ./
A instalação do pacote fornecerá acesso ao programa pydat-populator mencionado acima.
PyDat 5 introduz uma API REST atualizada, mas mantém um conjunto de endpoints v1 para aproximar a saída que seria retornada pelo Pydat 4. Devido a algumas mudanças estruturais entre pyDat 4 e 5, a saída não será exatamente a mesma.
v1Os seguintes endpoints estão expostos:
api/v1/metadata/
api/v1/metadata/<version>/
O endpoint de metadados retorna metadados disponíveis para os dados no banco de dados. Especificar uma versão retornará os metadados para essa versão específica.
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>/
O endpoint de domínio permite obter informações sobre um nome de domínio específico. Por padrão, ele retornará informações para qualquer versão de um domínio encontrada no banco de dados. Você pode especificar mais informações para obter versões específicas das informações do domínio ou para obter a entrada mais recente. Você também pode obter uma diferença (diff) entre duas versões de um domínio para ver o que mudou.
api/v1/domains/<searchKey>/<searchValue>/
api/v1/domains/<searchKey>/<searchValue>/latest/
api/v1/domains/<searchKey>/<searchValue>/<version>/
api/v1/domains/<searchKey>/<searchValue>/<version1>/<version2>/
O endpoint de domínios permite pesquisar domínios baseados em uma chave especificada. Atualmente, as seguintes chaves são suportadas:
domainName
registrant_name
contactEmail
registrant_telephone
Similar ao endpoint de domínio, você pode especificar quais versões dos dados está procurando.
Exemplos de Consultas:
curl http://pydat.myorg.domain/ajax/domain/google.com/latest/
curl http://pydat.myorg.domain/ajax/domains/domainName/google.com/
api/v1/query
Este endpoint aceita 4 parâmetros via requisição GET:
query - A consulta para pesquisar no ES
size - O número de elementos a retornar (tamanho da página)
page - A página a retornar, combinando com size você pode obter os resultados em blocos
unique - Tenta retornar a entrada mais recente por domainName
Nota sobre o parâmetro unique: Se você estiver usando o parâmetro unique, lembre-se que a paginação dos resultados é desabilitada, mas o parâmetro size ainda será usado para controlar o número de resultados retornados.
v2Os seguintes endpoints estão expostos:
api/v2/metadata
api/v2/metadata/<version>
Estes endpoints são similares aos seus equivalentes v1, mas seu formato de resposta difere.
api/v2/resolve/<domain>
Este é um novo endpoint que permite resolver um nome de domínio para endereços IP. Observe que esta capacidade pode ser desabilitada pelo backend. Faça uma chamada ao endpoint /settings para garantir que esta capacidade está habilitada antes de chamá-lo.
api/v2/domains/diff [POST]
Este endpoint permite obter uma diferença (diff) entre duas versões de um domínio para ver o que mudou. Ele espera uma requisição JSON com o seguinte formato:
{
domain: "mydomain.example",
version1: 1,
version2: 2
}
api/v2/domain [POST]
Este endpoint retorna informações para um nome de domínio específico e espera uma requisição JSON com o seguinte formato:
{
value: "mydomain.example",
version: 1, # Opcional
chunk_size: 50, # Opcional
offset: 0 # Opcional
}
api/v2/query [POST]
Este endpoint suporta a capacidade de sintaxe de consulta 'avançada'. Ele espera uma requisição JSON com o seguinte formato:
{
query: "myquery",
chunk_size: 50, # Opcional
offset: 0, # Opcional
unique: false, # Opcional
sort_keys: [ # Opcional
"domainName",
"registrant_name",
"contactEmail",
"standardRegCreatedDate",
"registrant_telephone",
"dataVersion",
"_score",
]
}
api/v2/info
Este endpoint fornece informações de saúde sobre o cluster Elastic.
api/v2/settings
Este endpoint é usado principalmente pelo frontend para determinar dinamicamente quais capacidades estão habilitadas pelo aplicativo backend.
Infelizmente, devido a mudanças estruturais na forma como os dados são armazenados no Elastic, pyDat 5 não é compatível com versões anteriores do pydat 4. Isso significa que os dados precisarão ser ingeridos novamente em um cluster ElasticSearch para serem usados com pyDat 5.
pyDat é protegido por direitos autorais da The MITRE Corporation 2021.
A implementação PHP é protegida por direitos autorais de Chris Clark, 2013. Contate-o em [email protected].
As versões PHP e Python são licenciadas sob a mesma licença.
pyDat é software livre: você pode redistribuí-lo e/ou modificá-lo sob os termos da GNU General Public License conforme publicada pela Free Software Foundation, seja na versão 3 da Licença, ou (a seu critério) qualquer versão posterior.
pyDat é distribuído na esperança de que seja útil, mas SEM NENHUMA GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM. Consulte a GNU General Public License para mais detalhes.
Você deve ter recebido uma cópia da GNU General Public License junto com o pyDat. Caso contrário, veja http://www.gnu.org/licenses/.
Aprovado para Divulgação Pública; Distribuição Ilimitada 14-1633