Como configurei meu honeypot SSH

Views: 440
0 0
Read Time:5 Minute, 44 Second

Algumas semanas atrás eu fiquei curioso sobre que tipos de credenciais estavam sendo tentadas na SSH. Eu tive a idéia de criar um pote de mel e capturar quais credenciais foram tentadas, quando foram tentadas e de onde as tentativas se originaram.

O que é um honeypot?

Alguns de vocês podem não estar cientes do que é um pote de mel. O seguinte é retirado da definição wikipedia:

Na terminologia do computador, um honeypot é um mecanismo de segurança de computador definido para detectar, desviar ou, de alguma forma, neutralizar tentativas de uso não autorizado de sistemas de informação. Geralmente, um honeypot consiste em dados (por exemplo, em um site de rede) que parecem ser uma parte legítima do site, mas na verdade é isolado e monitorado, e que parece conter informações ou um recurso de valor para os atacantes, que são então bloqueados. Isso é semelhante às operações policiais, coloquialmente conhecidas como “isca”, um suspeito.

Em suma, um honeypot é um sistema que parece fornecer um serviço para atrair a atenção para longe de um recurso real ou para capturar detalhes de tentativas nefastas feitas sobre ele.

Disclaimer

Uma palavra de cautela. Eu não teria tentado isso em uma máquina local se não fosse por um fato. Eu tinha uma conexão de banda larga que eu poderia dedicar ao projeto. Isso garantiu que se algo desse errado, nenhum outro dispositivo poderia ser comprometido. Se você seguir as etapas abaixo, você o faça por sua conta e risco.

Como eu configurei o Honeypot

Há uma série de pacotes populares que fornecem funcionalidade ssh honeypot (como Cowrie). Isso foi parcialmente concebido como uma experiência de aprendizagem, portanto, o uso desse pacote teria sido negado a partir desse objetivo. Então, sempre que possível eu fiz minhas próprias ferramentas para a tarefa.

Escolhendo um dispositivo

A primeira decisão que tive foi escolher o dispositivo que agiria como um pote de mel. Eu tenho vários PC antigos por aí, no entanto, teria sido um exagero dedicar um desses ao projeto. Outra escolha que tenho foi o Raspberry Pi, tenho uma quantidade e tanto dessas mentiras, elas tomam pouco espaço, exigem poucos recursos (como potência) e o fator forma é perfeito para que eu possa guardá-lo facilmente.

Eu não precisava de nenhum específico de uma distribuição que seria instalada no Raspberry Pi, portanto, eu fiquei com Raspbian. Não sou um grande fã de Noobs, portanto, instalei uma cópia sem cabeça Raspbian diretamente (se você não tem certeza de como fazer isso tenho um artigo explicando aqui).

Não há nenhuma razão pela qual isso não funcionaria em um PC padrão com um sistema operacional como Cent O/S ou Ubuntu, você pode precisar ajustar algumas coisas.

Módulo Pam

Eu sabia que queria capturar os detalhes de qualquer pedido e decidi que usar um módulo Pam seria a minha melhor escolha. Eu não tinha certeza se tal módulo existia, mas (conforme acima) este é um exercício de aprendizagem, por isso decidi construir um módulo básico eu mesmo. O módulo foi escrito em c e armazena os detalhes em um banco de dados SQLite.

Este módulo propositalmente não permite nenhum login (nem mesmo de mim, se eu precisasse de acesso eu ligaria um monitor e um teclado). Como eu não estava procurando permitir que as tentativas de login para ir além de verificar as credenciais, eu só implementei o método ‘ pam_sm_authenticate’ para o módulo Pam. O código fonte pode ser encontrado no Github.

Os adereços vão para um artigo intitulado “Writing a Linux PAM module” do Fedetask Useless Blog. Achei este artigo, bem como os outros artigos associados muito úteis na compreensão de como o PAM funcionava.

Servidor OpenSSH

Depois de configurar meu servidor SSH para usar o módulo pam recém-criado encontrei um problema. Algumas solicitações estavam armazenando credenciais vazias ou pior povoadas com “Incorreto” (ou uma substring combinando com o comprimento da senha). Isso, é claro, foi um show stopper.

Após a investigação, descobri que o código fonte do OpenSSH continha uma função chamada “fake_password”. Isso foi responsável por ajudar a proteger contra ataques de tempo e ofuscou a senha. Para resolver meu problema tive que remover esse código, compilar minha própria versão e instalar no Raspberry Pi(código fonte).

Armazenamento externo

Por fim, eu queria armazenar as credenciais de login fora do site. Isto foi no caso de algo acontecer com o Pi que tornou impossível para mim recuperar a data. Portanto, criei um script python para carregar as solicitações para um ponto final da AWS API. Isso foi como um plano bélico.

AWS

Para que as tentativas de login pudessem ser armazenadas no AWS havia uma configuração de 3 estágios.

  1. Banco de dados DynamoDB configurado para armazenar os dados
  2. Uma função Lambda criada para agir qualquer solicitação de put
  3. Gateway API para permitir conexões de saída de forma fácil para a função Lambda.

Para ajudar na segurança, assegurei que o Gateway API exigia uma chave para quaisquer solicitações. Isso ajudaria a impedir que pedidos aleatórios fossem feitos.

No momento, não vou entrar em detalhes sobre como a AWS foi configurada, pois isso exigiria um artigo em si.

Instalando o Honeypot

Cada uma das tecnologias acima está atualmente hospedada no Github e cada uma tem seus próprios métodos de instalação e scripts, porém eu coloquei um instalador muito bruto no Github.

Faltam alguns passos de acordo com o arquivo README. Como configurar ssh para usar o módulo PAM e adicionar a execução do script python em cron.

Uma vez instalado você pode deixá-lo em seu ser, desde que as solicitações não sobrecarreguem o madeireiro.

O que eu aprendi

Ao criar o honeypot eu decidi cedo que eu ia registrar os pedidos e passá-los para a AWS Em retrospectiva isso provavelmente não era necessário e realmente causou sobrecarga. Por exemplo, o honeypot recebeu vários ataques prolongados. Durante cada um desses ataques, o script que estava sendo enviado para a AWS não conseguiu acompanhar (eu intencionalmente estrangulei).” Tive que aumentar o número de pedidos que faria a qualquer momento para acompanhar várias vezes. Se eu fosse fazer isso de novo (quem estou enganando, quando eu fizer de novo) eu vou largar o passo de registro para a AWS, se alguma coisa eu vou fazer backup de todo o arquivo de banco de dados, potencialmente ainda no AWS.

Aprender como pam funcionava foi bastante interessante. O mesmo módulo que criei deve funcionar bem com outros serviços como o MySQL, que é potencialmente meu projeto líquido. Seria uma tarefa trivial portar isso para algo como MySQL desde que não haja gotchas semelhantes à função fake_password no SSH.

Se você está interessado nas minhas descobertas de executar o honeypot você pode ler sobre ele no meu artigo intitulado “I Opened My Connection To SSH Attacks, And These Were The Requests I Saw“.

FONTE: MEDIUM

POSTS RELACIONADOS