用於傳入 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)

來源: www.habr.com

添加評論