
Artículo · Seguridad de la información
OSINT Automatizado con Shodan y Slack
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
¿Quieres aprender estas técnicas en profundidad?
Continúa tu ruta con Ciberseguridad Personal.

Escrito por
José MorenoPurple 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.



