Trap (tarpit) para conexões SSH de entrada

Não é nenhum segredo que a Internet é um ambiente muito hostil. Assim que você ativa um servidor, ele é instantaneamente sujeito a ataques massivos e múltiplas varreduras. Por exemplo honeypot dos seguranças você pode estimar a escala desse tráfego de lixo. Na verdade, num servidor médio, 99% do tráfego pode ser malicioso.

Tarpit é uma porta trap usada para desacelerar as conexões de entrada. Se um sistema de terceiros se conectar a esta porta, você não conseguirá encerrar a conexão rapidamente. Ela terá que desperdiçar os recursos do sistema e esperar até que a conexão expire ou encerrá-la manualmente.

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

Um dos administradores de sistema chamado Chris Wellons aparentemente se cansou de assistir a essa desgraça - e escreveu um pequeno programa Sem fim, um tarpit para SSH que retarda as conexões de entrada. O programa abre uma porta (a porta padrão para teste é 2222) e finge ser um servidor SSH, mas na realidade estabelece uma conexão infinita com o cliente que chega até desistir. Isto pode continuar por vários dias ou mais até que o cliente caia.

Instalação do utilitário:

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

Um tarpit implementado corretamente consumirá mais recursos do invasor do que de você. Mas nem é uma questão de recursos. Autor escreveque o programa é viciante. Neste momento tem 27 clientes presos, alguns deles ligados há semanas. No pico da atividade, 1378 clientes ficaram presos durante 20 horas!

No modo operacional, o servidor Endlessh precisa ser instalado na porta 22 normal, onde os hooligans batem em massa. As recomendações de segurança padrão sempre aconselham mover o SSH para uma porta diferente, o que reduz imediatamente o tamanho dos logs em uma ordem de grandeza.

Chris Wellons diz que seu programa explora um parágrafo da especificação RFC 4253 ao protocolo SSH. Imediatamente após o estabelecimento de uma conexão TCP, mas antes da aplicação da criptografia, ambas as partes devem enviar uma sequência de identificação. E há também uma nota: "O servidor PODE enviar outras linhas de dados antes de enviar a linha da versão". E sem limite no volume desses dados, você só precisa iniciar cada linha com SSH-.

Isto é exatamente o que o programa Endlessh faz: envia sem fim fluxo de dados gerados aleatoriamente, que atendem à RFC 4253, ou seja, enviam antes da autenticação, e cada linha começa com SSH- e não exceda 255 caracteres, incluindo o caractere de final de linha. Em geral, tudo está de acordo com o padrão.

Por padrão, o programa espera 10 segundos entre o envio de pacotes. Isso evita que o tempo limite do cliente seja excedido, portanto, o cliente ficará preso para sempre.

Como os dados são enviados antes da aplicação da criptografia, o programa é extremamente simples. Não precisa implementar nenhuma cifra e oferece suporte a vários protocolos.

O autor procurou garantir que o utilitário consumisse o mínimo de recursos e funcionasse de forma totalmente despercebida na máquina. Ao contrário dos antivírus modernos e de outros “sistemas de segurança”, ele não deve deixar o seu computador lento. Ele conseguiu minimizar o tráfego e o consumo de memória devido a uma implementação de software um pouco mais astuta. Se ele simplesmente lançasse um processo separado em uma nova conexão, os invasores em potencial poderiam lançar um ataque DDoS abrindo múltiplas conexões para esgotar os recursos da máquina. Um thread por conexão também não é a melhor opção, pois o kernel desperdiçará recursos gerenciando threads.

É por isso que Chris Wellons escolheu a opção mais leve para o Endlessh: um servidor single-threaded poll(2), onde os clientes na armadilha praticamente não consomem recursos extras, sem contar o objeto soquete no kernel e outros 78 bytes para rastreamento no Endlessh. Para evitar a alocação de buffers de recebimento e envio para cada cliente, o Endlessh abre um soquete de acesso direto e traduz os pacotes TCP diretamente, ignorando quase toda a pilha TCP/IP do sistema operacional. O buffer de entrada não é necessário porque não estamos interessados ​​nos dados recebidos.

O autor diz que na época de seu programa não sabia sobre a existência do asycio do Python e de outros tarpits. Se ele conhecesse o asycio, poderia implementar seu utilitário em apenas 18 linhas em Python:

import asyncio
import random

async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % 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 é ideal para escrever tarpits. Por exemplo, este gancho irá congelar o Firefox, Chrome ou qualquer outro cliente que esteja 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 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (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 agressores online. É verdade que existe o risco, pelo contrário, de chamar a atenção para o comportamento incomum de um determinado servidor. 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 os tarpits funcionam muito bem.

Centrais:
Python, Segurança da informação, Software, Administração de sistemas

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) para conexões SSH de entrada

Não é nenhum segredo que a Internet é um ambiente muito hostil. Assim que você ativa um servidor, ele é instantaneamente sujeito a ataques massivos e múltiplas varreduras. Por exemplo honeypot dos seguranças você pode estimar a escala desse tráfego de lixo. Na verdade, num servidor médio, 99% do tráfego pode ser malicioso.

Tarpit é uma porta trap usada para desacelerar as conexões de entrada. Se um sistema de terceiros se conectar a esta porta, você não conseguirá encerrar a conexão rapidamente. Ela terá que desperdiçar os recursos do sistema e esperar até que a conexão expire ou encerrá-la manualmente.

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

Um dos administradores de sistema chamado Chris Wellons aparentemente se cansou de assistir a essa desgraça - e escreveu um pequeno programa Sem fim, um tarpit para SSH que retarda as conexões de entrada. O programa abre uma porta (a porta padrão para teste é 2222) e finge ser um servidor SSH, mas na realidade estabelece uma conexão infinita com o cliente que chega até desistir. Isto pode continuar por vários dias ou mais até que o cliente caia.

Instalação do utilitário:

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

Um tarpit implementado corretamente consumirá mais recursos do invasor do que de você. Mas nem é uma questão de recursos. Autor escreveque o programa é viciante. Neste momento tem 27 clientes presos, alguns deles ligados há semanas. No pico da atividade, 1378 clientes ficaram presos durante 20 horas!

No modo operacional, o servidor Endlessh precisa ser instalado na porta 22 normal, onde os hooligans batem em massa. As recomendações de segurança padrão sempre aconselham mover o SSH para uma porta diferente, o que reduz imediatamente o tamanho dos logs em uma ordem de grandeza.

Chris Wellons diz que seu programa explora um parágrafo da especificação RFC 4253 ao protocolo SSH. Imediatamente após o estabelecimento de uma conexão TCP, mas antes da aplicação da criptografia, ambas as partes devem enviar uma sequência de identificação. E há também uma nota: "O servidor PODE enviar outras linhas de dados antes de enviar a linha da versão". E sem limite no volume desses dados, você só precisa iniciar cada linha com SSH-.

Isto é exatamente o que o programa Endlessh faz: envia sem fim fluxo de dados gerados aleatoriamente, que atendem à RFC 4253, ou seja, enviam antes da autenticação, e cada linha começa com SSH- e não exceda 255 caracteres, incluindo o caractere de final de linha. Em geral, tudo está de acordo com o padrão.

Por padrão, o programa espera 10 segundos entre o envio de pacotes. Isso evita que o tempo limite do cliente seja excedido, portanto, o cliente ficará preso para sempre.

Como os dados são enviados antes da aplicação da criptografia, o programa é extremamente simples. Não precisa implementar nenhuma cifra e oferece suporte a vários protocolos.

O autor procurou garantir que o utilitário consumisse o mínimo de recursos e funcionasse de forma totalmente despercebida na máquina. Ao contrário dos antivírus modernos e de outros “sistemas de segurança”, ele não deve deixar o seu computador lento. Ele conseguiu minimizar o tráfego e o consumo de memória devido a uma implementação de software um pouco mais astuta. Se ele simplesmente lançasse um processo separado em uma nova conexão, os invasores em potencial poderiam lançar um ataque DDoS abrindo múltiplas conexões para esgotar os recursos da máquina. Um thread por conexão também não é a melhor opção, pois o kernel desperdiçará recursos gerenciando threads.

É por isso que Chris Wellons escolheu a opção mais leve para o Endlessh: um servidor single-threaded poll(2), onde os clientes na armadilha praticamente não consomem recursos extras, sem contar o objeto soquete no kernel e outros 78 bytes para rastreamento no Endlessh. Para evitar a alocação de buffers de recebimento e envio para cada cliente, o Endlessh abre um soquete de acesso direto e traduz os pacotes TCP diretamente, ignorando quase toda a pilha TCP/IP do sistema operacional. O buffer de entrada não é necessário porque não estamos interessados ​​nos dados recebidos.

O autor diz que na época de seu programa não sabia sobre a existência do asycio do Python e de outros tarpits. Se ele conhecesse o asycio, poderia implementar seu utilitário em apenas 18 linhas em Python:

import asyncio
import random

async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % 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 é ideal para escrever tarpits. Por exemplo, este gancho irá congelar o Firefox, Chrome ou qualquer outro cliente que esteja 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 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (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 agressores online. É verdade que existe o risco, pelo contrário, de chamar a atenção para o comportamento incomum de um determinado servidor. 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 os tarpits funcionam muito bem.

Trap (tarpit) para conexões SSH de entrada

Fonte: habr.com

Adicionar um comentário