Educación online efectiva

Aprende con expertos de la industria

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

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: 0
Content-Type: text/plain



IP: 1.51.246.132
HTTP/1.1 200 OK
Date: Fri, 30 Nov 2018 11:27:18 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Last-Modified: Thu, 19 Jul 2018 08:41:31 GMT
ETag: "2a0-5715625581d4b"
Accept-Ranges: bytes
Content-Length: 672
Content-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.8
Organization: Google
Operative Sistem: 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 Error in 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 entrada
if 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 IP
        for service in result['matches']:
                print service['ip_str']

except Exception as e:
        print 'Error: %s' % e
        sys.exit(1)

Resultado

# ./basicSearch.py
Uso: ./basicSearch.py <search query>

# ./basicSearch.py postfix
110.164.188.212
107.170.209.96
194.49.99.178
107.6.142.228
91.134.112.234
....

Mi script

Educación online efectiva

Aprende con expertos de la industria

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

0 Comentarios

para escribir tu comentario

Artículos relacionados