SSH-Tarpit oder wie man einen Angreifer entnervt

Mo, 10. Januar 2022, Norbert Rüthers

Seit einiger Zeit habe ich auf einem alten Raspberry Pi 1 einen besonderen Dienst laufen. Er heisst SSH-Tarpit, was übersetzt SSH-Teergrube bedeutet. Und genauso funktioniert er. Frei nach dem Motto ab jetzt wird zurückgeschlagen.

Dem ein oder anderen ist vielleicht bekannt, dass, wenn man einen Server im Internet zur Verfügung stellt, schon nach wenigen Minuten Abfragen nach offenen Ports eintrudeln. In den meisten Fällen erfolgt das auf Port 22, dem SSH Port, der Zugriff auf die Konsole und damit direkt ins Herz des Systems erlaubt. Ich hatte bereits am ersten Tag hunderte von Zugriffen.

Beispiel:

Jemand stellt eine Anfrage auf Port 22. Der Benutzername ist in der Regel "root", weil der alle Rechte am System besitzt. Sofern der Port freigegeben ist, erfolgt vom System sofort die Aufforderung ein Passwort einzugeben. Nun probiert der Angreifer die verschiedensten Passwörter aus. Wenn er sich einer automatisierten Wörterbuchattacke bedient, können das Millionen sein. Und vielleicht hat er damit Erfolg.

SSH-Tarpit geht nun folgendermassen vor:

Es nutzt eine Eigenschaft des SSH Protokolls aus die besagt, dass es egal ist in welcher Zeit unser System eine Antwort (sprich die Anfrage nach einem Passwort) geben muss. Nachdem der Angreifer also auf einen offenen Port 22 trifft, erfolgt keine Abfrage nach einem Passwort. Der Angreifer wartet....und wartet...und wartet. Der Angreifer kann natürlich in dieser Zeit auch kein anderes Passwort ausprobieren.

Ebenfalls kann er in dieser Zeit auch kein anderes System angreifen, weil er ja brav auf die Antwort unseres Systems wartet. Wenn es eine automatisierte Attacke ist, wird irgendwann ein timeout erfolgen oder ein manueller Angreifer bricht entnervt von selber ab. Auf diese Weise kann nicht nur ein Angreifer zur gleichen Zeit, sondern mehrere blockiert werden.

Nun will man sein System natürlich auch selber gerne per SSH bedienen.

Aus dem Internet heraus muss man dafür einfach einen anderen Port durchleiten, z.B. 1234 oder etwas beliebig anderes und den dann auf den entsprechenden Server Port 22 forwarden. Aus dem internen Netzwerk ist der Server natürlich weiterhin auf Port 22 erreichbar.

Installiert wird SSH-Tarpit wie folgt:

sudo apt install python3-pip

pip3 install ssh-tarpit

Die Optionen fragt man mit folgendem Kommando ab:

ssh-tarpit --help

Am Router muss der Port 22 (aussen) auf Port 2222 (Tarpit) freigegeben werden:

Gestartet wird SSH-Tarpit wie folgt:

ssh-tarpit -i 4 -a <IP-Adresse des Tarpit> -p 2222

Will man das Log von SSH-Tarpit in eine Textdatei zur späteren Auswertung schreiben, gilt folgender Befehl:

ssh-tarpit -i 4 -a <IP-Adresse des Tarpit> -p 2222 -f /pfad/zum/log/tarpit.log

Wobei der Dateiname tarpit.log an die eigenen Gegebenheiten anpassbar ist.

Hier ein Auszug aus einer Logdatei:

Wer will, der kann die Logdatei auch problemlos im csv Format abspeichern und dann mit einem beliebigen Tabellenkalkulationsprogramm auswerten.

Bei mir kamen innerhalb eines Monats über 25000 Angriffsversuche zusammen.

Nun könnte jemand behaupten das sich das auch z.B. mit fail2ban erledigen liesse. Aber.....

fail2ban blockt zwar nach einstellbaren X Versuchen einen Angreifer. Aber erstens erfolgt das sehr schnell und der Angreifer kann sofort zum nächsten System das angreifbar ist, springen und sein Werk dort fortführen. Und zweitens macht es einen Riesenspass zu beobachten wie sich ein Angreifer in meiner Teergrube verfangen hat und dort nicht mehr herauskommt.

Bildquelle: https://www.qacafe.com/resources/endlessh-ssh-tarpit/