用于传入 SSH 连接的陷阱 (tarpit)

众所周知,互联网是一个非常恶劣的环境。 服务器一旦启动,就会立即遭受大规模攻击和多次扫描。 例如 来自保安的蜜罐 你可以估算一下垃圾流量的规模。 事实上,在一般服务器上,99% 的流量都可能是恶意的。

Tarpit 是一个陷阱端口,用于减慢传入连接的速度。 如果第三方系统连接到此端口,您将无法快速关闭连接。 她将不得不浪费系统资源并等待连接超时,或者手动终止连接。

最常见的是,防水油坑用于保护。 该技术最初是为了防止计算机蠕虫而开发的。 现在,它可以用来毁掉垃圾邮件发送者和研究人员的生活,他们对连续的所有 IP 地址进行广泛扫描(Habré 的示例: 奥地利, 乌克兰).

一位名叫 Chris Wellons 的系统管理员显然厌倦了观看这种耻辱 - 他编写了一个小程序 无尽,一个用于 SSH 的 tarpit,可以减慢传入连接的速度。 该程序打开一个端口(测试的默认端口是2222)并伪装成SSH服务器,但实际上它与传入的客户端建立无限连接,直到放弃。 这可能会持续几天或更长时间,直到客户摔倒。

该实用程序的安装:

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

正确实施的 tarpit 会从攻击者那里获取比你更多的资源。 但这甚至不是资源的问题。 作者 пишет该程序令人上瘾。 目前有 27 名客户被困,其中一些已连接数周。 活动高峰期,1378名客户被困20小时!

在运行模式下,Endlessh服务器需要安装在常用的22端口上,流氓们会在这里集体敲门。 标准安全建议始终建议将 SSH 移动到不同的端口,这会立即将日志的大小减少一个数量级。

Chris Wellons 表示他的程序利用了规范中的一段内容 RFC 4253 到 SSH 协议。 TCP 连接建立后、应用加密之前,双方必须立即发送标识字符串。 并且还有一个注释: “服务器可以在发送版本行之前发送其他数据行”。 和 没有限制 对于此数据量,您只需以以下方式开始每一行 SSH-.

这正是 Endlessh 程序所做的: 发送 无穷 随机生成的数据流,符合RFC 4253,即在认证之前发送,每行以 SSH- 并且不超过 255 个字符,包括行结束符。 总的来说,一切都按照标准进行。

默认情况下,程序在发送数据包之间等待 10 秒。 这可以防止客户端超时,因此客户端将永远被困。

由于数据是在应用加密之前发送的,因此程序非常简单。 它不需要实现任何密码并支持多种协议。

作者试图确保该实用程序消耗最少的资源,并且在计算机上完全不被注意到。 与现代防病毒软件和其他“安全系统”不同,它不会减慢您的计算机速度。 由于软件实现稍微巧妙一些,他成功地最大限度地减少了流量和内存消耗。 如果它只是在新连接上启动单独的进程,那么潜在的攻击者就可以通过打开多个连接来发起 DDoS 攻击,以耗尽计算机上的资源。 每个连接一个线程也不是最佳选择,因为内核会浪费管理线程的资源。

这就是 Chris Wellons 为 Endlessh 选择最轻量级选项的原因:单线程服务器 poll(2),其中陷阱中的客户端几乎不消耗额外的资源,这还不包括内核中的套接字对象和 Endlessh 中用于跟踪的另外 78 个字节。 为了避免为每个客户端分配接收和发送缓冲区,Endlessh 打开一个直接访问套接字并直接转换 TCP 数据包,绕过几乎整个操作系统 TCP/IP 堆栈。 根本不需要传入缓冲区,因为我们对传入数据不感兴趣。

作者说在他的节目中 不知道 关于 Python 的 asycio 和其他 tarpit 的存在。 如果他了解 asycio,他只需用 Python 18 行就能实现他的实用程序:

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 是编写 tarpit 的理想选择。 例如,此挂钩将冻结 Firefox、Chrome 或任何其他尝试连接到 HTTP 服务器的客户端几个小时:

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 是惩罚网络恶霸的好工具。 确实,相反,吸引他们注意特定服务器的异常行为存在一些风险。 有人 可能会考虑报复 以及针对您的 IP 的定向 DDoS 攻击。 不过,到目前为止还没有出现这样的情况,而且柏油坑效果很好。

集线器:
Python、信息安全、软件、系统管理

标签:
SSH、Endlessh、tarpit、tarpit、trap、asycio
用于传入 SSH 连接的陷阱 (tarpit)

众所周知,互联网是一个非常恶劣的环境。 服务器一旦启动,就会立即遭受大规模攻击和多次扫描。 例如 来自保安的蜜罐 你可以估算一下垃圾流量的规模。 事实上,在一般服务器上,99% 的流量都可能是恶意的。

Tarpit 是一个陷阱端口,用于减慢传入连接的速度。 如果第三方系统连接到此端口,您将无法快速关闭连接。 她将不得不浪费系统资源并等待连接超时,或者手动终止连接。

最常见的是,防水油坑用于保护。 该技术最初是为了防止计算机蠕虫而开发的。 现在,它可以用来毁掉垃圾邮件发送者和研究人员的生活,他们对连续的所有 IP 地址进行广泛扫描(Habré 的示例: 奥地利, 乌克兰).

一位名叫 Chris Wellons 的系统管理员显然厌倦了观看这种耻辱 - 他编写了一个小程序 无尽,一个用于 SSH 的 tarpit,可以减慢传入连接的速度。 该程序打开一个端口(测试的默认端口是2222)并伪装成SSH服务器,但实际上它与传入的客户端建立无限连接,直到放弃。 这可能会持续几天或更长时间,直到客户摔倒。

该实用程序的安装:

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

正确实施的 tarpit 会从攻击者那里获取比你更多的资源。 但这甚至不是资源的问题。 作者 пишет该程序令人上瘾。 目前有 27 名客户被困,其中一些已连接数周。 活动高峰期,1378名客户被困20小时!

在运行模式下,Endlessh服务器需要安装在常用的22端口上,流氓们会在这里集体敲门。 标准安全建议始终建议将 SSH 移动到不同的端口,这会立即将日志的大小减少一个数量级。

Chris Wellons 表示他的程序利用了规范中的一段内容 RFC 4253 到 SSH 协议。 TCP 连接建立后、应用加密之前,双方必须立即发送标识字符串。 并且还有一个注释: “服务器可以在发送版本行之前发送其他数据行”。 和 没有限制 对于此数据量,您只需以以下方式开始每一行 SSH-.

这正是 Endlessh 程序所做的: 发送 无穷 随机生成的数据流,符合RFC 4253,即在认证之前发送,每行以 SSH- 并且不超过 255 个字符,包括行结束符。 总的来说,一切都按照标准进行。

默认情况下,程序在发送数据包之间等待 10 秒。 这可以防止客户端超时,因此客户端将永远被困。

由于数据是在应用加密之前发送的,因此程序非常简单。 它不需要实现任何密码并支持多种协议。

作者试图确保该实用程序消耗最少的资源,并且在计算机上完全不被注意到。 与现代防病毒软件和其他“安全系统”不同,它不会减慢您的计算机速度。 由于软件实现稍微巧妙一些,他成功地最大限度地减少了流量和内存消耗。 如果它只是在新连接上启动单独的进程,那么潜在的攻击者就可以通过打开多个连接来发起 DDoS 攻击,以耗尽计算机上的资源。 每个连接一个线程也不是最佳选择,因为内核会浪费管理线程的资源。

这就是 Chris Wellons 为 Endlessh 选择最轻量级选项的原因:单线程服务器 poll(2),其中陷阱中的客户端几乎不消耗额外的资源,这还不包括内核中的套接字对象和 Endlessh 中用于跟踪的另外 78 个字节。 为了避免为每个客户端分配接收和发送缓冲区,Endlessh 打开一个直接访问套接字并直接转换 TCP 数据包,绕过几乎整个操作系统 TCP/IP 堆栈。 根本不需要传入缓冲区,因为我们对传入数据不感兴趣。

作者说在他的节目中 不知道 关于 Python 的 asycio 和其他 tarpit 的存在。 如果他了解 asycio,他只需用 Python 18 行就能实现他的实用程序:

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 是编写 tarpit 的理想选择。 例如,此挂钩将冻结 Firefox、Chrome 或任何其他尝试连接到 HTTP 服务器的客户端几个小时:

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 是惩罚网络恶霸的好工具。 确实,相反,吸引他们注意特定服务器的异常行为存在一些风险。 有人 可能会考虑报复 以及针对您的 IP 的定向 DDoS 攻击。 不过,到目前为止还没有出现这样的情况,而且柏油坑效果很好。

用于传入 SSH 连接的陷阱 (tarpit)

来源: habr.com

添加评论