Trap (tarp) para conexões SSH de entrada

Não é segredo que a Internet é um ambiente muito hostil. Assim que você levanta o servidor, ele instantaneamente sofre ataques maciços e várias verificações. No exemplo de um hanipot do guarda de segurança, pode-se estimar a escala desse tráfego não solicitado . De fato, em um servidor médio, 99% do tráfego pode ser malicioso.

Tarpit é uma porta de interceptação usada para diminuir as conexões de entrada. Se um sistema de terceiros se conectar a essa porta, não funcionará para fechar a conexão rapidamente. Ela precisará gastar os recursos do sistema e aguardar até que a conexão seja interrompida por um tempo limite, ou quebre manualmente.

Na maioria das vezes, tarpits são usados ​​para proteção. A técnica foi desenvolvida para proteger contra worms de computador. E agora ele pode ser usado para estragar a vida de spammers e pesquisadores envolvidos em uma ampla verificação de todos os endereços IP seguidos (exemplos em Habré: Áustria , Ucrânia ).

Um dos administradores de sistemas chamado Chris Wellons, aparentemente cansado de assistir a essa desgraça - e ele escreveu um pequeno programa Endlessh , tarpit para SSH, diminuindo a velocidade das conexões de entrada. O programa abre a porta (por padrão, a porta 2222 é especificada para teste) e finge ser um servidor SSH, mas na verdade estabelece uma conexão sem fim com o cliente recebido até que ele se renda. Isso pode durar vários dias ou mais até o cliente cair.

Instalação do utilitário:

$ make $ ./endlessh & $ ssh -p2222 localhost 

Um tarpit corretamente implementado retira mais recursos do invasor do que você. Mas o assunto não está nos recursos. O autor escreve que o programa é viciante. Existem 27 clientes presos no momento, alguns deles conectados por semanas. No pico da atividade, 1378 clientes ficaram na armadilha por 20 horas!

No modo operacional, o servidor Endlessh precisa ser instalado na porta 22 regular, onde os hooligans estão batendo maciçamente. As recomendações de segurança padrão sempre aconselham a mudança do SSH para uma porta diferente, o que reduz imediatamente o tamanho do log em uma ordem de magnitude.

Chris Wellons diz que seu programa explora um parágrafo da especificação RFC 4253 para o protocolo SSH. Imediatamente após o estabelecimento de uma conexão TCP, mas antes de aplicar a criptografia, ambas as partes devem enviar uma sequência de identificação. E há uma nota: "O servidor PODE enviar outras linhas de dados antes de enviar a linha com a versão" . E não há limite para a quantidade desses dados, apenas todas as linhas não devem começar com SSH- .

É exatamente isso que o Endlessh faz: envia um fluxo interminável de dados gerados aleatoriamente, em conformidade com a RFC 4253, ou seja, enviando antes da identificação, e cada linha não inicia com SSH- e não excede 255 caracteres, incluindo o caractere de finalização da linha. Em geral, tudo é padrão.

Por padrão, o programa espera 10 segundos entre o envio de pacotes. Isso impede uma viagem de tempo limite para que o cliente fique preso para sempre.

Como os dados são enviados antes da aplicação da criptografia, o programa é excepcionalmente simples. Não é necessário implementar nenhuma cifra e suporte para vários protocolos.

O autor tentou fazer com que o utilitário consumisse um mínimo de recursos e trabalhasse perfeitamente na máquina. Ao contrário dos antivírus modernos e outros "sistemas de segurança", ele não deve desacelerar o computador. Ele conseguiu minimizar o tráfego e o consumo de memória devido a uma implementação de software um pouco mais esperta. Se ele apenas iniciar um processo separado em uma nova conexão, os possíveis invasores poderão realizar um ataque DDoS, abrindo muitas conexões para esgotar os recursos da máquina. Um thread por conexão também não é a melhor opção, porque o kernel gastará recursos no gerenciamento de threads.

Portanto, Chris Wellons escolheu a opção mais leve para o Endlessh: um servidor de poll(2) única poll(2) , em que os clientes na armadilha praticamente não consomem recursos desnecessários, sem contar o objeto de soquete no kernel e outros 78 bytes para rastreamento no Endlessh. Para não alocar buffers de recebimento e envio para cada cliente, o Endlessh abre um soquete de acesso direto e converte diretamente pacotes TCP, ignorando quase toda a pilha TCP / IP do sistema operacional. O buffer de entrada não é necessário, porque os dados de entrada não nos interessam.

O autor diz que, no momento de seu programa, ele não sabia da existência do Python Asycio e de outros tarpits. Se ele soubesse de asycio, poderia implementar seu utilitário em apenas 18 linhas no Python:

 import asyncio import random async def handler(_reader, writer): try: while True: await asyncio.sleep(10) writer.write(b'%x\r\n' % random.randint(0, 2**32)) await writer.drain() except ConnectionResetError: pass async def main(): server = await asyncio.start_server(handler, '0.0.0.0', 2222) async with server: await server.serve_forever() asyncio.run(main()) 


Asyncio é perfeito para escrever tarpit. Por exemplo, essa armadilha trava o Firefox, Chrome ou outro cliente que está tentando se conectar ao seu servidor HTTP por muitas horas:

 import asyncio import random async def handler(_reader, writer): writer.write(b'HTTP/1.1 200 OK\r\n') try: while True: await asyncio.sleep(5) header = random.randint(0, 2**32) value = random.randint(0, 2**32) writer.write(b'X-%x: %x\r\n' % (header, value)) await writer.drain() except ConnectionResetError: pass async def main(): server = await asyncio.start_server(handler, '0.0.0.0', 8080) async with server: await server.serve_forever() asyncio.run(main()) 


Tarpit é uma ótima ferramenta para punir os agressores online. É verdade que há algum risco, pelo contrário, chamar a atenção para o comportamento incomum de um servidor específico. Alguém pode pensar em vingança e um ataque DDoS direcionado ao seu IP. No entanto, até agora não houve tais casos, e o tarpit funciona bem.





Source: https://habr.com/ru/post/pt445318/


All Articles