08
Feb
08

SSH Blacklist für Mac OS X

Neulich als ich Abends am Computer sass, fiel mir auf, dass im Netzwerk Monitor von Little Snitch (kleine Petzte) reger Verkehr herrschte, welcher durch den SSH Daemon sshd verursacht wurde.
Netzwerk Montor

Ein Blick in die Log Datei bestätigte den Verdacht:


michi@otherland ~ $ tail -f /var/log/secure.log
...
Feb  6 22:22:59 otherland com.apple.SecurityServer[20]: Failed to authorize right system.login.tty by client /usr/sbin/sshd for authorization created by /usr/sbin/sshd.
Feb  6 22:22:59 otherland sshd[19031]: Failed password for invalid user smart from 218.225.122.4 port 43343 ssh2
Feb  6 22:23:02 otherland sshd[19033]: Invalid user smart from 218.225.122.4
...

Seit einiger Zeit versucht also jemand mit blossem Durchprobieren (Brute Force) sich per SSH auf meinem Heim-Computer anzumelden. Auf meinen Linux Servers installiere ich immer selbstverständlich sshblack, auf die Idee dies auch zu Hause unter Mac OS X zu tun kam ich bis jetzt aber noch nicht. Genau dies möchte ich jetzt aber nachholen. Am Ende des Artikels gibt es auch die angepassten Dateien zum Herunterladen.

Als erstes muss sshblack heruntergeladen werden. Ich werde es in der Bash tun, es kann natürlich auch mit Firefox und Finder getan werden.


michi@otherland ~ $ wget http://www.pettingers.org/media/sshblackv28.tar.gz
--22:49:36--  http://www.pettingers.org/media/sshblackv28.tar.gz
           => `sshblackv28.tar.gz'
Resolving www.pettingers.org... 207.149.40.42
Connecting to www.pettingers.org|207.149.40.42|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19,857 (19K) [application/x-gzip]

100%[============================================================================>] 19,857        24.01K/s             

22:49:38 (23.97 KB/s) - `sshblackv28.tar.gz' saved [19857/19857]

michi@otherland ~ $ tar xvfz sshblackv28.tar.gz
sshblackv28/
sshblackv28/INSTALL.TXT
sshblackv28/README.TXT
sshblackv28/bl
sshblackv28/iptables-setup.sh
sshblackv28/list
sshblackv28/unlist
sshblackv28/unbl
sshblackv28/sshblackv28.pl

sshblack nutzt iptables um unter anderen unixoiden Betriebssystemen den Angreifer mittels einer Sperre abzublocken. Unter Max OS X jedoch sollte man die eingebaute Firewall ipfw verwenden, wesshalb wir das Perl-Script sshblack anpassen müssen, und zwar können die Kommandos für das hinzufügen und entfernen einer Regel in den Variabeln ADDRULE und DELRULE und auch die Logdatei in LOG angepasst werden. Einfach in einem Editor der Wahl in sshblackv28.pl die Einträge anpassen.

Die originale Zeile mit dem iptables Kommando …


my($ADDRULE) = '/sbin/iptables -I BLACKLIST -s ipaddress -j DROP';

… wird durch die Zeile für das hinzufügen zur ipfw ersetzt …


my($ADDRULE) = '/sbin/ipfw add deny all from ipaddress to any';

… und das gleiche gilt auch für die Regel zum entfernen. Aus …


my($DELRULE) = '/sbin/iptables -D BLACKLIST -s ipaddress -j DROP';

… wird nun …


my($DELRULE) = '/sbin/ipfw delete `ipfw show | grep ipaddress | awk \'{ print $1 }\'`'

Als letztes noch unsere Logdatei anpassen. Der einzige Unterschied die Dateiendung. Einfach noch hinten .log an die Datei anhängen:


my($LOG) = '/var/log/secure.log';

Nun “installieren” wird sshblack, indem wir es nach /opt/local/bin kopieren und als ausführbar markieren und den Rest entfernen:


michi@otherland ~ $ sudo cp sshblackv28/sshblackv28.pl /opt/local/bin/
michi@otherland ~ $ sudo chmod +x /opt/local/bin/sshblackv28.pl
michi@otherland ~ $ rm -rf sshblackv28

Damit die Blackliste auch mit dem System startet, kann mit Lingon kurz und schmerzlos eine Launchd-Konfiguration erstellt werden. Hier ist meine:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>org.pettingers.sshblack</string>
	<key>ProgramArguments</key>
	<array>
		<string>/opt/local/bin/sshblackv28.pl</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>

was am Besten unter dem Namen org.pettingers.sshblack.plist im Verzeichnis /Library/LaunchDaemons abgelegt wird. Damit bei mir sshblack überhaupt laufen wollte, musste ich noch in /etc/profile die verwendete Sprache setzten:


export LANG="en_GB.UTF-8"

Wer sein OS X auf Deutsch eingestellt hat, sollte einfach de_DE.UTF-8 eintragen. Bei Bedarf kann nun auch noch das Lokale Netzwerk angepasst werden, da Adressen aus diesem Bereich nie auf die Blacklist kommen:


my($LOCALNET) = '^(?:127\.0\.0\.1|192\.168\.0)';

Die Standardeinstellung ist wie man oben sieht 192.168.0.X. Schlussendlich muss das Script noch ein wenig angepasst werden, da Launchd verlangt, dass das auszuführende Programm nicht einen eigenen Prozess abspaltet (fork). Dies können wir sshblack auch leicht mitteilen, indem wir die Variable DAEMONIZE auf 0 setzten:


my($DAEMONIZE) = '0';

Jetzt haben wir aber das Problem, dass sshblack die Log Informationen auf die Konsole ausgibt, welche dann von launchd verschluckt werden. Also müssen wir die Konsolenausgaben umbiegen (wir können die Kommandos dazu einfach aus der Fork-Bedingung kopieren:


open (STDOUT, ">>$OUTPUTLOG") or die "failed to open STDOUT";
open (STDERR, ">&STDOUT") or die "failed to open STDERR";
logit("SSHBLACK is Starting...",'1','0');

Endlich sind wir fertig und können den Dienst laden und starten, was wir natürlich auch gleich überprüfen:


michi@otherland LaunchDaemons $ sudo launchctl load org.pettingers.sshblack.plist
michi@otherland LaunchDaemons $ sudo launchctl start org.pettingers.sshblack
michi@otherland LaunchDaemons $ sudo launchctl list | grep sshblack
1597	0	org.pettingers.sshblack
michi@otherland LaunchDaemons $ tail -f /var/log/sshblacklisting
[Wed Feb  6 23:53:54 2008]  SSHBLACK is Starting...
[Wed Feb  6 23:53:54 2008]  Monitoring your log file for future attacks
michi@otherland LaunchDaemons $ ps -ef | grep perl
     0 1597     1   0   0:00.03 ttys000    0:00.06 /usr/bin/perl -w /opt/local/bin/sshblackv28.pl
  501 19674 13708   0   0:00.00 ttys000    0:00.00 grep perl

Sollte das Script aus irgend einem Grund nicht laufen, würde die Ausgabe anders aussehen:


michi@otherland LaunchDaemons $ sudo launchctl list | grep sshblack
-	255	org.pettingers.sshblack
michi@otherland LaunchDaemons $ tail -f /var/log/sshblacklisting
michi@otherland LaunchDaemons $ ps -ax | grep perl
  501 19674 13708   0   0:00.00 ttys000    0:00.00 grep perl

In diesem Fall sollte man sshblack direkt in der Konsole aufrufen, damit man dem Problem auf die Schliche kommen kann:


michi@otherland LaunchDaemons $ sudo /opt/local/bin/sshblackv28.pl

Sobald sich jemand viermal falsch per SSH anzumelden versucht, entweder mit einem falschen Benutzernamen oder auch falschem Passwort, schreibt sshblack seine Notizen und gegebenenfalls Aktionen in die Logdatei:


michi@otherland LaunchDaemons $ tail -f /var/log/sshblacklisting
[Fri Feb  8 16:11:36 2008]  SSHBLACK is Starting...
[Fri Feb  8 16:11:36 2008]  Monitoring your log file for future attacks
[Fri Feb  8 16:11:37 2008]  Watching 218.225.122.4 as potential attacker
[Fri Feb  8 16:11:38 2008]  Watching 218.225.122.4 as potential attacker
[Fri Feb  8 16:11:38 2008]  Watching 218.225.122.4 as potential attacker
[Fri Feb  8 16:11:39 2008]  Watching 218.225.122.4 as potential attacker
[Fri Feb  8 16:11:39 2008]  218.225.122.4 being blocked because of Failed password
00100 deny ip from 218.225.122.4 to any

Das die Adresse gesperrt wurde, können wir auch in der Feuerwand äh Firewall nachschauen:


michi@otherland ~ $ sudo ipfw show
00100      8      780 deny ip from 218.225.122.4 to any
65535 102101 58129069 allow ip from any to any

In der Standardeinstellung entfernt sshblack die gesperrten IP-Adressen automatisch wieder nach vier Tagen. Natürlich kann man die Adressen auch wieder manuell entfernen:


michi@otherland ~ $ sudo ipfw show
00100      9      884 deny ip from 88.41.58.213 to any
65535 102704 58234265 allow ip from any to any
michi@otherland ~ $ sudo ipfw del 00100
michi@otherland ~ $ sudo ipfw show
65535 102723 58235526 allow ip from any to any

Das angepasste sshblack 2.8 für OS X und auch die Launchd Konfiguration kann hier heruntergeladen werden: SSHBlack (411)

Das Kommando zum Entfernen der Regel ipfw del benötigt als Parameter nicht die IP-Adresse, sondern die ID der Regel (Eine IP kann ja auch in mehreren Regeln sein). Prima, nun haben wie uns die lästigen Scriptkiddies vom Hals geschafft…




1 Kommentar zu “SSH Blacklist für Mac OS X”



  1. Gravatar-Bild 1 michi 27. Feb 2008 um 8:24

    Schon nach nur vier Stunden online schaut bei mir die Blacklist folgendermassen aus:

    michi@otherland ~ $ sudo ipfw show
    Password:
    00100 39 2340 deny ip from 211.43.42.2 to any
    00200 17 956 deny ip from 82.98.141.9 to any
    00300 12 636 deny ip from 210.0.140.235 to any
    00400 19 1244 deny ip from 202.38.97.114 to any
    00500 15 852 deny ip from 221.204.251.32 to any
    65535 1716286 1043649581 allow ip from any to any

    Das ist mehr als eine Attacke pro Stunde…

Kommentare sind zur Zeit deaktiviert.

März 2010
M D M D F S S
« Jun    
1234567
891011121314
15161718192021
22232425262728
293031  

Werbung


Buttonitis