
Um poderoso framework de reconhecimento de alvos alimentado por teoria dos grafos.
O projeto foi movido para um monorepositório. Veja https://github.com/pownjs/pown para mais informações.
Recon é um framework de reconhecimento de alvos baseado em grafos de conhecimento. Usar grafos de conhecimento em vez de representação em tabela plana facilita encontrar as relações entre diferentes tipos de informação, o que é muito útil em muitas situações. Os algoritmos de grafos de conhecimento também ajudam na comparação (diffing), busca, encontrar o caminho mais curto e muitas outras tarefas úteis para auxiliar a descoberta de informações e coleta de inteligência.
Esta ferramenta faz parte da iniciativa de código aberto do secapps.com.```
/ | / | /_\ | _ \ _ / |
_ \ | ( / _ | / /_
|/__// __| || |___/
https://secapps.com
> **NB**: Recon é o resultado de uma cópia quase direta da excelente ferramenta [Recon](https://recon.secapps.com) da SecApps.
## Início Rápido
Esta ferramenta deve ser usada como parte do [Pown.js](https://github.com/pownjs/pown), mas pode ser invocada separadamente como uma ferramenta independente.
Instale o Pown primeiro como de costume:```sh
$ npm install -g pown@latest
Instalar recon:```sh $ pown modules install @pown/recon
Invoque diretamente do Pown:```sh
$ pown recon
Instale este módulo localmente a partir da raiz do seu projeto:```sh $ npm install @pown/recon --save
Depois de concluído, invoque o pown cli:```sh
$ POWN_ROOT=. ./node_modules/.bin/pown-cli recon
Você também pode usar o pown global para invocar a ferramenta localmente:```sh $ POWN_ROOT=. pown recon
## Uso como Biblioteca
O módulo também é uma biblioteca. Consulte o código e os exemplos para ideias de como usar. A documentação está a caminho.
## Uso
> **AVISO**: Este comando pown está atualmente em desenvolvimento e, como resultado, estará sujeito a alterações significativas.```
pown-cli recon <command>
Target recon
Commands:
pown-cli recon transform <transform> Perform inline transformation [aliases: t]
pown-cli recon template <command> Recon template commands [aliases: p, templates]
pown-cli recon select <expressions...> Select nodes [aliases: s]
pown-cli recon traverse <expressions...> Traverse nodes [aliases: v]
pown-cli recon options <command> Manage options [aliases: option]
pown-cli recon cache <command> Manage cache
pown-cli recon add <nodes...> Add nodes [aliases: a]
pown-cli recon remove <expressions...> Remove nodes [aliases: r]
pown-cli recon edit <expressions...> Edit nodes [aliases: e]
pown-cli recon merge <files...> Perform a merge between at least two recon files [aliases: m]
pown-cli recon diff <fileA> <fileB> Perform a diff between two recon files [aliases: d]
pown-cli recon group <name> <expressions...> Group nodes [aliases: g]
pown-cli recon ungroup <expressions...> Ungroup nodes [aliases: u]
pown-cli recon load <file> Load a file [aliases: l]
pown-cli recon save <file> Save to file [aliases: o]
pown-cli recon import <file> Import file [aliases: i]
pown-cli recon export <file> Export to file [aliases: x]
pown-cli recon remote <command> Remote managment [aliases: remotes, f]
pown-cli recon layout <name> Layout the graph [aliases: k]
pown-cli recon summary [options] Create a summary [aliases: y]
pown-cli recon exec <files...> Execute js file [aliases: c]
Options:
--version Show version number [boolean]
--help Show help [boolean]
pown-cli recon transform <transform>
Perform inline transformation
Commands:
pown-cli recon transform bitbucketlistrepos [options] <nodes...> List Bitbucket repositories [aliases: bitbucket_list_repos, bblr]
pown-cli recon transform bitbucketlistsnippets [options] <nodes...> List Bitbucket snippets [aliases: bitbucket_list_snippets, bbls]
pown-cli recon transform bitbucketlistteamrepos [options] <nodes...> List Bitbucket team repos [aliases: bitbucket_list_team_repos, bbltr]
pown-cli recon transform bitbucketlistteammembers [options] <nodes...> List Bitbucket team members [aliases: bitbucket_list_team_members, bbltm]
pown-cli recon transform bufferoverrunsubdomainsearch [options] <nodes...> Obtain a list of subdomains using bufferover.run DNS service [aliases: bufferoverrun_subdomain_search, brss]
pown-cli recon transform certspotterissuances [options] <nodes...> Obtain issuances from Certspotter [aliases: certspotter_issuances, csi]
pown-cli recon transform cloudflarednsquery [options] <nodes...> Query CloudFlare DNS API [aliases: cloudflare_dns_query, cfdq]
pown-cli recon transform crtshcndomainreport [options] <nodes...> Obtain crt.sh domain report which helps enumerating potential target subdomains [aliases: crtsh_cn_domain_report, crtshcdr]
pown-cli recon transform crtshsandomainreport [options] <nodes...> Obtain crt.sh domain report which helps enumerating potential target subdomains [aliases: crtsh_san_domain_report, crtshsdr]
pown-cli recon transform dnsresolve [options] <nodes...> Performs DNS resolution [aliases: dns_resolve, dr, dns]
pown-cli recon transform dockerhublistrepos [options] <nodes...> List DockerHub repositories for a given member or org [aliases: dockerhub_list_repos, dhlr]
pown-cli recon transform gravatar [options] <nodes...> Get gravatar
pown-cli recon transform hackertargetreverseiplookup [options] <nodes...> Obtain reverse IP information from hackertarget.com [aliases: hackertarget_reverse_ip_lookup, htril]
pown-cli recon transform hackertargetonlineportscan [options] <nodes...> Obtain port information from hackertarget.com [aliases: hackertarget_online_port_scan, htps]
pown-cli recon transform httpfingerprint [options] <nodes...> Performs a fingerprint on the HTTP server and application [aliases: http_fingerprint, hf]
pown-cli recon transform ipinfoiowidgetsearch [options] <nodes...> Obtain ipinfo.io whois report via the web widget [aliases: ipinfoio_widget_search, iiiows]
pown-cli recon transform omnisintsubdomainreport [options] <nodes...> Obtain omnisint domain report which helps enumerating target subdomains [aliases: omnisint_subdomain_report]
pown-cli recon transform pkslookupkeys [options] <nodes...> Look the the PKS database at pool.sks-keyservers.net which pgp.mit.edu is part of [aliases: pks_lookup_keys, pkslk]
pown-cli recon transform pwndbsearch [options] <nodes...> Searching the PwnDB database [aliases: pwndb_search, pds]
pown-cli recon transform riddleripsearch [options] <nodes...> Searches for IP references using F-Secure riddler.io [aliases: riddler_ip_search, rdis]
pown-cli recon transform riddlerdomainsearch [options] <nodes...> Searches for Domain references using F-Secure riddler.io [aliases: riddler_domain_search, rdds]
pown-cli recon transform script [options] <nodes...> Perform transformation with external script [aliases: script]
pown-cli recon transform scyllasearch [options] <nodes...> Searching the Scylla database [aliases: scylla_search, scys]
pown-cli recon transform securitytrailssuggestions [options] <nodes...> Get a list of domain suggestions from securitytrails.com [aliases: securitytrails_domain_suggestions, stds]
pown-cli recon transform shodanorgsearch [options] <nodes...> Performs search using ORG filter [aliases: shodan_org_search, sos]
pown-cli recon transform shodansslsearch [options] <nodes...> Performs search using SSL filter [aliases: shodan_ssl_search, sss]
pown-cli recon transform spysesubdomains [options] <nodes...> Performs subdomain searching with Spyse [aliases: spyse_subdomains, ssds]
pown-cli recon transform tcpportscan [options] <nodes...> Simple, full-handshake TCP port scanner (very slow and sometimes inaccurate) [aliases: tcp_port_scan, tps]
pown-cli recon transform threatcrowddomainreport [options] <nodes...> Obtain threatcrowd domain report which helps enumerating potential target subdomains and email addresses [aliases: threatcrowd_domain_report, tcdr]
pown-cli recon transform threatcrowdipreport [options] <nodes...> Obtain threatcrowd ip report which helps enumerating virtual hosts [aliases: threatcrowd_ip_report, tcir]
pown-cli recon transform urlscanliveshot [options] <nodes...> Generates a liveshot of any public site via urlscan [aliases: urlscan_liveshot, usls]
pown-cli recon transform urlscansubdomains [options] <nodes...> Find subdomains via urlscan [aliases: urlscan_subdomains, uss]
pown-cli recon transform noop [options] <nodes...> Does not do anything [aliases: nop]
pown-cli recon transform sleep [options] <nodes...> Sleeps for predefined time [aliases: sleep, wait]
pown-cli recon transform duplicate [options] <nodes...> Duplicate node [aliases: dup]
pown-cli recon transform extract [options] <nodes...> Extract property [aliases: excavate]
pown-cli recon transform prefix [options] <nodes...> Creates a new node with a prefix [aliases: prepand]
pown-cli recon transform suffix [options] <nodes...> Creates a new node with a suffix [aliases: append]
pown-cli recon transform augment [options] <nodes...> Update node with prefix or suffix
pown-cli recon transform splitemail [options] <nodes...> Split email at the @ sign [aliases: split_email]
pown-cli recon transform buildemail [options] <nodes...> Build email from node label [aliases: build_email]
pown-cli recon transform splitdomain [options] <nodes...> Split domain at the first dot [aliases: split_domain]
pown-cli recon transform builddomain [options] <nodes...> Build domain from node label [aliases: build_domain]
pown-cli recon transform splituri [options] <nodes...> Split URI to corresponding parts [aliases: split_uri]
pown-cli recon transform builduri [options] <nodes...> Build URI from node label [aliases: build_uri]
pown-cli recon transform bakeimages [options] <nodes...> Convert external image into data URIs for self-embedding purposes [aliases: bake_images, bes]
pown-cli recon transform virustotalsubdomains [options] <nodes...> Obtain subdomains from Virustotal [aliases: virustotal_subdomains, vtsd]
pown-cli recon transform vulnerssearch [options] <nodes...> Obtain vulnerability information via vulners.com [aliases: vulners_search, vs]
pown-cli recon transform wappalyzerprofile [options] <nodes...> Enumerate technologies with api.wappalyzer.com [aliases: wappalyzer_profile, wzp]
pown-cli recon transform worker [options] <nodes...> Perform transformation with external worker [aliases: worker]
pown-cli recon transform zonecrunchersubdomains [options] <nodes...> Performs subdomain searching with Zonecruncher [aliases: zonecruncher_subdomains, zcss]
pown-cli recon transform auto [options] <nodes...> Select the most appropriate methods of transformation
Options:
--version Show version number [boolean]
--help Show help [boolean]
-r, --read Read file [string]
-w, --write Write file [string]
Os gráficos gerados podem ser pré-visualizados no SecApps Recon para conveniência, no qual esta ferramenta é baseada. Você pode acessar o SecApps Recon pelo seu navegador, mas também pode invocá-lo pela linha de comando.
Primeiro, você precisa ter @pown/apps instalado:```sh
$ pown modules install @pown/apps
Isto instalará o pacote de comandos de aplicativos opcionais.
Gere seu gráfico usando as opções de escrita:```sh
$ pown recon transform auto -w path/to/file.network --node-type brand target
Assim que o reconhecimento estiver completo, abra o gráfico para visualização no SecApps Recon:```sh $ pown apps recon < path/to/file.network
## Scripts
Pown recon é projetado para ser scriptado através do seu ambiente de shell favorito, [Pown Script](https://github.com/pownjs/script), [Pown Engine Templates](https://github.com/pownjs/engine) e JavaScript. Os scripts se beneficiam do contexto preservado entre cada execução de comando. Isso significa que você pode construir um gráfico sem a necessidade de salvar e restaurar em arquivos intermediários.
Usando seu editor favorito, crie um arquivo chamado `example.pown` com o seguinte conteúdo:```sh
echo This is script
recon add --node-type brand target
recon t auto
Execute o script do pown:```sh $ pown script path/to/example.pown
Para mais informações, veja o `./examples` para mais ideias de como usar scripts.
## Seletores
> Alguns comandos esperam seletores de grafo. O restante da documentação é uma cópia do manual de seletores do cytoscape.js com algumas pequenas diferenças.
Um seletor funciona de forma semelhante a um seletor CSS em elementos DOM, mas os seletores no Recon trabalham em coleções de elementos de grafo. Este mecanismo é fornecido pelo poderoso cytoscape.js.
Os seletores podem ser combinados para fazer consultas poderosas, por exemplo:```
pown select 'node[weight >= 50][height < 180]'
Os seletores podem ser unidos (efetivamente criando um OU lógico) por vírgulas:``` pown select 'node#j, edge[source = "j"]'
É importante notar que strings precisam ser delimitadas por aspas:```
pown select 'node[type = "domain"]'
Note que os metacharacters ( ^ $ \ / ( ) | ? + * [ ] { } , . ) precisam ser escapados:
pown select '#some\$funky\@id'
node, edge ou * (seletor de grupo) Corresponde a elementos com base no grupo (nó para nós, aresta para arestas, * para todos)..className Corresponde a elementos que possuem a classe especificada (ex.: use .foo para uma classe chamada "foo").#id Corresponde a elemento com o ID correspondente (ex.: #foo é o mesmo que [id = 'foo'])[name] Corresponde a elementos se eles tiverem o atributo de dados especificado definido, ou seja, não indefinido (ex.: [foo] para um atributo chamado "foo"). Aqui, null é considerado um valor definido.[^name] Corresponde a elementos se o atributo de dados especificado não estiver definido, ou seja, indefinido (ex.: [^foo]). Aqui, null é considerado um valor definido.[?name] Corresponde a elementos se o atributo de dados especificado for um valor truthy (ex.: [?foo]).[!name] Corresponde a elementos se o atributo de dados especificado for um valor falsey (ex.: [!foo]).[name = value] Corresponde a elementos se o atributo de dados deles corresponder a um valor especificado (ex.: [foo = 'bar'] ou [num = 2]).[name != value] Corresponde a elementos se o atributo de dados deles não corresponder a um valor especificado (ex.: ou ).> (seletor de filho) Corresponde a filhos diretos do nó pai (ex.: node > node). (seletor de descendente) Corresponde a descendentes do nó pai (ex.: node node).$ (seletor de sujeito) Define o sujeito do seletor (ex.: $node > node para selecionar os nós pais em vez dos filhos).Um tipo complexo de seleção é conhecido como travessia.
Aqui estão algumas das transformações disponíveis no Recon. Transformações adicionais estão disponíveis em módulos pown opcionais.
Para demonstrar o poder do Recon e da OSINT baseada em grafos (Open Source Intelligence), vamos dar uma olhada no seguinte exemplo trivial.
Vamos começar consultando todos que são membros da equipe de engenharia do Google e contribuem para a sua conta no GitHub.```sh pown recon t -w google.network ghlm google
Este comando gerará uma tabela semelhante a esta:```
github:member
┌─────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┐
│ uri │ login │ avatar │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/3rf │ 3rf │ https://avatars1.githubusercontent.com/u/1242478?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/aaroey │ aaroey │ https://avatars0.githubusercontent.com/u/31743510?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/aarongable │ aarongable │ https://avatars3.githubusercontent.com/u/2474926?v=4 │
...
...
...
│ https://github.com/alexpennace │ alexpennace │ https://avatars1.githubusercontent.com/u/2506548?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/alexv │ alexv │ https://avatars0.githubusercontent.com/u/30807372?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/alexwhouse │ alexwhouse │ https://avatars3.githubusercontent.com/u/1448490?v=4 │
└─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┘
Você acabou de criar sua primeira rede!
A representação é tabular por conveniência, mas por baixo temos um modelo que consiste em nós conectados por arestas.
Se você está se perguntando como isso se parece, você pode usar o SecApps Recon. A linha de comando não tem o nível necessário de interatividade para apresentar a complexidade dos grafos.
A opção de linha de comando -w google.network exportou a rede para um arquivo. Você pode carregar o arquivo diretamente no SecApps Recon com o recurso de abrir arquivo. O resultado será semelhante a este:
Agora imagine que queremos consultar em quais repositórios esses engenheiros do Google estão trabalhando. Isso é fácil. Primeiro, precisamos selecionar os nós no grafo e então transformá-los com a transformação "GitHub List Repositories". É assim que fazemos a partir da linha de comando:```sh pown recon t ghlr -r google.network -w google2.nework -s 'node[type="github:member"]'
Se você não exceder os limites de taxa da API do GitHub, você será apresentado a isto:```
github:repo
┌──────────────────────────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────┐
│ uri │ fullName │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/3rf/2015-talks │ 3rf/2015-talks │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/3rf/codecoroner │ 3rf/codecoroner │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/3rf/DefinitelyTyped │ 3rf/DefinitelyTyped │
...
...
...
│ https://github.com/agau4779/ultimate-tic-tac-toe │ agau4779/ultimate-tic-tac-toe │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/agau4779/worm_scraper │ agau4779/worm_scraper │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/agau4779/zsearch │ agau4779/zsearch │
└──────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────┘
Agora que temos dois arquivos google.network e google2.network, você pode estar se perguntando qual é a diferença entre eles. Bem, temos uma ferramenta para fazer exatamente isso.```sh
pown recon diff google.network google2.network
Agora sabemos! Este recurso é bastante útil se você está construindo grandes mapas de reconhecimento e gostaria de saber quais são as principais diferenças. Imagine que seu cron job realiza o mesmo reconhecimento todos os dias e você gostaria de saber se algo novo apareceu que vale a pena explorar mais. Olá, caçadores de bug bounty!
[foo != 'bar'][num != 2][name > value] Corresponde a elementos se o atributo de dados deles for maior que um valor especificado (ex.: [foo > 'bar'] ou [num > 2]).[name >= value] Corresponde a elementos se o atributo de dados deles for maior ou igual a um valor especificado (ex.: [foo >= 'bar'] ou [num >= 2]).[name < value] Corresponde a elementos se o atributo de dados deles for menor que um valor especificado (ex.: [foo < 'bar'] ou [num < 2]).[name <= value] Corresponde a elementos se o atributo de dados deles for menor ou igual a um valor especificado (ex.: [foo <= 'bar'] ou [num <= 2]).[name *= value] Corresponde a elementos se o atributo de dados deles contiver o valor especificado como substring (ex.: [foo *= 'bar']).[name ^= value] Corresponde a elementos se o atributo de dados deles começar com o valor especificado (ex.: [foo ^= 'bar']).[name $= value] Corresponde a elementos se o atributo de dados deles terminar com o valor especificado (ex.: [foo $= 'bar']).@ (modificador de operador de atributo de dados) Anteposto a um operador para que seja insensível a maiúsculas/minúsculas (ex.: [foo @$= 'ar'], [foo @>= 'a'], [foo @= 'bar'])! (modificador de operador de atributo de dados) Anteposto a um operador para que seja negado (ex.: [foo !$= 'ar'], [foo !>= 'a'])[[]] (colchetes de metadados) Use colchetes duplos no lugar dos simples para corresponder a metadados em vez de dados (ex.: [[degree > 2]] corresponde a elementos com grau maior que 2). As propriedades suportadas incluem degree, indegree e outdegree.