Bẫy (tarpit) cho các kết nối SSH đến

Không có gì bí mật rằng Internet là một môi trường rất thù địch. Ngay khi bạn nâng cấp một máy chủ, nó sẽ ngay lập tức bị tấn công lớn và bị quét nhiều lần. Ví dụ honeypot từ nhân viên bảo vệ bạn có thể ước tính quy mô của lưu lượng rác này. Trên thực tế, trên máy chủ trung bình, 99% lưu lượng truy cập có thể độc hại.

Tarpit là một cổng bẫy được sử dụng để làm chậm các kết nối đến. Nếu hệ thống của bên thứ ba kết nối với cổng này, bạn sẽ không thể nhanh chóng đóng kết nối. Cô ấy sẽ phải lãng phí tài nguyên hệ thống của mình và đợi cho đến khi hết thời gian kết nối hoặc chấm dứt nó theo cách thủ công.

Thông thường, bạt được sử dụng để bảo vệ. Kỹ thuật này lần đầu tiên được phát triển để bảo vệ chống lại sâu máy tính. Và bây giờ nó có thể được sử dụng để hủy hoại cuộc sống của những kẻ gửi thư rác và các nhà nghiên cứu đang tham gia quét rộng rãi tất cả các địa chỉ IP liên tiếp (ví dụ trên Habré: Áo, Ukraina).

Một trong những quản trị viên hệ thống tên là Chris Wellons dường như đã cảm thấy mệt mỏi khi phải chứng kiến ​​cảnh tượng đáng hổ thẹn này - và anh ấy đã viết một chương trình nhỏ Bất tận, một tarpit dành cho SSH làm chậm các kết nối đến. Chương trình mở một cổng (cổng mặc định để thử nghiệm là 2222) và giả vờ là máy chủ SSH, nhưng trên thực tế, nó thiết lập kết nối vô tận với máy khách đến cho đến khi nó bỏ cuộc. Điều này có thể tiếp tục trong vài ngày hoặc hơn cho đến khi khách hàng bỏ cuộc.

Cài đặt tiện ích:

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

Một tấm bạt được triển khai đúng cách sẽ lấy nhiều tài nguyên từ kẻ tấn công hơn là từ bạn. Nhưng vấn đề thậm chí không phải là nguồn lực. Tác giả пишетrằng chương trình này gây nghiện. Hiện tại nó có 27 khách hàng bị mắc kẹt, một số trong số họ đã kết nối trong nhiều tuần. Vào thời điểm hoạt động cao điểm, 1378 khách hàng đã bị mắc kẹt trong 20 giờ!

Ở chế độ hoạt động, máy chủ Endlessh cần được cài đặt trên cổng 22 thông thường, nơi bọn côn đồ tấn công hàng loạt. Các khuyến nghị bảo mật tiêu chuẩn luôn khuyên bạn nên di chuyển SSH sang một cổng khác, điều này ngay lập tức giảm kích thước của nhật ký xuống một mức độ lớn.

Chris Wellons cho biết chương trình của anh ấy khai thác một đoạn trong đặc tả RFC 4253 đến giao thức SSH. Ngay sau khi kết nối TCP được thiết lập, nhưng trước khi áp dụng mật mã, cả hai bên phải gửi một chuỗi nhận dạng. Và cũng có một lưu ý: "Máy chủ CÓ THỂ gửi các hàng dữ liệu khác trước khi gửi hàng phiên bản". И không giới hạn trên khối lượng dữ liệu này, bạn chỉ cần bắt đầu mỗi dòng bằng SSH-.

Đây chính xác là những gì chương trình Endlessh thực hiện: nó gửi vô tận luồng dữ liệu được tạo ngẫu nhiên, tuân thủ RFC 4253, nghĩa là gửi trước khi xác thực và mỗi dòng bắt đầu bằng SSH- và không vượt quá 255 ký tự, kể cả ký tự cuối dòng. Nói chung mọi thứ đều đúng tiêu chuẩn.

Theo mặc định, chương trình đợi 10 giây giữa các gói gửi. Điều này ngăn không cho máy khách bị hết thời gian chờ, do đó máy khách sẽ bị mắc kẹt mãi mãi.

Vì dữ liệu được gửi trước khi áp dụng mật mã nên chương trình cực kỳ đơn giản. Nó không cần thực hiện bất kỳ mật mã nào và hỗ trợ nhiều giao thức.

Tác giả đã cố gắng đảm bảo rằng tiện ích này tiêu thụ ít tài nguyên nhất và hoạt động hoàn toàn không được chú ý trên máy. Không giống như các phần mềm chống vi-rút hiện đại và các “hệ thống bảo mật” khác, nó không làm chậm máy tính của bạn. Anh ấy đã cố gắng giảm thiểu cả lưu lượng truy cập và mức tiêu thụ bộ nhớ nhờ triển khai phần mềm tinh vi hơn một chút. Nếu nó chỉ đơn giản khởi chạy một quy trình riêng biệt trên một kết nối mới thì những kẻ tấn công tiềm năng có thể khởi động một cuộc tấn công DDoS bằng cách mở nhiều kết nối để làm cạn kiệt tài nguyên trên máy. Một luồng cho mỗi kết nối cũng không phải là lựa chọn tốt nhất, vì kernel sẽ lãng phí tài nguyên quản lý các luồng.

Đó là lý do Chris Wellons chọn phương án nhẹ nhất cho Endlessh: máy chủ đơn luồng poll(2), trong đó các máy khách trong bẫy hầu như không tiêu thụ thêm tài nguyên nào, không tính đối tượng socket trong kernel và 78 byte khác để theo dõi trong Endlessh. Để tránh phải phân bổ bộ đệm nhận và gửi cho từng máy khách, Endlessh mở một ổ cắm truy cập trực tiếp và dịch trực tiếp các gói TCP, bỏ qua gần như toàn bộ ngăn xếp TCP/IP của hệ điều hành. Bộ đệm đến hoàn toàn không cần thiết vì chúng ta không quan tâm đến dữ liệu đến.

Tác giả nói rằng tại thời điểm chương trình của mình đã không biết về sự tồn tại của asycio của Python và các tarpits khác. Nếu biết về asycio, anh ấy có thể triển khai tiện ích của mình chỉ trong 18 dòng bằng 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 là lý tưởng để viết tarpit. Ví dụ: hook này sẽ đóng băng Firefox, Chrome hoặc bất kỳ ứng dụng khách nào khác đang cố gắng kết nối với máy chủ HTTP của bạn trong nhiều giờ:

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 là một công cụ tuyệt vời để trừng phạt những kẻ bắt nạt trực tuyến. Đúng, ngược lại, có một số rủi ro khi thu hút sự chú ý của họ đến hành vi bất thường của một máy chủ cụ thể. Có ai có thể nghĩ đến việc trả thù và một cuộc tấn công DDoS có chủ đích vào IP của bạn. Tuy nhiên, cho đến nay vẫn chưa có trường hợp nào như vậy và bạt che hoạt động rất tốt.

Trung tâm:
Python, Bảo mật thông tin, Phần mềm, Quản trị hệ thống

Tags:
SSH, Endlessh, tarpit, tarpit, bẫy, asycio
Bẫy (tarpit) cho các kết nối SSH đến

Không có gì bí mật rằng Internet là một môi trường rất thù địch. Ngay khi bạn nâng cấp một máy chủ, nó sẽ ngay lập tức bị tấn công lớn và bị quét nhiều lần. Ví dụ honeypot từ nhân viên bảo vệ bạn có thể ước tính quy mô của lưu lượng rác này. Trên thực tế, trên máy chủ trung bình, 99% lưu lượng truy cập có thể độc hại.

Tarpit là một cổng bẫy được sử dụng để làm chậm các kết nối đến. Nếu hệ thống của bên thứ ba kết nối với cổng này, bạn sẽ không thể nhanh chóng đóng kết nối. Cô ấy sẽ phải lãng phí tài nguyên hệ thống của mình và đợi cho đến khi hết thời gian kết nối hoặc chấm dứt nó theo cách thủ công.

Thông thường, bạt được sử dụng để bảo vệ. Kỹ thuật này lần đầu tiên được phát triển để bảo vệ chống lại sâu máy tính. Và bây giờ nó có thể được sử dụng để hủy hoại cuộc sống của những kẻ gửi thư rác và các nhà nghiên cứu đang tham gia quét rộng rãi tất cả các địa chỉ IP liên tiếp (ví dụ trên Habré: Áo, Ukraina).

Một trong những quản trị viên hệ thống tên là Chris Wellons dường như đã cảm thấy mệt mỏi khi phải chứng kiến ​​cảnh tượng đáng hổ thẹn này - và anh ấy đã viết một chương trình nhỏ Bất tận, một tarpit dành cho SSH làm chậm các kết nối đến. Chương trình mở một cổng (cổng mặc định để thử nghiệm là 2222) và giả vờ là máy chủ SSH, nhưng trên thực tế, nó thiết lập kết nối vô tận với máy khách đến cho đến khi nó bỏ cuộc. Điều này có thể tiếp tục trong vài ngày hoặc hơn cho đến khi khách hàng bỏ cuộc.

Cài đặt tiện ích:

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

Một tấm bạt được triển khai đúng cách sẽ lấy nhiều tài nguyên từ kẻ tấn công hơn là từ bạn. Nhưng vấn đề thậm chí không phải là nguồn lực. Tác giả пишетrằng chương trình này gây nghiện. Hiện tại nó có 27 khách hàng bị mắc kẹt, một số trong số họ đã kết nối trong nhiều tuần. Vào thời điểm hoạt động cao điểm, 1378 khách hàng đã bị mắc kẹt trong 20 giờ!

Ở chế độ hoạt động, máy chủ Endlessh cần được cài đặt trên cổng 22 thông thường, nơi bọn côn đồ tấn công hàng loạt. Các khuyến nghị bảo mật tiêu chuẩn luôn khuyên bạn nên di chuyển SSH sang một cổng khác, điều này ngay lập tức giảm kích thước của nhật ký xuống một mức độ lớn.

Chris Wellons cho biết chương trình của anh ấy khai thác một đoạn trong đặc tả RFC 4253 đến giao thức SSH. Ngay sau khi kết nối TCP được thiết lập, nhưng trước khi áp dụng mật mã, cả hai bên phải gửi một chuỗi nhận dạng. Và cũng có một lưu ý: "Máy chủ CÓ THỂ gửi các hàng dữ liệu khác trước khi gửi hàng phiên bản". И không giới hạn trên khối lượng dữ liệu này, bạn chỉ cần bắt đầu mỗi dòng bằng SSH-.

Đây chính xác là những gì chương trình Endlessh thực hiện: nó gửi vô tận luồng dữ liệu được tạo ngẫu nhiên, tuân thủ RFC 4253, nghĩa là gửi trước khi xác thực và mỗi dòng bắt đầu bằng SSH- và không vượt quá 255 ký tự, kể cả ký tự cuối dòng. Nói chung mọi thứ đều đúng tiêu chuẩn.

Theo mặc định, chương trình đợi 10 giây giữa các gói gửi. Điều này ngăn không cho máy khách bị hết thời gian chờ, do đó máy khách sẽ bị mắc kẹt mãi mãi.

Vì dữ liệu được gửi trước khi áp dụng mật mã nên chương trình cực kỳ đơn giản. Nó không cần thực hiện bất kỳ mật mã nào và hỗ trợ nhiều giao thức.

Tác giả đã cố gắng đảm bảo rằng tiện ích này tiêu thụ ít tài nguyên nhất và hoạt động hoàn toàn không được chú ý trên máy. Không giống như các phần mềm chống vi-rút hiện đại và các “hệ thống bảo mật” khác, nó không làm chậm máy tính của bạn. Anh ấy đã cố gắng giảm thiểu cả lưu lượng truy cập và mức tiêu thụ bộ nhớ nhờ triển khai phần mềm tinh vi hơn một chút. Nếu nó chỉ đơn giản khởi chạy một quy trình riêng biệt trên một kết nối mới thì những kẻ tấn công tiềm năng có thể khởi động một cuộc tấn công DDoS bằng cách mở nhiều kết nối để làm cạn kiệt tài nguyên trên máy. Một luồng cho mỗi kết nối cũng không phải là lựa chọn tốt nhất, vì kernel sẽ lãng phí tài nguyên quản lý các luồng.

Đó là lý do Chris Wellons chọn phương án nhẹ nhất cho Endlessh: máy chủ đơn luồng poll(2), trong đó các máy khách trong bẫy hầu như không tiêu thụ thêm tài nguyên nào, không tính đối tượng socket trong kernel và 78 byte khác để theo dõi trong Endlessh. Để tránh phải phân bổ bộ đệm nhận và gửi cho từng máy khách, Endlessh mở một ổ cắm truy cập trực tiếp và dịch trực tiếp các gói TCP, bỏ qua gần như toàn bộ ngăn xếp TCP/IP của hệ điều hành. Bộ đệm đến hoàn toàn không cần thiết vì chúng ta không quan tâm đến dữ liệu đến.

Tác giả nói rằng tại thời điểm chương trình của mình đã không biết về sự tồn tại của asycio của Python và các tarpits khác. Nếu biết về asycio, anh ấy có thể triển khai tiện ích của mình chỉ trong 18 dòng bằng 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 là lý tưởng để viết tarpit. Ví dụ: hook này sẽ đóng băng Firefox, Chrome hoặc bất kỳ ứng dụng khách nào khác đang cố gắng kết nối với máy chủ HTTP của bạn trong nhiều giờ:

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 là một công cụ tuyệt vời để trừng phạt những kẻ bắt nạt trực tuyến. Đúng, ngược lại, có một số rủi ro khi thu hút sự chú ý của họ đến hành vi bất thường của một máy chủ cụ thể. Có ai có thể nghĩ đến việc trả thù và một cuộc tấn công DDoS có chủ đích vào IP của bạn. Tuy nhiên, cho đến nay vẫn chưa có trường hợp nào như vậy và bạt che hoạt động rất tốt.

Bẫy (tarpit) cho các kết nối SSH đến

Nguồn: www.habr.com

Thêm một lời nhận xét