Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
SSHintel — Self-contained SSH honeypot for capturing attacker interactions and turning them into structured security intelligence. | Kitploit
Tools/GitHubGitHub/sonitbahl/sshintel
Network SecurityThreat IntelligenceIntrusion DetectionIncident ResponseLog Analysis
GitHubsonitbahl/sshintel

SSHintel

Self-contained SSH honeypot for capturing attacker interactions and turning them into structured security intelligence.

View Repository
3782 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

SSHintel — Lightweight SSH Honeypot

License: MIT Python Last Commit Repo Size

SSHintel is a lightweight SSH honeypot built using Python and Paramiko. It simulates a fake Linux shell to log unauthorized access attempts, capture credentials, and analyze attacker behavior in a controlled environment.


🔧 Features

  • Logs SSH login attempts with IP, username, and password
  • Provides a simulated Linux shell (a fake, in-memory environment)
  • Supports a broad set of reconnaissance and navigation commands (ls, cd, pwd, cat, echo, grep, find, tree, head, tail, wc, stat, ps, df, free, env, id, whoami, etc.)
  • Optional --tarpit mode to slow down attackers with delayed output
  • Per-session isolated fake filesystem with file creation and reading support
  • Local web dashboard for visualizing captured security telemetry (sessions, commands, auth attempts, top attackers)
  • Session investigation view — select any session and reconstruct the complete attack timeline chronologically, including source IP, authentication outcome, every command executed with its working directory, and session duration
  • Everything is simulated — commands never execute on the host, never access the real filesystem, and make no network requests.

SSHintel is not a full Bash/Linux shell. It simulates a believable subset of common commands to gather attacker telemetry. Commands are dispatched by a lightweight registry; adding a command means adding a small handler function.


🛠️ Setup

1. 📦 Install Dependencies

pip install -r requirements.txt

Note: The SSH host key is automatically generated on first run. No manual key generation needed.


🚀 Running the Honeypot

Run the honeypot with a specific port, username, and password:

python3 run.py serve --port 2222 --username user1 --password pass123

Default port is 2222 and host is 0.0.0.0.

The honeypot automatically generates an SSH host key at static/server.key on first run if one doesn't exist. No manual key generation is needed.

To enable tarpit mode:

python3 run.py serve --port 2222 --username user1 --password pass123 --tarpit

To disable SQLite telemetry (JSONL only):

python3 run.py serve --port 2222 --username user1 --password pass123 --no-db

Configuration files and environment variables

Sensor settings use CLI > environment > configuration file > defaults. Only explicitly supplied CLI flags override other sources. This applies to serve; dashboard/query commands retain their own CLI settings.

On Python 3.11+:

cp sshintel.toml.example sshintel.toml
chmod 600 sshintel.toml
python3 run.py serve

On Python 3.8/3.10, use the dependency-free JSON equivalent:

cp sshintel.json.example sshintel.json
chmod 600 sshintel.json
python3 run.py serve

Edit the copied file before deployment. TOML requires Python 3.11+; older versions fail with a clear instruction to use JSON. With no explicit file, SSHintel looks for sshintel.toml, then sshintel.json in the current directory. Use serve --config /path/to/settings.json or HONEYPOT_CONFIG to select another file (--config wins). Explicit missing files, malformed files, unknown keys, and invalid values fail before the server or database starts. File paths inside configuration are relative to the process working directory, not the config file.

File keyEnvironment variableDefault
hostHONEYPOT_HOST0.0.0.0
portHONEYPOT_PORT (legacy alias: PORT)2222
usernameHONEYPOT_USERNAMEuser1
passwordHONEYPOT_PASSWORDpass123
tarpitHONEYPOT_TARPITfalse
tarpit_max_secondsHONEYPOT_TARPIT_MAX_SECONDS120
max_connectionsHONEYPOT_MAX_CONNECTIONS50
auth_timeoutHONEYPOT_AUTH_TIMEOUT60
session_idle_timeoutHONEYPOT_SESSION_IDLE_TIMEOUT300
sensor_idHONEYPOT_SENSOR_IDunset
db_pathHONEYPOT_DB_PATHdata/sshintel.db
no_dbHONEYPOT_NO_DBfalse
fetch_payloadsHONEYPOT_FETCH_PAYLOADSfalse (reserved)

Environment booleans accept true/false, 1/0, yes/no, and on/off. HONEYPOT_PORT takes precedence over PORT. Ports must be 1–65535 and limits and timeouts must be positive integers. Use --no-tarpit, --db-enabled, or --no-fetch-payloads to override a lower-priority true setting. Database paths use the existing --db CLI flag. Payload fetching is not implemented: enabling fetch_payloads is rejected rather than silently ignored.

Local sshintel.toml/sshintel.json files are Git-ignored and excluded from Docker builds because they can contain credentials. Mount a configuration file read-only into a container instead. Docker consumes environment variables directly (without shell-interpolating credentials); its existing ENV defaults take precedence over a mounted file. Override those variables as needed or use explicit CLI flags.

🛡️ Connection limits & timeouts

SSHintel guards against resource exhaustion from many concurrent connections or connections kept alive indefinitely. These are configurable via the CLI:

FlagDefaultPurpose
--max-connections50Maximum simultaneous active connections; extra connections are rejected and logged as a connection_rejected event
--auth-timeout60 (s)Time allowed to complete the SSH handshake/authentication; stalled clients are disconnected
--session-idle-timeout300 (s)Inactivity timeout for an authenticated shell; an idle session is ended, but an actively-typing attacker is never killed

Example:

python3 run.py serve --port 2222 --username user1 --password pass123 \
  --max-connections 25 --auth-timeout 30 --session-idle-timeout 300

When too many connections are open, the extra connection is closed immediately and a connection_rejected security event (with reason: connection_limit) is written to the JSONL log. A stalled authentication is recorded as a disconnect with reason: auth_timeout; an idle shell ends with reason: idle_timeout.

Tarpit mode intentionally sends output slowly to keep an attacker engaged, so the tarpit banner loop is not subject to the inactivity timeout — but tarpit sessions do count against the connection limit.


📊 Dashboard

SSHintel includes a local web dashboard that visualizes the security telemetry stored in SQLite.

Start the dashboard

python3 run.py dashboard

Then open http://localhost:5000 in your browser.

The dashboard reads from the SQLite database at data/sshintel.db by default. Start the honeypot first so telemetry is being captured, then launch the dashboard to watch it populate.

What it displays

  • KPI cards — total sessions, unique source IPs, authentication attempts, successful/failed authentications, and commands executed
  • Activity chart — connections over time, grouped by hour
  • Top commands — the most frequently run attacker commands
  • Targeted usernames — which usernames attackers are trying
  • Recent sessions — click any session ID to investigate it
  • Recent activity — the latest telemetry events in a searchable table

Session investigation

Click a session ID (or navigate to /session/<session_id>) to open the session investigation view, which reconstructs a single attack chronologically:

Download Tool