Ein TARPIT erstellen

Datum

A tarpit (also known as Teergrube, the German word for tarpit (German pronunciation: [ˈteːɐ̯ˌɡʁuːbə])) is a service on a computer system (usually a server) that purposely delays incoming connections. The technique was developed as a defense against a computer worm, and the idea is that network abuses such as spamming or broad scanning are less effective, and therefore less attractive, if they take too long. The concept is analogous with a tar pit, in which animals can get bogged down and slowly sink under the surface, like in a swamp.

Quelle: wikipedia.org

D.h. wenn ein Client beispielsweise eine unerwünschte SSH-Verbindung zu einem TARPIT-System aufbaut wird die Verbindung angenommen und sofort in den persistenten Zustand versetzt.
Die Remote-Seite hört auf Daten zu senden und fordert alle 60 bis 240 Sekunden auf fortzufahren. Die Schließung der Verbindungen von der Remote-Seite wird ignoriert. Die Verbindung läuft dann in 12-24 Minuten ab.

das xtables-addons-dkms Paket

Für Debian und Ubuntu steht das Paket xtables-addons-dkms in den Standard-repos bereit.

Dieses Paket bietet zusätzliche Erweiterungen für iptables, ip6tables, etc. an.

Anmerkung: DKMS steht für Dynamic Kernel Module Support.

Installation

Da sich das Paket, wie bereits erwähnt, in den Standard-Repos befindet kann man bequem per apt installieren:

apt install xtables-addons-dkms

Bereits bei der Installation werden die nötigen Kernel-Module gebaut:

$ apt install xtables-addons-dkms 
Paketlisten werden gelesen... Fertig                           
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
   dkms (2.3-3ubuntu9.2)
   unzip (6.0-21ubuntu1)                         
   xtables-addons-common (3.0-0.1ubuntu1)
...
Loading new xtables-addons-3.0 DKMS files...
Building for 4.15.0-46-generic
Building initial module for 4.15.0-46-generic
Done.
...
xt_TARPIT.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.15.0-46-generic/updates/dkms/
...
depmod...

DKMS: install completed.
Verwenden des TARPIT-Moduls

man Page des Paketes xtables-addons: manpages.ubuntu.com

Zu Testzwecken erstelle ich ein SSH-TARPIT um ungewollte Bots zu ärgern.

Der entsprechende Befehl lautet:
iptables -A INPUT -p tcp --dport 22 -j TARPIT

Überprüfen der Regel:

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
TARPIT     tcp  --  anywhere             anywhere             tcp dpt:22 -j TARPIT --tarpit 

HINWEIS: Man sollte hierbei dringend beachten, dass sich die Anzahl der Verbindungen schnell aufstauen kann!

endlessh

Eine weitere Implementierung eines TARPIT findet man bei endlessh.

Dieses Tool bietet folgende Features;
  • Ausgaben lassen in Logdateien umleiten
  • Optionen über config Datei einstellbar
  • Festlegen der maximalen Anzahl der Clients

endlessh nutzt ein Schlupfloch in der Spezifikation des SSH Protokols aus:

Endlessh exploits a little paragraph in RFC 4253, the SSH protocol specification. Immediately after the TCP connection is established, and before negotiating the cryptography, both ends send an identification string:

SSH-protoversion-softwareversion SP comments CR LF

The RFC also notes:

"The server MAY send other lines of data before sending the version string."

There is no limit on the number of lines, just that these lines must not begin with “SSH-“ since that would be ambiguous with the identification string, and lines must not be longer than 255 characters including CRLF. 
So Endlessh sends and endless stream of randomly-generated “other lines of data” without ever intending to send a version string. By default it waits 10 seconds between each line. 
This slows down the protocol, but prevents it from actually timing out.

This means Endlessh need not know anything about cryptography or the vast majority of the SSH protocol. It’s dead simple.

Quelle: nullprogram.com

Kompillieren

Zuerst sollte man sicherstellen, dass das Paket build-essential installiert ist:
apt install build-essential

Nun klont man sich das entsprechende git-Repo:
git clone https://github.com/skeeto/endlessh.git

..wechslet hinein:
cd endlessh/

und führt make aus:

$ make
cc -ggdb3 -std=c99 -Wall -Wextra -Wno-missing-field-initializers -Os -o endlessh endlessh.c 

Nun erstellt man sich noch eine config Datei, hierzu kann man direkt die Vorlage aus der README des github-Repos verwenden.

Beispiel:

$ cat config 
# The port on which to listen for new SSH connections.
Port 22

# The endless banner is sent one line at a time. This is the delay
# in milliseconds between individual lines.
Delay 10000

# The length of each line is randomized. This controls the maximum
# length of each line. Shorter lines may keep clients on for longer if
# they give up after a certain number of bytes.
MaxLineLength 32

# Maximum number of connections to accept at a time. Connections beyond
# this are not immediately rejected, but will wait in the queue.
MaxClients 4096

# Set the detail level for the log.
#   0 = Quiet
#   1 = Standard, useful log messages
#   2 = Very noisy debugging information
LogLevel 1
endlessh verwenden

Anschließend starten wir das Tool und lassen uns auch gleich entsprechende Logdateien erstellen:

./endlessh -v -f config >endlessh.log 2>endlessh.err

Nun sollte auf dem in der config angegebenen Port endlessh lauschen:

$ ss -lp | grep endless
tcp  LISTEN 0 128  *:222   *:*  users:(("endlessh",pid=12118,fd=3))

Wenn sich nun ein Client verbindet, kommt dieser noch bis zum Anzeigen des Local version string und dann wird die Verbindung gehalten.

Nun wird immer wieder, mit dem senden diverser Strings, dafür gesorgt, dass die Verbindung offen gehalten wird.

$ ssh -v -p222 192.168.2.28
OpenSSH_7.9p1, OpenSSL 1.1.1b FIPS  26 Feb 2019
debug1: Reading configuration data /home/rasputin/.ssh/config
debug1: /home/rasputin/.ssh/config line 1: Applying options for *
debug1: Connecting to 192.168.2.28 [192.168.2.28] port 222.
debug1: Connection established.
ebug1: Local version string SSH-2.0-OpenSSH_7.9
debug1: ssh_exchange_identification: 3s|rOZc{^|.bGd~/O4UT!8C

debug1: ssh_exchange_identification: iVe7Q^72h|C1m:?bS-L}&5

debug1: ssh_exchange_identification: K;I{~@C

debug1: ssh_exchange_identification: E+H*T((9HdSS=NW{=v{SHY|'x

debug1: ssh_exchange_identification: (.Q529
...

Ein Blick in die entsprechende Logdatei zeigt dann die bisher verbundenen Clients an:

$ cat endlessh.log
2019-03-24T14:21:22.553Z Port 222
2019-03-24T14:21:22.553Z Delay 10000
2019-03-24T14:21:22.553Z MaxLineLength 32
2019-03-24T14:21:22.553Z MaxClients 4096
2019-03-24T14:21:52.321Z ACCEPT host=::ffff:192.168.2.24 port=47588 fd=4 n=1/4096

Autor
Kategorien Linux, Server

PRTG Map