Trap (tarpit) สำหรับการเชื่อมต่อ SSH ขาเข้า

ไม่เป็นความลับเลยที่อินเทอร์เน็ตมีสภาพแวดล้อมที่ไม่เป็นมิตรมาก ทันทีที่คุณเพิ่มเซิร์ฟเวอร์ เซิร์ฟเวอร์ก็จะถูกโจมตีครั้งใหญ่และการสแกนหลายครั้งทันที ตัวอย่างเช่น honeypot จากเจ้าหน้าที่รักษาความปลอดภัย คุณสามารถประมาณขนาดของปริมาณขยะนี้ได้ ในความเป็นจริง บนเซิร์ฟเวอร์โดยเฉลี่ย 99% ของการรับส่งข้อมูลอาจเป็นอันตราย

Tarpit เป็นพอร์ตกับดักที่ใช้ในการชะลอการเชื่อมต่อขาเข้า หากระบบของบุคคลที่สามเชื่อมต่อกับพอร์ตนี้ คุณจะไม่สามารถปิดการเชื่อมต่อได้อย่างรวดเร็ว เธอจะต้องสิ้นเปลืองทรัพยากรระบบและรอจนกว่าการเชื่อมต่อจะหมดเวลาหรือยุติการเชื่อมต่อด้วยตนเอง

ส่วนใหญ่มักใช้ tarpits เพื่อการป้องกัน เทคนิคนี้ได้รับการพัฒนาครั้งแรกเพื่อป้องกันเวิร์มคอมพิวเตอร์ และตอนนี้สามารถใช้เพื่อทำลายชีวิตของผู้ส่งอีเมลขยะและนักวิจัยที่สแกนที่อยู่ IP ทั้งหมดติดต่อกันในวงกว้าง (ตัวอย่างใน Habré: ออสเตรีย, ยูเครน).

เห็นได้ชัดว่าผู้ดูแลระบบคนหนึ่งชื่อ Chris Wellons รู้สึกเบื่อหน่ายกับการดูความอับอายนี้ - และเขาก็เขียนโปรแกรมขนาดเล็กขึ้นมา ไม่มีที่สิ้นสุดtarpit สำหรับ SSH ที่ทำให้การเชื่อมต่อขาเข้าช้าลง โปรแกรมเปิดพอร์ต (พอร์ตเริ่มต้นสำหรับการทดสอบคือ 2222) และแกล้งทำเป็นเซิร์ฟเวอร์ SSH แต่ในความเป็นจริงมันสร้างการเชื่อมต่อที่ไม่มีที่สิ้นสุดกับไคลเอนต์ขาเข้าจนกว่าจะยอมแพ้ การดำเนินการนี้อาจดำเนินต่อไปเป็นเวลาหลายวันหรือนานกว่านั้นจนกว่าลูกค้าจะเลิกกิจการ

การติดตั้งยูทิลิตี้:

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

ผ้าใบกันน้ำที่ใช้งานอย่างเหมาะสมจะใช้ทรัพยากรจากผู้โจมตีมากกว่าจากคุณ แต่มันไม่ใช่เรื่องของทรัพยากรด้วยซ้ำ ผู้เขียน เขียนว่าโปรแกรมมันเสพติด ขณะนี้มีลูกค้า 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)โดยที่ไคลเอนต์ในกับดักแทบไม่ต้องใช้ทรัพยากรเพิ่มเติม โดยไม่นับออบเจ็กต์ซ็อกเก็ตในเคอร์เนลและอีก 78 ไบต์สำหรับการติดตามใน Endlessh เพื่อหลีกเลี่ยงการจัดสรรบัฟเฟอร์การรับและส่งสำหรับแต่ละไคลเอ็นต์ Endlessh จะเปิดซ็อกเก็ตการเข้าถึงโดยตรงและแปลแพ็กเก็ต TCP โดยตรง โดยข้ามสแต็ก TCP/IP ของระบบปฏิบัติการเกือบทั้งหมด บัฟเฟอร์ขาเข้าไม่จำเป็นเลย เนื่องจากเราไม่สนใจข้อมูลที่เข้ามา

ผู้เขียนบอกว่าตอนที่เขาเขียนโปรแกรม ไม่รู้ เกี่ยวกับการมีอยู่ของ asycio ของ Python และ tarpits อื่น ๆ หากเขารู้เกี่ยวกับ asycio เขาสามารถใช้ยูทิลิตี้ของเขาได้เพียง 18 บรรทัดใน 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 เหมาะสำหรับเขียนผ้าใบกันน้ำ ตัวอย่างเช่น ฮุคนี้จะหยุด 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 เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการลงโทษผู้รังแกทางออนไลน์ จริงอยู่ ในทางกลับกัน มีความเสี่ยงที่จะดึงความสนใจไปที่พฤติกรรมที่ผิดปกติของเซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่ง ใครบางคน อาจจะคิดแก้แค้น และการโจมตี DDoS แบบกำหนดเป้าหมายบน IP ของคุณ อย่างไรก็ตาม จนถึงขณะนี้ยังไม่มีกรณีดังกล่าว และ tarpits ก็ใช้งานได้ดี

ฮับ:
Python ความปลอดภัยของข้อมูล ซอฟต์แวร์ การดูแลระบบ

Tags:
SSH, Endlessh, tarpit, tarpit, กับดัก, asycio
Trap (tarpit) สำหรับการเชื่อมต่อ SSH ขาเข้า

ไม่เป็นความลับเลยที่อินเทอร์เน็ตมีสภาพแวดล้อมที่ไม่เป็นมิตรมาก ทันทีที่คุณเพิ่มเซิร์ฟเวอร์ เซิร์ฟเวอร์ก็จะถูกโจมตีครั้งใหญ่และการสแกนหลายครั้งทันที ตัวอย่างเช่น honeypot จากเจ้าหน้าที่รักษาความปลอดภัย คุณสามารถประมาณขนาดของปริมาณขยะนี้ได้ ในความเป็นจริง บนเซิร์ฟเวอร์โดยเฉลี่ย 99% ของการรับส่งข้อมูลอาจเป็นอันตราย

Tarpit เป็นพอร์ตกับดักที่ใช้ในการชะลอการเชื่อมต่อขาเข้า หากระบบของบุคคลที่สามเชื่อมต่อกับพอร์ตนี้ คุณจะไม่สามารถปิดการเชื่อมต่อได้อย่างรวดเร็ว เธอจะต้องสิ้นเปลืองทรัพยากรระบบและรอจนกว่าการเชื่อมต่อจะหมดเวลาหรือยุติการเชื่อมต่อด้วยตนเอง

ส่วนใหญ่มักใช้ tarpits เพื่อการป้องกัน เทคนิคนี้ได้รับการพัฒนาครั้งแรกเพื่อป้องกันเวิร์มคอมพิวเตอร์ และตอนนี้สามารถใช้เพื่อทำลายชีวิตของผู้ส่งอีเมลขยะและนักวิจัยที่สแกนที่อยู่ IP ทั้งหมดติดต่อกันในวงกว้าง (ตัวอย่างใน Habré: ออสเตรีย, ยูเครน).

เห็นได้ชัดว่าผู้ดูแลระบบคนหนึ่งชื่อ Chris Wellons รู้สึกเบื่อหน่ายกับการดูความอับอายนี้ - และเขาก็เขียนโปรแกรมขนาดเล็กขึ้นมา ไม่มีที่สิ้นสุดtarpit สำหรับ SSH ที่ทำให้การเชื่อมต่อขาเข้าช้าลง โปรแกรมเปิดพอร์ต (พอร์ตเริ่มต้นสำหรับการทดสอบคือ 2222) และแกล้งทำเป็นเซิร์ฟเวอร์ SSH แต่ในความเป็นจริงมันสร้างการเชื่อมต่อที่ไม่มีที่สิ้นสุดกับไคลเอนต์ขาเข้าจนกว่าจะยอมแพ้ การดำเนินการนี้อาจดำเนินต่อไปเป็นเวลาหลายวันหรือนานกว่านั้นจนกว่าลูกค้าจะเลิกกิจการ

การติดตั้งยูทิลิตี้:

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

ผ้าใบกันน้ำที่ใช้งานอย่างเหมาะสมจะใช้ทรัพยากรจากผู้โจมตีมากกว่าจากคุณ แต่มันไม่ใช่เรื่องของทรัพยากรด้วยซ้ำ ผู้เขียน เขียนว่าโปรแกรมมันเสพติด ขณะนี้มีลูกค้า 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)โดยที่ไคลเอนต์ในกับดักแทบไม่ต้องใช้ทรัพยากรเพิ่มเติม โดยไม่นับออบเจ็กต์ซ็อกเก็ตในเคอร์เนลและอีก 78 ไบต์สำหรับการติดตามใน Endlessh เพื่อหลีกเลี่ยงการจัดสรรบัฟเฟอร์การรับและส่งสำหรับแต่ละไคลเอ็นต์ Endlessh จะเปิดซ็อกเก็ตการเข้าถึงโดยตรงและแปลแพ็กเก็ต TCP โดยตรง โดยข้ามสแต็ก TCP/IP ของระบบปฏิบัติการเกือบทั้งหมด บัฟเฟอร์ขาเข้าไม่จำเป็นเลย เนื่องจากเราไม่สนใจข้อมูลที่เข้ามา

ผู้เขียนบอกว่าตอนที่เขาเขียนโปรแกรม ไม่รู้ เกี่ยวกับการมีอยู่ของ asycio ของ Python และ tarpits อื่น ๆ หากเขารู้เกี่ยวกับ asycio เขาสามารถใช้ยูทิลิตี้ของเขาได้เพียง 18 บรรทัดใน 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 เหมาะสำหรับเขียนผ้าใบกันน้ำ ตัวอย่างเช่น ฮุคนี้จะหยุด 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 เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการลงโทษผู้รังแกทางออนไลน์ จริงอยู่ ในทางกลับกัน มีความเสี่ยงที่จะดึงความสนใจไปที่พฤติกรรมที่ผิดปกติของเซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่ง ใครบางคน อาจจะคิดแก้แค้น และการโจมตี DDoS แบบกำหนดเป้าหมายบน IP ของคุณ อย่างไรก็ตาม จนถึงขณะนี้ยังไม่มีกรณีดังกล่าว และ tarpits ก็ใช้งานได้ดี

Trap (tarpit) สำหรับการเชื่อมต่อ SSH ขาเข้า

ที่มา: will.com

เพิ่มความคิดเห็น