Αυτό είναι το δεύτερο μέρος της σειράς “Car Hacking: Ο απόλυτος οδηγός!”. Στο μέρος Ι, συζητήσαμε, τι είναι το CAN Bus, αρκετές πληροφορίες για να ξεκινήσετε με το CAN Traffic και πώς να δημιουργήσετε ένα εικονικό σύστημα για το Car Hacking χρησιμοποιώντας το ICSim.
Σε αυτό το μέρος, θα βουτήξουμε στα βαθιά κάνοντας sniffing τα δεδομένα του αυτοκινήτου μέσω του CAN Traffic.
Πώς μοιάζει ένα μήνυμα CAN;
Έτσι ακριβώς μοιάζουν τα μηνύματα από το CAN, όταν καταγράφονται. Αν σπάσω τις στήλες, η πρώτη είναι η διεπαφή, η δεύτερη είναι το arbitration ID, το τρίτο είναι το μέγεθος του μηνύματος CAN, αυτό δεν μπορεί να είναι μεγαλύτερο από 8 (Αν κοιτάξετε το CAN framework, θα καταλάβετε καλύτερα γιατί αυτό δεν μπορεί να είναι μεγαλύτερο από 8), το τέταρτο είναι τα ίδια τα δεδομένα του CAN.
Το νόημα του μηνύματος CAN
Σε αυτό το παράδειγμα, θα δούμε ένα πλαίσιο των 8 byte. Το μήνυμα αποστέλλεται με αναγνωριστικό 0x111. Μόλις ο πίνακας των οργάνων δει αυτό το μήνυμα, αυτό θα βεβαιωθεί πρώτα, εάν προοριζόταν για τον πίνακα των οργάνων ή όχι. Αν ναι, τότε διαβάζει το μήνυμα που είναι το 0x0BB8, το οποίο μεταφράζεται σε 3000 (δεκαδικά ψηφία). Τώρα ο πίνακας οργάνων σας μετακινεί τη βελόνα στο στροφόμετρο σε 3000.
Μόλις κατανοήσουμε το μήνυμα CAN, μπορούμε περαιτέρω να εγχύσουμε τροποποιημένα πακέτα μέσω του ODB-II στο δίαυλο CAN για παραποίηση του ταχύμετρου ή οτιδήποτε άλλο θέλουμε.
Πριν ξεκινήσουμε να δείχνουμε το ICSim, ας δούμε πώς λειτουργούν τα άλλα βοηθητικά προγράμματα. Για να γίνει αυτό, ας ρυθμίσουμε πρώτα το virtual interface.
Ρύθμιση της εικονικής διεπαφής CAN
sudo modprobe can
Αυτό θα φορτώσει τη μονάδα του πυρήνα για το CAN. Επίσης, πρέπει να φορτώσουμε τη μονάδα του πυρήνα και για την εικονική μηχανή.
sudo modprobe vcan
Εάν θέλετε να επαληθεύσετε εάν οι απαιτούμενες μονάδες του πυρήνα είναι φορτωμένες, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή.
lsmod | grep can
Αυτό θα εμφανιστεί εάν τα CAN και VCAN έχουν φορτωθεί ή όχι.
Ας ρυθμίσουμε τώρα την εικονική διεπαφή
sudo ip link add dev vcan0 type vcan sudo ip link setup vcan0
Μπορείτε να επαληθεύσετε εάν η εικονική διεπαφή CAN έχει ρυθμιστεί με την παρακάτω εντολή
ifconfig vcan0
Μόλις ρυθμιστεί η εικονική διεπαφή CAN, είστε πλέον έτοιμοι να στείλετε/λάβετε το πακέτο CAN σε αυτήν τη διεπαφή. Ας χρησιμοποιήσουμε τώρα ένα από τα βοηθητικά προγράμματα από το can-utils που ονομάζεται cangen για να δημιουργήσουμε τα εικονικά πακέτα CAN.
cangen
Το cangen δημιουργεί τα CAN frameworks για εκπαιδευτικούς σκοπούς. Για να χρησιμοποιήσετε το cangen, πρέπει να καθορίσετε τη διεπαφή στην οποία θα δημιουργηθεί το CAN framework.
cangen vcan0
Το vcan0 είναι η εικονική διεπαφή CAN που δημιουργήσαμε πριν.
Δεδομένου ότι έχετε ήδη δημιουργήσει το CAN framework, πρέπει να υπάρχει ένας τρόπος να δείτε το framework! Υπάρχουν πολλά διαθέσιμα βοηθητικά προγράμματα, ένα από τα πολλά διαθέσιμα είναι το Wireshark. Εκκινήστε το Wireshark αφού δημιουργήσετε τα CAN frameworks.
Μπορεί να δείτε πολλές διαθέσιμες διεπαφές ανάλογα με το πόσες διεπαφές υπάρχουν, το vcan0 είναι η διεπαφή όπου δημιουργούνται τα CAN καρέ σας.
Μόλις κάνετε κλικ στη διεπαφή που θέλετε να δείτε τα πακέτα, έτσι θα φαίνεται το πλαίσιο CAN.
Μπορείτε επίσης να δείτε πιο λεπτομερείς πληροφορίες σχετικά με το πλαίσιο CAN.
Επίσης, υπάρχουν άλλα βοηθητικά προγράμματα στο εσωτερικό του vcan0 όπως το cansniffer και το candump που κάνουν λίγο πολύ τα ίδια πράγματα που κάνει το Wireshark. Μπορείτε να χρησιμοποιήσετε οποιοδήποτε εργαλείο ή βοηθητικό πρόγραμμα, με όποιο νιώθετε πιο άνετα.
candump
Για να απορρίψετε ή να καταγράψετε τα frames χρησιμοποιώντας το candump , μπορείτε να χρησιμοποιήσετε την εντολή
candump vcan0
Παρακάτω θα δούμε τα αποτελέσματα που θα μας εμφανίσει.
Σε ένα από τα τερματικά, στο κάτω, δημιουργούνται τα πακέτα του CAN, ενώ το τερματικό στο επάνω μέρος λειτουργεί το candump. Εάν πρέπει να αναλύσω τις στήλες, το πρώτο που βλέπετε είναι η διεπαφή CAN. Το δεύτερο είναι το αναγνωριστικό ID, το τρίτο είναι το μέγεθος του μηνύματος CAN και το τέταρτο είναι το ίδιο το μήνυμα.
Το candump μπορεί επίσης να καταγράψει το framework για εσάς. Εάν επιθυμείτε να εκτελέσετε μια επίθεση επανάληψης, μπορείτε πρώτα να καταγράψετε τα καρέ και στη συνέχεια να χρησιμοποιήσετε μίνι βοηθητικό πρόγραμμα όπως το canplayer για να επαναλάβετε τα καρέ. Η καταγραφή των CAN frameworks μπορεί να ενεργοποιηθεί χρησιμοποιώντας το flag -l.
candump -l vcan0
Όταν καταγράφετε τα CAN frames, θα δημιουργηθεί ένα αρχείο με το πρόθεμα candump ακολουθούμενο από την ημερομηνία της δημιουργίας του.
Εάν θέλετε να δείτε τα περιεχόμενα του αρχείου, μπορείτε πάντα να χρησιμοποιήσετε την εντολή cat στο Linux για να δείτε.
Τα στοιχεία που καταγράψαμε χρησιμοποιώντας το candump μπορούν να αναπαραχθούν χρησιμοποιώντας ένα βοηθητικό πρόγραμμα όπως το canplayer .
canplayer
Όπως υποδηλώνει το όνομα, το canplayer θα αναπαράγει τα can frames . Ιδανικά, αυτό είναι χρήσιμο όταν πρέπει να κάνετε την replay attack. Πρώτα θα καταγράψετε τα CAN frames και στη συνέχεια θα αναπαραγάγετε το CAN framework χρησιμοποιώντας το canplayer.
Φανταστείτε ένα σενάριο όπου θέλετε να παραποιήσετε το στροφόμετρο και δεν έχετε ιδέα σε ποιο αναγνωριστικό ID λειτουργεί η ανάγνωση του στροφόμετρου, δεν έχετε ιδέα τι υπάρχει στο μήνυμα CAN. Στην ιδανική περίπτωση, θα πρέπει πρώτα να απορρίψετε και να καταγράψετε τα frames χρησιμοποιώντας το candump με flag -l και στη συνέχεια να χρησιμοποιήσετε το πρόγραμμα αναπαραγωγής can για να επαναλάβετε τα καρέ που καταγράφηκαν.
Το canplayer απαιτεί την επιλογή -i για το αρχείο εισόδου.
canplayer -I canfile.log
Το canplayer έχει αρκετές άλλες πραγματικά χρήσιμες επιλογές, μπορείτε να τις μάθετε χρησιμοποιώντας το man canplayer.
cansniffer
Το CAN sniffer το χρησιμοποιείτε για να δείτε την αλλαγή στην κίνηση CAN. Αυτό είναι πολύ χρήσιμο για να δείτε μια αλλαγή σε ένα συγκεκριμένο byte. Το cansniffer έχει μια επιλογή -c πολύ χρήσιμη για να δείτε την αλλαγή του byte με πολύχρωμο τρόπο. Αυτό που κάνει είναι ότι θα συγκρίνει το προηγούμενο byte και το τρέχον byte, αν υπάρχει διαφορά τότε υποδεικνύεται από την αλλαγή στο χρώμα του byte. Αυτό είναι πολύ χρήσιμο όταν θέλετε να μάθετε εάν υπήρξε αλλαγή όταν είχατε πραγματοποιήσει ορισμένες επεμβάσεις σε ένα αυτοκίνητο.
cansniffer -c vcan0
Θεωρώ ότι το cansniffer είναι πολύ χρήσιμο επειδή επιτρέπει επίσης φιλτράρισμα με αναγνωριστικά. Έτσι, εάν θέλετε να βλέπετε τα frames μόνο από ένα συγκεκριμένο αναγνωριστικό, ας πούμε 0x011, μπορείτε να το κάνετε.
Αυτό μπορεί να γίνει μόλις αρχίσετε να κάνετε sniffing, πατήστε – και μετά 000000. Αυτό θα καθαρίσει πρώτα όλα τα καρέ. Τώρα, μπορείτε να αρχίσετε να προσθέτετε τα αναγνωριστικά χρησιμοποιώντας το + και στη συνέχεια, το αναγνωριστικό που θέλετε να εμφανίσετε και να πατήσετε Enter. Με αυτόν τον τρόπο μπορείτε να φιλτράρετε τα frames μεμονωμένων αναγνωριστικών.
cansend
Το cansend χρησιμοποιείται για την αποστολή των CAN frames σε μια συγκεκριμένη διεπαφή CAN.
cansend interface frame
Θα χρησιμοποιήσουμε όλα αυτά τα βοηθητικά προγράμματα με το ICSim.
Εκκίνηση του ICSim
Ακολουθήστε το πρώτο άρθρο που φτιάξαμε για να μάθετε πώς να εγκαταστήσετε το ICSim.
Ας ξεκινήσουμε το ICSim και ας κάνουμε sniff τα CAN frames.
./icsim vcan0 ./controls vcan0
Εάν έχετε ακολουθήσει κάθε βήμα που συζητήθηκε στην προηγούμενη ανάρτηση, θα πρέπει να μπορείτε να τα δείτε. Επίσης, μπορείτε να παρατηρήσετε ότι η βελόνα του ταχύμετρου κινείται μπρος – πίσω, κάτι που είναι αναμενόμενο λόγω του θορύβου που υπάρχει.
Sniff των CAN frames που δημιουργούνται από το ICSim
Θα χρησιμοποιήσουμε το cansniffer, ένα βοηθητικό πρόγραμμα που παρέχεται από τα can-utils, για να συλλάβουμε τα πακέτα. Μπορείτε να ανοίξετε ένα νέο τερματικό και να ξεκινήσετε το cansniffer με την παρακάτω εντολή
cansniffer -c vcan0
Η επιλογή -c χρησιμοποιείται για να υποδείξει την αλλαγή των byte του frame.
Μπορείτε να δείτε πολύ γρήγορες αλλαγές στα CAN frames, δύσκολο να συμβαδίσετε με τον ρυθμό με τον οποίο πραγματοποιείται η επικοινωνία. Σε ένα πραγματικό αυτοκίνητο, αυτή η επικοινωνία θα γινόταν γρήγορα. Για να συμβαδίσετε, μπορείτε να χρησιμοποιήσετε το φιλτράρισμα του αναγνωριστικού ID. Εάν θέλετε να βλέπετε μόνο τα frames από το ID 40C, μπορείτε πάντα να πατήσετε – και στη συνέχεια 000000 ακολουθούμενο από το πλήκτρο Enter. Αυτό θα διαγράψει όλα τα αναγνωριστικά από το cansniffer και μπορείτε στη συνέχεια να πατήσετε + ακολουθούμενο από το αναγνωριστικό ID για φιλτράρισμα και στη μετά να πατήσετε το πλήκτρο Enter.
Εδώ έχω φιλτράρει το αναγνωριστικό 40c χρησιμοποιώντας τα ίδια βήματα που αναφέρθηκαν παραπάνω. Μπορείτε να δοκιμάσετε να πατήσετε το πλήκτρο του επάνω βέλους για να αυξήσετε το γκάζι και στη συνέχεια, να παρατηρήσετε πόσο γρήγορα αλλάζουν τα CAN frames. Η αλλαγή υποδεικνύεται και πάλι με το χρωματισμό. Μπορείτε πάντα να παίξετε με αυτό και να δείτε πώς λειτουργούν τα πράγματα κάτω από το καπό.
Replay Attack
Η κατανόηση αυτών των τεράστιων δεδομένων θα είναι αρκετά δύσκολη. Επίσης, η εύρεση του αναγνωριστικού ID στο οποίο πρέπει να εισάγετε τα frames είναι αδύνατο να γίνει από αυτά τα πολλά δεδομένα.
Έτσι, θα πρέπει να συλλάβετε τα πακέτα και στη συνέχεια να εκτελέσετε κάποιες ενέργειες, όπως να ανάψετε τα φλας ή να πιέσετε το γκάζι, μόλις είναι συνδεδεμένο, στη συνέχεια να χωρίσετε τα πακέτα, να εκτελέσετε replay attack και να δείτε αν λειτουργεί.
Τώρα για να εκτελέσετε replay attack με το ICSim, πρέπει να έχετε ήδη ξεκινήσει το ICSim και θα πρέπει να μπορείτε να βλέπετε τα frames χρησιμοποιώντας το cansniffer. Τώρα θα χρησιμοποιήσουμε την επιλογή candump με -l για να καταγράψουμε και να αποθηκεύσουμε τα frames, στο μεταξύ θα αυξήσουμε το γκάζι, πατώντας τα πλήκτρα βέλους <αριστερά> και <δεξιά> για να ενεργοποιήσουμε την ένδειξη φλας.
candump -l vcan0
Τώρα θα σταματήσουμε το candump και θα δούμε να δημιουργείται ένα αρχείο candump-XXXXX.log.
Επανάληψη των CAN frames
Για να επαναλάβουμε αυτά τα πακέτα θα χρησιμοποιήσουμε το canplayer . Δεδομένου ότι θα χρησιμοποιήσουμε ένα αρχείο ως είσοδο για το canplayer, χρειαζόμαστε την επιλογή -I για να είναι ενεργοποιημένη.
canplayer -I candump -2019XXXXXX.log
Μπορείτε να δείτε ότι έχει πραγματοποιηθεί η επίθεση replay και τα φλας όπως και το ταχύμετρο θα πρέπει να λειτουργούν όπως κάναμε νωρίτερα.
Ανάλυση των πακέτων
Σε ένα πραγματικό αυτοκίνητο, το CAN bus μπορεί να είναι πολύ πιο περίπλοκο και τα CAN frames μπορεί να εμφανίζονται πολύ γρηγορότερα, οπότε ο εντοπισμός του ID θα μπορούσε να είναι αρκετά δύσκολος. Έτσι, για να προσδιορίσετε εύκολα το αναγνωριστικό ID, μπορείτε να το ακολουθήσετε τα παρακάτω βήματα.
Διαίρεση των CAN frames και εκτέλεση Replay attack
Εάν θέλετε να διαιρέσετε τα CAN frames σε δύο μισά και να εκτελέσετε την επίθεση replay σε καθένα από αυτά, ο καλύτερος τρόπος για να το κάνετε είναι να καταγράψετε τα CAN frames χρησιμοποιώντας το candump και να χρησιμοποιήσετε το βοηθητικό πρόγραμμα wc για να μετρήσετε τον αριθμό των CAN frames και στη συνέχεια, χρησιμοποιήστε το split για να το διαιρέσετε στα δύο εξίσου.
Τώρα, μπορείτε να χρησιμοποιήσετε το canplayer για να επαναλάβετε το CAN frames ανεξάρτητα.
Κάπου εδώ φτάσαμε στο τέλος και αυτού του οδηγού. Δείξαμε πως μπορούμε να πραγματοποιήσουμε exploitation αφού έχουμε πάρει πρόσβαση σε ένα όχημα και να πραγματοποιήσουμε κάποιες ενέργειες, όπως να αυξήσουμε το γκάζι, να ανάψουμε τα φλας και να ανοίξουμε τις πόρτες. Έτσι λοιπόν με κάποια προγράμματα και με χαμηλό κόστος εξαρτημάτων, καταφέραμε να πάρουμε πλήρη πρόσβαση σε ένα όχημα.
Happy (car) hacking !!!