Para conocer las IPs de shodan lo que se hace es solicitar un escaneo desde cualquiera de sus herramientas y observar las IPs que realizan el escaneo. Una vez obtenidas las IPs se bloquean y se vuelve a realizar otra petición de escaneo para encontrar nuevas direcciones IP. Eso realizado una y otra vez desde varios servidores permite tener una lista más o menos completa de las IPs que utiliza shodan. Por suerte instituciones como SAN ofrecen listados actualizados que pueden servir para bloquear / engañar a shodan.
Listado actualizado en XML/JSON con las IPs de shodan.
Recopilación de IPs de otros servicios similares (incluido shodan).
SAN API Documentación: https://isc.sans.edu/api/
Agregar las IPs de todos los crawlers (SAN blacklist) a iptables mediante ipset.
ipset es una extensión de iptables que permite crear reglas para “conjuntos” completos de direcciones. A diferencia de la definición habitual de reglas de iptables, los conjuntos de IP se almacenan en estructuras de datos indexados, lo que resulta en búsquedas más eficientes, incluso al tener grandes conjuntos.
El uso de ipset no es obligatorio ni tampoco 100% necesario en este caso ya que no es un número muy grande de direcciones IPs. Una ventaja es que nos permite actualizar el listado sin tener que configurar / reiniciar iptables.
ipset create crawler_bots hash:ip curl -s https://isc.sans.edu/api/threatcategory/research?json | jq '.[] | {ipv4}' | grep ':' | awk '{ print $2 }' | tr -d '"' | xargs -L1 ipset add crawler_bots iptables -I INPUT -m set --match-set crawler_bots src -j DROP
Listar las direcciones IP del conjunto crawler_bots.
ipset -L crawler_bots Name: crawler_bots Type: hash:ip Revision: 4 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 15936 References: 1 Number of entries: 611 Members: 184.105.139.70 65.49.20.85 141.212.121.26 141.212.121.138 74.82.47.32 ...
Borrar entradas en ipset.
ipset del crawler_bots X.X.X.X # Borra la IP X.X.X.X del grupo crawler_bots. ipset flush crawler_bots # Borra todas las IPs del conjunto crawler_bots. ipset destroy crawler_bots # Borra el conjunto crawler_bots.
NOTA: ipset aporta a iptables un magnífico rendimiento cuando hay decenas de miles de reglas en uso. Pero todavía se podría optimizar más si se usan rangos en vez de direcciones (/32), para ello merece la pena echar un vistazo al comando “iprange”, el cual nos permite obtener rangos de listados de IPs para usar con ipset.
# Con iprange. curl -s https://isc.sans.edu/api/threatcategory/research?json | jq '.[] | {ipv4}' | grep ':' | awk '{ print $2 }' | tr -d '"' | iprange | wc -l 72 # Sin iprange. curl -s https://isc.sans.edu/api/threatcategory/research?json | jq '.[] | {ipv4}' | grep ':' | awk '{ print $2 }' | tr -d '"' | wc -l 511
Cronjob para tener actualizada la lista y bloquear las IPs de los crawlers (Usando iprange, pero no es obligatorio).
# Vacía el conjunto de IPs de crawler_bots (previamente creado) y vuelve a cargarlo con la nueva lista disponible desde la web de SAN. ipset flush crawler_bots curl -s https://isc.sans.edu/api/threatcategory/research?json | jq '.[] | {ipv4}' | grep ':' | awk '{ print $2 }' | tr -d '"' | iprange | xargs -L1 ipset add crawler_bots
Este mismo proceso se podría usar para denegar IPs de TOR, Facebook (tráfico saliente ;D), etc. En el proyecto firehol se pueden encontrar muchos listados interesantes.
Listas negras de IPs (Firehol): https://github.com/firehol/blocklist-ipsets