[ Inicio ] [ Hacking ] [ CTFs ] [ Rant ]
.:: Brenn0 Weblog ::.

Título : Brincando com API do Shodan
Autor : brennords
Data : 25/02/2018
            

Se não conheces, o Shodan é um buscador que vive escaneando a internet e indexando os metadados (os banners) que são retornados pelos dispositivos que estejam aceitando conexões indiscriminadamente.

Por exemplo, uma busca ‘apache’ vai trazer como resultado dispositivos que, ao receberem um pedido de conexão, responderam com alguma coisa que contenha o termo ‘apache’. Como pode se ver, a maioria dos itens encontrados são de servidores Web rodando o (pasmem!) Apache.

Ele não é algo novo. A maioria da galera já sabe que dá para encontrar câmeras de segurança sem senha, ftps desprotegidos, roteadores, switchs, impressoras e essas porra. Diz a lenda que se encontra até sistemas SCADA com senhas default e facilmente se destrói uma indústria nuclear com poucos cliques.

TD-Heavy-Shit.gif

Não é a toa que, por jornalistas, ele é considerado “o mecanismo de busca mais perigoso do mundo”.

Mas chega de merda e vamos ao código.

Estava eu numa daquelas tarde. Queria programar algo, não sabia bem por onde começar… Só queria passar o tempo.

Então lembrei que tinha umas ideias de usar o Shodan para procurar uns roteadores de determinada empresa porque eles tinham um servidor telnet que, provavelmente, em 80% dos casos, mantinham suas senhas padrão de fábrica. Até encontrei alguns, mas o processo manual de buscar, acessar, cumprir minha missão e sair fora do roteador não parecia ser a forma mais inteligente de ownar a porra toda finalizar minha pesquisa, a qual me fez invadir apenas dispositivos que eu tinha permissão.

Logo, como um bom homem preguiçoso, decidi que poderia codar um script para trabalhar por mim.

Foi divertido e rendeu um bom aprendizado.

Joguei no github porque é chique e faz parecer mais importante do que realmente é. E ah, claro, documentei e fiz o código todo no english porque fica bonito para as empresas.

Para usar a classe ShodanSearch, é necessário ter uma API KEY. Se consegue facilmente após se criar uma conta no Shodan e acessar a página com propriedades de sua conta. Aí é só criar um objeto e começar a usar.

import shodansearch

shodan_api = 'aTPPqKASuQKJi34A291P0123I'
shodan = shodansearch.ShodanSearch(shodan_api)

Criei dois métodos: ‘search’ e ‘filter’.

O método ‘search’ faz uma busca no Shodan. O único parâmetro obrigatório é o ‘term’, que é o termo a ser buscado. Os opcionais são o ‘page’, que é a página em que a obtenção dos dados vai iniciar, ‘limit’ limitará a quantidade de resultados e ‘offset’ escolhe a posição, tipo, o quadragésimo item da busca, para iniciar a obtenção dos resultados.

Caso não tenha lido as entrelinhas dos termos de sua conta no Shodan, não sabes que, se não for desembolsada uma grana para comprar créditos, as buscas usando sua API são limitadas há: não poderem ser iniciadas além da primeira página, limitadas aos 100 primeiros resultados, e o mais debilitante que é: não se pode usar os termos de filtragem na busca.

Claro que você pode pagar $20 dólares por mês e ter 10.000 query credits para fazer umas buscas filtradas envenenadas mas, caso não precise de buscas complexas, pode usar o método ‘filter’ que codei especificamente para esse propósito: poder filtrar os resultados como se estivesse usando os filtros do Shodan. Ou quase isso.

O resultado que a API devolve vem bem organizado e não foi difícil meter um for e iterar o json filtrando os dados. Eu tô começando a ficar com sono, então vou deixar o link da documentação da API. É suficiente para entender como criei o método arcaico de filtragem.

Os parâmetros do método ‘filter’ são: ‘filter by’, que pode ser por ‘port’, ou seja, filtrar pelo número da porta, ‘protocol’ que é pelo protocolo (http, telnet, ftp…), ‘city’ e ‘country’. O parâmetro seguinte é o ‘filter_term’, o qual o nome já diz tudo. E o último, e opcional, parâmetro é o ‘search_results’, que espera receber o valor de uma busca feita previamente. Caso esse valor não seja encontrado, mais na frente o código vai buscar na propriedade search_results do objeto.

Abaixo segue uma pequena implementação de minha classe:

O código acima vai procurar pelo termo “NET” e depois filtrar os usem o protocolo FTP. Logo depois, ele printa o banner do servidor encontrado e o endereço IP do mesmo.

E rodando o script acima, o resultado é esse:

Obviamente censurei os endereços dos servidores FTP porque estou velho demais para ser processado por uma merda dessas. Nunca se sabe.

E é isso aí.