Non é ningún segredo que Internet é un ambiente moi hostil. Tan pronto como creas un servidor, está sometido ao instante a ataques masivos e a varias exploracións. Por exemplo
Tarpit é un porto de trampa que se usa para ralentizar as conexións entrantes. Se un sistema de terceiros se conecta a este porto, non poderás pechar a conexión rapidamente. Ela terá que desperdiciar os seus recursos do sistema e esperar ata que se esgote o tempo de espera da conexión ou finalizala manualmente.
Na maioría das veces, as lonas úsanse para protección. A técnica foi desenvolvida por primeira vez para protexerse contra os vermes informáticos. E agora pódese usar para arruinar a vida dos spammers e investigadores que se dedican a escanear amplamente todos os enderezos IP seguidos (exemplos en Habré:
Un dos administradores do sistema chamado Chris Wellons aparentemente cansou de ver esta deshonra e escribiu un pequeno programa
Instalación da utilidade:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Unha tarpit correctamente implementada tomará máis recursos do atacante que de ti. Pero nin sequera é cuestión de recursos. Autor
No modo operativo, o servidor Endlessh debe instalarse no porto habitual 22, onde os hooligans chaman en masa. As recomendacións de seguridade estándar sempre aconsellan mover SSH a un porto diferente, o que reduce inmediatamente o tamaño dos rexistros nunha orde de magnitude.
Chris Wellons di que o seu programa explota un parágrafo da especificación SSH-
.
Isto é exactamente o que fai o programa Endlessh: iso envía infinito fluxo de datos xerados aleatoriamente, que cumpren coa RFC 4253, é dicir, enviar antes da autenticación, e cada liña comeza por SSH-
e non supera os 255 caracteres, incluído o carácter de final de liña. En xeral, todo está de acordo coa norma.
Por defecto, o programa espera 10 segundos entre o envío de paquetes. Isto evita que o cliente se esgote, polo que o cliente quedará atrapado para sempre.
Dado que os datos envíanse antes de aplicar a criptografía, o programa é moi sinxelo. Non precisa implementar ningún cifrado e admite varios protocolos.
O autor intentou garantir que a utilidade consome un mínimo de recursos e funciona completamente desapercibida na máquina. A diferenza dos antivirus modernos e outros "sistemas de seguridade", non debería ralentizar o teu ordenador. Conseguiu minimizar tanto o tráfico como o consumo de memoria debido a unha implementación de software un pouco máis astuta. Se simplemente lanzou un proceso separado nunha nova conexión, os potenciais atacantes poderían lanzar un ataque DDoS abrindo varias conexións para esgotar os recursos da máquina. Un fío por conexión tampouco é a mellor opción, porque o núcleo desperdiciará recursos xestionando fíos.
É por iso que Chris Wellons elixiu a opción máis lixeira para Endlessh: un servidor de fío único poll(2)
, onde os clientes da trampa non consumen practicamente recursos adicionais, sen contar o obxecto socket no núcleo e outros 78 bytes para o seguimento en Endlessh. Para evitar ter que asignar búferes de recepción e envío para cada cliente, Endlessh abre un socket de acceso directo e traduce os paquetes TCP directamente, evitando case toda a pila TCP/IP do sistema operativo. O búfer de entrada non é necesario en absoluto, porque non nos interesan os datos entrantes.
O autor di que no momento do 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 escribir tarpits. Por exemplo, este gancho conxelará Firefox, Chrome ou calquera outro cliente que estea tentando conectarse ao teu servidor HTTP durante moitas 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 é unha excelente ferramenta para castigar aos matóns en liña. É certo que hai certo risco, pola contra, de chamarlles a atención sobre o comportamento inusual dun servidor en particular. Alguén
Hubs:
Python, Seguridade da información, Software, Administración de sistemas
Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trampa (tarpit) para conexións SSH entrantes
Non é ningún segredo que Internet é un ambiente moi hostil. Tan pronto como creas un servidor, está sometido ao instante a ataques masivos e a varias exploracións. Por exemplo
Tarpit é un porto de trampa que se usa para ralentizar as conexións entrantes. Se un sistema de terceiros se conecta a este porto, non poderás pechar a conexión rapidamente. Ela terá que desperdiciar os seus recursos do sistema e esperar ata que se esgote o tempo de espera da conexión ou finalizala manualmente.
Na maioría das veces, as lonas úsanse para protección. A técnica foi desenvolvida por primeira vez para protexerse contra os vermes informáticos. E agora pódese usar para arruinar a vida dos spammers e investigadores que se dedican a escanear amplamente todos os enderezos IP seguidos (exemplos en Habré:
Un dos administradores do sistema chamado Chris Wellons aparentemente cansou de ver esta deshonra e escribiu un pequeno programa
Instalación da utilidade:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Unha tarpit correctamente implementada tomará máis recursos do atacante que de ti. Pero nin sequera é cuestión de recursos. Autor
No modo operativo, o servidor Endlessh debe instalarse no porto habitual 22, onde os hooligans chaman en masa. As recomendacións de seguridade estándar sempre aconsellan mover SSH a un porto diferente, o que reduce inmediatamente o tamaño dos rexistros nunha orde de magnitude.
Chris Wellons di que o seu programa explota un parágrafo da especificación SSH-
.
Isto é exactamente o que fai o programa Endlessh: iso envía infinito fluxo de datos xerados aleatoriamente, que cumpren coa RFC 4253, é dicir, enviar antes da autenticación, e cada liña comeza por SSH-
e non supera os 255 caracteres, incluído o carácter de final de liña. En xeral, todo está de acordo coa norma.
Por defecto, o programa espera 10 segundos entre o envío de paquetes. Isto evita que o cliente se esgote, polo que o cliente quedará atrapado para sempre.
Dado que os datos envíanse antes de aplicar a criptografía, o programa é moi sinxelo. Non precisa implementar ningún cifrado e admite varios protocolos.
O autor intentou garantir que a utilidade consome un mínimo de recursos e funciona completamente desapercibida na máquina. A diferenza dos antivirus modernos e outros "sistemas de seguridade", non debería ralentizar o teu ordenador. Conseguiu minimizar tanto o tráfico como o consumo de memoria debido a unha implementación de software un pouco máis astuta. Se simplemente lanzou un proceso separado nunha nova conexión, os potenciais atacantes poderían lanzar un ataque DDoS abrindo varias conexións para esgotar os recursos da máquina. Un fío por conexión tampouco é a mellor opción, porque o núcleo desperdiciará recursos xestionando fíos.
É por iso que Chris Wellons elixiu a opción máis lixeira para Endlessh: un servidor de fío único poll(2)
, onde os clientes da trampa non consumen practicamente recursos adicionais, sen contar o obxecto socket no núcleo e outros 78 bytes para o seguimento en Endlessh. Para evitar ter que asignar búferes de recepción e envío para cada cliente, Endlessh abre un socket de acceso directo e traduce os paquetes TCP directamente, evitando case toda a pila TCP/IP do sistema operativo. O búfer de entrada non é necesario en absoluto, porque non nos interesan os datos entrantes.
O autor di que no momento do 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 escribir tarpits. Por exemplo, este gancho conxelará Firefox, Chrome ou calquera outro cliente que estea tentando conectarse ao teu servidor HTTP durante moitas 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 é unha excelente ferramenta para castigar aos matóns en liña. É certo que hai certo risco, pola contra, de chamarlles a atención sobre o comportamento inusual dun servidor en particular. Alguén
Fonte: www.habr.com