Du bist nicht angemeldet
Anmelden mit deinem Facebook-Konto
Hallo! Du bist nicht angemeldet. Wenn Du Dich anmeldest, dann kannst Du hier Kommentare verfassen und Dich mit anderen Nutzern austauschen. Es werden keine Daten von Dir ausspioniert und nach einer Stunde wirst Du hier automatisch wieder abgemeldet.
Weiterempfehlen

« Wi-Fi Intrusion Detection mit OpenWrt und PHP »

(30.01.2011 16:09)

Ich habe mir heute ein wenig Zeit genommen, meine Intrusion Detection für mein WLAN zu verbessern. Bisher habe ich mir immer manuell die Log-Einträge angesehen und geguckt, ob sich Stationen am Netzwerk anmelden oder dies versuchen, die nicht bekannt sind. Es wurde jetzt mal langsam Zeit, den Prozess zu automatisieren und mir auch eine E-Mail Benachrichtigung zu senden. Etwas ähnliches hatte ich auf meinem WRT54GL auch, aber das hatte ich eher schlecht als recht umgesetzt. Deswegen jetzt auf dem WR1043ND ein Neuanfang.

Das ganze funktioniert jetzt so; Alle 10 Minuten läuft ein Cronjob auf dem Router, welcher die Logeinträge von hostapd (Daemon für den Access Point) und dropbear (SSH daemon) per wget an ein PHP Script auf dem Server meiner Website bei GoDaddy sendet. Dieses Script überprüft die Log-Einträge und sendet bei Bedarf eine E-Mail an mich.

Das Script, welches die Log-Einträge versendet sieht relativ einfach aus. Ein bisschen grep und wget.

#!/bin/ash
logread | egrep 'hostapd|dropbear' >> /tmp/hostapd-sendlog.txt
wget -qO- "http://www.kammerath.net/xxx/xxx/checklog.php" --post-file /tmp/hostapd-sendlog.txt
echo "";
rm /tmp/hostapd-sendlog.txt

Wie man sieht passiert in dem Script jetzt noch nicht wirklich irgendetwas. Es liest die Log-Datei und drückt Sie in den RAM des Geräts (der RAM ist bei OpenWrt immer unter /tmp eingehangen). Anschließend sendet wget die Datei per POST an das Script auf meinem Server. Habe ich oben aus Sicherheitsgründen mit * maskiert. Danach wird die Log-Datei wieder gelöscht, damit der RAM nicht unnötig Daten hält, da er nur 14MB groß ist.

Das PHP Script sieht da schon spannender aus. Es liest erst einmal den POST-Datenstrom. Sieht vielleicht etwas umständlich aus, ist aber für die leichtgewichtige wget Version bedeutend einfacher durchzuführen. Der router soll nicht so sehr von dem Vorgang belastet werden. Das ist auch der Grund, warum die Hauptveranstaltung auf dem GoDaddy Server stattfindet. Kann man jetzt drüber diskutieren.

// define the known hosts (add the MACs lowercase!)
$known_hosts = array(
	/* alle anderen gibts hier aus sicherheitsgruenden nicht zu sehen für euch */
	"00:20:00:xx:xx:xx" => "LEXMARK S405 PRINTER (printer)"
);
 
// start the script
check_log();
 
// method reads the log in post-data
function check_log(){
	// make sure raw post data has been transmitted
	if ( $_SERVER['REQUEST_METHOD'] === 'POST' ){
		// Read the input from stdin
		$postData = trim(file_get_contents('php://input'));
		$lines = explode("n",$postData);
		analyze_log($lines);
		echo "Server checked ".count($lines). " lines of log data.";
	}
}
 
// analyzes the log and checks it
function analyze_log($datalines){
	global $known_hosts;
 
	$wifi_authenticated = array();
	$wifi_handshaked = array();
 
	$wifi_stationlog = array();
	$wifi_log_count = 0;
 
	$ssh_failures = array();
	$ssh_failure_count = 0;
 
	$alert_level = 0; // 0 = NONE, 1 = WARNING, 2 = CRITICAL
	$alert_text = "";
 
	// we'll only check events within the last 10 minutes
	// but for that we need the clients system time of the
	// last log entry and parse that
	$start_time = (parse_logtime(substr($datalines[count($datalines)-1],0,15))-600);
	echo "Checking your events after ".date("Y-m-d H:i",$start_time)."n";
 
	for($i=0; $i=$start_time){
			if(!array_key_exists($wifi_auth_stations[$was],$known_hosts)){
				$alert_level = 1;
				$alert_text .= "Wi-Fi station ".$wifi_auth_stations[$was]
							." tried to authenticate, but is not in the known hosts"
							." (".date("Y-m-d H:i",$wifi_authenticated[$wifi_auth_stations[$was]])
							.")nn";
 
				// 2) WiFI authentication with handshake of unknown sta
				// check if the station was able to authenticate successfully
				if(array_key_exists($wifi_auth_stations[$was],$wifi_handshaked)){
					if($wifi_handshaked[$wifi_auth_stations[$was]]
						>=$wifi_authenticated[$wifi_auth_stations[$was]]){
						// set alert level to critical then
						$alert_level = 2;
						$alert_text .= "Wi-Fi station ".$wifi_auth_stations[$was]
							." hanshaked successfully, but is not in the known hosts"
							." (".date("Y-m-d H:i",$wifi_handshaked[$wifi_auth_stations[$was]])
							.")nn";
					}
				}
 
				// finally add the full wi-fi log for
				// this station in the last 10 mins
				$alert_text .= "n**** All events for ".$wifi_auth_stations[$was]." ****n";
				for($wsl=0; $wsl$start_time
						&& $wifi_stationlog[$wsl]["station"]==$wifi_auth_stations[$was]){
						// add it to the message log
						$alert_text .= $wifi_stationlog[$wsl]["message"]."nn";
					}
				}
				$alert_text .= "nn";
			}
		}
	}
 
	// 3) SSH authentication attempt with unknown user	
	// 4) SSH authentication attempt with bas password
	for($saf=0; $saf=$start_time){
			if($alert_level < 1){$alert_level = 1;}
			$alert_text .= $ssh_failures[$saf]["message"]."nn";
		}
	}
 
	// finally send the alert message when there are alerts
	if($alert_level > 0){
		$alert_subject = "IDS Warning Alert";
		if($alert_level > 1){
			$alert_subject = "CRITICAL IDS ALERT";
		}
		// send the alert
		send_alert($alert_subject,$alert_text);
		// inform the host about the alert
		echo $alert_subject." has been sent!n";
	}else{
		// inform the host that there are not alerts
		echo "No alert has been sent (You seem to be safe).n";
	}
}
 
// sends an alert message
function send_alert($subject,$text){
	mail("janxxxx@xxx.com", $subject, $text, 
	"From: Intrusion Detection rn");
}
 
// parses the log time and returns a timestamp
function parse_logtime($logtime){
	// input format: 'Jan 30 14:56:00'
	// definition of the months
	$month_names = array(
		"Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4,
		"May" => 5, "Jun" => 6, "Jul" => 7, "Aug" => 8,
		"Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12
	);
 
	return mktime(substr($logtime,7,2), /* hour*/
					substr($logtime,10,2), /* minute */
					substr($logtime,13,2), /* second */
					$month_names[substr($logtime,0,3)], /* month */
					substr($logtime,4,2), /* day */
					date("Y",time())); /* year */
}

Das Script geht einfach alle Log-Einträge durch, und sucht nach 802.11 Authentifizierungen, WPA Handshakes und Sicherheitswarnungen von Dropbear – dem SSH daemon. Sofern sich eine Station authentifiziert, aber dann den Handshake nicht durchführt, hat sie einen falschen Schlüssel überliefert. In diesem Fall geht dann schon eine E-Mail raus. Jedoch immer nur, wenn es sich um eine unbekannte Station handelt (außer bei den Dropbear Warnungen).

Das ganze dann als Cronjob und man ein prima IDS. Falls Jemand Bugs oder Fehler in einem der Scripte findet, bitte einfach ein Kommentar an diesen Artikel dranhängen.

Update: Ich habe das ganze jetzt noch etwas angepasst. Während der Laufzeit des Scripts leuchtet die “QSS” LED an dem Router. Ist es fertig, geht Sie wieder aus. Sofern das Script eine Warnmeldung versendet hat, blinkt die “QSS” Leuchte 1 Minute lang.

Hier das Script, welches CRON ausführt.

#!/bin/ash
sh /root/led/switch-qss 1
sleep 1s
rm /tmp/ids_alert_log
sh /root/log/send-hostapd-log >> /tmp/ids_alert_log
sleep 1s
sh /root/led/switch-qss 0
grep "has been sent" /tmp/ids_alert_log -q && sh /root/led/blink-qss 30 &

Man sieht oben, dass dort ein Shell-Script verwendet wird, welches die LED zum leuchten bringt. Interessehalber poste ich das Script gleich mit, obwohl es wenig mit dem eigentlichen Vorgang zu tun hat.

#!/bin/ash
for i in `seq 0 $1`;
do
  echo 1 > /sys/devices/platform/leds-gpio/leds/tl-wr1043nd:green:qss/brightness
  sleep 1s
  echo 0 > /sys/devices/platform/leds-gpio/leds/tl-wr1043nd:green:qss/brightness
  sleep 1s;
done

Das Blink-Script bekommt einen Parameter, der ihm mitteilt, wie lange es laufen soll. Da hier immer An/Aus in einem Lauf gemacht wird, ist der Parameter entsprechend Laufzeit = Parameter 1 * 2 sek.

Vielleicht fragt sich der Ein oder Andere, was die QSS LED eigentlich macht. Sie steht für “Quick Security Setup” und ist damit Bullshit. Quick und Security sind zwei Begriffe, die sich schon irgendwie gegenseitig ausschließen. Ich überlege auch noch, was ich mit dem gleichnamigen Button am Vorderteil des Geräts machen soll.

Bücher zum Thema „Intrusion Detection“

Die Linux Security Box: Das Komplettpaket zu Firewalling und Intrusion Detection & Prevention für Linux-Server von Ralf Spenneberg für  119,95 € Intrusion Detection effektiv!: Modellierung und Analyse von Angriffsmustern (X.systems.press) von Michael Meier für  9,34 € Es sind eine Reihe interessanter Intrusion Detection-Bücher und Veröffentlichungen rund um das Thema „Intrusion Detection“ erschienen, wozu unter Anderem Intrusion Detection effektiv!: Modellierung und Analyse von Angriffsmustern (X.systems.press) von Michael Meier, erschienen bei Springer Berlin Heidelberg für 9,34 €, zählt.

Gut und empfehlenswert ist auch das 1600-Seiten starke Buch Die Linux Security Box: Das Komplettpaket zu Firewalling und Intrusion Detection & Prevention für Linux-Server von Ralf Spenneberg (erschienen bei Addison-Wesley, München). Der Autor Ralf Spenneberg bietet ein paar sehr hilfreiche Details zum Thema Intrusion Detection in seinem Buch, welches mit einem Preis von 119,95 € auch noch recht erschwinglich für ein Intrusion Detection-Buch ist.

Intrusion Detection und Prevention mit Snort 2 & Co. Einbrüche auf Linux-Servern erkennen und verhindern von Ralf Spenneberg für  € Wenn es um Intrusion Detection-Wissen geht sollte das Buch „Intrusion Detection und Prevention mit Snort 2 & Co. Einbrüche auf Linux-Servern erkennen und verhindern ebenfalls nicht ungenannt bleiben. Ralf Spenneberg hat hier viele gute Informationen über Intrusion Detection festgehalten. „Intrusion Detection und Prevention mit Snort 2 & Co. Einbrüche auf Linux-Servern erkennen und verhindern“ wird durch Addison-Wesley, München herausgegeben, kostet 129,00 € und umfasst insgesamt 829 äußerst informative Seiten.

Gleichwohl hier im Artikel Wi-Fi Intrusion Detection mit OpenWrt und PHP und auch in anderen Artikeln zahlreiche Informationen über Intrusion Detection zu finden sind, empfiehlt sich immer ein Blick auf aktuelle Buchveröffentlichungen, da natürlich auch im Bereich Intrusion Detection sich die Dinge mit der Zeit ändern. Besonders empfehlen kann ich das Lesen auf dem Amazon Kindle, welches eine besonders angenehme Möglichkeit ist, Intrusion Detection-Bücher unterwegs zu lesen.

Besucher, die diesen Beitrag gelesen haben, interessieren sich auch für...

62 Besucher haben auch das gelesen
43 Besucher haben auch das gelesen
20 Besucher haben auch das gelesen
19 Besucher haben auch das gelesen
5 Besucher haben auch das gelesen

Du musst Dich lediglich mit deinem Benutzer über Facebook anmelden, um hier Kommentare schreiben zu können. » Mit Facebook anmelden.
© 2012 Jan Kammerath
Telefon +49 2241 955 98 60 oder E-Mail Kontakt.

Das Kammerath Network Website System ist unter der Mozilla Public License 1.1 veröffentlicht.

Diese Website wurde von Jan Kammerath entwickelt und ist in Ihren Bestandteilen somit teilweise Eigentum von Jan Kammerath. Sie besteht jedoch auch aus Teilen, die unter der Open Source Lizenzen veröffentlicht wurden. Die Familie Kammerath besitzt zudem E-Mail Adressen unter dieser Domain und wenn Du auch ein Kammerath bist, dann kannst Du Dich gerne melden und vielleicht bekommst Du dann auch eine E-Mail Adresse bei Kammerath.net oder Kammerath.com. Wenn Du Dich fragst, woher der Name Kammerath kommt, dann können selbst die besten Ahnenforscher Dir dies nicht so richtig beantworten, denn Kammerath ist schon ein sehr spezieller Nachname.



Seite durchsuchen
Kategorien
Angebote