Escaneando el abismo: detección masiva de fallos con Shodan e IPs públicas
Shodan es un motor de búsqueda especializado que permite encontrar dispositivos conectados a Internet, como servidores, cámaras IP, routers, sistemas SCADA, IoT, y más. A diferencia de Google, que indexa sitios web, Shodan indexa información de los servicios expuestos (banners) y puede mostrar:
-
Puertos abiertos
-
Versiones de software
-
Localización geográfica
-
Información del sistema operativo
-
Posibles vulnerabilidades (si están asociadas)
Es ampliamente utilizado en ciberseguridad, auditorías y reconocimiento avanzado para detectar configuraciones inseguras o dispositivos expuestos.
Con su versión gratuita, podemos hacer numerosas busquedas de equipos vulnerables, camaras expuestas, servidores mal configurados, etc.
Aunque con esta versión no podemos usar la busqueda con los "Vulnerability search filter" (solo disponible con la versión de pago) que nos permite hacer busquedas especificas de vulnerabilidades de una forma más completa y tirando a tiro fijo.. pero esto lo vamos a solucionar..
Os voy a explicar como hacer una busqueda de equipos vulnerables con Shodan y sacarles a todos sus CVEs gratis, si, sin pagar un duro..
Lo primero es hacer una busqueda de equipos con algun tipo de vulnerabilidad, en este ejemplo he buscado equipos con una version de Apache vulnerable, para ello he usardo el dork:
product:"Apache httpd" version:"2.2.8"
Esta versión de apache tiene las siguientes vulnerabilidades:
CVE-2012-3499 – Cross-Site Scripting (XSS) en múltiples módulos-
Vulnerabilidades XSS en los módulos
mod_imagemap
,mod_info
ymod_status
permiten a atacantes remotos inyectar scripts maliciosos a través de nombres de host y URIs manipulados.
mod_proxy_balancer
-
El manejador de balanceo de carga (
mod_proxy_balancer
) es susceptible a ataques XSS, lo que permite a usuarios maliciosos inyectar scripts arbitrarios en la interfaz de gestión.
mod_isapi
(Windows)-
En sistemas Windows, el módulo
mod_isapi
no garantiza que el procesamiento de la solicitud se complete antes de descargar el módulo ISAPI, lo que podría permitir la ejecución de código arbitrario.
ap_pregsub
-
El uso del módulo
mod_setenvif
sin restricciones adecuadas puede permitir a usuarios locales causar un desbordamiento de memoria, potencialmente provocando una denegación de servicio.
mod_status
-
Una vulnerabilidad XSS en el módulo
mod_status
permite a atacantes inyectar scripts maliciosos a través del parámetro de actualización (refresh
) en las páginas de estado.
mod_imagemap
-
El módulo
mod_imagemap
es vulnerable a ataques XSS cuando se accede a archivos de mapas de imagen públicos, permitiendo la inyección de código malicioso.
Una vez que tengamos los resultados de los equipos vulnerables, le damos al botón de Download Results como os indiqué en la imagen de antes, lo cual nos descargará los resultados en un archivo .gz lo descomprimimos y obtendremos un archivo .json.
¿Que tenemos en ese archivo .json?
!Muchos datos de los equipos vulnerables a esa versión de apache!
Vamos a extraer lo que más nos interesa del archivo, las direcciones IP. Lo cual el programa Cyberchef de nuestro Kali Linux es perfecto para ello.
Abrimos Cyberchef y en el nuestro archivo json, luego a la izquierda le damos a Extractors y aplicamos una extracción de las direcciones IP.
Luego, le damos a descargar los resultados, que no son mas que un fichero de direcciones IP vulnerables.
import json
def obtener_vulnerabilidades(ip):
url = f"https://internetdb.shodan.io/{ip}"
try:
respuesta = requests.get(url, timeout=10)
if respuesta.status_code == 200:
datos = respuesta.json()
if 'vulns' in datos and datos['vulns']:
return datos['vulns']
except requests.RequestException as e:
print(f"Error al consultar {ip}: {e}")
return []
def procesar_ips(archivo_entrada, archivo_salida):
with open(archivo_entrada, "r") as f:
ips = [line.strip() for line in f if line.strip()]
with open(archivo_salida, "w") as f:
for ip in ips:
vulns = obtener_vulnerabilidades(ip)
if vulns:
f.write(f"{ip}: {', '.join(vulns)}\n")
print(f"{ip} tiene vulnerabilidades: {', '.join(vulns)}")
if __name__ == "__main__":
procesar_ips("lista.txt", "vulns.txt")
Comentarios