Δεν είναι μυστικό ότι το Διαδίκτυο είναι ένα πολύ εχθρικό περιβάλλον. Μόλις ανεβάσετε έναν διακομιστή, υποβάλλεται αμέσως σε μαζικές επιθέσεις και πολλαπλές σαρώσεις. Για παράδειγμα
Το Tarpit είναι μια θύρα παγίδας που χρησιμοποιείται για την επιβράδυνση των εισερχόμενων συνδέσεων. Εάν ένα σύστημα τρίτου κατασκευαστή συνδεθεί σε αυτήν τη θύρα, δεν θα μπορείτε να κλείσετε γρήγορα τη σύνδεση. Θα πρέπει να σπαταλήσει τους πόρους του συστήματός της και να περιμένει μέχρι να λήξει το χρονικό όριο σύνδεσης ή να το τερματίσει χειροκίνητα.
Τις περισσότερες φορές, τα tarpits χρησιμοποιούνται για προστασία. Η τεχνική αναπτύχθηκε για πρώτη φορά για την προστασία από σκουλήκια υπολογιστών. Και τώρα μπορεί να χρησιμοποιηθεί για να καταστρέψει τις ζωές των spammers και των ερευνητών που ασχολούνται με την ευρεία σάρωση όλων των διευθύνσεων IP στη σειρά (παραδείγματα στο Habré:
Ένας από τους διαχειριστές συστήματος ονόματι Chris Wellons προφανώς βαρέθηκε να παρακολουθεί αυτό το αίσχος - και έγραψε ένα μικρό πρόγραμμα
Εγκατάσταση του βοηθητικού προγράμματος:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Ένα σωστά εφαρμοσμένο tarpit θα πάρει περισσότερους πόρους από τον εισβολέα παρά από εσάς. Αλλά δεν είναι καν θέμα πόρων. Συγγραφέας
Σε κατάσταση λειτουργίας, ο διακομιστής Endlessh πρέπει να εγκατασταθεί στη συνηθισμένη θύρα 22, όπου οι χούλιγκαν χτυπούν μαζικά. Οι τυπικές συστάσεις ασφαλείας συμβουλεύουν πάντα τη μεταφορά του SSH σε διαφορετική θύρα, η οποία μειώνει αμέσως το μέγεθος των αρχείων καταγραφής κατά μια τάξη μεγέθους.
Ο Chris Wellons λέει ότι το πρόγραμμά του εκμεταλλεύεται μια παράγραφο των προδιαγραφών SSH-
.
Αυτό ακριβώς κάνει το πρόγραμμα Endlessh: αυτό στέλνει ατελείωτες ροή δεδομένων που δημιουργούνται τυχαία, τα οποία συμμορφώνονται με το RFC 4253, δηλαδή στέλνουν πριν από τον έλεγχο ταυτότητας και κάθε γραμμή ξεκινά με SSH-
και δεν υπερβαίνει τους 255 χαρακτήρες, συμπεριλαμβανομένου του χαρακτήρα κατάληξης γραμμής. Γενικά, όλα είναι σύμφωνα με το πρότυπο.
Από προεπιλογή, το πρόγραμμα περιμένει 10 δευτερόλεπτα μεταξύ της αποστολής πακέτων. Αυτό αποτρέπει το χρονικό όριο του πελάτη, οπότε ο πελάτης θα παγιδευτεί για πάντα.
Δεδομένου ότι τα δεδομένα αποστέλλονται πριν από την εφαρμογή της κρυπτογραφίας, το πρόγραμμα είναι εξαιρετικά απλό. Δεν χρειάζεται να εφαρμόσει κανέναν κρυπτογράφηση και υποστηρίζει πολλαπλά πρωτόκολλα.
Ο συγγραφέας προσπάθησε να διασφαλίσει ότι το βοηθητικό πρόγραμμα καταναλώνει ελάχιστους πόρους και λειτουργεί εντελώς απαρατήρητα στο μηχάνημα. Σε αντίθεση με τα σύγχρονα προγράμματα προστασίας από ιούς και άλλα «συστήματα ασφαλείας», δεν θα πρέπει να επιβραδύνει τον υπολογιστή σας. Κατάφερε να ελαχιστοποιήσει τόσο την κυκλοφορία όσο και την κατανάλωση μνήμης λόγω μιας ελαφρώς πιο πονηρής εφαρμογής λογισμικού. Αν απλώς ξεκίνησε μια ξεχωριστή διαδικασία σε μια νέα σύνδεση, τότε οι πιθανοί εισβολείς θα μπορούσαν να εξαπολύσουν μια επίθεση DDoS ανοίγοντας πολλαπλές συνδέσεις για να εξαντλήσουν τους πόρους στο μηχάνημα. Ένα νήμα ανά σύνδεση δεν είναι επίσης η καλύτερη επιλογή, επειδή ο πυρήνας θα σπαταλήσει πόρους διαχειριζόμενος νήματα.
Γι' αυτό ο Chris Wellons επέλεξε την πιο ελαφριά επιλογή για το Endlessh: έναν διακομιστή με ένα νήμα poll(2)
, όπου οι πελάτες στην παγίδα δεν καταναλώνουν ουσιαστικά επιπλέον πόρους, χωρίς να υπολογίζεται το αντικείμενο υποδοχής στον πυρήνα και άλλα 78 byte για παρακολούθηση στο Endlessh. Για να μην χρειάζεται να εκχωρηθούν buffers λήψης και αποστολής για κάθε πελάτη, το Endlessh ανοίγει μια υποδοχή άμεσης πρόσβασης και μεταφράζει απευθείας πακέτα TCP, παρακάμπτοντας σχεδόν ολόκληρη τη στοίβα TCP/IP του λειτουργικού συστήματος. Το εισερχόμενο buffer δεν χρειάζεται καθόλου, γιατί δεν μας ενδιαφέρουν τα εισερχόμενα δεδομένα.
Το λέει ο συγγραφέας την ώρα του προγράμματός του
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 είναι ένα εξαιρετικό εργαλείο για την τιμωρία των διαδικτυακών νταήδων. Είναι αλήθεια ότι υπάρχει κάποιος κίνδυνος, αντίθετα, να επιστήσει την προσοχή τους στην ασυνήθιστη συμπεριφορά ενός συγκεκριμένου διακομιστή. Κάποιος
Κόμβοι:
Python, Ασφάλεια πληροφοριών, Λογισμικό, Διαχείριση συστήματος
Ετικέτες:
SSH, Endlesssh, tarpit, tarpit, trap, asycio
Παγίδα (tarpit) για εισερχόμενες συνδέσεις SSH
Δεν είναι μυστικό ότι το Διαδίκτυο είναι ένα πολύ εχθρικό περιβάλλον. Μόλις ανεβάσετε έναν διακομιστή, υποβάλλεται αμέσως σε μαζικές επιθέσεις και πολλαπλές σαρώσεις. Για παράδειγμα
Το Tarpit είναι μια θύρα παγίδας που χρησιμοποιείται για την επιβράδυνση των εισερχόμενων συνδέσεων. Εάν ένα σύστημα τρίτου κατασκευαστή συνδεθεί σε αυτήν τη θύρα, δεν θα μπορείτε να κλείσετε γρήγορα τη σύνδεση. Θα πρέπει να σπαταλήσει τους πόρους του συστήματός της και να περιμένει μέχρι να λήξει το χρονικό όριο σύνδεσης ή να το τερματίσει χειροκίνητα.
Τις περισσότερες φορές, τα tarpits χρησιμοποιούνται για προστασία. Η τεχνική αναπτύχθηκε για πρώτη φορά για την προστασία από σκουλήκια υπολογιστών. Και τώρα μπορεί να χρησιμοποιηθεί για να καταστρέψει τις ζωές των spammers και των ερευνητών που ασχολούνται με την ευρεία σάρωση όλων των διευθύνσεων IP στη σειρά (παραδείγματα στο Habré:
Ένας από τους διαχειριστές συστήματος ονόματι Chris Wellons προφανώς βαρέθηκε να παρακολουθεί αυτό το αίσχος - και έγραψε ένα μικρό πρόγραμμα
Εγκατάσταση του βοηθητικού προγράμματος:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Ένα σωστά εφαρμοσμένο tarpit θα πάρει περισσότερους πόρους από τον εισβολέα παρά από εσάς. Αλλά δεν είναι καν θέμα πόρων. Συγγραφέας
Σε κατάσταση λειτουργίας, ο διακομιστής Endlessh πρέπει να εγκατασταθεί στη συνηθισμένη θύρα 22, όπου οι χούλιγκαν χτυπούν μαζικά. Οι τυπικές συστάσεις ασφαλείας συμβουλεύουν πάντα τη μεταφορά του SSH σε διαφορετική θύρα, η οποία μειώνει αμέσως το μέγεθος των αρχείων καταγραφής κατά μια τάξη μεγέθους.
Ο Chris Wellons λέει ότι το πρόγραμμά του εκμεταλλεύεται μια παράγραφο των προδιαγραφών SSH-
.
Αυτό ακριβώς κάνει το πρόγραμμα Endlessh: αυτό στέλνει ατελείωτες ροή δεδομένων που δημιουργούνται τυχαία, τα οποία συμμορφώνονται με το RFC 4253, δηλαδή στέλνουν πριν από τον έλεγχο ταυτότητας και κάθε γραμμή ξεκινά με SSH-
και δεν υπερβαίνει τους 255 χαρακτήρες, συμπεριλαμβανομένου του χαρακτήρα κατάληξης γραμμής. Γενικά, όλα είναι σύμφωνα με το πρότυπο.
Από προεπιλογή, το πρόγραμμα περιμένει 10 δευτερόλεπτα μεταξύ της αποστολής πακέτων. Αυτό αποτρέπει το χρονικό όριο του πελάτη, οπότε ο πελάτης θα παγιδευτεί για πάντα.
Δεδομένου ότι τα δεδομένα αποστέλλονται πριν από την εφαρμογή της κρυπτογραφίας, το πρόγραμμα είναι εξαιρετικά απλό. Δεν χρειάζεται να εφαρμόσει κανέναν κρυπτογράφηση και υποστηρίζει πολλαπλά πρωτόκολλα.
Ο συγγραφέας προσπάθησε να διασφαλίσει ότι το βοηθητικό πρόγραμμα καταναλώνει ελάχιστους πόρους και λειτουργεί εντελώς απαρατήρητα στο μηχάνημα. Σε αντίθεση με τα σύγχρονα προγράμματα προστασίας από ιούς και άλλα «συστήματα ασφαλείας», δεν θα πρέπει να επιβραδύνει τον υπολογιστή σας. Κατάφερε να ελαχιστοποιήσει τόσο την κυκλοφορία όσο και την κατανάλωση μνήμης λόγω μιας ελαφρώς πιο πονηρής εφαρμογής λογισμικού. Αν απλώς ξεκίνησε μια ξεχωριστή διαδικασία σε μια νέα σύνδεση, τότε οι πιθανοί εισβολείς θα μπορούσαν να εξαπολύσουν μια επίθεση DDoS ανοίγοντας πολλαπλές συνδέσεις για να εξαντλήσουν τους πόρους στο μηχάνημα. Ένα νήμα ανά σύνδεση δεν είναι επίσης η καλύτερη επιλογή, επειδή ο πυρήνας θα σπαταλήσει πόρους διαχειριζόμενος νήματα.
Γι' αυτό ο Chris Wellons επέλεξε την πιο ελαφριά επιλογή για το Endlessh: έναν διακομιστή με ένα νήμα poll(2)
, όπου οι πελάτες στην παγίδα δεν καταναλώνουν ουσιαστικά επιπλέον πόρους, χωρίς να υπολογίζεται το αντικείμενο υποδοχής στον πυρήνα και άλλα 78 byte για παρακολούθηση στο Endlessh. Για να μην χρειάζεται να εκχωρηθούν buffers λήψης και αποστολής για κάθε πελάτη, το Endlessh ανοίγει μια υποδοχή άμεσης πρόσβασης και μεταφράζει απευθείας πακέτα TCP, παρακάμπτοντας σχεδόν ολόκληρη τη στοίβα TCP/IP του λειτουργικού συστήματος. Το εισερχόμενο buffer δεν χρειάζεται καθόλου, γιατί δεν μας ενδιαφέρουν τα εισερχόμενα δεδομένα.
Το λέει ο συγγραφέας την ώρα του προγράμματός του
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 είναι ένα εξαιρετικό εργαλείο για την τιμωρία των διαδικτυακών νταήδων. Είναι αλήθεια ότι υπάρχει κάποιος κίνδυνος, αντίθετα, να επιστήσει την προσοχή τους στην ασυνήθιστη συμπεριφορά ενός συγκεκριμένου διακομιστή. Κάποιος
Πηγή: www.habr.com