Auteur Sujet: Script d'inclusion de blocklistes de moches  (Lu 3711 fois)

0 Membres et 1 Invité sur ce sujet

Gnubyte

  • Abonné Orange Fibre
  • *
  • Messages: 1 078
  • Toulon (83)
    • HSGMII intégriste
Script d'inclusion de blocklistes de moches
« le: 02 janvier 2023 à 00:07:16 »
RouterOS permet des fonctionnalités vraiment intéressantes avec ses scripts.

Voici notamment un script que j'utilise depuis quelques temps, qui pompe sur la toile des listes d'IPs notoirement décrites comme sujettes à attaques et autres malversations. Je préfère autant que toute sollicitation de ces IPs soient droppées cash.

# merci diamuxin@forum.mikrotik.com/viewtopic.php?t=182441 l'idée originale et le code.

Citer
/system scheduler add interval=4h name=FireHol-Level1 on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\r\
    \n\$update url=https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/firehol_level1.netset description=\"FireHOL Level1\" delimiter=(\"\\n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=apr/13/2022 start-time=01:30:46
/system scheduler add interval=4h name=DShield on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\$update url=https://www.dshield.org/block.txt description=DShield delimiter=(\"\\t\") cidr=/24" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=apr/13/2022 start-time=01:35:59
/system scheduler add interval=4h name="Spamhaus DROP" on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\$update url=https://www.spamhaus.org/drop/drop.txt description=\"Spamhaus DROP\" delimiter=(\"\\_\")\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=apr/13/2022 start-time=01:33:04
/system scheduler add interval=4h name="Spamhaus EDROP" on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\r\
    \n\$update url=https://www.spamhaus.org/drop/edrop.txt description=\"Spamhaus EDROP\" delimiter=(\"\\_\")\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=apr/23/2022 start-time=01:40:10
/system scheduler add interval=4h name="Abuse.ch SSLBL" on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\r\
    \n\r\
    \n\$update url=https://sslbl.abuse.ch/blacklist/sslipblacklist.txt description=\"Abuse.ch SSLBL\" delimiter=(\"\\r\")" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=apr/23/2022 start-time=01:46:21
/system scheduler add interval=4h name="Abuse.ch FEODO" on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\r\
    \n\r\
    \n\$update url=https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt description=\"Abuse.ch FEODO\" delimiter=(\"\\r\")" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=apr/23/2022 start-time=01:46:21
/system scheduler add interval=4h name=FireHol-Level2 on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\r\
    \n\$update url=https://raw.githubusercontent.com/ktsaou/blocklist-ipsets/master/firehol_level2.netset description=\"FireHOL Level2\" delimiter=(\"\\n\")" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jan/01/2023 start-time=23:44:40
/system scheduler add interval=4h name=Malc0de on-event="/ip firewall address-list\r\
    \n:local update do={\r\
    \n:do {\r\
    \n:local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \nremove [find list=blacklist comment=\$description]\r\
    \n:while ([:len \$data]!=0) do={\r\
    \n:if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n:do {add list=blacklist address=([:pick \$data 0 [:find \$data \$delimiter]].\$cidr) comment=\$description timeout=1d} on-error={}\r\
    \n}\r\
    \n:set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n}\r\
    \n} on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\r\
    \n\$update url=https://iplists.firehol.org/files/iblocklist_malc0de.netset description=\"malc0de\" delimiter=(\"\\n\")" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jan/01/2023 start-time=23:46:52

À cet instant, ceci évince 6958 IPs ou tranches d'IPv4, qui proviennent de sources pénibles.

Tout ajout, modification, optimisation est toujours la bienvenue.
« Modifié: 04 janvier 2023 à 11:01:13 par Gnubyte »

yeocti

  • Abonné Sosh fibre
  • *
  • Messages: 210
  • Plougastel-Daoulas (29)
Script d'inclusion de blocklistes de moches
« Réponse #1 le: 02 janvier 2023 à 09:48:05 »
Bonjour,

D'après la description des listes sur Firehole, la liste firehol_level1 inclut déjà les listes Spamhaus DROP et EDROP, Dshield (top 20 des réseaux classe C) et également les listes de abuse.ch (Feodo et SSLBL).
Et j'ai l'impression que tu télécharges deux fois la liste Firehol_level2.

Gnubyte

  • Abonné Orange Fibre
  • *
  • Messages: 1 078
  • Toulon (83)
    • HSGMII intégriste
Script d'inclusion de blocklistes de moches
« Réponse #2 le: 03 janvier 2023 à 01:23:47 »
Le contenu des listes peut varier entre le moment où je les ai monté et maintenant. Je vais vérifier.
Je peux m'être emmêlé les pinceaux en faisant le copier coller tard. Je vais vérifier.

Gnubyte

  • Abonné Orange Fibre
  • *
  • Messages: 1 078
  • Toulon (83)
    • HSGMII intégriste
Script d'inclusion de blocklistes de moches
« Réponse #3 le: 03 janvier 2023 à 08:21:24 »
1- Tu as raison, une redite de Level2 m'a échappé, liée à des tests, sur le planning d'exécution de Level1. Je vais la retirer à tête reposée depuis un export de la configuration.
2- Sur l'interface des listes d'adresses du FW IPv4 de RouterOS, on peut afficher les IP par ordre croissant, et je ne vois pas de redite. On y trouve des IPs de toutes les listes, avec des IP ou des tranches uniques.

yeocti

  • Abonné Sosh fibre
  • *
  • Messages: 210
  • Plougastel-Daoulas (29)
Script d'inclusion de blocklistes de moches
« Réponse #4 le: 03 janvier 2023 à 10:16:47 »
Dans le script présenté plus haut, les listes possèdent toutes le même nom.
Ainsi, lors de l'ajout des IPs, si l'une d'elle est déjà présente, elle ne sera pas ajoutée en doublon, quelle que soit la source.
Il n'est donc pas possible de vérifier les doublons de cette manière.

J'ai testé le script en définissant un nom unique pour chaque liste et je constate bien des doublons :
  • Firehol Level2 n'est pas intégrée à 100% dans Firehol Level1 mais il y a quelques doublons
  • DShield est intégrée à 100% dans Firehol Level1
  • Spamhaus DROP et EDROP sont intégrées à 100% dans Firehol Level1

Il y a un souci avec les listes suivantes :

Manifestement la liste malc0de n'est plus maintenue (ta source pour cette liste est Firehol avec une version qui date de 2019).
Les listes Feodo et SSL BL de abuse.ch sont bien maintenue mais leur intégration dans les listes de Firehol ne se font pas. J'ai ouvert un ticket auprès de Firehol à ce sujet.

Pour rationaliser les téléchargements, je pense que les listes Firehol Level1, Firehol Level2 et abuse.ch suffisent.
Il est possible de remplacer malc0de par iblocklist_malc0de (https://iplists.firehol.org/?ipset=iblocklist_malc0de)
Lorsque le problème d'ajout des listes de abuse.ch dans Firehol sera résolue, il sera également possible de les retirer.

Inutile de préciser qu'en reposant uniquement Firehol, on s'expose à d'éventuels problèmes de mise à jour.

zoc

  • Abonné Orange Fibre
  • *
  • Messages: 4 532
  • Antibes (06) / Mercury (73)
Script d'inclusion de blocklistes de moches
« Réponse #5 le: 03 janvier 2023 à 11:29:01 »
Pour ceux qui ont les compétences techniques (et le matériel, un conteneur Proxmox ou Docker devrait pouvoir le faire), je suggère de developper un script qui télécharge et consolide les listes (cidrmerge le fait très bien) et d'exposer le résultat sur une URL interne (avec lighthttp) que le routeur ira télécharger. Ca évitera les doublons qui à priori peuvent toujours arriver si le netmask n'est pas le même (par exemple par sur que le mikrotik consolide de lui même 10.0.0.0/8 et 10.0.0.0/16 en 10.0.0.0/16).

C'est ce que je pense faire de mon coté (en y rajoutant ma propre liste obtenue à partir des logs du firewall stockées dans graylog). J'ai d'ailleurs un joli dashboard grafana pour visualiser tout ça :):



JcDenis

  • Abonné Orange Fibre
  • *
  • Messages: 89
  • Amberieu-en-Bugey 01
    • L'homme invisible
Script d'inclusion de blocklistes de moches
« Réponse #6 le: 13 janvier 2023 à 20:07:57 »
Quelqu'un saurait comment intégrer les listes de https://cinsarmy.com/ ? Mon UDM Pro les utilisait, ça me paraissait pas mal.

fttmeh

  • Abonné Orange Fibre
  • *
  • Messages: 261
  • Hauts-de-Seine
Script d'inclusion de blocklistes de moches
« Réponse #7 le: 23 janvier 2023 à 15:41:32 »
J’ai modifié un peu le script pour mon usage, j’utilise firehol Level 1 + spamhaus edrop :
/system script add dont-require-permissions=no name=update_blocklist_ipv4 policy=ftp,read,write,policy,test,sensitive source="/ip firewall address-list\r\
    \n:local update do={\r\
    \n    :do {\r\
    \n    :local data ([:tool fetch url=\$url output=user as-value]->\"data\")\r\
    \n    :local array [find dynamic list=wan_blocklist]\r\
    \n    :foreach value in=\$array do={:set array (array,[get \$value address])}\r\
    \n    :while ([:len \$data]!=0) do={\r\
    \n        :if ([:pick \$data 0 [:find \$data \"\\n\"]]~\"^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\") do={\r\
    \n            :local ip ([:pick \$data 0 [:find \$data \$delimiter]].\$cidr)\r\
    \n            :do {add list=wan_blocklist address=\$ip comment=\$description timeout=25h} on-error={\r\
    \n                :do {set (\$array->([:find \$array \$ip]-[:len \$array]/2)) timeout=25h} on-error={}\r\
    \n                }\r\
    \n        }\r\
    \n        :set data [:pick \$data ([:find \$data \"\\n\"]+1) [:len \$data]]\r\
    \n        }\r\

   \n        :log info \"Address list <\$description> successfully updated\"\r\

    \n    } on-error={:log warning \"Address list <\$description> update failed\"}\r\
    \n}\r\
    \n\$update url=https://iplists.firehol.org/files/firehol_level1.netset description=firehol_level1_ipv4 delimiter=(\"\\n\") \r\
    \n\$update url=https://www.spamhaus.org/drop/edrop.txt description=\"Spamhaus EDROP\" delimiter=(\"\\_\")"

Je fais tourner le script via le scheduler toutes les 24h, et les adresses à bloquer restent dans la liste pendant 25h, afin de ne pas avoir à nettoyer la liste avec un script.

filou59

  • Abonné Orange Fibre
  • *
  • Messages: 69
  • 59
Script d'inclusion de blocklistes de moches
« Réponse #8 le: 08 octobre 2023 à 12:46:34 »
Salut zoc, ton idée est intéressante.

Est-ce que tu as avancé sur le sujet, pour le partager eventuellement ?

Sinon je vais m'y mettre.
Je vais partir sur un petit container LXC sous proxmox.

filou59

  • Abonné Orange Fibre
  • *
  • Messages: 69
  • 59
Script d'inclusion de blocklistes de moches
« Réponse #9 le: 08 octobre 2023 à 21:13:07 »
J'ai avancé un peu sur l'idée de zoc, je suis en train de partir sur la chose suivante:

  • Container LXC basé sur une Debian (On peut trouver plus léger sous Alpine, mais pour le moment je fais avec ce que je maitrise le mieux  :D )
  • Telechargement des Listes + Triturage pour retirer les commentaires...
  • Concatenation des listes
  • Exécution de cidr-merger
  • Envoi de la liste via SCP en SSH

Avec cette solution, pas besoin de mettre en place un serveur WEB
On transfert notre liste dans le routeur

Du coup il n'y a plus qu'a importer la liste via un script via le scheduler du Mikrotik


Preparation du container

J'ai utilisé un script de chez TTeck pour créer le container :
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/debian.sh)"PS : Le container occupe 389Mo sur les 2Go. On peut donc réduire l'image disque lors de la création
Note : J'utilise le mode avancé pour définir moi même certaines options.


Récupération et Installation de cidr-merger :
wget https://github.com/zhanhb/cidr-merger/releases/download/v1.1.3/cidr-merger-linux-amd64

cp cidr-merger-linux-amd64 /usr/bin/cidr-merger
chmod 770 /usr/bin/cidr-merger


Recupération des Listes via un wget
  • Download via wget
  • Suivant les listes on vire les commentaires : a coup de sed
  • Pour certaines il faut mettre en forme et extraire l'ip ou le bloc d'ip via awk
  • J'applique une 1ere foi cidr-merger
  • J'efface le fichier téléchargé
wget -q https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/firehol_level1.netset && sed '/^#/d' firehol_level1.netset | cidr-merger -eo firehol_level1.merger && rm firehol_level1.netset
wget -q https://www.dshield.org/block.txt && sed '/^#/d' block.txt | awk '{print $1 "-" $2}' | cidr-merger -eo block.merger && rm block.txt
wget -q https://www.spamhaus.org/drop/drop.txt && cat drop.txt | awk '{print $1}' | cidr-merger -eo drop.merger && rm drop.txt
wget -q https://www.spamhaus.org/drop/edrop.txt && cat edrop.txt | awk '{print $1}' | cidr-merger -eo edrop.merger && rm edrop.txt
wget -q https://sslbl.abuse.ch/blacklist/sslipblacklist.txt && sed '/^#/d' sslipblacklist.txt | cidr-merger -eo sslipblacklist.merger && rm sslipblacklist.txt
wget -q https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt && sed '/^#/d' ipblocklist_recommended.txt | cidr-merger -eo ipblocklist_recommended.merger && rm ipblocklist_recommended.txt
wget -q https://raw.githubusercontent.com/ktsaou/blocklist-ipsets/master/firehol_level2.netset  && sed '/^#/d' firehol_level2.netset | cidr-merger -eo firehol_level2.netset.merger && rm firehol_level2.netset
wget -q https://iplists.firehol.org/files/iblocklist_malc0de.netset && sed '/^#/d' iblocklist_malc0de.netset | cidr-merger -eo iblocklist_malc0de.netset.merger && rm iblocklist_malc0de.netset

On concatene tous les fichiers puis on applique une derniere fois le script
cat firehol_level1.merger block.merger drop.merger edrop.merger sslipblacklist.merger ipblocklist_recommended.merger firehol_level2.netset.merger iblocklist_malc0de.netset.merger | cidr-merger -eo myblocklist

Preparation de la partie SSH

Chez moi je change le port du SSH, sur le routeur :
Citer
/ip service set ssh port=XXXX
Pour l'ajout d'un user :
/user add name=sshuserdurouteur password="ZZZZZZZ" group=full
Dans votre container :
Générer une clé RSA :
ssh-keygen -t rsa -b 2048
Copier la clé public ds le routeur, un glisser déposer dans winbox par exemple.

Dans le routeur, importer la clé public sur l'utilisateur :
/user ssh-keys import public-key-file=id_rsa.pub user=sshuserdurouteur
Depuis votre container tester la connexion :
ssh sshuserdurouteur@192.168.10.1 -p leportsshdevotrerouteur
Vous devez atterir dans la console de votre routeur.

Voilà on peut maintenant envoyer notre fichier via la commande scp :
scp -P leportsshdevotrerouteur myblocklist sshuserdurouteur@192.168.10.1:/

Me reste plus qu'a mettre ca dans un script bash puis de faire une tache cron (A Faire prochainement)
Puis d'importer le fichier générer dans le routeur.


N'hésitez pas si vous avez des idées ou des suggestions.



zoc

  • Abonné Orange Fibre
  • *
  • Messages: 4 532
  • Antibes (06) / Mercury (73)
Script d'inclusion de blocklistes de moches
« Réponse #10 le: 09 octobre 2023 à 08:46:02 »
Est-ce que tu as avancé sur le sujet, pour le partager eventuellement ?
Non, pas vraiment.

A vrai dire pour l'instant je n'ai pas de blocklist du tout, et je ne sais pas si je vais en mettre une.

jericho63

  • Abonné Orange Fibre
  • *
  • Messages: 122
  • COURNON 63
Script d'inclusion de blocklistes de moches
« Réponse #11 le: 19 octobre 2023 à 15:44:23 »
Bonjour,

j'ai mis en place ces scripts mais j'ai une question de newbie concernant la règle de pare-feu à mettre en place.

il vaut mieux faire le drop dans filter ou dans raw? de ce que j'ai compris dans mes lectures les regles raw s'appliquent avant le filter.

j'ai fait ça
/ip firewall raw
add action=drop chain=prerouting in-interface=ether1 src-address-list=Blacklist