Get Adobe Flash player

SSH Honeypod Kippo

Ein Honeypod ist ein System, was vorgaukelt ein richtiges SSH Server zu sein, Verbindungen mit sehr einfachen Passwörtern (Mehrzahl möglich) zulässt. Im Hintergrund protokolliert der Honeypod alles was gemacht wird und liefert ein Log davon. In Wirklichkeit wird das System aber zur keinen Zeit kompromittiert.

Für den SSH Dienst welcher ganz oben auf der Liste der Angreifer steht, gibt es ein Dienst der Kippo heisst.

Installation

Um Kippo zu installieren muss Python und ein paar Abhängigkeiten installiert werden, sowie ein User eingerichtet werden:

apt-get install python-dev openssl python-openssl python-pyasn1 python-twisted -y
adduser kippouser

Ist dies gemacht, geht es darum Kippo zu installieren:

mkdir /opt/kippo
cd /opt/kippo
chown kippouser:kippouser /opt/kippo
su -c "wget http://kippo.googlecode.com/files/kippo-0.5.tar.gz" kippouser
su -c "tar xf kippo-0.5.tar.gz" kippouser
su -c "cd kippo-0.5" kippouser


Auch ändere ich gleich das Startscript, das dieses mit Root gestartet werden kann, aber unter Kippouser ausgeführt wird, ohne das man nachdenken muss ;)

echo "#!/bin/sh" > start.sh
echo 'echo -n "Starting kippo in background..."' >> start.sh
echo 'su -c "twistd -y kippo.tac -l log/kippo.log --pidfile kippo.pid" kippouser' >> start.sh

Als nächstes konfigurieren wir die Firewall so, das diese alle Anfragen auf Port 22 an Kippo weiterleitet, dabei sollte der richtige SSH Server nicht auf dem Port 22 laufen:

iptables -A INPUT -i eth0 -p tcp --dport 22222 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j REDIRECT --to-port 22222

Nun erstellen wir die “Festplatte” vom Server mit dem Befehl:

cd /opt/kippo/kippo-0.5/utils
su -c "python createfs.py" kippouser

Honeypod identifiziert sich selbst

Jetzt gibt es nur noch ein Problem, Kippo identifiziert sich eigentlich selbst an die Angreifer. Dies ist sehr ungeschickt.
Das Problem liegt in den Befehlen “w” und “uptime”.

Die Rückgabe zu dem Befehl ist immer “??:??:?? up 14 days, 3:53, 1 user, load average: 0.08, 0.02, 0.01″.
Wie man sieht, Kippo läuft immer 14 Tage und 3:53 Stunden. Hier musste Abhilfe geschaffen werden.

So habe ich kurzerhand das Python Script erweitert:
Auszug Orginal Datei /opt/kippo/kippo-0.5/kippo/commenads/base.py

class command_uptime(HoneyPotCommand):
    def call(self):
        self.writeln(' %s up 14 days,  3:53,  0 users,  load average: 0.08, 0.02, 0.01' % \
            time.strftime('%H:%M:%S'))
commands['/usr/bin/uptime'] = command_uptime

class command_w(HoneyPotCommand):
    def call(self):
        self.writeln(' %s up 14 days,  3:53,  1 user,  load average: 0.08, 0.02, 0.01' % \
            time.strftime('%H:%M:%S'))
        self.writeln('USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT')
        self.writeln('root     pts/0    %s %s    0.00s  0.00s  0.00s w' % \
            (self.honeypot.clientIP[:17].ljust(17),
            time.strftime('%H:%M', time.localtime(self.honeypot.logintime))))
commands['/usr/bin/w'] = command_w
commands['/usr/bin/who'] = command_w

Auszug Neue Datei

def uptime():
 
     try:
         f = open( "/proc/uptime" )
         contents = f.read().split()
         f.close()
     except:
        return "Cannot open uptime file: /proc/uptime"
     total_seconds = float(contents[0])
     MINUTE  = 60
     HOUR    = MINUTE * 60
     DAY     = HOUR * 24
     days    = int( total_seconds / DAY )
     hours   = int( ( total_seconds % DAY ) / HOUR )
     minutes = int( ( total_seconds % HOUR ) / MINUTE )
     seconds = int( total_seconds % MINUTE )
     string = " up " + str(days) + " days, " +  str(hours) + ":" + str(minutes) + ",  1 users,  load average: 0.25, 0.18, 0.15"  
     return string;

class command_uptime(HoneyPotCommand):

    def call(self):
		self.writeln(' %s' % time.strftime('%H:%M:%S') + uptime())
commands['/usr/bin/uptime'] = command_uptime

class command_w(HoneyPotCommand):
    def call(self):
        self.writeln(' %s' % time.strftime('%H:%M:%S') + uptime())	
        self.writeln('USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT')
        self.writeln('root     pts/0    %s %s    0.00s  0.00s  0.00s w' % \
            (self.honeypot.clientIP[:17].ljust(17),
            time.strftime('%H:%M', time.localtime(self.honeypot.logintime))))
commands['/usr/bin/w'] = command_w
commands['/usr/bin/who'] = command_w

Danach melden die Befehle den richtigen Wert vom Server zurück und die Angreifer sehen nicht mehr gleich dass dahinter Kippo läuft.
Um die neue Datei bei euch zu installieren, einfach folgende Befehle ausführen:

cd /opt/kippo/kippo-0.5/kippo/commands
rm base.py
wget http://www.murawski.ch/wp-content/uploads/2012/08/base.py.txt
mv base.py.txt base.py
chown kippouser:kippouser base.py

Auch update ich gleich die ifconfig Ausgabe vom Server.

ifconfig > /opt/kippo/kippo-0.5/txtcmds/sbin/ifconfig

Web Statistiken

Als Nächstes kommt optional noch das Webpanel mit den Statistiken dazu. Wer dies nicht möchte, kann gleich zum Start des Dienstes hüpfen.

PHP und Mysql sollte installiert sein.

apt-get install apache2 php5-gd php5-mysql mysql-common -y

erstellt eine leere Datenbank, ein User mit Lese / Schreibrechten sowie das Passwort zum User. Ich nenne dies nur noch die_datenbank, der_user und das_passwort unten.

Damit das Webpanel funktioniert, müssen wir das Logging des Kippo in der MySQL einschalten. Dies geht in dem man in der kippo.cfg die Zeilen auskommentiert und Datenbank / User und Passwort einträgt:

[database_mysql]
host = localhost
database = die_datenbank
username = der_user
password = das_passwort

Auch muss man noch das Datenbankmodel gleich importieren:

mysql -u der_user -p das_passwort
> USE die_datenbank; 
> source /opt/kippo/kippo-0.5/doc/sql/mysql.sql 
> exit

Nun laden wir die Webseiten Statistikpaket runter:

cd /var/www
wget http://bruteforce.gr/wp-content/uploads/kippo-graph-0.7.2.tar
tar xvf kippo-graph-VERSION.tar --no-same-permissions
cd /var/www/kippo-graph
chmod 777 generated-graphs

Nun editieren wir die Datei /var/www/kippo-graph/config.php und geben auch hier die Datenbank Infos ein:

define('DB_HOST', 'localhost');
define('DB_USER', 'der_user');
define('DB_PASS', "das_passwort");
define('DB_NAME', 'die_datenbank');

Die Statistiken sind nun unter http://deine-ip-adresse/kippo-stats aufrufbar.

Start des Dienstes

Nun starten wir den Dienst:

cd /opt/kippo/kippo-0.5
./start.sh

Weitere Passwörter hinzufügen

Um weitere Passwörter hinzuzufügen, connected euch in euer Honeypod, das Standard passwort ist 123456.
Nun führt einfach ein passwd aus und gebt ein neues Passwort ein. Sogleich gehen beide Passwörter. So könnt ihr die Passwörter erweitern und damit die Chance das der Server “gehackt” wird.

Honeypod Eigenheit

Dank einer genialen Eigenheit des Honeypod bin ich schon an sehr interessante Daten gekommen.
Nachdem die Verbindung mit dem Honeypod aufgebaut wurde vom Angreifer versucht dieser Befehle auszuführen. Sobald er aufhören möchte, gibt er “exit” ein, was die Verbindung beendet normalerweise und man wieder auf dem eigenen Server landet.

Nun kommt die Eigenheit, sobald man exit eingibt, beendet es die Verbindung nicht wirklich, aber sagt dem Angreifer es hätte sie beendet. Alle weiteren Befehle die er glaubt lokal auszuführen werden weiterhin protokolliert!
So haben bereits 2 Angreifer auf meinem Server Daten für ein weiteren gehackten Server hinterlassen, da diese per ssh auf ein weiteren Server wollten. Da ich root und Passwort dadurch erhalten habe, konnte ich die RZ anschreiben, welche per sofort die beiden Server offline geschaltet haben. Dies in 2 Wochen.

Viel Spass beim Daten sammeln und sehr gerne höre ich eure Erfolge damit.

Weitere interessante Beiträge:

8 Kommentare zu „SSH Honeypod Kippo“

  • avatar Dario Rugani:

    Hallo,

    wollte nur sagen das es eine klasse Anleitung ist.

    Da ich kippo schon am laufen habe wollte ich nur den script von Ihnen verwenden.

    Wenn ich diesen Link allerdings laden möchte: http://www.murawski.ch/wp-content/uploads/2012/08/base.py
    Bekomme ich die fehlermeldung: Internal Server Error.

    Ich hab dann versucht den Script einfach zu kopieren, dies scheint aber nicht zu funktionieren, da Kippo dann nicht mehr starten.
    Könnten sie den Link “reparieren”?

  • Der Browser akzeptiert keine .py Dateien. Habe daher nun eine TXT draus gemacht und ein rename nach dem Befehl. Dann hat man am Ende eine .py Datei die gehen sollte.
    Danke für die Info.

  • avatar Christian:

    Hi,

    Danke für die übersichtliche Anleitung. Was mich an Kippo außerdem verrät, sind die hässlichen
    Loginmeldungen. So müsste nach “login as: root” dann auch “root@hostname password:” angezeigt werden.
    Nach einem erfolgreichen Login wird außerdem kein “Welcome to” und kein “Last login” angezeigt.
    Habe ich da etwas falsch gemacht, oder ist das bei Kippo die Regel?

  • Mir haben die Meldungen von Kippo auch nicht so gut gefallen.
    Ich habe diese einfach nachbearbeitet, damit diese so gut wie möglich stimmen. Auch die Uptimeanzeige ist so eine schlechte Sache. Habe ich ja auch geändert.
    Nach so einem Monat Laufzeit ist da doch einiges zusammengekommen, aber dennoch habe ich das Projekt wieder eingestellt.

  • avatar Bernd:

    Hi,
    vielen Dank für die Anleitung. Der Trick mit der Uptime gefällt mir.

    Beim Erstellen der Startdatei müsste es in den letzten zwei Zeilen nicht “>> start.sh” anstatt “> start.sh” heißen, damit die Datei nicht jedes Mal überschrieben wird?

  • Da muss ich dir klar recht geben ;) Danke für den Hinweis

  • avatar Michael:

    Hallo,
    das ist ein sehr interessantes Thema und ich kann mich nur dem anschließen, dass die Anleitung sehr hilfreich ist.

    Ich habe nun folgende Herausforderung:
    Bei mir läuft die Authentifizierung des normalen SSH-Zugangs auf dem neuen Server jetzt mit einem Zertifikat auf einem anderen Port (nicht 22).
    Nun möchte ich Kippo bei mir zusätzlich installieren, da mein alter Server schon mal gehackt wurde.

    Ist es möglich, den regulären SSH-Zugang mit einer Zertifikat-Anmeldung über einen nicht-Standard-Port und die Kippo-SSH-Anmeldung über Port 22 mit einem Passwort (ohne Zertifikat) zu realisieren?

    Über Hilfe würde ich mich sehr freuen.

    Mit freundlichem Gruß
    Michael.

  • Klar, das ist genau so wie ich das auch machte. SSH lege ich auf einen sehr hohen Port, z.B. 20500.
    Dann ist der SSH POrt 22 wieder frei. Kippo installieren und done.

    Kippo ist ein eigener Dienst welcher NUR mit PW funktioniert und dem ist egal wie SSH eingestellt ist.
    ABER Achtung: Es gibt tatsächlich solche Dienste im Netz, welche das Netz automatisiert absuchen und einfache PWs ausprobieren. Z.B. mein Kippo Server wurde von einem Anti-Virenhersteller “gefunden” undmein Hoster hat darauf eine Mail erhalten, wegen unsicherem Server an ihrem Netz…

    1. Das diese “automatisch” Server hacken war mir unbekannt, auch dass die das dürfen… sehr fragwürdig.
    2. Ich habe mein Kippo laufen lassen noch paar Monate und mein Hoster hatte noch eine 2te Benachrichtigung erhalten, aber nichts unternommen, da es ja nur ein Kippo war und kein richtiges SSH was “gehackt” wurde.

    Ich habe mein Kippo dann dennoch runtergenommen, nicht das denen US Idioten noch einfält den Hoster zu verklagen weil ers nicht macht.
    Jedenfalls funktioniert der Honigpot sehr gut wie ich sehen musste.

    PPS: Ich habe ein paar sehr interessante “Scripte” dadurch erhalten. Rootkits und div PHP / Perl Zeugs. Sehr lernreich.

    Gruss
    Stefan

Kommentieren

This Blog will give regular Commentators DoFollow Status. Implemented from IT Blögg

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.