Instalacion de la libreria de shodan
Para instalar la librería de Shodan usamos el comando pip.
sudo pip3 install shodan
en el caso de salir error o algun problema intenta con :
sudo pip install shodan
Conectar con la cuenta
Para conectar con la cuenta debemos de consultar la API_KEY publicada en la sección MyAccount de Shodan.
Ahora importamos la librería y cargamos la aplicación con la API_KEY.
import shodan
SHODAN_API_KEY = "XXX"
api = shodan.Shodan(SHODAN_API_KEY)
Búsqueda básica
Para realizar una búsqueda debemos de usar el método search e iterar con todos los resultados usando un bucle for. Por ejemplo, vamos a realizar una búsqueda por el servidor web Apache.
try:
results = api.search('apache')
print("Resultados encontrados: {}' . format(results['total']))
for result in results['matches']:
print('IP: {}' . format(result['ip_str']))
print(result['data'])
print('')
except shodan.APIError, e:
print('Error: {}' . format(e))
Resultado
Resultados encontrados: 25504866
IP: 213.226.249.184
HTTP/1.1 302 Moved Temporarily
Date: Fri, 30 Nov 2018 11:36:15 GMT
Server: Apache
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Location: http://213.226.249.184:5000/
Content-Length: 0Content-Type: text/plain
IP: 1.51.246.132HTTP/1.1200 OK
Date: Fri, 30 Nov 201811:27:18 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Last-Modified: Thu, 19 Jul 201808:41:31 GMT
ETag: "2a0-5715625581d4b"Accept-Ranges: bytesContent-Length: 672Content-Type: text/html
Búsqueda de host
Para buscar información de un host concreto usamos el método host y la función get.
results = api.host('8.8.8.8')
# Mostramos la informacion.
print("""
IP: {}
Oganization: {}
Operative Sistem: {}
""" . format(results['ip_str'], results.get('org', 'n/a'), results.get('os', 'n/a')))
Resultado
IP: 8.8.8.8Organization: GoogleOperativeSistem: None
Mostrar Banners
Usando el comando anterior podemos obtener los Banners mostrados por los servicios cuando se realiza una conexión, y registrados en Shodan.
for item in results['data']:
print("""
Port: {}
Banner: {}
""".format(item['port'], item['data']))
Resultado
Port:53 Banner:Recursion: enabled
Como el resultado anterior es muy simple, a continuación se muestra el resultado tras consultar otra IP diferente.
Port: 443
Banner: HTTP/1.1 200 OK
Date: Wed, 28 Nov 2018 07:09:50 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=10
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.38-0+deb8u1
Server: RainLoop
Strict-Transport-Security: max-age=15768000
Port: 993
Banner: * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN
A001 OK Pre-login capabilities listed, post-login capabilities have more.
* ID ("name" "Dovecot")
A002 OK ID completed.
A003 BAD Errorin IMAP command received by server.
* BYE Logging out
A004 OK Logout completed.
Script búsqueda básica
El siguiente script, que llamaremos busquedaBasica.py, permite realizar una búsqueda básica con el método search y mostrar las IPs registradas con el patrón indicado. Se debe de indicar algún parámetro tras ejecutar el script.
#!/usr/bin/env python## Buscador para imprimir una lista de IPs resultantes de una consulta.import shodan, sys
API_KEY = "XXX"# Validacion de entradaif len(sys.argv) == 1:
print 'Uso: %s <search query>' % sys.argv[0]
sys.exit(1)
try:
# Setup de API
api = shodan.Shodan(API_KEY)
# Perform the search
query = ' '.join(sys.argv[1:])
result = api.search(query)
# Loop through the matches and print aeach IPfor service inresult['matches']:
print service['ip_str']
exceptExceptionas e:
print 'Error: %s' % e
sys.exit(1)
Resultado
# ./basicSearch.py
Uso: ./basicSearch.py <search query>
# ./basicSearch.py postfix
110.164.188.212107.170.209.96194.49.99.178107.6.142.22891.134.112.234
....