Nouveau forum : https://forum.slackware-fr.eu.org/

Annonce

29/01/2017 : Ce forum est dsormais en lecture seule. Merci d'utiliser le nouveau forum.

13/12/2014 : Inscriptions dsactives pour un moment en raison d'une recrudescence d'inscriptions plus que douteuses.

#1 03-05-2009 11:20:36

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

brute_force.pl

Vu que j'tais dans la problmatique du firewall j'ai tent d'intgrer "brute_force.pl" a mon firewall.

Le script est rest tel quel (je ne connait rien perl) (bien qu'avec les liens cliquables sur les fonctions, j'ai pu en comprendre l'usage {chouette ide ces liens cliquables} )

donc plac ou il se doit, chmod rwxr--r--, et lanc (a la main pour tester)

et patatras un retour d'erreur

Code:

machin@truc:~# /usr/sbin/firewall_ssh_force.pl /var/log/messages /var/cache/ssh_force.db /var/firewall/blacklist
Useless use of addition (+) in void context at /usr/sbin/firewall_ssh_force.pl line 100.
Use of uninitialized value in modulus (%) at /usr/sbin/firewall_ssh_force.pl line 100, <LOGFILE> line 30681.
Use of uninitialized value in modulus (%) at /usr/sbin/firewall_ssh_force.pl line 100, <LOGFILE> line 30681.
Illegal modulus zero at /usr/sbin/firewall_ssh_force.pl line 100, <LOGFILE> line 30681.

je suppose que a n'est pas grand chose, j'ai bien compris que a vient de la ligne 100 (vu que j'ai modifi juste en haut pour y intgrer en commentaire la crontab a ajouter) a as dcal de quelques lignes, donc je copie les lignes avec leurs numros.

Code:

96 if ( /sshd/ && /Failed password for/)
97          {
98          $dontblack=0;
99          $ip_cur=$_[12];
100         $count{$ip_cur}%%++%%;
101         open ( BLACKLIST, $blacklist) || die ("Cannot open blacklist file `".$blacklist."'!" );

a doit tre une erreur de copier/coller de ma part sur "$cout{$ip_cur}%%++%%;", Serge si tu pouvait m'clairer...

Hors ligne

 

#2 03-05-2009 11:44:30

Mushroom
Administrateur
Date d'inscription: 15-10-2005
Messages: 2158

Re: brute_force.pl

Salut,

Si a peut aider, la syntaxe incrimine ne ressemble pas du Perl (plutt un infme mlange Perl/wiki) ;  essaie avec $cout{$ip_cur}++; la place de $cout{$ip_cur}%%++%%;.

Hors ligne

 

#3 03-05-2009 11:55:35

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

a aide merveilleusement bien, du coup maintenant que j'ai mis du perl dans un truc perso, je doit au moins faire l'effort d'apprendre un peu les bases smile

Merci du coup de main

**EDIT**

    J'dite pour te rpondre Jonesy, histoire de te laisser le mot de la fin, a sonne comme un appel a traquer les bugs de la migration.
    C'est un plaisir (traquer les bugs ici sonne comme "se coucher beaucoup moins bte le soir smile")

Dernire modification par T-Christophe (03-05-2009 13:13:33)

Hors ligne

 

#4 03-05-2009 12:38:55

Jonesy
Elephantidae
Lieu: /usr/local/forest
Date d'inscription: 28-05-2004
Messages: 1268
Site web

Re: brute_force.pl

Bonjour,

C'est li la migration/fusion. tongue
Les "++" pouvant poser des problmes d'interprtation syntaxique maintenant que l'on a le plugin folded pour masquer les tags en fin de document.

J'ai corrig le script dans le wiki. big_smile

Merci de relever ce genre de petites erreurs.


Marchons seul, sans faire le mal, sans rien attendre, tel l'lphant qui traverse la fort.

Hors ligne

 

#5 09-05-2009 11:13:47

serge
Site Admin
Lieu: Nice
Date d'inscription: 12-02-2004
Messages: 522
Site web

Re: brute_force.pl

Tien d'ailleur ce script a lgrement volu de mon cot, il va falloir que je pense le mettre jour!


Who is General Failure and why is he reading my hard disk ?

Hors ligne

 

#6 09-05-2009 11:49:03

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

Je suis preneur, la version en cour d'usage est dj trs efficace.
Je ne m'y tait pas intress, prenant les prcautions les plus lmentaires (pas d'user "test" avec le mot de passe "test" et un mot de passe complexe sur root), mais j'ai dcouvert l'occasion de mon travail (finalis mais toujours en cour de peaufinage des dtails) sur iptables et en analysant les log du kernel une grande quantit de tentative d'attaque en brute force sur ssh.
J'ai d'ailleurs l'intention d'ajouter un changement de port d'coute d'sshd pour amliorer encore la scurit.
Je suis ce fil, si tu met jour le script, a serais cool de passer l'info ici.

Je me posait une question "bte", pourquoi le perl pour ce script, a n'aurais pas t aussi performant en bash ? ou c'est que tu est plus spcialis en perl ?

Hors ligne

 

#7 10-05-2009 23:14:00

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

Re, je me doute que le sujet n'est pas des plus passionnants, mais ...

En approfondissant et en comparant le rsultat du script avec le rsultat d'une recherche "manuelle" dans les logs du kernel, j'ai constat que le script zappe certaines IP et ne traite pas (je n'ai pas compris pourquoi) les "Failed password for" pour les tentatives faite sur un utilisateur existant root en l'occurence, il ne semble traiter que dans le cas ou cela ne concerne un utilisateur inexistant. Je ne connait rien en perl mais malgrs tout la logique parle d'elle mme et le script se lit facilement (surtout qu'il est bien comment) et ma constatation me semble compltement incohrente par rapport ce que je lit dans le script (qui ne prsente rien qui justifie que ces matchs soit ignors), mais aprs vrification attentive (j'ai mis plusieurs jours me dcider poster) je me suis rsolu ...
Au passage, j'ai pu trouver dans les log du kernel des tentatives avec "Invalid user" certainement des tentatives scp tant donn qu'il n'y as pas de "Failed password" associ, certainement rajouter dans les masques de recherche du script.

et du coup je me suis travaill a en shell en attendant smile .

c'est fonctionnel, mais il y manque une ou deux choses que je souhaite intgrer, ds que c'est fini, je livre ici (je sait qu'il y as ici des personne beaucoup plus expriments que moi au niveau du shell qui se ferons un plaisir de pointer mes erreurs ou imperfections)

Hors ligne

 

#8 14-05-2009 19:28:18

serge
Site Admin
Lieu: Nice
Date d'inscription: 12-02-2004
Messages: 522
Site web

Re: brute_force.pl

J'avais fait la premire version de ce script en bash, il traine encore p-e quelque part dans une page du wiki d'ailleur (ou bien la migration du site la dfinitivement effac). Mais pour des raisons de lisibilit du code et facilit de maintenance/volution je l'ai re-cris en Perl. Bash est bien pour des petites taches automatise simples, l pour parser des logs et stocker des IPs et status de fichiers je prfre utiliser un "vrai" language comme le Perl.
Les "problmes" que tu remontes sont effectivement corrigs dans la dernire version du script. JE dois nanmois l'pur de 2/3 choses trs spcifiques pour le diffuser publiquement. J'essaye de faire ca trs rapidement. Ds que je l'ai mis jour je posterais un petit message.


Who is General Failure and why is he reading my hard disk ?

Hors ligne

 

#9 14-05-2009 22:27:16

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

Excellente nouvelle, je suis l'coute.

Hors ligne

 

#10 16-05-2009 10:00:27

Mushroom
Administrateur
Date d'inscription: 15-10-2005
Messages: 2158

Re: brute_force.pl

Serge a crit:

Bash est bien pour des petites taches automatise simples, l pour parser des logs et stocker des IPs et status de fichiers je prfre utiliser un "vrai" language comme le Perl.

Si on veut tout prix rester dans la trousse UNIX, notons qu'il y a aussi AWK qui se prte bien ce genre de tches... wink

Hors ligne

 

#11 28-05-2009 18:54:14

serge
Site Admin
Lieu: Nice
Date d'inscription: 12-02-2004
Messages: 522
Site web

Re: brute_force.pl

Ok j'ai mis jour le script sur le wiki.
Corrections apportes:

Prcdement ds que je detectais une ligne "Failed password for ..." je rcuprais l'ip en rcuprant le 13me mot de la ligne, sauf que l'ip est bien en 13eme position si la phrase est "Failed password for invalid user toto ...." cas d'un utilisateur inconnu, et non pas "Failed password for toto ..." cas d'un utilisateur connu.

Dans le cas d'un utilisateur connu je rcuprais alors le port source au lieu de l'ip. Comme ce port n'est jamais le mme, je n'avais jamais 5 fois le mme "mot" et donc le treshold ne se dclenchais pas.

Dsomais je vrifie si c'est un utilisateur inconnu ou connu et je rcupre le bon mot qui correspond l'ip (position 13 ou 11 suivant le cas). Je vrifie aussi que j'ai bien faire une IP au cas ou (REGEXP  \d+.\d+.\d+.\d+)

(dans le script on lit 12 et 10 plutt que 13 et 11, c'est normal perl commence compter partir de 0 plutot qu' partir de 1
comme la plupart des languages d'ailleurs).


Who is General Failure and why is he reading my hard disk ?

Hors ligne

 

#12 28-05-2009 20:33:09

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

j'ai fini ma version en bash ces jours ci, je poste le code au cas ou une bonne me ait des commentaires, j'aime bien ce langage, il est nouveau pour moi qui vient de php.

Code:

onlyipregex='^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'
extractipregex='((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)'
cache=$(($(cat ${dircache}/db_$(basename ${log}) 2> /dev/null)))
ncache=$(sed -n '$=' ${log})
[ "${cache}" = "0" ] && cache=1
# si la nouvelle taille du fichier log est infrieure  la prcdente remet la valeur  0
[ "${ncache}" -lt "${cache}" ] && cache=1
# si la nouvelle taille est gale  l'ancienne inutile de ranalyser ce fichier.
[ "${ncache}" -eq "${cache}" ] && echo "${log} [ALREADY DONE]" && continue
# traitement
echo "${ncache}" > ${dircache}/db_$(basename ${log})
echo "${log} ${cache}->${ncache}"
if [ -f ${log} ]
then
    
    sed -n "$((${ncache}+1))q;${cache},${ncache}p" ${log} | grep "sshd" | grep -e "Invalid user" -e "Failed password for" | grep -Eo ${extractipregex} | sort | uniq -c | while read line
    do
        thistries=$(echo "${line}" | cut -f1 -d " ")
        thisip=$(echo "${line}" | cut -f2 -d " ")
        if [ ${thistries} -ge ${maxtries} ] && echo ${thisip} | grep -Eq ${onlyipregex}
        then
            if ! grep -qs ${thisip} ${whitelist} && ! grep -qs ${thisip} ${blacklist} && check_mask "${whitemask}" "${ip}"
            then
                echo "(${thistries} tries)    : ${thisip}"
                echo "${thisip}" >> ${blacklist}
                ! grep -qs 1 ${restart} && echo 1 > ${restart}
            fi
        fi
    done
fi
# la fonction check mask qui permet de mettre des masques d'ip  ne pas blacklister
check_mask() {
     # doit tre appel avec pour paramtre "un fichier masque de rseau" et "une ip"
     cat $1 | while read mask
        do
            extend=$(echo ${mask} | cut -f2 -d "/")
            case "${extend}" in
                "8")
                [ "$(echo $2 | cut -f 1 -d .)" = "$(echo ${mask} | cut -f 1 -d .)" ] && return 1
                ;;
                "16")
                [ "$(echo $2 | cut -f 1,2 -d .)" = "$(echo ${mask} | cut -f 1,2 -d .)" ] && return 1
                ;;
                "24")
                [ "$(echo $2 | cut -f 1,2,3 -d .)" = "$(echo ${mask} | cut -f 1,2,3 -d .)" ] && return 1
                ;;
            esac
        done
     return 0
    }

au tout dbut je me suis affranchis de mettre en cache le dernier numro de ligne trait et je reprenais tout le log chaque passage, j'ai vite compris que le fait que toutes mes connections soient sous ip dynamiques me sauvaient, et qu'en ip fixes, 5 erreurs sur la dure de vie du log et une ip tait trs vite blackliste tort. malgrs la prsence du fichier whitelist, cela ne me semblait pas cohrent et j'ai repris ton principe de cache

Je ne sait pas encore s'il est bon d'enchainer les pipes en bash comme j'ai tendance le faire, les variables sont l du l'intgration de ce bout de code dans un plus long morceaux destin grer globalement l'ensemble du pare feu.

Perl par contre l'air en effet trs concis, et trs clair, il vas falloir que je m'y mette au plus vite. De plus sous perl je devrais trouver confortable de retrouver la syntaxe de condition et boucles encapsules dans des accolades dont l'absence m'as un peu drout au dbut sous bash.

Dernire modification par T-Christophe (28-05-2009 20:46:39)

Hors ligne

 

#13 29-05-2009 03:33:00

jaguarwan
Close the world, open the next
Lieu: Beijing
Date d'inscription: 09-04-2006
Messages: 353
Site web

Re: brute_force.pl

Hmm, a me semble overkill tout a, on peut bloquer un bruteforce trs facilement avec iptables uniquement:

Code:

protect_bruteforce() {
  # This function protects a port exposed to the internet from bruteforce
  # attacks, by allowing only 4 hits per minute.
  #
  # $1 port to protect
  [ -n $1 ] || return -1
  [ $1 -gt 0 -a $1 -lt 65536 ] || return -1

  # tag new incoming connections
  $IPTABLES -A INPUT -p tcp -d $INET_ADDR --dport $1 -m state --state NEW \
  -m recent --set --name "BF_$1"

  # prevent bruteforce attacks by restricting to 4 connections per second
  # log the possible attempt
  $IPTABLES -A INPUT -i $INET -p tcp --dport 22 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 4 --rttl --name "BF_$1" \
  -j LOG --log-level $LOG_LEVEL --log-prefix "Bruteforce on port $1 ? : "
  # drop the offending packet
  $IPTABLES -A INPUT -i $INET -p tcp -d $INET_ADDR --dport $1 \
  -m state --state NEW -m recent --update --seconds 60 --hitcount 4 \
  --rttl --name "BF_$1" -j DROP

  return 0
}

(extrait de mon script firewall perso, ici $IPTABLES est le path complet du binaire iptables, $INET_ADDR est l'adresse sortante, $INET l'interface rseau connecte au net)

Il suffit de changer "--seconds 60 --hitcount 4" pour moduler la frquence de connection autorise.

Hors ligne

 

#14 29-05-2009 09:01:23

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

Effectivement, c'est intressant, je n'y vois qu'une seule chose qui me laisse un sentiment d'incomplet, c'est l'absence de bannissement de l'ip de l'attaquant. Cela suppose que si l'attaquant "sent" qu'il n'est pas banni mais ralenti et qu'il choisis de se caler sur notre cadence, il pourras lentement certes, mais il pourras continuer son attaque aussi longtemps qu'il le voudras. Mais je vois dans le cumul des deux procds le moyen d'conomiser des ressources, l'attaquant ralentis 4 tentatives par minutes, il est alors possible de lancer la vrification sur les logs du kernel avec un intervale bien plus large (6/h ou 1/h). Ainsi iptables ralise le travail de protection initial, et toutes les heure on vrifie ce qui as t bloqu et on banis.

Qu'on m'arrte si c'est trop tordu smile

Hors ligne

 

#15 29-05-2009 15:41:46

jaguarwan
Close the world, open the next
Lieu: Beijing
Date d'inscription: 09-04-2006
Messages: 353
Site web

Re: brute_force.pl

Je pense pas qu'un ban soit une vritable protection, si un type utilise un botnet il dispose d'une bonne quantit d'IP. Et en tant maladroit, on peut se blacklister soi-mme. Si vraiment on craint le scan, on peut aussi autoriser seulement une connection toutes les dix minutes... Il faudra un attaquant trs trs dtermin ou bien un mot de passe bien faible pour se faire avoir par un tel scan.

Hors ligne

 

#16 29-05-2009 20:32:55

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

Lorsque j'ai dcouvert l'informatique, ma premire recherche t de passer quelques semaines apprendre taper au clavier (je sait je suis un grand malade, j'achette un PC, j'installe dactylo, et au lieu de jouer, de dcouvrir, de me faire plaisir, je tape, je fait pas exprs, je faisait dj ce genre de chose quand j'tais tout petit smile )
Donc je ne me blacklisterais pas moi-mme, je ne suis pas maladroit.
Je me suis dit aussi qu'il seras bon de vider les ip ajoutes la blacklist au bout d'un certain temps, si l'attaquant change d'ip il est inutile de continuer ...
J'ai dja intgr une protection sshd qui consiste ne pas permettre plus de 3 tentatives d'accs simultanes, mais je me connecte/dconnecte de divers serveurs trs frquemment, donc un intervale impos d'une connection par 10mn me pnaliserais.

A vrai dire, effectivement, ta mthode de restriction par iptable, couple la restriction de configuration sshd, a semble amplement suffisant, mais, tant donn que a ne mange pas de pain, blacklister des ip est un plus qui apporte la garantie que le malin laisseras le serveur tranquille pour un temps ds que la boucle boucleras (partant du principe que tout ceux qui ont subi une attaque russie pensaient tre suffisamment protgs avant de la subir ...).

Dernire modification par T-Christophe (29-05-2009 20:34:36)

Hors ligne

 

#17 29-05-2009 22:00:21

serge
Site Admin
Lieu: Nice
Date d'inscription: 12-02-2004
Messages: 522
Site web

Re: brute_force.pl

J'avais l'poque tenter la methode "ipt_recent", sauf qu'il tait buggu et cela fonctionnait trs mal (bon il y a environ 4 ans...).

Puis personellement je prfre la methode que j'utilise (chercher des motifs dans les logs) car ce me permet:
- de conserver les IPs en cas de reboot
- de voir facilement les nouvelles IPs blacklistes en regardant rgulirement le fichier des blacklists


Who is General Failure and why is he reading my hard disk ?

Hors ligne

 

#18 30-05-2009 17:25:11

Mushroom
Administrateur
Date d'inscription: 15-10-2005
Messages: 2158

Re: brute_force.pl

Salut,

Deux questions (qui ne sont pas des provocations, je commence juste dcouvrir SSH wink) :

1) pourquoi autoriser la connexion via simple mot de passe quand on peut la restreindre aux connexions signes (je crois que c'est le cas sur slackfr) ? doubles avec le "denial" de ssh, c'est quasi impossible casser.

2) pourquoi ne pas crer une chane utilisateur iptables BLACKLIST (portant sur la chane DROP), et envoyer les adresses matches dessus (facile retrouver avec un iptables-save) ?

Hors ligne

 

#19 30-05-2009 19:53:24

T-Christophe
Membre trs actif
Lieu: DAKAR SNGAL
Date d'inscription: 06-02-2008
Messages: 109
Site web

Re: brute_force.pl

alors pour ma part de dirais

1) si je devais me limiter aux connections signes, a me limiterais au niveau mobilit, j'utilise ssh pour pouvoir assurer une intervention quasi 24/24 sur des serveurs, je doit pouvoir utiliser un live cd de nimporte ou au moment voulu, mais pour autant, avec la plthore d'outils fournis tant par iptables que par sshd (je pense entre autre un "MaxStartups 3:30:10", un "AllowUsers xxx", un "PermitRootLogin no", un "MaxAuthTries 3" et aux restrictions iptables dont on as parl plus haut), il devient quasi impossible de passer. Mais je part du principe que soit je fait, soit je fait pas, la scurit notamment, donc il est bon d'explorer et "si a ne nuit pas" de mettre en uvre toutes les stratgies disponibles.

2) pour ma part parce que mon firewall est bas sur des fichiers de config placs dans /etc/firewall/, que le parefeu est reconfigur chaque lancement sur la base du contenu de ces fichiers (ce qui pour moi le rend plus portable), et par consquent il m'est apparus comme plus cohrent d'avoir un fichier /etc/firewall/blacklist

Dernire modification par T-Christophe (30-05-2009 19:56:13)

Hors ligne

 

#20 07-06-2009 15:33:15

serge
Site Admin
Lieu: Nice
Date d'inscription: 12-02-2004
Messages: 522
Site web

Re: brute_force.pl

Mushroom a crit:

Salut,

Deux questions (qui ne sont pas des provocations, je commence juste dcouvrir SSH wink) :

1) pourquoi autoriser la connexion via simple mot de passe quand on peut la restreindre aux connexions signes (je crois que c'est le cas sur slackfr) ? doubles avec le "denial" de ssh, c'est quasi impossible casser.

2) pourquoi ne pas crer une chane utilisateur iptables BLACKLIST (portant sur la chane DROP), et envoyer les adresses matches dessus (facile retrouver avec un iptables-save) ?

Pour ma part:

1/
Oui j'essaye autant que possible ne faire que des connexions par clef plutt que par mot de passe. C'est l'idal cot scurit vis vis de SSH, mais ce n'est pas toujours possible, comme l'indique T-Christophe. Mme ici j'autorise les mots de passe mais la liste des utilisateurs autoriss et trs restreintes (un AllowGroup).
Mais comme on est jamais l'abri d'une faille de SSH, d'une erreur de configuration un jour X ou Y, un utilisateur de test oubli, ..., j'utilise aussi ce script pour blacklister des personnes ou botnet qui essaye des "brute force".

2/ Oui aussi, chacun sa mthode aprs wink
JE suis un peu comme T-Christophe, j'ai pas mal de fichier inclus par mon script de firewall dont celui de blacklist.
PErso j'aime pas trop les iptables-save et iptable-restore, je trouve pas ca trs parlant et "utilisable", je prfre mes bons vieux scripts en bash wink


Who is General Failure and why is he reading my hard disk ?

Hors ligne

 

#21 17-06-2009 18:47:27

Mushroom
Administrateur
Date d'inscription: 15-10-2005
Messages: 2158

Re: brute_force.pl

serge a crit:

PErso j'aime pas trop les iptables-save et iptable-restore, je trouve pas ca trs parlant et "utilisable", je prfre mes bons vieux scripts en bash

Moi je fais un mixte des deux :

1) le script charge les modules ;
2) il vrifie si le fichier o le dump iptables est stock est plus vieux que lui mme ;
3a) si oui, il se rexcute et refait un dump ;
3b) si non, il recharge juste le dump.

Bon, dans le cas qui nous occupe (blacklisting), c'est pas trs utile comme algo, mais pour un petit pare-feu perso, c'est un chargement quasi-instantan au boot. smile

En tous les cas, merci pour tes rponses. wink

Hors ligne