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ụ
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é:
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ỏ
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ả
Ở 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ả 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
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
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ụ
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é:
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ỏ
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ả
Ở 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ả 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
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
Nguồn: www.habr.com