Programmation et script

Comment faire un système de détection d'intrusion de base avec bash

Comment faire un système de détection d'intrusion de base avec bash

Introduction

Pour la plupart d'entre nous, le cryptage WEP est devenu une blague. WPA va rapidement de la même manière grâce à de nombreux outils tels que Aircrack-NG. En plus de cela, les réseaux câblés ne sont pas également étrangers aux invités indésirables. Toute personne sérieuse au sujet de la sécurité devrait avoir un bon système de détection d'intrusion dans sa boîte à outils.

Il existe déjà de très bons ID (systèmes de détection d'intrusion) disponibles. Pourquoi quelqu'un voudrait-il réinventer la roue en bash??? Il y a quelques raisons à cela. De toute évidence, les scripts bash peuvent être très légers. Surtout par rapport à certains des programmes d'interface graphique qui existent. Alors que des programmes comme Etherape nous aspirent avec de jolies couleurs, ils nécessitent une surveillance constante pour savoir quand le réseau a changé. Si vous êtes comme la plupart d'entre nous, vous n'utilisez l'ordinateur que pour deux choses, travaillez et jouez. En utilisant la cloche du système pour alerter les nouveaux clients en ligne, vous pouvez laisser ce script en cours d'exécution et ne pas avoir à avoir une montre constante. Si vous décidez que vous souhaitez inspecter ce qu'un client suspect fait de plus près, vous pouvez toujours ouvrir Etherape, Wireshark ou votre outil de choix. Mais jusqu'à ce que vous ayez un problème, vous pouvez jouer ou travailler sur d'autres choses.

Un autre bonus à ce programme est qu'il affichera uniquement des adresses IP sur les réseaux connectés à votre ordinateur. Si vous hébergeiez un serveur occupé ou que vous téléchargeiez peut-être la dernière distribution Linux à travers un client torrent, un IDS peut être inondé de connexions. La recherche d'un nouveau client malveillant peut être comme chercher une aiguille dans une pile de foin. Bien que ce script puisse sembler simple par rapport aux autres IDS, la simplicité peut aussi avoir ses avantages.

Ce dont tu auras besoin

NMAP est requis pour que ce script fonctionne. Nous ne ferons aucun numérisation de port. Cependant, pour faire ce script rapidement, nous avions besoin de quelque chose de mieux qu'un ping ordinaire. Le paramètre -SP de NMAP n'utilisera qu'une analyse de ping pour vérifier si un client vers le haut. Il y avait certaines variations dans la façon dont NMAP obtient des informations entre les versions. Jusqu'à présent, ce script n'a été testé qu'à l'aide de NMAP 5.00 (Debian Squeeze) et 5.21 (Debian Sid). Vous pouvez avoir de la chance avec d'autres distros et versions de NMAP. Cependant, avec toutes les possibilités que je ne pouvais soutenir qu'un couple pour le moment.

Vous devrez également être sûr d'utiliser Bash version 4.0 ou plus. Vous devriez le trouver dans n'importe quelle distribution stable ou plus récente. Mais toutes les versions de Bash ci-dessous ne prendront pas en charge les tableaux utilisés dans ce script. L'accès racine est également requis ou la commande ARP ne sera pas constatée pour bloquer les clients.

NOTE: Ce script ne fonctionne pas bien avec les interfaces réseau virtuelles telles que VMware, VirtualBox et etc.

Exécution du script

Pour exécuter ce script, exécutez simplement:

# Chmod + X Leecher.sh; ./ Leecher.shot

À l'heure actuelle, il n'y a pas de paramètres à définir.

Comment fonctionne ce script

Passez au-delà de toutes les fonctions de début pour l'instant afin que nous puissions voir le flux réel du script. La première chose que nous faisons est de vérifier que l'utilisateur est root et que NMAP est installé sur le système actuel. Si ce n'est pas le script expliquera que les privilèges racine sont nécessaires ou que le NMAP est une dépendance ici et de sortir. Si ces exigences sont satisfaites, le script sautera avec une salutation à l'utilisateur et explique certaines fonctionnalités. J'ai utilisé Setterm pour éteindre le curseur. C'était définitivement un oeil esthétique.

J'ai défini un piège à piège pour faire arrêter le script. Bien que vous puissiez penser 'Wait, Control-C arrête généralement le programme de ligne de commande!'Bien que cela soit normalement vrai, j'ai trouvé la boucle pour toujours que nous utilisons plus tard pour causer des problèmes à arrêter le script avec Control-C. En utilisant un piège avec Sigint, nous avons pu faire fonctionner ce travail. Nous définissons quelques variables dans l'instruction if suivante pour vérifier la version prise en charge de NMAP que nous utilisons ici. Ceci est important car la sortie est complètement différente entre ces versions. La première chose que nous avons faite ici a été de faire une boucle qui obtiendra d'abord la version de NMAP que nous utilisons ici. Ceci est important car la sortie est complètement différente entre ces versions. La prochaine chose que nous avons faite ici était de faire une boucle qui obtiendra d'abord les adresses IP de toutes nos interfaces qui sont actuellement en ligne. Nous utilisons également AWK ici pour filtrer 127.0.0.1 car il n'est pas nécessaire de scanner l'adresse de bouclage. De plus, nous utilisons AWK pour découper l'octet de fin dans ces adresses IP. Par exemple, si l'interface ETH0 a une IP de 192.168.1.12 Nous n'avons pas besoin de la fin 12. Un scan normal d'un sous-réseau comme celui-ci serait «NMAP -SP 192.168.1.0/24 ”donc pour l'instant, cette boucle éliminera l'une des IP sur toutes les interfaces actives et les transmettra à la fois pour NMAP jusqu'à ce que nous ayons fini. À l'intérieur de la boucle, nous recevons la valeur pour IP une interface et ajoutez ".0/24 ”pour scanner l'ensemble du réseau dans cette plage.(Ou 0-255) Nous passerons les variables correctes pour la version de NMAP pour que Awk sache où faire retourner l'IP de chaque analyse. Toutes les valeurs renvoyées de chaque analyse seront branchées sur un tableau. Après la première analyse de tous vos réseaux d'interfaces, nous utiliserons simplement une autre boucle pour afficher les résultats initiaux à l'utilisateur.

Je dois souligner ici ce que dit le nouveau message suivant à l'utilisateur. Si vous souhaitez entendre la cloche du système, il doit être activé dans vos paramètres de bureau. L'emplacement de cela variera en fonction de la version de KDE, Gnome, Xface ou quel que soit le bureau que vous utilisez. Cependant, vous pouvez penser que juste parce que vous avez entendu une cloche avant qu'elle soit activée. J'ai remarqué que mon système d'exploitation avait une cloche similaire pour me faire savoir que ma batterie d'ordinateur portable était sur le point de mourir. Veuillez vérifier comment activer la cloche du système sur votre distribution si vous rencontrez des problèmes.

Ensuite, la boucle pour toujours pour maintenir la numérisation et la surveillance de ce script constant. Si vous êtes nouveau dans Bash ou Forever Loops, cela pourrait vous faire vous demander pourquoi nous utiliserions quelque chose qui est une boucle infinie. Beaucoup d'entre vous ont sans aucun doute été averti du danger des boucles infinies et de la façon dont ils peuvent écraser une machine. Comme vous l'avez peut-être remarqué, nous avons utilisé une déclaration de sommeil après le premier scan. Nous utiliserons à nouveau à l'intérieur de notre boucle pour toujours et de certaines des fonctions qu'il inclut. Le sommeil permettra à l'exécution de s'arrêter et de redonner temporairement des ressources à l'ordinateur. J'ai testé ce script sur un processeur assez modeste et je n'ai rencontré aucun problème. Mais si vous êtes sur une machine très ancienne, ou une utilisée pour des ressources, vous pouvez changer le nombre de secondes que le sommeil est utilisé ici.

La première chose que notre boucle Forever fera est de passer à la fonction nommée moteur (). Ce que nous faisons ici est exactement le même que notre premier scan, sauf que nous le mettons dans un tableau différent. Une fois cette fonction exécutée, nous retournons maintenant à notre boucle pour toujours où une instruction IF comparera si ces deux tableaux sont les mêmes. S'ils sont les mêmes, le tableau du deuxième scan sera vidé pour éviter les valeurs en double lors de la prochaine itération de la boucle. Cependant, si la valeur est une différence dans ces deux tableaux, nous passerons à la clause ELSE qui nous redirige vers notre fonction d'interruption.

La fonction d'interruption s'arrêtera et annoncera à l'utilisateur que la liste des clients a changé. De là, nous appellerons une fonction nommée «deux fois» où nous affichons à l'utilisateur le contenu des adresses IP dans le deuxième tableau. Nous allons maintenant demander à l'utilisateur s'il souhaite bloquer une adresse IP. Il peut s'agir de n'importe quelle IP, pas seulement de celles affichées. Si l'utilisateur répond «y» pour oui, il lui sera demandé de saisir une adresse IP. Si l'IP entrée n'est pas nu. Pour une raison quelconque, lorsque Nmap pingre le réseau, il ne fait pas cela. Ensuite, nous utilisons ARP pour nous donner l'adresse MAC du client. Étant donné que les IP peuvent être réaffectées par un routeur, nous ne voulons pas bloquer par adresses IP. Une fois cela fait, nous utilisons une instruction IF nichée pour vérifier si l'adresse MAC que nous avons maintenant stockée dans $ mac est nul. C'est bon pour la vérification des erreurs au cas où l'utilisateur entre dans une chaîne de déchets. Si l'adresse MAC n'existe pas, nous disons à l'utilisateur que le client existe ou a quitté le réseau et reprendre notre surveillance dans la boucle pour toujours. Si l'adresse MAC existe, nous l'ajoutons à une règle iptables qui bloquera cet utilisateur de toute connexion à notre ordinateur. Je dois noter ici que cela ne vous empêche pas d'envoyer des paquets à cette machine, seulement un trafic entrant pour vous. Cependant, cela ne protège pas l'ensemble de votre réseau. Seule la machine que vous utilisez jusqu'à ce que vos règles iptables soient rincées. Si vous bloquez accidentellement un client qui trouve que vous devez vous connecter, vous pouvez publier cette règle avec quelques commandes iptables simples. L'instruction IF se poursuit en disant à l'utilisateur que l'adresse MAC de la propriété intellectuelle entrée est maintenant bloquée et affiche les clients actuels en ligne. Le client bloqué apparaîtra toujours sur cette liste car nous ne l'avons pas bloqué, pas le réseau. Si l'utilisateur avait choisi de ne pas bloquer un client, nous afficherions simplement le changement dans le réseau et reviendrions à notre boucle pour toujours.

Indépendamment de ce que l'utilisateur a fait dans la fonction d'interruption, nous devons maintenant mettre à jour les valeurs de nos tableaux. Étant donné que le deuxième tableau contient actuellement les nouvelles valeurs de notre réseau, nous devons alimenter cela à l'autre tableau avant que la fonction du moteur ne le remplit à nouveau. Nous effacons d'abord ce tableau pour éviter toute valeur en double, puis copierons le contenu du deuxième tableau vers le premier tableau. Utilisez maintenant vide le deuxième tableau et nous sommes prêts à démarrer la boucle avec la fonction du moteur.

Bien sûr, il y avait une fonction que j'ai sautée jusqu'à maintenant. Vous avez peut-être remarqué que notre premier message à l'utilisateur a dit de frapper Control-C à tout moment pour bloquer les clients supplémentaires ou quitter. Notre piège appelle la première fonction nommée Control_C (). Tout ce que j'ai fait ici a été de demander à l'utilisateur dans une instruction IF s'il veut bloquer un utilisateur presque de la même manière qu'avant. Vous remarquerez si l'utilisateur répond oui à l'instruction IF, il y a une nouvelle ligne ici. «Bash Leecher.sh ”est utilisé pour redémarrer ce script. Si vous avez nommé ce script quelque chose de différent, vous devez fournir cela ici. Nous réexécutions notre script parce que le piège veut toujours envoyer Sigint et tuer le script. La création d'une nouvelle instance empêche le script de mourir indésirable. Cependant, la création de la nouvelle instance ne permet pas à Sigint terminer.

Vous avez peut-être également remarqué que nous avons utilisé le sommeil un peu plus longtemps. Il s'agit seulement de donner à l'utilisateur le temps de lire ce qui se passe avant de passer à notre nouvelle instance du script qui prendra le contrôle de ce terminal. Si l'utilisateur avait choisi «non» au lieu de «oui», la clause ELSE permettrait simplement au script de quitter. Nous serons également sûrs d'utiliser Setterm pour retourner notre curseur ou nous n'en aurons pas dans ce terminal même si le script est sorti.

Le but du blocage à la volée est facile. Vous pouvez avoir plus d'un client à bloquer s'il y a plusieurs clients agressifs. Vous pourriez décider plus tard après avoir sauté le hasard bloquer un client dans la fonction d'interruption dont vous avez besoin. Ou peut-être que vous savez que quelque chose ne va pas dès que vous commencez le script. Si aucun nouveau client n'est venu ou laissé sur le réseau en question, nous n'aurions pas la possibilité de bloquer quoi que ce soit avant qu'ils ne le fassent.

Comment ce script peut être amélioré

De toute évidence, entendre la cloche du système se déclenche constamment pour de faux positifs peut être ennuyeux. Faire de ce script capable de faire des clients de la liste blanche en qui vous avez probablement réduir. .
. De nombreux programmes, comme Etherape, font la même chose. Si votre routeur agit car votre DNS affichera probablement le nom d'hôte en continu. Je ne pense pas que vous voudrez bloquer les connexions avec votre routeur. Cependant, offrir un paramètre pour passer à l'IP uniquement pourrait être bien pour certains d'entre vous.
. Cela ne présente aucun danger à moins qu'un utilisateur ne décide de bloquer des milliers de clients avec Control-C. Cependant, toutes les instances du script sont tuées à la sortie. Mais puisque nous allons pour Basic ici, ça devrait être bien.

Un système de détection d'intrusion avec bash

#!?\ n "echo -e" entrez y ou n: "lire yn si [" $ yn "==" y "]; alors echo -e" \ nenter ip adresse à bloquer: \ n "lire ip si [-n $ ip]; puis écho -e "\ nnow récupérer l'adresse MAC pour bloquer… \ n" ping -c 1 $ ip> / dev / null mac = "arp $ ip | éther grep | awk "print $ 3" if [-z $ mac]; Ensuite, effacez le client Echo -e "\ n *** n'existe pas ou n'est plus \ sur ce réseau ***" Echo -e "\ nskipping Action et reprend la surveillance.\ n \ n "Sleep 2 Bash Leecher.sh exit 0 else iptables -a entrée -m mac --mac-source $ mac -j dépôt echo -e "\ nclient avec l'adresse mac $ mac est maintenant \ bloqué.\ n "echo -e" Nous continuerons à surveiller les modifications \ chez les clients \ n \ n "Sleep 2 Bash Leecher.SH exit 0 fi fi else Clear echo -e "\ n \ nleecher a quitté \ n \ n" setterm -Cursor sur rm -f $ pid exit 0 fi # Imprimez le scan à partir du moteur () deux fois () g = 0 len = $ # second [@] pour ((g = 0; g / dev / null mac = "arp $ ip | grep éther | awk" print $ 3 "if [-z $ mac]; alors clear Echo -e "\ n *** Le client n'existe pas ou n'est plus sur \ ce réseau ***" Echo -e "\ nskipping Action et reprend la surveillance.\ n \ n "else iptables -a entrée -m mac --mac-source $ mac -j dépôt echo -e" \ nclient avec l'adresse mac $ mac est maintenant bloqué.\ n "echo -e" Nous continuerons de surveiller les modifications \ chez les clients \ n \ n "echo -e" Les clients actuels sont: \ n "Twice Echo -e" \ nresuming Survering… "fi fi else clear echo -e" Les clients actuels sont: \ n "Twice Echo -e" Republing Monitoring… "FI # Fonction Pour continuer à surveiller pour tout changement Moteur () # Scan Networks à nouveau pour la comparaison des modifications. pour le sous-réseau dans $ (/ sbin / ifconfig | awk '/ inet addr / && !/ 127.0.0.1/ && !a [2 2] ++ \ imprimer substr (2,6) ') faire seconde + = ("$ (nmap -sp $ sous-réseau%.*.0/24 | awk 'index ($ 0, t) \ print $ i' t = "$ t" i = "$ i") ") Sleep 1 Done # Assurez-vous que l'utilisateur est connecté comme racine si [[$ euid -ne 0k \ nnmap doit être installé pour ce programme pour fonctionner \ n "echo -e" uniquement nmap 5.00 et 5.21 sont pris en charge à l'heure Pour bloquer des clients supplémentaires ou quitter \ n "# supprimer les fichiers temporaires à la sortie et permettre à Control-C de quitter. Trap Control_c Sigint # éteindre le curseur Setterm -Cursor OFF # Faire des tableaux et variables DÉCLARI.21 # Vérifiez quelle version de NMAP si [5.21 = $ (nmap --version | awk '/ nmap / print $ 3')]; alors i = 5 t = rapport else i = 2 t = host fi # obtenir ip à partir des interfaces et exécuter la première analyse pour le sous-réseau dans $ (/ sbin / ifconfig | awk '/ inet addr / && !/ 127.0.0.1/ && !a [2 2] ++ print \ substr (2,6) ') do First + = ("$ (nmap -sp $ sous-réseau%.*.0/24 | awk 'index ($ 0, t) print $ i' \ t = "$ t" i = "$ i") ") Sleep 1 fait echo -e" Les clients actuels sont: \ n "#display Array Elements et ajouter Nouvelles lignes e = 0 len = $ # d'abord [@] pour ((e = 0; e < $len; e++ )); do echo -e "$first[$e]\n" done echo -e "Leecher is now monitoring for new clients." echo -e "\nAny changes with clients will be reported by the system bell." echo -e "If bell is not enabled details will log to this console." # Forever loop to keep monitoring constant for (( ; ; )) do engine if [[ $first[@] == $second[@] ]]; then second=( ) else interupt sleep 1 first=( ) first=("$second[@]") second=( ) fi done

Échantillon de sortie

Maintenant, trouver des clients sur votre réseau local, appuyez sur Control-C-C à tout moment pour bloquer les clients supplémentaires ou quitter les clients actuels sont: 192.168.12.1 192.168.12.9 192.168.12.43 Mephistolist 10.0.0.121 10.0.0.137 10.0.0.140 Leecher surveille maintenant les nouveaux clients. Tout changement avec les clients sera signalé par la cloche du système. Si Bell n'est pas activé, les détails se connecteront à cette console. ==============================================. ============ La liste des clients a changé! 192.168.12.9 192.168.12.43 Mephistolist 10.0.0.140 Souhaitez-vous bloquer les connexions avec un client? Entrez y ou n: y entrez l'adresse IP pour bloquer: 192.168.12.9 =============================================. =========== Client avec l'adresse MAC 7c: Ed: 8d: 9c: 93: 8e est maintenant bloqué. Nous continuerons à surveiller les changements dans les clients ========================================================= ==================
Comment se réveiller sur l'hôte pris en charge LAN sur le réseau à l'aide de Linux
Comment se réveiller sur l'hôte pris en charge LAN sur le réseau à l'aide de Linux...
Démarrer et arrêter Rtorrent pendant le pic et la pointe hors pointe sur TheCus NTOP 10top 10
Je sais qu'il y a une syntaxe dans un fichier de configuration rtorrent pour planifier l'accélérateur pour les téléchargements et télécharger pour rto...
Chgrp- Page manuelle
Nom CHGRP - Modifier la propriété du groupe Synopsis CHGRP [Option]… Fichier de groupe… CHGRP [Option]… -Reference = RFILE Fichier… Description Change...