2019-02-03 04:38:59 +01:00
|
|
|
# Endlessh: an SSH tarpit
|
|
|
|
|
2019-03-25 14:37:34 +01:00
|
|
|
Endlessh is an SSH tarpit [that *very* slowly sends an endless, random
|
|
|
|
SSH banner][np]. It keeps SSH clients locked up for hours or even days
|
|
|
|
at a time. The purpose is to put your real SSH server on another port
|
|
|
|
and then let the script kiddies get stuck in this tarpit instead of
|
2019-02-03 18:04:23 +01:00
|
|
|
bothering a real server.
|
2019-02-03 04:38:59 +01:00
|
|
|
|
2019-02-03 18:04:23 +01:00
|
|
|
Since the tarpit is in the banner before any cryptographic exchange
|
2019-02-03 04:38:59 +01:00
|
|
|
occurs, this program doesn't depend on any cryptographic libraries. It's
|
|
|
|
a simple, single-threaded, standalone C program. It uses `poll()` to
|
|
|
|
trap multiple clients at a time.
|
|
|
|
|
2019-03-25 14:37:34 +01:00
|
|
|
|
|
|
|
|
2019-02-03 17:59:11 +01:00
|
|
|
## Usage
|
2019-02-03 04:38:59 +01:00
|
|
|
|
|
|
|
Usage information is printed with `-h`.
|
|
|
|
|
|
|
|
```
|
2019-02-03 17:47:20 +01:00
|
|
|
Usage: endlessh [-vh] [-d MS] [-f CONFIG] [-l LEN] [-m LIMIT] [-p PORT]
|
2019-04-03 17:11:04 +02:00
|
|
|
-4 Bind to IPv4 only
|
|
|
|
-6 Bind to IPv6 only
|
2019-02-03 04:38:59 +01:00
|
|
|
-d INT Message millisecond delay [10000]
|
2019-02-03 18:00:35 +01:00
|
|
|
-f Set and load config file [/etc/endlessh/config]
|
2019-02-03 04:38:59 +01:00
|
|
|
-h Print this help message and exit
|
2019-02-03 15:34:41 +01:00
|
|
|
-l INT Maximum banner line length (3-255) [32]
|
2019-02-03 04:38:59 +01:00
|
|
|
-m INT Maximum number of clients [4096]
|
|
|
|
-p INT Listening port [2222]
|
|
|
|
-v Print diagnostics to standard output (repeatable)
|
|
|
|
```
|
|
|
|
|
2019-02-03 18:04:23 +01:00
|
|
|
Argument order matters. The configuration file is loaded when the `-f`
|
|
|
|
argument is processed, so only the options that follow will override the
|
|
|
|
configuration file.
|
|
|
|
|
2019-02-03 14:09:21 +01:00
|
|
|
By default no log messages are produced. The first `-v` enables basic
|
2019-02-03 18:04:23 +01:00
|
|
|
logging and a second `-v` enables debugging logging (noisy). All log
|
2019-02-03 14:09:21 +01:00
|
|
|
messages are sent to standard output.
|
|
|
|
|
|
|
|
endlessh -v >endlessh.log 2>endlessh.err
|
|
|
|
|
2019-02-03 15:18:28 +01:00
|
|
|
A SIGTERM signal will gracefully shut down the daemon, allowing it to
|
|
|
|
write a complete, consistent log.
|
2019-02-03 17:47:20 +01:00
|
|
|
|
|
|
|
A SIGHUP signal requests a reload of the configuration file (`-f`).
|
2019-02-03 17:59:11 +01:00
|
|
|
|
|
|
|
## Sample Configuration File
|
|
|
|
|
|
|
|
The configuration file has similar syntax to OpenSSH.
|
|
|
|
|
|
|
|
```
|
2019-02-04 00:51:37 +01:00
|
|
|
# The port on which to listen for new SSH connections.
|
|
|
|
Port 2222
|
|
|
|
|
|
|
|
# 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 0
|
2019-04-03 17:11:04 +02:00
|
|
|
|
|
|
|
# Set the family of the listening socket
|
|
|
|
# 0 = Use IPv4 Mapped IPv6 (Both v4 and v6, default)
|
|
|
|
# 4 = Use IPv4 only
|
|
|
|
# 6 = Use IPv6 only
|
|
|
|
BindFamily 0
|
2019-02-03 17:59:11 +01:00
|
|
|
```
|
2019-03-25 14:17:48 +01:00
|
|
|
|
|
|
|
## Build issues
|
|
|
|
|
2019-03-27 04:09:44 +01:00
|
|
|
Some more esoteric systems require extra configuration when building.
|
|
|
|
|
|
|
|
### RHEL 6 / CentOS 6
|
|
|
|
|
|
|
|
This system uses a version of glibc older than 2.17 (December 2012), and
|
|
|
|
`clock_gettime(2)` is still in librt. For these systems you will need to
|
|
|
|
link against librt:
|
2019-03-25 14:17:48 +01:00
|
|
|
|
|
|
|
make LDLIBS=-lrt
|
2019-03-25 14:37:34 +01:00
|
|
|
|
2019-03-27 04:09:44 +01:00
|
|
|
### Solaris / illumos
|
|
|
|
|
|
|
|
These systems don't include all the necessary functionality in libc and
|
|
|
|
the linker requires some extra libraries:
|
|
|
|
|
|
|
|
make CC=gcc LDLIBS='-lnsl -lrt -lsocket'
|
|
|
|
|
|
|
|
If you're not using GCC or Clang, also override `CFLAGS` and `LDFLAGS`
|
|
|
|
to remove GCC-specific options. For example, on Solaris:
|
|
|
|
|
|
|
|
make CFLAGS=-fast LDFLAGS= LDLIBS='-lnsl -lrt -lsocket'
|
|
|
|
|
2019-04-05 03:44:44 +02:00
|
|
|
The feature test macros on these systems isn't reliable, so you may also
|
|
|
|
need to use `-D__EXTENSIONS__` in `CFLAGS`.
|
|
|
|
|
2019-03-25 14:37:34 +01:00
|
|
|
|
|
|
|
[np]: https://nullprogram.com/blog/2019/03/22/
|