Para o infinito e além!
Olá a todos! Este é o terceiro e último post desta série cobrindo OSINT e o Recon-NG. Se você ainda não leu os posts anteriores e é novo em algum dos assuntos, recomendo a visita:
Já fomos apresentados aos conceitos do tema e já começamos a trabalhar com a ferramenta que implementa tais conteúdos. Agora, vamos extrair ainda mais dela e ver o que podemos alcançar. Ao final do artigo, coloquei algumas fontes de leitura adicional. Mãos à obra!
Avançando na Exploração
Certo, Contatos/E-mails são bem úteis de se obter, é verdade. Mas, e os hosts? Nós já temos o domínio do SANS, então deve ser possível obter alguns hosts a partir dele, certo? E é! Uma forma antiga de conseguir os hosts pertencentes a um determinado domínio é o uso da ferramenta “nslookup” e seu comando “ls”. Desta forma, ao se consultar o servidor responsável pelo domínio, todos os dados da zona são obtidos. No entanto, rapidamente se percebeu que isso poderia levar a ataques relativamente sofisticados, como DNS poisoning ou spoofing. Assim, uma boa prática é permitir a transferência de zona (a operação executada pelo comando “ls”) apenas entre os servidores DNS responsáveis pela mesma. Você pode entender melhor sobre o assunto neste white paper do SANS.
Voltando para o Recon-NG, há dois módulos especiais dedicados à descoberta de hosts: um que usa o Bing, e outro que usa o Google. Ambos os módulos atualizam a tabela “hosts”, que deve estar atualmente vazia no nosso caso (verifique com o comando “show hosts”). Você pode usar o “show info” para entender melhor do módulo após carregá-lo. Vamos usar o primeiro e ver o que conseguimos:
[recon-ng][sans] > use recon/domains-hosts/bing_domain_web [recon-ng][sans][bing_domain_web] > run -------- SANS.ORG -------- [*] URL: https://www.bing.com/search?first=0&q=domain%3Asans.org [*] [host] ics.sans.org (<blank>) [*] [host] securingthehuman.sans.org (<blank>) [*] [host] blogs.sans.org (<blank>) [*] Sleeping to avoid lockout... [*] URL: https://www.bing.com/search?first=0&q=domain%3Asans.org+-domain%3Aics.sans.org+-domain%3Asecuringthehuman.sans.org+-domain%3Ablogs.sans.org [*] [host] content.sans.org (<blank>) [*] [host] www3.sans.org (<blank>) [*] [host] handlers.sans.org (<blank>) [*] Sleeping to avoid lockout... [*] URL: https://www.bing.com/search?first=0&q=domain%3Asans.org+-domain%3Aics.sans.org+-domain%3Asecuringthehuman.sans.org+-domain%3Ablogs.sans.org+-domain%3Acontent.sans.org+-domain%3Awww3.sans.org+-domain%3Ahandlers.sans.org [*] [host] digital-forensics.sans.org (<blank>) [*] [host] www.sans.org (<blank>) [*] Sleeping to avoid lockout... [*] URL: https://www.bing.com/search?first=0&q=domain%3Asans.org+-domain%3Aics.sans.org+-domain%3Asecuringthehuman.sans.org+-domain%3Ablogs.sans.org+-domain%3Acontent.sans.org+-domain%3Awww3.sans.org+-domain%3Ahandlers.sans.org+-domain%3Adigital-forensics.sans.org+-domain%3Awww.sans.org [*] [host] files.sans.org (<blank>) [*] Sleeping to avoid lockout... [*] URL: https://www.bing.com/search?first=0&q=domain%3Asans.org+-domain%3Aics.sans.org+-domain%3Asecuringthehuman.sans.org+-domain%3Ablogs.sans.org+-domain%3Acontent.sans.org+-domain%3Awww3.sans.org+-domain%3Ahandlers.sans.org+-domain%3Adigital-forensics.sans.org+-domain%3Awww.sans.org+-domain%3Afiles.sans.org ------------ WWW.SANS.ORG ------------ [*] URL: https://www.bing.com/search?first=0&q=domain%3Awww.sans.org ------- SUMMARY ------- [*] 9 total (9 new) hosts found. [recon-ng][sans][bing_domain_web] > show hosts +-------------------------------------------------------------------------------------------------------------+ | rowid | host | ip_address | region | country | latitude | longitude | module | +-------------------------------------------------------------------------------------------------------------+ | 1 | ics.sans.org | | | | | | bing_domain_web | | 2 | securingthehuman.sans.org | | | | | | bing_domain_web | | 3 | blogs.sans.org | | | | | | bing_domain_web | | 4 | content.sans.org | | | | | | bing_domain_web | | 5 | www3.sans.org | | | | | | bing_domain_web | | 6 | handlers.sans.org | | | | | | bing_domain_web | | 7 | digital-forensics.sans.org | | | | | | bing_domain_web | | 8 | www.sans.org | | | | | | bing_domain_web | | 9 | files.sans.org | | | | | | bing_domain_web | +-------------------------------------------------------------------------------------------------------------+ [recon-ng][sans2][bing_domain_web] > query select host from hosts +----------------------------+ | host | +----------------------------+ | ics.sans.org | | securingthehuman.sans.org | | blogs.sans.org | | content.sans.org | | www3.sans.org | | handlers.sans.org | | digital-forensics.sans.org | | www.sans.org | | files.sans.org | +----------------------------+ [*] 9 rows returned
Nós podemos incrementar esta tabela com outro módulo (recon/domain-hosts/google_site_web). Ele pesquisará no Google por hosts relacionados ao domínio e nos devolverá o resultado:
[recon-ng][sans][google_site_web] > use recon/domains-hosts/google_site_web [recon-ng][sans][google_site_web] > run -------- SANS.ORG -------- [*] Searching Google for: site:sans.org [*] [host] securingthehuman.sans.org (<blank>) [*] [host] software-security.sans.org (<blank>) [*] [host] www.sans.org (<blank>) [*] [host] isc.sans.org (<blank>) [*] [host] uk.sans.org (<blank>) [*] [host] ics.sans.org (<blank>) [*] Searching Google for: site:sans.org -site:securingthehuman.sans.org -site:software-security.sans.org -site:www.sans.org -site:isc.sans.org -site:uk.sans.org -site:ics.sans.org [*] [host] sic.sans.org (<blank>) [*] [host] handlers.sans.org (<blank>) [*] [host] www3.sans.org (<blank>) [*] [host] cyber-defense.sans.org (<blank>) [*] [host] pen-testing2.sans.org (<blank>) [*] [host] isc2.sans.org (<blank>) [*] [host] pen-testing.sans.org (<blank>) [*] [host] lists.sans.org (<blank>) [*] [host] access.sans.org (<blank>) [*] [host] leam.sans.org (<blank>) [*] [host] digital-forensics.sans.org (<blank>) [*] [host] isc1.sans.org (<blank>) [*] Searching Google for: site:sans.org -site:securingthehuman.sans.org -site:software-security.sans.org -site:www.sans.org -site:isc.sans.org -site:uk.sans.org -site:ics.sans.org -site:sic.sans.org -site:handlers.sans.org -site:www3.sans.org -site:cyber-defense.sans.org -site:pen-testing2.sans.org -site:isc2.sans.org -site:pen-testing.sans.org -site:lists.sans.org -site:access.sans.org -site:leam.sans.org -site:digital-forensics.sans.org -site:isc1.sans.org [*] [host] files.sans.org (<blank>) [*] [host] blogs.sans.org (<blank>) [*] [host] content.sans.org (<blank>) [*] [host] isc11.sans.org (<blank>) [*] Searching Google for: site:sans.org -site:securingthehuman.sans.org -site:software-security.sans.org -site:www.sans.org -site:isc.sans.org -site:uk.sans.org -site:ics.sans.org -site:sic.sans.org -site:handlers.sans.org -site:www3.sans.org -site:cyber-defense.sans.org -site:pen-testing2.sans.org -site:isc2.sans.org -site:pen-testing.sans.org -site:lists.sans.org -site:access.sans.org -site:leam.sans.org -site:digital-forensics.sans.org -site:isc1.sans.org -site:files.sans.org -site:blogs.sans.org -site:content.sans.org -site:isc11.sans.org ------------ WWW.SANS.ORG ------------ <saída suprimida> ------- SUMMARY ------- [*] 22 total (13 new) hosts found. [recon-ng][sans][google_site_web] > query select host from hosts +----------------------------+ | host | +----------------------------+ | ics.sans.org | | securingthehuman.sans.org | | blogs.sans.org | | content.sans.org | | www3.sans.org | | handlers.sans.org | | digital-forensics.sans.org | | www.sans.org | | files.sans.org | | software-security.sans.org | | isc.sans.org | | uk.sans.org | | sic.sans.org | | cyber-defense.sans.org | | pen-testing2.sans.org | | isc2.sans.org | | pen-testing.sans.org | | lists.sans.org | | access.sans.org | | leam.sans.org | | isc1.sans.org | | isc11.sans.org | +----------------------------+
Ótimo! Conseguimos uma lista de hosts e seus nomes. Mas, e que tal conseguir os endereços IP e as portas em uso de cada um? Isto poderia ser mais útil, certo? Adivinhe: a API do Shodan pode fazer isso por nós. E, de novo, você precisará de uma chave de API para usar o módulo correspondente (recon/domains-hosts/shodan_hostname). Desta vez, imagino que você já seja um mestre de APIs. 😉
Este módulo busca informações de hosts na base de dados do Shodan e atualiza a tabela “hosts”, bem como a tabela “ports” com os dados coletados. Portanto, adicione sua chave de API Shodan com o comando “keys” e deixe o módulo fazer o trabalho dele:
[recon-ng][sans] > keys add shodan_api <coloque sua chave aqui> [recon-ng][sans] > use recon/domains-hosts/shodan_hostname [recon-ng][sans][shodan_hostname] > show info Name: Shodan Hostname Enumerator Path: modules/recon/domains-hosts/shodan_hostname.py Author: Tim Tomes (@LaNMaSteR53) Keys: shodan_api Description: Harvests hosts from the Shodan API by using the 'hostname' search operator. Updates the 'hosts' table with the results. Options: Name Current Value Required Description ------ ------------- -------- ----------- LIMIT 1 yes limit number of api requests per input source (0 = unlimited) SOURCE default yes source of input (see 'show info' for details) Source Options: default SELECT DISTINCT domain FROM domains WHERE domain IS NOT NULL <string> string representing a single input <path> path to a file containing a list of inputs query <sql> database query returning one column of inputs [recon-ng][sans][shodan_hostname] > run -------- SANS.ORG -------- [*] Searching Shodan API for: hostname:sans.org [*] [port] 66.35.59.13 (25/<blank>) - smtp21a.sans.org [*] [host] smtp21a.sans.org (66.35.59.13) [*] [port] 66.35.59.249 (80/<blank>) - isc.sans.org [*] [host] isc.sans.org (66.35.59.249) [*] [port] 204.51.94.234 (80/<blank>) - software-security.sans.org [*] [host] software-security.sans.org (204.51.94.234) [*] [port] 204.51.94.223 (80/<blank>) - dev.sans.org [*] [host] dev.sans.org (204.51.94.223) [*] [port] 204.51.94.206 (80/<blank>) - 204-51-93-206.clp.sans.org [*] [host] 204-51-93-206.clp.sans.org (204.51.94.206) <output omitted> ------------ WWW.SANS.ORG ------------ [*] Searching Shodan API for: hostname:www.sans.org [*] [port] 66.35.59.202 (80/<blank>) - www.sans.org [*] [host] www.sans.org (66.35.59.202) ------- SUMMARY ------- [*] 56 total (54 new) hosts found. [*] 56 total (55 new) ports found. [recon-ng][sans][shodan_hostname] > query select host, ip_address, module from hosts +----------------------------------------------------------------+ | host | ip_address | module | +----------------------------------------------------------------+ | securingthehuman.sans.org | | google_site_web | | software-security.sans.org | | google_site_web | | www.sans.org | | google_site_web | | isc.sans.org | | google_site_web | | pages.sans.org | | google_site_web | | uk.sans.org | | google_site_web | | ics.sans.org | | google_site_web | | sic.sans.org | | google_site_web | | handlers.sans.org | | google_site_web | | www3.sans.org | | google_site_web | | cyber-defense.sans.org | | google_site_web | | lists.sans.org | | google_site_web | | pen-testing2.sans.org | | google_site_web | | isc2.sans.org | | google_site_web | | pen-testing.sans.org | | google_site_web | | survey.sans.org | | google_site_web | | digital-forensics.sans.org | | google_site_web | | leam.sans.org | | google_site_web | | access.sans.org | | google_site_web | | isc1.sans.org | | google_site_web | | files.sans.org | | google_site_web | | blogs.sans.org | | google_site_web | | content.sans.org | | google_site_web | | isc11.sans.org | | google_site_web | | smtp21a.sans.org | 66.35.59.13 | shodan_hostname | | isc.sans.org | 66.35.59.249 | shodan_hostname | | software-security.sans.org | 204.51.94.234 | shodan_hostname | | dev.sans.org | 204.51.94.223 | shodan_hostname | | 204-51-93-206.clp.sans.org | 204.51.94.206 | shodan_hostname | <saída suprimida> [recon-ng][sans][shodan_hostname] > query select ip_address, host, port, module from ports +-----------------------------------------------------------------------+ | ip_address | host | port | module | +-----------------------------------------------------------------------+ | 66.35.59.13 | smtp21a.sans.org | 25 | shodan_hostname | | 66.35.59.249 | isc.sans.org | 80 | shodan_hostname | | 204.51.94.234 | software-security.sans.org | 80 | shodan_hostname | | 204.51.94.223 | dev.sans.org | 80 | shodan_hostname | | 204.51.94.206 | 204-51-93-206.clp.sans.org | 80 | shodan_hostname | <saída suprimida>
O restante dos endereços IP que estão faltando na tabela “hosts” pode ser obtido com o módulo “resolve” (recon/hosts-hosts/resolve). Simplesmente carregue e execute.
Se você não está satisfeito com hostnames, endereços IP e portas, você pode ir ainda mais além, encontrando a localização física dos hosts. Isso pode ser conseguido com o módulo “freegeoip” (recon/hosts-hosts/freegeoip):
[recon-ng][sans][shodan_net] > use recon/hosts-hosts/freegeoip [recon-ng][sans][freegeoip] > show info Name: FreeGeoIP Path: modules/recon/hosts-hosts/freegeoip.py Author: Gerrit Helm (G) and Tim Tomes (@LaNMaSteR53) Description: Leverages the freegeoip.net API to geolocate a host by IP address. Updates the 'hosts' table with the results. Options: Name Current Value Required Description --------- ------------- -------- ----------- SERVERURL http://freegeoip.net yes overwrite server url (e.g. for local installations) SOURCE default yes source of input (see 'show info' for details) Source Options: default SELECT DISTINCT ip_address FROM hosts WHERE ip_address IS NOT NULL <string> string representing a single input <path> path to a file containing a list of inputs query <sql> database query returning one column of inputs Comments: * Allows up to 10,000 queries per hour by default. Once this limit is reached, all requests will result in HTTP 403, forbidden, until the quota is cleared. [recon-ng][sans][freegeoip] > run [*] 204.51.94.212 - 39.006,-77.1026 - Bethesda, Maryland, United States [*] 204.51.94.234 - 39.006,-77.1026 - Bethesda, Maryland, United States [*] 45.60.37.34 - 37.5331,-122.2471 - Redwood City, California, United States [*] 66.35.59.249 - 39.006,-77.1026 - Bethesda, Maryland, United States [*] 13.111.23.20 - 39.7724,-86.16 - Indianapolis, Indiana, United States <saída suprimida> [recon-ng][sans][freegeoip] > query select host, region, latitude, longitude from hosts +------------------------------------------------------------------------------+ | host | region | latitude | longitude | +------------------------------------------------------------------------------+ | securingthehuman.sans.org | Bethesda, Maryland | 39.006 | -77.1026 | | software-security.sans.org | Bethesda, Maryland | 39.006 | -77.1026 | | www.sans.org | Redwood City, California | 37.5331 | -122.2471 | | isc.sans.org | Bethesda, Maryland | 39.006 | -77.1026 | | pages.sans.org | Indianapolis, Indiana | 39.7724 | -86.16 | <saída suprimida>
Exportando os resultados
Como mencionei no primeiro post desta série, o Recon-NG armazena todos os resultados obtidos em bancos de dados. Ele usa o SQLite. Os bancos ficam localizados no diretório home do usuário que executou a ferramenta (diretório .recon-ng, subdiretório workspaces, subdiretório com o nome do workspace). Eu sei que você pode gostar de trabalhar diretamente com sintaxe SQL dentro da ferramenta. No entanto, você pode necessitar exportar os dados do projeto para usá-los num relatório ou qualquer outro software, ou mesmo para vê-los de uma forma mais sofisticada. E, adivinhe, você pode. Isto é feito pelo módulo “reporting”. Procure pelo termo dentro do Recon-NG para descobrir quais são os formatos disponíveis:
[recon-ng][sans] > search report [*] Searching for 'report'... Reporting --------- reporting/csv reporting/html reporting/json reporting/list reporting/proxifier reporting/pushpin reporting/xlsx reporting/xml
Vamos exportar nossos resultados para HTML e abri-los. Este módulo também possui opções. Defini o criador do módulo como eu mesmo e o “cliente” a receber este relatório como a PenTest Magazine:
[recon-ng][sans] > use reporting/html [recon-ng][sans][html] > show info Name: HTML Report Generator Path: modules/reporting/html.py Author: Tim Tomes (@LaNMaSteR53) Description: Creates a HTML report. Options: Name Current Value Required Description -------- ------------- -------- ----------- CREATOR yes creator name for the report footer CUSTOMER yes customer name for the report header FILENAME /home/mauricio/.recon-ng/workspaces/sans/results.html yes path and filename for report output SANITIZE True yes mask sensitive data in the report [recon-ng][sans][html] > set creator Mauricio Harley CREATOR => Mauricio Harley [recon-ng][sans][html] > set customer PenTest Magazine CUSTOMER => PenTest Magazine [recon-ng][sans][html] > run [*] Report generated at '/home/mauricio/.recon-ng/workspaces/sans/results.html'.
E aqui está ele:
Você pode observar que há muitas outras possibilidades com as quais trabalhar, como locations, netblocks, credentials, pushpins e assim por diante. Muitas destas tabelas são preenchidas com a combinação dos módulos “whois_miner”, “geocode” e “reverse_geocode”. Alguns deles precisam da carga de módulos situados em outras categorias que não a “Recon”.
Bônus: Ferramentas Adicionais
Vimos vários recursos do Recon-NG até aqui, na versão padrão dele, baseada em prompt. Entretanto, há outros componentes do pacote que merecem menção.
Se você precisar transformar seu trabalho de OSINT em algo mais automatizado, construindo scripts para interagir com outros scripts ou programas, o Recon-NG pode fazer isso. E o software em questão é o “recon-cli“. Invoque-o com a opção de help para ver as possibilidades:
$ ./recon-cli -h usage: recon-cli [-h] [-v] [-w workspace] [-C command] [-c command] [-G] [-g name=value] [-M] [-m module] [-O] [-o name=value] [-x] [--no-check] recon-cli - Tim Tomes (@LaNMaSteR53) tjt1980[at]gmail.com optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit -w workspace load/create a workspace -C command runs a command at the global context -c command runs a command at the module context (pre-run) -G show available global options -g name=value set a global option (can be used more than once) -M show modules -m module specify the module -O show available module options -o name=value set a module option (can be used more than once) -x run the module --no-check disable version check
Portanto, dá para executar um módulo com todo seu conjunto de opções e receber os resultados diretamente na tela. Ou, você pode querer redirecionar a saída para outro comando do shell, ou mesmo exportar para um arquivo. Fica a seu critério. Vamos fazer um teste com um módulo que ainda não usamos: CensysIO. Este módulo verifica a base de dados pública da Censys usando sua própria API e executa a enumeração do alvo baseado na tabela “netblocks”. Esta tabela já foi preenchida por um dos módulos que usamos anteriormente. Assim, comece fornecendo seu ID e secret da Censys. Por último, execute o módulo:
$ ./recon-cli -C "keys add censysio_id <Minha ID da Censys>" GLOBAL COMMAND => keys add censysio_id <Minha ID da Censys> [*] Key 'censysio_id' added. [*] No module provided. $ ./recon-cli -C "keys add censysio_secret <Meu Secret da Censys>" GLOBAL COMMAND => keys add censysio_secret <Meu Secret da Censys> [*] Key 'censysio_secret' added. [*] No module provided. $ ./recon-cli -w sans -m recon/netblocks-ports/censysio -x WORKSPACE => sans MODULE => recon/netblocks-ports/censysio -------------- 70.91.145.8/29 -------------- [*] [port] 70.91.145.12 (443/https) - <blank> [*] [port] 70.91.145.12 (80/http) - <blank> [*] [port] 70.91.145.14 (8080/http) - <blank> [*] [port] 70.91.145.11 (2323/telnet) - <blank> [*] [port] 70.91.145.11 (8080/http) - <blank> [*] [port] 70.91.145.10 (25/smtp) - <blank> [*] [port] 70.91.145.9 (80/http) - <blank> [*] [port] 70.91.145.9 (443/https) - <blank> [*] [port] 70.91.145.9 (53/dns) - <blank> ------- SUMMARY ------- [*] 9 total (9 new) ports found.
Agora, o que você acabou de fazer foi executar um port scan sem enviar um único pacote para o alvo. Excelente! O comportamento deste módulo pode ser ligeiramente alterado se você configurar a opção “source” para especificar uma query SQL que aponta para os hosts, em vez do netblock inteiro. Isto pode levar bem mais tempo que a execução anterior.
O segundo componente que eu gostaria de apresentar é o “recon-rpc“. Ele permite que o Recon-NG escute na porta 4141 do TCP, esperando por conexões locais ou remotas. Assim, você pode iniciar este serviço e implementar sua própria aplicação para interagir com o Recon-NG através de RPC. Na verdade, já existe uma aplicação web criada em PHP que faz justamente isto. Você pode conferi-la aqui.
$ ./recon-rpc [+] Serving on 0.0.0.0:4141
E a última, mas não menos importante é a “recon-web“. Isso mesmo! Você achava que não havia interface gráfica, mas aqui está ela! Quando você a carrega a partir do shell, um servidor web inicia e passa a escutar requests na porta 5000 do TCP. Assim, simplesmente abra um browser e aproveite seus workspaces no Recon-NG gráfico. Aqui, você pode navegar entre seus projetos e conferir os resultados obtidos.
$ ./recon-web ************************************************************************* * Welcome to Recon-web, the analytics and reporting engine for Recon-ng! * This is a web-based user interface. Open the following URL in your browser to begin. * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Conclusão
O Recon-NG é de longe uma das ferramentas de segurança mais interessantes com as quais já trabalhei. Sendo completamente open source, ele motiva desenvolvedores a construir e liberar mais código, o que torna o projeto ainda maior e mais poderoso. Definitivamente, o Recon-NG preenche os requisitos de OSINT.
Se você quiser testar módulos adicionais não incluídos por default, visite este site. Boa exploração!
Dicas de Leitura
Abaixo, dicas de leitura para complementar esta série de posts.
- Livro OSINT Techniques and Tools, de Michael Bazzell – O livro aborda diversas fontes abertas de informação (como redes sociais, motores de busca, mapas, entre outros), com tipos de documentos que podem ser obtidos a partir de cada uma. Também trata de APIs, add-ons para browsers e outras ferramentas úteis;
- Open Source Intelligence – Tools and Resources Handbook, da i-Intelligence – Documento criado pela i-Intelligence, firma de consultoria suíça, com numerosos links cobrindo diversas áreas diferentes de OSINT. Cada categoria, como Investigação de Pessoas, Mídias Sociais, Busca de Código, entre várias outras, vem acompanhada por diversos URLs de referência;
- Open Source Intelligence Gathering 101 – Este site traz diversas técnicas de open source intelligence explicadas de forma sucinta. Alguns conceitos, como Google Dorks, WHOIS, arquivos texto de servidores web, entre outras são apresentadas com capturas de tela para ilustrar seu uso.
0 comentário