Programmierung & Skripten

Wie man ein grundlegendes Intrusionserkennungssystem mit Bash erstellt

Wie man ein grundlegendes Intrusionserkennungssystem mit Bash erstellt

Einführung

Für die meisten von uns ist die WEP -Verschlüsselung zum Witz geworden. WPA geht dank vielen Werkzeugen wie Flugzeug-NG schnell genauso aus. Darüber hinaus sind kabelgebundene Netzwerke auch für unerwünschte Gäste keine Unbekannten. Jeder, der mit Sicherheit ernsthaft ein gutes Intrusion -Erkennungssystem in seiner Toolbox haben sollte.

Es sind bereits einige sehr gute IDs (Intrusion Detection Systems) verfügbar. Warum sollte jemand das Rad in Bash neu erfinden wollen???? Es gibt ein paar Gründe dafür. Offensichtlich kann Bash -Skripte sehr leicht sein. Insbesondere im Vergleich zu einigen der GUI -Programme, die da draußen sind. Während Programme wie Etherape uns mit hübschen Farben einsaugen, müssen sie eine ständige Überwachung erfordern, um zu wissen, wann sich das Netzwerk verändert hat. Wenn Sie wie die meisten von uns sind, verwenden Sie den Computer nur für zwei Dinge, arbeiten und spielen. Durch die Verwendung der Systemglocke, um online für neue Kunden zu alarmieren. Wenn Sie entscheiden, dass Sie untersuchen möchten, was ein verdächtiger Kunde genauer tut, können Sie immer Etherape, Wireshark oder Ihr Tool der Wahl öffnen. Aber bis Sie ein Problem haben, können Sie an anderen Dingen spielen oder arbeiten.

Ein weiterer Bonus für dieses Programm ist, dass nur IP -Adressen in den mit Ihrem Computer verbundenen Netzwerken angezeigt werden. Wenn Sie einen geschäftigen Server gehostet haben oder möglicherweise die neueste Linux -Distribution durch einen Torrent -Client heruntergeladen haben, kann ein IDS mit Verbindungen überflutet werden. Auf der Suche nach einem neuen bösartigen Kunden kann wie eine Nadel in einem Heustapel suchen. Während dieses Skript im Vergleich zu anderen IDs einfach erscheinen mag, kann die Einfachheit auch seine Vorteile haben.

Was wirst du brauchen

NMAP ist erforderlich, damit dieses Skript funktioniert. Wir werden keinen Port -Scan durchführen. Um dieses Skript schnell zu machen, brauchten wir etwas Besseres als einen normalen Ping. Der -SP -Parameter von NMAP verwendet nur einen Ping -Scan, um zu überprüfen, ob ein Client aufbaut. Es gab einige Variationen darin, wie NMAP Informationen zwischen den Versionen ausgibt. Bisher wurde dieses Skript nur mit NMAP 5 getestet.00 (Debian Squeeze) und 5.21 (Debian Sid). Möglicherweise haben Sie Glück mit anderen Distributionen und Versionen von NMAP. Mit all den Möglichkeiten konnte ich jedoch zu diesem Zeitpunkt nur ein Paar unterstützen.

Sie müssen auch sicher sein, dass Sie Bash Version 4 verwenden.0 oder höher. Sie sollten dies in jeder Distribution finden, die stabil oder neuer ist. Aber alle Versionen von Bash unten, die Arrays nicht unterstützen, die in diesem Skript verwendet werden. Der Root -Zugriff ist ebenfalls erforderlich oder der Befehl ARP wird nicht festgestellt, um Clients zu blockieren.

NOTIZ: Dieses Skript funktioniert nicht gut mit virtuellen Netzwerkschnittstellen wie VMware, VirtualBox usw.

Ausführung des Skripts

Um dieses Skript auszuführen, leiten Sie einfach aus:

# Chmod +x Blecher.Sch; ./Blecher.Sch

Zu diesem Zeitpunkt gibt es keine Parameter zu setzen.

Wie dieses Skript funktioniert

Überspringen Sie die Anfangsfunktionen vorerst, damit wir den tatsächlichen Fluss des Skripts sehen können. Das erste, was wir tun, ist zu überprüfen, ob der Benutzer root ist und NMAP auf dem aktuellen System installiert ist. Wenn nicht das Skript erklärt, dass Root -Berechtigungen erforderlich sind oder dass NMAP hier eine Abhängigkeit ist und beendet. Wenn diese Anforderungen erfüllt sind, wird das Skript mit einer Begrüßung an den Benutzer weitergeleitet und einige Funktionen erläutert. Ich habe Setterm verwendet, um den Cursor auszuschalten. Es war definitiv eine ästhetische Augenhöhe.

Ich setze ein Trap Control-C, um das Skript zu stoppen. Während Sie vielleicht denken, dass Sie warten, stoppt Control-C in der Regel das Befehlszeilenprogramm sowieso!„Während dies normalerweise wahr ist, fand ich die für immer gelegene Schleife, die wir später verwenden, um Probleme zu verursachen, um das Skript mit Control-C zu stoppen. Durch die Verwendung einer Falle mit SIGINT konnten wir diese Arbeit machen. Wir setzen einige Variablen in der folgenden Anweisung fest, um zu überprüfen, welche unterstützte Version von NMAP hier verwendet wird. Dies ist wichtig, da der Ausgang zwischen diesen Versionen völlig unterschiedlich ist. Das erste, was wir hier gemacht haben, war, eine Schleife zu erstellen, die zuerst die Version von NMAP bekommt, die wir hier verwenden. Dies ist wichtig, da der Ausgang zwischen diesen Versionen völlig unterschiedlich ist. Das nächste, was wir hier gemacht haben. Wir verwenden AWK auch hier, um 127 herauszufiltern.0.0.1 Da es nicht erforderlich ist, die Loopback -Adresse zu scannen. Außerdem verwenden wir awk, um das Ende -Oktett in diesen IP -Adressen auszuschneiden. Zum Beispiel, wenn die Schnittstelle ETH0 eine IP von 192 hat.168.1.12 Wir brauchen das Ende nicht 12. Ein normaler Scan eines solchen Subnetzes wäre „NMAP -sp 192.168.1.0/24 ”, so dass diese Schleife vorerst die IPs auf allen aktiven Schnittstellen ausstreifen und sie gleichzeitig an NMAP weitergeben wird, bis wir fertig sind. In der Schleife erhalten wir den Wert für IP eine Schnittstelle und appendieren “.0/24 ”, um das gesamte Netzwerk in diesem Bereich zu scannen.(Oder 0-255) Wir werden die richtigen Variablen für die Version von NMAP übergeben, sodass awk weiß, wo die IPs von jedem Scan zurückgegeben wird. Alle von jedem Scan zurückgegebenen Werte werden in ein Array angeschlossen. Nach dem ersten Scan aller Ihre Schnittstellennetzwerke verwenden wir einfach eine andere Schleife, um die ersten Ergebnisse dem Benutzer anzuzeigen.

Ich sollte darauf hinweisen, was die neue folgende Nachricht an den Benutzer sagt. Wenn Sie die Systemglocke hören möchten, muss sie in Ihren Desktop -Einstellungen aktiviert werden. Der Standort davon hängt von der Version von KDE, GNOME, XFACE oder jedem Desktop ab, den Sie verwenden. Sie denken jedoch vielleicht, dass nur weil Sie zuvor eine Glocke gehört haben, sie aktiviert ist. Ich bemerkte, dass mein Betriebssystem eine ähnliche Glocke hatte, um mich wissen zu lassen, dass meine Laptop -Batterie im Begriff war zu sterben. Bitte überprüfen Sie, wie Sie die Systemglocke auf Ihrer Distribution aktivieren, wenn Sie Probleme haben.

Als nächstes ist die Forever -Schleife, um das Scannen und Überwachung dieses Skripts konstant zu halten. Wenn Sie neu zu verprügeln sind oder für immer Loops sind, können Sie sich fragen, warum wir etwas verwenden würden, das eine unendliche Schleife ist. Viele von Ihnen wurden zweifellos vor der Gefahr von unendlichen Schleifen gewarnt und wie sie eine Maschine zum Absturz bringen können. Wie Sie vielleicht bemerkt haben, haben wir nach dem ersten Scan eine Schlafanweisung verwendet. Wir werden dies wieder in unserer Forever -Schleife und einige der Funktionen verwenden, die es beinhaltet. Durch den Schlaf kann die Ausführung innehalten und vorübergehend Ressourcen dem Computer zurückgeben. Ich habe dieses Skript auf einem ziemlich bescheidenen Prozessor getestet und überhaupt keine Probleme erlebt. Wenn Sie sich jedoch auf einer sehr alten Maschine befinden oder bereits für Ressourcen abgebildet sind, können Sie die Anzahl der Sekunden ändern, in denen der Schlaf hier verwendet wird.

Das erste, was unsere Forever -Schleife tun wird, ist zu der Funktion namens Engine () zu springen. Was wir hier tun, ist genau das gleiche wie unser erster Scan, außer dass wir es in ein anderes Array setzen. Nachdem diese Funktion ausgeführt wurde. Wenn sie gleich sind, wird das Array aus dem zweiten Scan geleert, um doppelte Werte bei der nächsten Iteration der Schleife zu verhindern. Wenn der Wert jedoch ein Unterschied in diesen beiden Arrays ist.

Die Interrupt -Funktion hält dem Benutzer an und kündigt an, dass sich die Liste der Clients geändert hat. Von hier aus rufen wir eine Funktion mit dem Namen "zweimal" auf, bei der wir dem Benutzer den Inhalt von IP -Adressen im zweiten Array anzeigen. Wir werden den Benutzer nun fragen, ob er eine IP -Adresse blockieren möchte. Es kann eine IP sein, nicht nur die angezeigten IP. Wenn der Benutzer „y“ für Ja beantwortet, werden er gebeten, eine IP -Adresse einzugeben. Wenn die eingegebene IP nicht null ist. Aus irgendeinem Grund, wenn NMAP das Netzwerk ping. Dann verwenden wir ARP, um uns die MAC -Adresse des Clients zu geben. Da IPs von einem Router neu zugewiesen werden können, möchten wir nicht per IP -Adressen blockieren. Sobald dies erledigt ist, verwenden wir eine verschachtelte Anweisung, um zu überprüfen, ob die MAC. Dies ist gut für die Fehlerprüfung, falls der Benutzer eine Müllqualitätstreichung eingibt. Wenn die MAC -Adresse nicht vorhanden ist, teilen wir dem Benutzer mit. Wenn die MAC -Adresse vorhanden ist. Ich sollte hier beachten, dass dies Sie nicht daran hindert, Pakete an diese Maschine zu senden, sondern nur eingehender Verkehr zu Ihnen. Dies schützt jedoch nicht Ihr gesamtes Netzwerk. Nur die Maschine, die Sie verwenden, bis Ihre Iptables -Regeln gespült sind. Wenn Sie versehentlich einen Kunden blockieren, der feststellt. Die Anweisung wird fortgesetzt, indem der Benutzer teilnimmt, dass die MAC -Adresse der eingegebenen IP jetzt blockiert ist und die aktuellen Kunden online angezeigt wird. Der blockierte Client wird weiterhin in dieser Liste angezeigt, da wir ihn nur von uns blockiert haben, nicht im Netzwerk. Wenn der Benutzer einen Client nicht blockieren würde, würden wir einfach die Änderung im Netzwerk anzeigen und zurück zu unserer Forever Loop gehen.

Unabhängig davon, was der Benutzer in der Interrupt -Funktion getan hat, müssen wir nun die Werte unserer Arrays aktualisieren. Da das zweite Array derzeit die neuen Werte unseres Netzwerks enthält. Wir klären zuerst dieses Array, um doppelte Werte zu verhindern, und kopieren dann den Inhalt des zweiten Arrays in das erste Array. Verwenden Sie nun das zweite Array leer und wir sind bereit, die Schleife mit der Motorfunktion zu starten.

Natürlich gab es eine Funktion, die ich bis jetzt übersprungen habe. Möglicherweise haben Sie festgestellt, dass unsere erste Nachricht an den Benutzer jederzeit auf Control-C klicken soll, um zusätzliche Clients zu blockieren oder zu beenden. Unsere Trap ruft die erste Funktion namens Control_c () auf. Alles, was ich hier getan habe, war, den Benutzer in einer IF -Anweisung zu fragen, ob er einen Benutzer auf die gleiche Weise wie zuvor blockieren möchte. Sie werden feststellen, ob der Benutzer die IF -Anweisung mit Ja beantwortet, dass hier eine neue Zeile vorhanden ist. „Bash Leecher.SH ”wird verwendet, um dieses Skript neu zu starten. Wenn Sie dieses Skript etwas anderes benannt haben, müssen Sie das hier angeben. Wir führen unser Skript erneut aus. Das Erstellen einer neuen Instanz verhindert, dass das Skript unerwünscht sterben. Das Erstellen der neuen Instanz lässt SIGINT jedoch nicht vervollständigen.

Möglicherweise haben Sie auch bemerkt, dass wir auch etwas länger als Schlaf genutzt haben. Dies dient nur dazu, dem Benutzer Zeit zu geben, zu lesen, was passiert, bevor Sie zu unserer neuen Instanz des Skripts wechseln, die dieses Terminal übernimmt. Wenn der Benutzer "Nein" anstelle von "Ja" ausgewählt hätte. Wir werden auch sicher sein, dass Setterm zur Rückgabe unseres Cursors verwendet wird, oder wir werden keine in diesem Terminal haben, obwohl das Skript beendet ist.

Der Zweck, im Laufe der Fliege zu blockieren, ist einfach. Möglicherweise haben Sie mehr als einen Kunden zum Blockieren, wenn mehrere aggressive Kunden vorhanden sind. Sie können später entscheiden, nachdem Sie den Chance übersprungen haben, einen Kunden in der Interrupt -Funktion zu blockieren, die Sie benötigen. Oder vielleicht wissen Sie, dass etwas nicht stimmt, sobald Sie das Skript beginnen. Wenn keine neuen Kunden im fraglichen Netz.

Wie dieses Skript verbessert werden kann

Offensichtlich kann es ärgerlich sein. Wenn Sie dieses Skript in der Lage machen, Whitelist -Clients zu erledigen, denen Sie vertrauen, würde dies wahrscheinlich reduzieren. Die Systemglocke kann definitiv lästig sein, wenn eine Person für längere Zeit Probleme hat, in Verbindung zu bleiben.
Manchmal bemerken Sie möglicherweise einige Kunden, die von IPs zu Hostnamen wechseln. Viele Programme wie Etherape tun dasselbe. Wenn Ihr Router so wirkt, wie Ihr DNS den Hostnamen wahrscheinlich kontinuierlich anzeigt. Ich glaube nicht. Das Anbieten eines Parameters zum Wechsel zu IPs einziger kann für einige von Ihnen schön sein.
Es gibt auch ein kleines Problem mit dem Skriptgabeln, wenn ein Benutzer einen Client mit Control-C blockiert. Dies stellt keine Gefahr dar, es sei denn, ein Benutzer beschließt, Tausende von Clients mit Control-C zu blockieren. Allerdings werden alle Fälle des Drehbuchs beim Ausgang getötet. Aber da wir hier die Grundlagen finden, sollte dies in Ordnung sein.

Ein Intrusionserkennungssystem mit Bash

#!/bin/bash # Interuption und Exit Function Control_c () Clear echo -e "Möchten Sie Verbindungen zu einem Client blockieren?\ n "echo -e" Geben Sie y oder n ein: "Lesen Sie y, wenn [" $ yn "==" y "]; dann echo -e" \ nenter IP -Adresse zu blockieren: \ n "Lesen Sie IP if [-n $ ip]; dann echo -e "\ nnow ring mac -Adresse zu blockieren ... \ n" Ping -c 1 $ ip> /dev /null mac = "arp $ ip | Grep Ether | awk "print $ 3" if [-z $ mac]; Dann existiert das Echo -e "\ n *** Client nicht mehr oder ist in diesem Netzwerk nicht mehr.\ n \ n "Schlaf 2 Bash -Blecher.sh exit 0 sonst iptables -a Eingabe -m Mac - -mac -source $ mac -j Drop Clear Echo -e "\ nclient mit MAC -Adresse $ mac ist jetzt \ blockiert.\ n "echo -e" Wir werden weiterhin die Änderungen \ in Clients \ n \ n "Sleep 2 Bash Blecher überwachen.sh exit 0 fi fi sonst klare echo -e "\ n \ nleecher hat \ n \ n" setterm -cursor auf rm -f $ pid exit 0 fi # Drucken Sie den Scan aus dem Engine () zweimal () () g = 0 len = $ #Sekunde [@] für ((g = 0; g /dev /null mac = "arp $ ip | grepether | awk" print $ 3 "if [-z $ mac]; dann löschen echo -e "\ n *** Client existiert nicht oder ist nicht mehr in diesem Netzwerk ***" echo -e "\ nskipping -Aktion und Wiederaufnahme der Überwachung.\ n \ n "else iptables -a Eingabe -m Mac - -mac -source $ mac -j drop löschen echo -e" \ nclient mit MAC -Adresse $ mac ist jetzt blockiert.\ n "echo -e" Wir werden weiterhin die Änderungen der \ in Clients \ n \ n "echo -e" weiterhin überwachen. Aktuelle Clients sind: \ n "zweimal echo -e" \ nResuming -Überwachung ... "fi fi fi sonst klare echo -e" Aktuelle Clients sind: \ n "zweimal echo -e" Wiederaufentwicklung der Überwachung ... "fi # Funktion, um die Überwachung für alle Änderungen in Engine ()  # -Scan -Netzwerke erneut zum Vergleich von Änderungen weiter zu überwachen. Für Subnetz in $ (/sbin/ifconfig | awk '/inet addr/&& !/127.0.0.1/ && !a [$ 2] ++ \ print substr ($ 2,6) ') do Second+= ("$ (nmap -sp $ Subnetz.*.0/24 | awk 'index ($ 0, t) \ print $ i' t = "$ t" i = "$ i") ") schlaf 1 fertig 0]]; dann echo "Dieses Skript muss als Root" 1> & 2 Beenden 1 fi # prüfen, ob NMAP installiert ist ifnmap = "Typ -p nmap" if [-z $ ifnmap]; dann echo -e "\ n" \ n "\ n \ nnmap muss installiert werden, damit dieses Programm nur nmap 5 funktioniert \ n "echo -e".00 und 5.21 werden zu diesem Zeitpunkt unterstützt \ n "echo -e" Bitte installieren und erneut versuchen ". So blockieren Sie zusätzliche Clients oder beenden Sie \ n " # TEMP-Dateien auf dem Beenden entfernen und das Control-C beenden lassen. Trap Control_c SIGINT # Schalten Sie den Cursor -Setterm -cursor aus # Machen Sie einige Arrays und Variablen deklarieren -a erster deklarieren -a Second Sid = 5.21 # Überprüfen Sie die Version von NMAP, wenn [5.21 = $ (nmap --version | awk '/ nmap/ print $ 3')]; Dann i = 5 t = Bericht else i = 2 t = Host fi # GET IP -IP -SCHREIBEN VON IPEN VON IPENSCHAFTEN UND DER ERSTE Subnetz in $ (/sbin/ifconfig | awk '/inet adDr/&& !/127.0.0.1/ && !a [$ 2] ++ print \ substr ($ 2,6) ') do First+= ("$ (NMAP -sp $ $ subnetz.*.0/24 | awk 'index ($ 0, t) drucken $ i' \ t = "$ t" i = "$ i") ") schlaf 1 erledigte echo -e" Aktuelle Clients sind: \ n "#Display -Array -Elemente und hinzufügen und hinzufügen Neue Zeilen e = 0 len = $ #zuerst [@] für ((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

Probenausgabe

Finden Sie nun Clients in Ihrem lokalen Netzwerk (en). Drücken Sie jederzeit Control-C, um zusätzliche Clients zu blockieren oder aktuelle Clients zu beenden, sind: 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 Blecher überwacht jetzt neue Kunden. Änderungen mit Kunden werden von der Systemglocke gemeldet. Wenn Bell nicht aktiviert ist, melden sich Details bei dieser Konsole an. ====================================================== ============ Die Liste der Kunden hat sich geändert! 192.168.12.9 192.168.12.43 Mephistolist 10.0.0.140 Möchten Sie Verbindungen zu einem Client blockieren? Geben Sie y oder n ein: y Geben Sie die IP -Adresse ein, um zu blockieren: 192.168.12.9 ===================================================== ============ Client mit MAC -Adresse 7C: ed: 8d: 9c: 93: 8e ist jetzt blockiert. Wir werden weiterhin Änderungen in Clients überwachen ===================
Fatal ERROR BAD Primärpartition 0 Partition endet im endgültigen Teilzylinder
Fataler Fehler Schlechte Primärpartition 0 Die Partition endet im endgültigen Teilzylinder Dieser Fehler tritt auf, wenn CFDisk versucht, eine Partiti...
Starten Sie und stoppen Sie RTorrent während der Spitzen- und Absendungsstunde auf Thecus ntop 10top 10
Ich weiß, dass es eine Syntax in einer RTorrent -Konfigurationsdatei gibt, um Gas für Uploads zu planen und für RTorrent herunterzuladen. Egal wie sch...
Linux WD Ohrs Erweitertes Festplattenformat
Die Einführung Heutzutage wechselt die Festplattenhersteller auf eine neue Festplattentechnologie, bei der 4 KB -Sektoren anstelle von herkömmlichen 5...