anti brutes
#1

Sur son site, Bruno F nous propose un script qui scanne les journaux pour de possibles attaques sur le service ssh et place les IP sur liste noire : addbrute.sh.

J'ai modifié son travail légèrement pour le simplifier d'une certaine façon et permettre de gérer d'autres services si besoin.
Voici ce que ça donne, libre à vous de commenter Smile

Code :
#!/bin/sh
# evils.sh : scan logs for bruteforcers and add ip to pf table
#
# stolen here : https://www.bsdhowto.ch/addbrute.html
#
# modifications by prx <prx@ybad.name>:
#  - remove "uniq", use "sort -u" instead
#  - no /tmp/ipdump.txt temporary file anymore
#  - allow multiple log files passed as argument
#  - $exclude variable is no longer an array : grep filter ip.
#  - Do not rely on ksh

# How to use:
# 1. add a table in /etc/pf.conf:
#  table <evils> persist
#  ...
#  block quick from <evils>
#
# 2. add a new cron entry to run this script every 5 min
# # crontab -e
#  */5  *  *  *  *  /root/bin/evils.sh /var/log/authlog /var/log/maillog
#
# 3. Clean this table everyday in /etc/daily.local
#  pfctl -t evils -T expire 86400

usage() {
echo "usage: ${0##*/} /path/to/log1 /path/to/log2 ..."
exit 1
}

test $# -gt 0 || usage
tmp=$(mktemp) || (echo "can't create tmp file"; exit 1)

# ip to ignore. regex allowed
exclude="127\.0\.0\.1|\
192\.168\.1\.*|\
93\.6\.177\.187|\
46\.23\.93\.119"

# pf table
pftable="evils"

# Add you own filter
# /pattern to select line/{
# s/regex to remove before ip//
# s/regex to remove after ip//p
# }
sed -nE "/sshd.*Invalid user/{
s/.* from //
s/ port .*//p
}
/sshd.*Failed password/{
s/.* from //
s/ port .*//p
}
/sshd.*Unable to negotiate with/{
s/.* with //
s/ port .*//p
}
/sshd.*Bad protocol version identification/{
s/.* from //
s/ port .*//p
}
/sshd.*Disconnected from authenticating user root/{
s/.* root //
s/ port .*//p
}" $@ |\
sort -u |\
grep -Ev "$exclude" > $tmp

pfctl -q -f $tmp -t $pftable -T add $ip

# kill all states for ip in $pftable
pfctl -t $pftable -T show | while read -r ip; do
    pfctl -q -k $ip
done

rm $tmp
Répondre
#2

Intéressant. Merci.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#3

En fait c'est ce que fait sshlockout, il regarde ce type d'erreur et possède un compteur interne du nombre d'erreur pour chaque IP. L'intérêt c'est de pouvoir utiliser pledge sur le programme et de ne pas avoir à parcourir l'ensemble du log à chaque lancement.

Mais c'est intéressant comme script bien évidemment.
Répondre
#4

J'allais le dire, à-propos de sshlockout. sshguard a la même fonctionnalité et semble gérer plus de choses, aussi.

Donc, de fait, sur mon serveur DNS/Web, j'ai installé sshlockout car il me semble être plus pertinent qu'un propre script :p

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#5

Souvent ces intrus essaient beaucoup de fois en peu de temps.
Code :
man -O tag=max-src-conn-rate pf.conf
Répondre
#6

@eol : Ce que tu décris est en effet important, mais n'a d'intérêt que pour les attaques "rapides". Cependant, le script proposé est là pour pallier aux attaques "lentes" indétectables avec pf : https://en.wikipedia.org/wiki/Hail_Mary_Cloud

@solene : en effet, c'est comme sshguard ou sshlockout, à ceci près que le script peut fonctionner pour d'autres logs que /var/log/authlog. Il manque toutefois un compteur, et gagnerait à être plus efficace.
Répondre
#7

@prx: à moins que je ne me trompe, mais de ce que j'ai lu sur le site de sshguard, c'est le cas, il semble être prévu pour fonctionner avec plusieurs services !

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#8

C'est ce qui est mis sur leur site, mais je n'ai pas trouvé mention de cette fonctionnalité dans la configuration.
Mais j'aime bien sshguard que j'utilise depuis des années Smile
Répondre
#9

peut-être que sous OpenBSD, il est "bridé" - ce ne serait pas le premier à être "sacrifié sur l'autel" de la sécurité.

Il faudrait chercher un peu plus, qui sait !?

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#10

(25-08-2020, 16:09:26)prx a écrit :  J'ai modifié son travail légèrement pour le simplifier d'une certaine façon et permettre de gérer d'autres services si besoin.
Voici ce que ça donne, libre à vous de commenter Smile
Comme je suis des fois un peu taquin, j'aimerais laisser savoir
qu'il est possible de faire à peu près équivalent sans scanner
les journaux après coup, sans cron et sans règle sed compliquée
en utilisant la possibilité de piper vers un script externe
directement depuis syslogd et en utilisant un simple case
dans le script. Smile
Code :
man syslog.conf 
voir la ligne avec "logsurfer" pour la syntaxe.
Répondre
#11

@eol : je t'ai déjà dit que je t'aime ?
Si non : je t'aime !
J'adore l'idée, je vais m'amuser avec Smile
Répondre
#12

@eol, stp, sois plus explicite.

Parce que perso, sur le manpage de syslog.conf, je ne trouve QUE :
Citation :# Feed everything to logsurfer.
*.* |/usr/local/sbin/logsurfer

Donc, j'en déduis que c'est un programme tiers… sauf qu'un pkg_info ne restitue rien, ni apropos !

???

Une recherche donne ce lien : https://crypt.gen.nz/logsurfer/
voire : https://crypt.gen.nz/logsurfer/

Bizarre que ce ne soit dans les packages ! ???

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#13

@prx: regarde ce tuto pour SSHGuard, concernant les autres services :
http://www.openbsd-edu.net/SSHGuard,_con...brute.html

Par contre, je me permets de le mettre ici :
Citation :(…)
Objectifs

Surveiller les connexions (via Syslog) entrantes et informer le parefeu pf des IP sources des attaques en force brute sur les divers services ouverts.

Contrairement à ce que le nom laisse penser, l'outil peut gérer les protocoles mails, webs,..
Installation et Configuration

pkg_add -i sshguard

Puis dans /etc/pf.conf

table <sshguard> persist

block in proto tcp from <sshguard> to port $mail_ports
block in proto tcp from <sshguard> to port $ssh_port
block in proto tcp from <sshguard> to port $http_ports

On teste que tout fonctionne et on relance

pfctl -vnf /etc/pf.conf
rcctl enable sshguard
rcctl start sshguard

Configuration des listes blanches

Afin de ne pas vous enfermer dehors, je vous conseille de whitelister votre accès d'administration :

mkdir -p /var/db/sshguard/
touch /var/db/sshguard/whitelist.db
echo "IP_ADM" >> /var/db/sshguard/whitelist.db
rcctl set sshguard flags -a 50 -l /var/log/authlog -l /var/log/maillog -p 14400 -w /var/db/sshguard/whitelist.db

Sur les accès Mails (Pop, Imap), et SSH, je bloque durant 4h les attaques au bout de 50 essais, sans tenir compte de l'IP d'admin.

(…)

On voit clairement l'usage dans PF vers les autres services que sont mail, web…

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#14

@prx Il me semble l'avoir déjà lu quelque part mais
ça n'enlève rien à cette nouvelle déclaration … Wink

Pour info, lors de mon test le case est enrobé dans un
Code :
while read line
do
(…)
done
On peut peut-être faire autrement mais je n'ai pas cherché.

(27-08-2020, 02:49:55)PengouinBSD a écrit :  @eol, stp, sois plus explicite.
Comme je l'écrivais, je renvoie sur cette ligne
juste pour donner une idée de la syntaxe.
Ce n'est qu'à titre d'exemple que logsurfer est écrit
dans le man. Remplace "/usr/local/sbin/logsurfer" par le chemin
vers ton propre script et éventuellement "*.*" par les "facility" et
"level" de ton choix.
Répondre
#15

(27-08-2020, 09:27:07)eol a écrit :  Pour info, lors de mon test le case est enrobé dans un
Code :
while read line
do
(…)
done
On peut peut-être faire autrement mais je n'ai pas cherché.
Comme on ne traite qu'une ligne à la fois, la boucle est superflue,
un simple
Code :
read line
suivi d'un case sur line suffit.
Répondre
#16

(27-08-2020, 02:49:55)PengouinBSD a écrit :  @eol, stp, sois plus explicite.

Citation :A pipe to another program (beginning with a leading pipe symbol). The given program is started and presented the selected messages on its standard input. If the program exits, syslogd(8) tries to restart it.
: http://man.openbsd.org/syslog.conf

@eol : reste à traiter cette ligne pour en extraire l'IP de façon efficace.

Un script shell fera l'affaire dans un premier temps.
Ensuite, un bout de C pour profiter de pledge/unveil constituera un bon défi.
Répondre
#17

(27-08-2020, 17:57:47)prx a écrit :  @eol : reste à traiter cette ligne pour en extraire l'IP de façon efficace.

Un script shell fera l'affaire dans un premier temps.
Ensuite, un bout de C pour profiter de pledge/unveil constituera un bon défi.
Oui, pour le script shell
Code :
grep -Eho '([0-9]{1,3}\.){3}[0-9]{1,3}'
est un bon début (plein d'autres choses que des des IPs valides
peuvent correspondre à cette expression mais dans le contexte de authlog,
il y a de très fortes chances que ce qui y correspondent en soit une).
Pour les autres cas, une autre branche du case peut offrir autre chose.
Répondre
#18

En comptant sur le fait que la regex fait toujours ce qu'on attend, il manque le support d'ipv6.

J'étais parti sur du 'cut' et/ou du 'awk'
Répondre
#19

(27-08-2020, 20:40:00)prx a écrit :  il manque le support d'ipv6.
Dans parse_v6() de https://www.geoghegan.ca/pub/pf-badhost/...badhost.sh
tu as un exemple mais encore avec grep.
Répondre
#20

Bonjour,

super.
mais.... l'outil "Vilain" de Prx ne fait pas déjà cela ???
le script vient en plus, en complément ?
faut plus utiliser Vilain ?
j'ai dû louper un ou plusieurs épisode de l'aventure....

Antoine
Consultant JBoss, WildFly, J2EE,.... et utilisation d'OpenBSD avec un grand plaisir.
Bon pour l'Hygiène-Numerique.
Répondre
#21

Salut!
Si, vilain fait exactement ce genre de choses, en temps réel là aussi. Vilain marche toujours très bien.
Là, j'ai envie de faire un truc plus simple, qui ne nécessite pas python, qui est plus intelligent que vilain en utilisant syslog comme le suggère eol.
Juste des geekeries finalement... Smile
Répondre
#22

ha ok !
tu as le temps ???.... tu as de la chaaannnce !!!
et nous aussi du coup,...merci pour ces outils Wink

Antoine
Consultant JBoss, WildFly, J2EE,.... et utilisation d'OpenBSD avec un grand plaisir.
Bon pour l'Hygiène-Numerique.
Répondre
#23

Le temps ?
Ha ha, parfois pendant les siestes ^^
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)