Artículo · Seguridad de la información

OSINT Automatizado con Shodan y Slack

José MorenoJosé Moreno 4 min de lectura

El reconocimiento es parte fundamental de las fases de pentesting, en ocasiones cuando queremos probar una vulnerabilidad día zero o solo queremos comprobar un exploit por curiosidad, hasta probar malas configuraciones de seguridad que se dan mucho  en la actualidad y más debido al aceleramiento de la transformación digital causada por la pandemia.

 

Por lo que en una lectura que comparto al final en las referencias, encontré un código el cual realizaba una búsqueda en shodan y enviaba las notificaciones al email, sin embargo, en muchas ocasiones no utilizamos el correo para comunicación inmediata, por tanto, se hizo una modificación de este para hacer una búsqueda de lo que quisiéramos, monitoreando y almacenando el resultado en la Elasticsearch y la notificación llegará a slack.

 

Requerimientos:

  • Shodan Api Key
  • VPS o un equipo con Python
  • Elasticsearch
  • Una cuenta de slack habilitada con integración en un canal con webhooks

Primero instalaremos Elasticsearch  y lo configuramos

Añadimos la llave GPG

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add –

 

Instalamos el paquete https-transport

apt-get install apt-transport-https

 

Guardamos el repositorio

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

 

Instalamos elasticsearch

apt-get update && sudo apt-get install elasticsearch

 

 

Comprobamos el estado del servicio, el cual debería estar desactivado, utilizamos el comando 

systemctl status elasticsearch

 

Iniciamos el servicio con el comando

systemctl start elasticsearch

 

Verificamos nuevamente que este arriba

Comprobamosmos que el elasticsearch este funcionando con curl

curl -i http://127.0.0.1:9200

 

Creamos un tunnel ssh para loguearnos localmente, dado que con el ip público no podremos acceder por razones de seguridad

 

ssh -l root -N -L9200:127.0.0.1:9200 ip-vps

 

Accedemos al navegador

 

Segunda creación del Script en Python y variables de entorno

Debemos crear las variables del entorno, para ello creamos un archivo llamado slack.api

Debemos cargarlo para que quede en nuestras variables de entorno con el comando

source slack.api

 

Antes de ver el script debemos instalar los paquetes os, slack, request, json, slackclient y elasticsearch para ello usamos pip3

 

A continuación, compartimos el código en Python (extraído de la fuente de referencia), es relativamente sencillo por lo que si gustan pueden mejorarlo y modificarlo en mi caso para que enviara la información de las consultas a slack.

 

#!/usr/bin/env python3
from elasticsearch import Elasticsearch
import os
import slack
import requests
import json


es = Elasticsearch()
print(es.info())
es.indices.create(index='hmi-final', ignore=400)

SHODAN_API_KEY = os.environ["SHODAN_API_KEY_VAR"]
query = "Server: EA-HTTP/1.0"
endpoint = "https://api.shodan.io/shodan/host/search?key="+SHODAN_API_KEY+"&query="+query+"&page=3"
#cve = "CVE-2019-0708"
fresh = []


def exists(ip):
    try:
        es.get(index='hmi-final', id=ip)
        return True
    except:
    	return False

def send_notification(ips):

    body = "New IPs in HMI ICS\n\n"
    ips_text = ""
    for ip in ips:
        ips_text = ips_text + "https://beta.shodan.io/host/" + ip + "\n\n"

    # Set the webhook_url to the one provided by Slack when you create the webhook at https://my.slack.com/services/new/incoming-webhook/
    webhook_url = os.environ["web_hook_url"]
    slack_data = {'channel':"#meterpreter",'text': body + ips_text}
    response = requests.post(
    webhook_url, data=json.dumps(slack_data),
    headers={'Content-Type': 'application/json'}
    )
    if response.status_code != 200:
        raise ValueError(
            'Request to slack returned an error %s, the response is:\n%s'
            % (response.status_code, response.text)
        )



try:
    shodan_request = requests.get(endpoint)
    shodan_json = json.loads(shodan_request.text)
    for result in shodan_json['matches']:
        if not exists(result['ip_str']):
            check_each_host = requests.get("https://api.shodan.io/shodan/host/" + result['ip_str'] + "?key=" + SHODAN_API_KEY)
            check_each_host_json = json.loads(check_each_host.content)
#            if 'vulns' in check_each_host_json:
#                if cve in check_each_host_json['vulns']:
            fresh.append(result['ip_str'])
            print("New IP:" + result['ip_str'])
            es.index(index="hmi-final", id=check_each_host_json['ip_str'], body={"organization": check_each_host_json['org']})
        else:
            print("IP exists")

    if fresh:
        send_notification(fresh)

except Exception as e:
    print(e)

 

No debemos tener errores si instalamos los módulos solicitados al inicio del script y al ejecutarlo debe arrojarnos el siguiente resultado

 

En el canal de slack que configuramos nos debe salir las notificaciones, podemos modificarla de igual manera para que tenga un mejor look en formato markdown o en bloque

 

Podemos de igual manera observar el resultado en elsaticsearch 

 

Los resultados obtenidos los podemos acceder desde el navegador http://127.0.0.1:9200/hmi-final/_search

 

 

Con este sencillo script podemos añadirle a un cron para que se repita cada cierto tiempo y conseguimos una herramienta automatizada para búsquedas, utilizando OSINT, shodan y slack. Además que podemos modificar el query para buscar sobre lo que estemos investigan

 

Referencias

https://www.offensiveosint.io/offensive-osint-s01e01-osint-rdp/

https://slack.dev/python-slackclient/auth.html

https://gist.github.com/devStepsize/b1b795309a217d24566dcc0ad136f784

https://keestalkstech.com/2019/10/simple-python-code-to-send-message-to-slack-channel-without-packages/

¿Quieres aprender estas técnicas en profundidad?

Continúa tu ruta con Ciberseguridad Personal.

José Moreno

Escrito por

José Moreno

Purple Team

Jugador de HTB, script kiddie, apasionado por la seguridad informática especialmente red team, Miembro Fundador Asociación Panameña de Peritos en Informática Forense, Purple-Team UTP.

Sigue leyendo

Como crear un CTF con Owasp Juice Shop y Traefik
Seguridad de la información

Como crear un CTF con Owasp Juice Shop y Traefik

EElzer Pineda

Durante toda mi aventura con Owasp Juice Shop he realizado eventos de ctf en la Comunidad Dojo Panamá y poner en práctica todos nuestros conocimientos en aplicaciones web vulnerables. El proceso de configurar los servicios, aplicación, dominios puede llevarte horas de implementación.

Instalar Openstack en Ubuntu con Devstack
Seguridad de la información

Instalar Openstack en Ubuntu con Devstack

José Moreno

Compartiendo con unos colegas surge un proyecto de cloud que tenía en mente para unas clases, implementar una nube privada, la mayoría de los profesionales de tecnología que conocemos les viene a la mente el uso de proveedores grandes como Azure, AWS o Google, sin embargo para una entidad educativa pública, no sé cuenta con el presupuesto para adquirir estos servicios.

OSINT Docker Registry
Seguridad de la información

OSINT Docker Registry

José Moreno

Recientemente he tenido algo de tiempo para dedicarme a escribir un poco sobre algunas investigaciones realizadas, principalmente al ser jugador de Hack The Box (no profesional), me intrigaba el hecho de lograr explotar ciertas vulnerabilidades que me ha tocado realizar durante mis horas de prácticas ofensivas y dada la casualidad mi buen amigo Big Brother (google.com) me tiene tan bien perfilado que me proporciona ciertas lecturas casi obligatorias, por lo que recomiendo vean la fuente de donde obtuve la información para mi prueba, la encontraran en las referencias.