Contreur d'intrusion en SSH

Fermé
Monosinus - Modifié par Monosinus le 16/11/2010 à 18:19
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 17 nov. 2010 à 01:00
Bonjour,
Afin d'éviter toute intrusion sur mon poste à l'IUT (surtout empêcher les éventuelles fork bombs ^^), j'ai codé un petit script shell en bash qui enverra un yes tubé write à l'assaillant, c'est-à-dire qu'il répètera un message tant que le processus ne sera pas tué par moi-même sur le terminal de l'intrus, ce qui l'empechera de faire n'importe quelle commande par la suite.

Mon code :
#!/bin/bash 

while true; do 
  a=$(who|grep -v $USER|tr -s ' '|cut -f 1-2 -d " ") 
  b=$(who|grep -v $USER|wc -l)
  for (( i=1; i<=$(($b*2)); i+=2 )) ; do 
    d=$(($i+1)) 
    c=$(echo $a|cut -f $i-$d -d " ") 
    yes CASSE TOI|write $c& 
    echo "$c c'est fait yesser" 
  done 
  
  sleep 5 
  
done 


Comme vous avez sans doute remarqué, le script tournera en fond et procèdera à une analyse toutes les 5 secondes.
Mon problème est le suivant :
Quand quelqu'un reste plus longtemps (genre une minute à se prendre un yes), les processus sont créés en masse (un processus créé toutes les 5 secondes donc), ce qui à la longue fait planter ma machine. La solution serait de tuer le ou les processus qui viennent d'être créés, après le sleep de préférence pour libérer la mémoire pour le prochain yes pour les récidivistes. Mais mes connaissances sont trop faibles pour y parvenir... Votre aide sera donc la bienvenue :).

Si je n'ai pas été clair, n'hésitez pas à poser vos questions.
Bonne soirée ! :)


3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
16 nov. 2010 à 18:25
Salut,

Normalement un :

kill $!

après le "sleep 5" devrait tuer le dernier processus lancé en arrière-plan...
1
Salut et merci pour une réponse aussi rapide.

kill $!
va-t-il supprimer le dernier processus en arrière plan, ou tuer tous les processus appelés dans la boucle for? Parce qu'avouons que tuer le processus dans la boucle et attendre 5s ne servirait pas à grand chose :/.

Pour moi ca serait plutôt :

Recherche des intrus,
"Yessage" des intrus (boucle for)
Attendre 5 sec
Tuer les processus de yessage.

Merci :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
Modifié par zipe31 le 16/11/2010 à 18:58
Il va tuer le dernier processus lancé en arrière-plan ;-(

A ce moment là, il te faut regrouper ta boucle for et les commandes qui suivent entre parenthèses (regroupement de commandes) et mettre ce groupe en arrière-plan.

( 
for... 
do 
commande1 
commande2 
done 
)& 
sleep 5 
kill $!
0
Merci pour ton aide, tester chez moi est plutot compliqué, j'essaierai ca demain à l'IUT, je te tiens au courant.
Merci et bonne soirée!
0
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802
16 nov. 2010 à 20:45
Ça aurait été cool de donner des vrais noms à tes variables :s Un truc dans ce goût là par exemple

#!/bin/sh

message="Ouste petit garnement"

while true; do
    who | while read ligne
    do
        login=$(echo $ligne | cut -d" " -f1)
        pts=$(echo $ligne | cut -d" " -f2)
        yes $message | write $login $pts
    done

    sleep 5
done


Je te laisse de voir ton soucis avec zipe31 pour les histoires de kill.

Au fait, pourquoi ne pas simplement limiter l'accès à certains utilisateurs en ssh (voir /etc/ssh/sshd_config) avec la directive AllowUser ?

Dans cet exemple, seul admin peut se connecter en ssh :
http://www.faqs.org/docs/securing/chap15sec122.html

Pense à relancer sshd pour prendre les modifications en compte. En root :

service sshd restart


ou sur les vieilles distributions :

/etc/init.d/sshd restart


Bonne chance
0
Je suis d'accord avec ton idée, le truc c'est que vu que je suis à l'IUT deja je ne peux pas passer en root ^^. De plus c'est peut etre sadique mais j'imagine deja la déception de mes futurs assaillants quand ils vont essayer de me "forker" (ben ouais faut bien s'occuper).
En tout cas j'essaierai demain pour le kill :)
0
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802
17 nov. 2010 à 01:00
Mouais enfin tu sais bloquer un write c'est un peu l'enfance de l'art :

You can prevent people (other than the super-user) from writing to you with the mesg(1) command.


C'est même un peu une condition de survie en milieu hostile ;-)

De toute façon ne cherche pas tu ne peux pas empêcher en tant qu'utilisateur d'empêcher quelqu'un de venir se connecter chez toi et de travailler. Pouvoir le bloquer ou le pourrir serait intrusif ce qui va à l'encontre de la philosophie linux (un utilisateur non root ne doit pas pouvoir pénaliser un autre utilisateur). On donne donc aux utilisateurs des moyens pour se prémunir d'outils potentiellement intrusif (write par exemple peut être avec mesg) mais ça s'arrête là.

La seule manière de "cloisonner" requiert des droits root :
- authentification ssh
- allocation de ressources par quota (espace disque ...)
- etc ...

Mais bon au moins ça t'entraîne à faire du shell donc c'est déjà ça ;-)
0