La Fibre

Datacenter et équipements réseaux => Routeurs => MikroTik MikroTik RouterOS => Discussion démarrée par: Gnubyte le 02 janvier 2023 à 00:07:16

Titre: Script d'inclusion de blocklistes de moches
Posté par: Gnubyte 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: yeocti 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: Gnubyte 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: Gnubyte 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: yeocti 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 :

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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: zoc 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 :):


Titre: Script d'inclusion de blocklistes de moches
Posté par: JcDenis 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: fttmeh 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: filou59 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: filou59 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:


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
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.


Titre: Script d'inclusion de blocklistes de moches
Posté par: zoc 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.
Titre: Script d'inclusion de blocklistes de moches
Posté par: jericho63 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

Titre: Script d'inclusion de blocklistes de moches
Posté par: fttmeh le 19 octobre 2023 à 16:25:21
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.


En effet, c'est le mieux à faire (dropper en table RAW).
Titre: Script d'inclusion de blocklistes de moches
Posté par: kgersen le 19 octobre 2023 à 17:21:00
dans le doute toujours regarder ce schéma:

(https://karchnu.fr/resources/img/iptables-Flowchart.jpg)
(source (https://karchnu.fr/pages/securite-systemes-et-reseaux/iptables.html))

l'important c'est d'être avant conntrack (connection tracking) qui consomme de la mémoire pour suivre la connexion.
Titre: Script d'inclusion de blocklistes de moches
Posté par: jericho63 le 19 octobre 2023 à 18:43:00
merci pour vos réponses