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
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é:
Um dos administradores de sistema chamado Chris Wellons aparentemente se cansou de assistir a essa desgraça - e escreveu um pequeno programa
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
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 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
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
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
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é:
Um dos administradores de sistema chamado Chris Wellons aparentemente se cansou de assistir a essa desgraça - e escreveu um pequeno programa
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
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 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
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
Fonte: habr.com