
Honeypot SSH autossuficiente para capturar interações de atacantes e transformá-las em inteligência de segurança estruturada.
SSHintel é um honeypot SSH leve construído com Python e Paramiko. Ele simula um shell Linux falso para registrar tentativas de acesso não autorizado, capturar credenciais e analisar o comportamento de atacantes em um ambiente controlado.
ls, cd, pwd, cat, echo, grep, find, tree, head, tail, wc, stat, ps, df, free, env, id, whoami, etc.)--tarpit para atrasar atacantes com saída retardadaO SSHintel não é um shell Bash/Linux completo. Ele simula um subconjunto verossímil de comandos comuns para coletar telemetria de atacantes. Os comandos são despachados por um registro leve; adicionar um comando significa adicionar uma pequena função de manipulador.
pip install -r requirements.txt
Nota: A chave de host SSH é gerada automaticamente na primeira execução. Não é necessária a geração manual de chaves.
Execute o honeypot com uma porta, nome de usuário e senha específicos:
python3 run.py serve --port 2222 --username user1 --password pass123
A porta padrão é
2222e o host é0.0.0.0.
O honeypot gera automaticamente uma chave de host SSH em static/server.key na primeira execução, caso ela não exista. Não é necessária a geração manual da chave.
Para habilitar o modo tarpit:
python3 run.py serve --port 2222 --username user1 --password pass123 --tarpit
Para desativar a telemetria do SQLite (apenas JSONL):
python3 run.py serve --port 2222 --username user1 --password pass123 --no-db
As configurações do sensor seguem CLI > ambiente > arquivo de configuração > padrões.
Apenas flags de CLI fornecidas explicitamente substituem outras fontes. Isso se aplica a
serve; os comandos de dashboard/consulta mantêm suas próprias configurações de CLI.
No Python 3.11+:
cp sshintel.toml.example sshintel.toml
chmod 600 sshintel.toml
python3 run.py serve
No Python 3.8/3.10, use o equivalente JSON sem dependências:
cp sshintel.json.example sshintel.json
chmod 600 sshintel.json
python3 run.py serve
Edite o arquivo copiado antes da implantação. O TOML requer Python 3.11+; versões
mais antigas falham com uma instrução clara para usar JSON. Sem um arquivo explícito,
o SSHintel procura por sshintel.toml, depois sshintel.json no diretório atual.
Use serve --config /path/to/settings.json ou HONEYPOT_CONFIG para selecionar outro
arquivo (--config tem precedência). Arquivos explícitos ausentes, arquivos malformados, chaves desconhecidas
e valores inválidos falham antes de o servidor ou o banco de dados iniciar. Os caminhos de arquivo dentro
da configuração são relativos ao diretório de trabalho do processo, não ao arquivo de configuração.
| Chave do arquivo | Variável de ambiente | Padrão |
|---|---|---|
host | HONEYPOT_HOST | 0.0.0.0 |
port | HONEYPOT_PORT (alias legado: PORT) | 2222 |
username | HONEYPOT_USERNAME | user1 |
password | HONEYPOT_PASSWORD | pass123 |
tarpit | HONEYPOT_TARPIT | false |
tarpit_max_seconds | HONEYPOT_TARPIT_MAX_SECONDS | 120 |
max_connections | HONEYPOT_MAX_CONNECTIONS | 50 |
auth_timeout | HONEYPOT_AUTH_TIMEOUT | 60 |
session_idle_timeout | HONEYPOT_SESSION_IDLE_TIMEOUT | 300 |
sensor_id | HONEYPOT_SENSOR_ID | não definido |
db_path | HONEYPOT_DB_PATH | data/sshintel.db |
no_db | HONEYPOT_NO_DB | false |
fetch_payloads | HONEYPOT_FETCH_PAYLOADS | false (reservado) |
Booleanos de ambiente aceitam true/false, 1/0, yes/no e on/off.
HONEYPOT_PORT tem precedência sobre PORT. As portas devem estar entre 1–65535 e os limites
e timeouts devem ser inteiros positivos. Use --no-tarpit, --db-enabled ou
--no-fetch-payloads para substituir uma configuração verdadeira de menor prioridade. Os caminhos do banco de dados
usam a flag de CLI --db existente. A busca de payloads não está implementada: habilitar
fetch_payloads é rejeitado em vez de silenciosamente ignorado.
Arquivos locais sshintel.toml/sshintel.json são ignorados pelo Git e excluídos dos builds
Docker porque podem conter credenciais. Monte um arquivo de configuração como somente leitura
em um contêiner. O Docker consome variáveis de ambiente diretamente (sem
interpolação de shell nas credenciais); seus padrões ENV existentes têm precedência sobre
um arquivo montado. Substitua essas variáveis conforme necessário ou use flags de CLI explícitas.
O SSHintel protege contra esgotamento de recursos causado por muitas conexões simultâneas ou conexões mantidas ativas indefinidamente. Estes são configuráveis via CLI:
| Flag | Padrão | Propósito |
|---|---|---|
--max-connections | 50 | Número máximo de conexões ativas simultâneas; conexões extras são rejeitadas e registradas como um evento connection_rejected |
--auth-timeout | 60 (s) | Tempo permitido para concluir o handshake/autenticação SSH; clientes travados são desconectados |
--session-idle-timeout | 300 (s) | Timeout de inatividade para um shell autenticado; uma sessão ociosa é encerrada, mas um atacante digitando ativamente nunca é encerrado |
Exemplo:
python3 run.py serve --port 2222 --username user1 --password pass123 \
--max-connections 25 --auth-timeout 30 --session-idle-timeout 300
Quando muitas conexões estão abertas, a conexão extra é fechada imediatamente e um evento de segurança connection_rejected (com reason: connection_limit) é gravado no log JSONL. Uma autenticação travada é registrada como uma desconexão com reason: auth_timeout; um shell ocioso termina com reason: idle_timeout.
O modo tarpit envia saída intencionalmente de forma lenta para manter o atacante envolvido, portanto o loop do banner do tarpit não está sujeito ao timeout de inatividade — mas as sessões de tarpit contam para o limite de conexões.
O SSHIntel inclui um dashboard web local que visualiza a telemetria de segurança armazenada no SQLite.
python3 run.py dashboard
Em seguida, abra http://localhost:5000 no seu navegador.
O dashboard lê do banco de dados SQLite em
data/sshintel.dbpor padrão. Inicie o honeypot primeiro para que a telemetria seja capturada, depois inicie o dashboard para acompanhá-la sendo preenchida.