1

Usando la API de Shodan con Python

Erik Alejandro
Erik172
22399

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
....

Mi script

Escribe tu comentario
+ 2