Παγίδα (tarpit) για εισερχόμενες συνδέσεις SSH

Δεν είναι μυστικό ότι το Διαδίκτυο είναι ένα πολύ εχθρικό περιβάλλον. Μόλις ανεβάσετε έναν διακομιστή, υποβάλλεται αμέσως σε μαζικές επιθέσεις και πολλαπλές σαρώσεις. Για παράδειγμα honeypot από φύλακες μπορείτε να υπολογίσετε την κλίμακα αυτής της κίνησης σκουπιδιών. Στην πραγματικότητα, στον μέσο διακομιστή, το 99% της επισκεψιμότητας μπορεί να είναι κακόβουλο.

Το Tarpit είναι μια θύρα παγίδας που χρησιμοποιείται για την επιβράδυνση των εισερχόμενων συνδέσεων. Εάν ένα σύστημα τρίτου κατασκευαστή συνδεθεί σε αυτήν τη θύρα, δεν θα μπορείτε να κλείσετε γρήγορα τη σύνδεση. Θα πρέπει να σπαταλήσει τους πόρους του συστήματός της και να περιμένει μέχρι να λήξει το χρονικό όριο σύνδεσης ή να το τερματίσει χειροκίνητα.

Τις περισσότερες φορές, τα tarpits χρησιμοποιούνται για προστασία. Η τεχνική αναπτύχθηκε για πρώτη φορά για την προστασία από σκουλήκια υπολογιστών. Και τώρα μπορεί να χρησιμοποιηθεί για να καταστρέψει τις ζωές των spammers και των ερευνητών που ασχολούνται με την ευρεία σάρωση όλων των διευθύνσεων IP στη σειρά (παραδείγματα στο Habré: Αυστρία, Ουκρανία).

Ένας από τους διαχειριστές συστήματος ονόματι Chris Wellons προφανώς βαρέθηκε να παρακολουθεί αυτό το αίσχος - και έγραψε ένα μικρό πρόγραμμα Ατελείωτες, ένα tarpit για SSH που επιβραδύνει τις εισερχόμενες συνδέσεις. Το πρόγραμμα ανοίγει μια θύρα (η προεπιλεγμένη θύρα για δοκιμή είναι 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), όπου οι πελάτες στην παγίδα δεν καταναλώνουν ουσιαστικά επιπλέον πόρους, χωρίς να υπολογίζεται το αντικείμενο υποδοχής στον πυρήνα και άλλα 78 byte για παρακολούθηση στο Endlessh. Για να μην χρειάζεται να εκχωρηθούν buffers λήψης και αποστολής για κάθε πελάτη, το Endlessh ανοίγει μια υποδοχή άμεσης πρόσβασης και μεταφράζει απευθείας πακέτα TCP, παρακάμπτοντας σχεδόν ολόκληρη τη στοίβα TCP/IP του λειτουργικού συστήματος. Το εισερχόμενο buffer δεν χρειάζεται καθόλου, γιατί δεν μας ενδιαφέρουν τα εισερχόμενα δεδομένα.

Το λέει ο συγγραφέας την ώρα του προγράμματός του δεν ηξερα για την ύπαρξη του ασυκίου και άλλων ταρπιτών του Python. Αν ήξερε για το 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 είναι ιδανικό για τη γραφή 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 είναι ένα εξαιρετικό εργαλείο για την τιμωρία των διαδικτυακών νταήδων. Είναι αλήθεια ότι υπάρχει κάποιος κίνδυνος, αντίθετα, να επιστήσει την προσοχή τους στην ασυνήθιστη συμπεριφορά ενός συγκεκριμένου διακομιστή. Κάποιος μπορεί να σκεφτεί εκδίκηση και μια στοχευμένη επίθεση DDoS στην IP σας. Ωστόσο, μέχρι στιγμής δεν έχουν υπάρξει τέτοιες περιπτώσεις, και τα tarpit λειτουργούν εξαιρετικά.

Κόμβοι:
Python, Ασφάλεια πληροφοριών, Λογισμικό, Διαχείριση συστήματος

Ετικέτες:
SSH, Endlesssh, tarpit, tarpit, trap, asycio
Παγίδα (tarpit) για εισερχόμενες συνδέσεις SSH

Δεν είναι μυστικό ότι το Διαδίκτυο είναι ένα πολύ εχθρικό περιβάλλον. Μόλις ανεβάσετε έναν διακομιστή, υποβάλλεται αμέσως σε μαζικές επιθέσεις και πολλαπλές σαρώσεις. Για παράδειγμα honeypot από φύλακες μπορείτε να υπολογίσετε την κλίμακα αυτής της κίνησης σκουπιδιών. Στην πραγματικότητα, στον μέσο διακομιστή, το 99% της επισκεψιμότητας μπορεί να είναι κακόβουλο.

Το Tarpit είναι μια θύρα παγίδας που χρησιμοποιείται για την επιβράδυνση των εισερχόμενων συνδέσεων. Εάν ένα σύστημα τρίτου κατασκευαστή συνδεθεί σε αυτήν τη θύρα, δεν θα μπορείτε να κλείσετε γρήγορα τη σύνδεση. Θα πρέπει να σπαταλήσει τους πόρους του συστήματός της και να περιμένει μέχρι να λήξει το χρονικό όριο σύνδεσης ή να το τερματίσει χειροκίνητα.

Τις περισσότερες φορές, τα tarpits χρησιμοποιούνται για προστασία. Η τεχνική αναπτύχθηκε για πρώτη φορά για την προστασία από σκουλήκια υπολογιστών. Και τώρα μπορεί να χρησιμοποιηθεί για να καταστρέψει τις ζωές των spammers και των ερευνητών που ασχολούνται με την ευρεία σάρωση όλων των διευθύνσεων IP στη σειρά (παραδείγματα στο Habré: Αυστρία, Ουκρανία).

Ένας από τους διαχειριστές συστήματος ονόματι Chris Wellons προφανώς βαρέθηκε να παρακολουθεί αυτό το αίσχος - και έγραψε ένα μικρό πρόγραμμα Ατελείωτες, ένα tarpit για SSH που επιβραδύνει τις εισερχόμενες συνδέσεις. Το πρόγραμμα ανοίγει μια θύρα (η προεπιλεγμένη θύρα για δοκιμή είναι 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), όπου οι πελάτες στην παγίδα δεν καταναλώνουν ουσιαστικά επιπλέον πόρους, χωρίς να υπολογίζεται το αντικείμενο υποδοχής στον πυρήνα και άλλα 78 byte για παρακολούθηση στο Endlessh. Για να μην χρειάζεται να εκχωρηθούν buffers λήψης και αποστολής για κάθε πελάτη, το Endlessh ανοίγει μια υποδοχή άμεσης πρόσβασης και μεταφράζει απευθείας πακέτα TCP, παρακάμπτοντας σχεδόν ολόκληρη τη στοίβα TCP/IP του λειτουργικού συστήματος. Το εισερχόμενο buffer δεν χρειάζεται καθόλου, γιατί δεν μας ενδιαφέρουν τα εισερχόμενα δεδομένα.

Το λέει ο συγγραφέας την ώρα του προγράμματός του δεν ηξερα για την ύπαρξη του ασυκίου και άλλων ταρπιτών του Python. Αν ήξερε για το 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 είναι ιδανικό για τη γραφή 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 είναι ένα εξαιρετικό εργαλείο για την τιμωρία των διαδικτυακών νταήδων. Είναι αλήθεια ότι υπάρχει κάποιος κίνδυνος, αντίθετα, να επιστήσει την προσοχή τους στην ασυνήθιστη συμπεριφορά ενός συγκεκριμένου διακομιστή. Κάποιος μπορεί να σκεφτεί εκδίκηση και μια στοχευμένη επίθεση DDoS στην IP σας. Ωστόσο, μέχρι στιγμής δεν έχουν υπάρξει τέτοιες περιπτώσεις, και τα tarpit λειτουργούν εξαιρετικά.

Παγίδα (tarpit) για εισερχόμενες συνδέσεις SSH

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο