Bonjour à tous, aujourd’hui on va regarder comment on peut construire une Blacklist Iptables AbuseIPDB de 10 000 adresses IP malveillantes issu d’AbuseIPDB pour iptables et tout ça gratuitement !
AbuseIPDB ?
AbuseIPDB est un projet collaboratif (détenu par Marathon Studios Inc. depuis 2016) de déclaration des IP malveillantes de façon communautaire. Le service permet de :
- signaler des adresses IP qui présentent des comportement aggressifs, par exemple : du portscan ou du bruteforce ;
- contrôler si une IP est (ou a été) référencée par d’autres utilisateurs comme malveillante ;
- récupérer des listes d’adresses IP pourries par API ou depuis l’interface web.
C’est ce dernier point qui nous intéresse aujourd’hui du coup.
Extraire les IPs malveillante d’AbuseIPDB
Alors il faut savoir qu’AbuseIPDB autorise une inscription gratuite. Celle-ci inclus un certain nombre d’appel à l’API. La première étape de ce tuto est donc de s’inscrire en Free. En « individuel » ou « webmestre », ce dernier profil vous permettant, si vous faire valider votre site si vous mettez jolie un badge abuseIPDB, comme ci-dessous, quelque part sur votre site. Cela permet de passer à 5000 requêtes de signalement au lieu de 1000 normalement.
Une fois que vous en êtes inscrit, vous pourrez vous authentifier sur l’IHM web et créer une clé d’API dans l’interface :
Intérroger l’API AbuseIPDB en PowerShell
Une fois la clé d’API prête (n’essayez pas celle au dessus, je l’ai delete hein…), il ne reste plus qu’a faire du PowerShell pour sortir la blacklist d’abuse IPDB. Attention : la requête API blacklist est limitée à 10 requêtes par jour, ça ne fait pas beaucoup. Il y a d’autres requêtes pour reporter ou contrôler une IP mais elles en nous concernent pas ici, je vous laisse contrôler la doc au besoin.
Bref, voici comment sortir la liste (Json) des 10 000 IP les plus malveillantes du coup :
Invoke-RestMethod https://api.abuseipdb.com/api/v2/blacklist -Headers @{"Key"="$APIKEY";"Accept"="application/json"} -Body confidenceMinimum=100
Si vous voulez les chopper un format texte brut pour les envoyer directement dans un outils de CTI ou dans des fonctions de blocage de vos pare-feu :
$data = Invoke-RestMethod https://api.abuseipdb.com/api/v2/blacklist -Headers @{"Key"="$APIKEY";"Accept"="text/plain"} -Body confidenceMinimum=100
Notez pour votre culture qu’il est possible de faire faire du geofencing (ça ne sert à rien mais les RSSI adorent ça alors je vous le met), par exemple :
Invoke-RestMethod https://api.abuseipdb.com/api/v2/blacklist?onlyCountries=US,RU -Headers @{"Key"="$APIKEY";"Accept"="application/json"} -Body confidenceMinimum=90 Invoke-RestMethod https://api.abuseipdb.com/api/v2/blacklist?exceptCountries=FR,DE -Headers @{"Key"="$APIKEY";"Accept"="application/json"} -Body confidenceMinimum=90
Je vous laisse faire par vous même l’extraction dans un fichier. Ce n’est pas bien compliqué.
Blacklist Iptables AbuseIPDB
Bon, ici on a une grosse liste d’IP, c’est bien. Sauf qu’on ne peut pas les ajouter une par une dans le firewall avec des règles « INPUT $IP DENY ». En effet iptables travaille séquentiellement, c’est à dire règle par règle. Si on attaques les 10 000 adresses une par une, ça va flinguer la tronche aux perfs du serveurs… Pour ça il existe un petit un outils pour iptables : ipsets, qui est justement conçu pour ça.
Donc première étape sortir la liste des IP à bloquer (donc ici je passe en bash hein) :
$ curl -G https://api.abuseipdb.com/api/v2/blacklist -d confidenceMinimum=90 -H "Key: $APIKEY" -H "Accept: text/plain" > blocklist.txt
Ensuite, vous devez installer ipset sur votre serveur (Debian 11 ici) :
# apt-get install ipset
Après, il faut créer une première blocklist dans ipset (utilisez bien le Hash:ip pour des listes de blocages d’IP « aléatoire ». Je vous laisse regarder la doc sur les différents type de set possible) :
# ipset create blocklist hash:ip hashsize 4096
Enfin, la placer dans Iptables en règle de DROP (et n’oubliez pas de passer par votre fichier iptables-save pour maintenir la règle entres les reboot) :
iptables -I INPUT -m set --match-set blocklist src -j DROP
Et voilà il ne reste plus qu’a ajouter la liste en provenance d’abuseIPDB dans la blocklist :
ip_abuseipdb=$(cat blocklist.txt) for ip_row in $ip_abuseipdb; do ipset add blocklist ${ip_row}; done
L’absolue majorité des adresses IP dans la liste est en IPv4 mais il y a quelques adresses IPv6 aussi. Elles vont générer des avertissements (ipset v7.10: Syntax error: cannot parse $IPv6 resolving to IPv4 address failed
). Donc, en production, pensez à séparer V4 et V6 dans 2 fichiers séparés (avec une bonne regex) et appliquer une blocklist sur votre chaine IPv6 dans iptables :
ipset create blacklist6 hash:net hashsize 4096 family inet6 ip6tables -I INPUT -m set --match-set blacklist6 src -j DROP
Maintenir la Blacklist Iptables AbuseIPDB à jour
Bon c’est bien tout ça mais malheuresement les attaquants n’ont pas réservé sur leur RIR des plages IP statiques qui ne change pas au cours du temps. Comme pour n’importe quelle source de CTI, notre liste de n’a de valeur que si l’information est « fraiche ».
Il faut en conséquence maintenir la liste à jour dans un script à appliquer régulièrement pour éviter de bloquer des IP légitimes. Je vous propose donc ce petit script bash à claquer dans vos crontab 2-3 fois par jour :
#!/bin/bash # Licence MIT, from geekeries.org ! #Authentication key APIKEY=yourapikey # get the new list curl -G https://api.abuseipdb.com/api/v2/blacklist -d confidenceMinimum=90 -H "Key: $APIKEY" -H "Accept: text/plain" > blocklist_new.txt # create a new set ipset create blocklist_new hash:ip hashsize 4096 # populate the new_set ip_abuseipdb=$(cat blocklist_new.txt) for ip_row in $ip_abuseipdb; do ipset add blocklist_new ${ip_row}; done # Swap the content of two sets, i.e exchange the name of two sets ipset -W blocklist blocklist_new # Drop the old set which was swapped in "blocklist_new" ipset -X blocklist_new
Et voilà, votre firewall iptables va désormais bloquer 10000 ip identifiées comme malveillantes par abuseIPDB.
Conclusion
Voilà, j’espère que mon petit TP sur la Blacklist Iptables AbuseIPDB vous servira. Moi j’ai trouvé ça bien pratique et simple à mettre en place. Vu le bruits ambiant que le serveur se prend dans la tronche au quotidien, c’est une bonne idée à mettre en place gratuitement à titre perso ou pro. De mon côté, je me suis rajouté une règle de log iptables pour pouvoir suivre l’effet de ma blocklist dans le temps dans mon splunk free :-). Je vous dirai si ca sert à quelques chose mais en tout cas, en 30min, j’ai déjà plus de 500 lignes en block sur cette règle !
Pour les plus volontaires, notez que vous pouvez aussi configurer fail2ban aussi pour qu’il signale automatiquement (genre depuis vos authen wordpress ou ssh) les IP bannies à abuseIPDB. Et ainsi apporter à votre pierre à l’édifice (quand c’est gratuit,c’est toi produit, hein? ).
Enfin, notez que 10 000 c’est un peu light car AbuseIPDB annonce quand même 70K ip à 95% « confidence »… Du coup vous ne choppez que 1/7ème du problème ici, mais… c’est gratuit !
Pour terminer, n’oubliez pas qu’il y a d’autres sources d’IP malveillantes que vous pouvez intégrer : abuse.ch, shodan, virustotal.com, ipqualityscore.com, urlscan.io, talosintelligence.com, etc. et je ne vous parle pas des fournisseurs de CTI commerciaux comme RecordedFutur ou Sekoia. N’hésitez pas à compléter vos sources API en fonction de ce que vous avez, hein…
C’est tout pour moi aujourd’hui, blocklistez bien du coup ?