UART
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Το UART είναι ένα σειριακό πρωτόκολλο, που σημαίνει ότι μεταφέρει δεδομένα μεταξύ των συστατικών ένα bit τη φορά. Αντίθετα, τα παράλληλα πρωτόκολλα επικοινωνίας μεταδίδουν δεδομένα ταυτόχρονα μέσω πολλαπλών καναλιών. Κοινά σειριακά πρωτόκολλα περιλαμβάνουν τα RS-232, I2C, SPI, CAN, Ethernet, HDMI, PCI Express και USB.
Γενικά, η γραμμή κρατείται υψηλή (σε λογική τιμή 1) ενώ το UART είναι σε κατάσταση αδράνειας. Στη συνέχεια, για να σηματοδοτήσει την έναρξη μιας μεταφοράς δεδομένων, ο πομπός στέλνει ένα bit εκκίνησης στον δέκτη, κατά τη διάρκεια του οποίου το σήμα κρατείται χαμηλό (σε λογική τιμή 0). Στη συνέχεια, ο πομπός στέλνει πέντε έως οκτώ bits δεδομένων που περιέχουν το πραγματικό μήνυμα, ακολουθούμενα από ένα προαιρετικό bit παραλληλίας και ένα ή δύο bits τερματισμού (με λογική τιμή 1), ανάλογα με τη διαμόρφωση. Το bit παραλληλίας, που χρησιμοποιείται για έλεγχο σφαλμάτων, σπάνια παρατηρείται στην πράξη. Το bit τερματισμού (ή bits) σηματοδοτούν το τέλος της μετάδοσης.
Ονομάζουμε την πιο κοινή διαμόρφωση 8N1: οκτώ bits δεδομένων, χωρίς παραλληλία και ένα bit τερματισμού. Για παράδειγμα, αν θέλαμε να στείλουμε τον χαρακτήρα C, ή 0x43 σε ASCII, σε μια διαμόρφωση UART 8N1, θα στέλναμε τα εξής bits: 0 (το bit εκκίνησης); 0, 1, 0, 0, 0, 0, 1, 1 (η τιμή του 0x43 σε δυαδικό), και 0 (το bit τερματισμού).
Εργαλεία υλικού για επικοινωνία με UART:
USB-to-serial adapter
Αντάπτορες με τα τσιπ CP2102 ή PL2303
Πολυλειτουργικό εργαλείο όπως: Bus Pirate, το Adafruit FT232H, το Shikra ή το Attify Badge
Το UART έχει 4 θύρες: TX(Μετάδοση), RX(Λήψη), Vcc(Τάση), και GND(Γείωση). Μπορείτε να βρείτε 4 θύρες με τα γράμματα TX
και RX
γραμμένα στην PCB. Αλλά αν δεν υπάρχει ένδειξη, μπορεί να χρειαστεί να προσπαθήσετε να τις βρείτε μόνοι σας χρησιμοποιώντας ένα πολυμέτρη ή έναν αναλυτή λογικής.
Με ένα πολυμέτρη και τη συσκευή απενεργοποιημένη:
Για να αναγνωρίσετε το GND pin χρησιμοποιήστε τη λειτουργία Δοκιμής Συνεχούς Ρεύματος, τοποθετήστε το πίσω καλώδιο στη γείωση και δοκιμάστε με το κόκκινο μέχρι να ακούσετε ήχο από το πολυμέτρη. Πολλά pins GND μπορούν να βρεθούν στην PCB, οπότε μπορεί να έχετε βρει ή όχι αυτό που ανήκει στο UART.
Για να αναγνωρίσετε τη θύρα VCC, ρυθμίστε τη λειτουργία DC voltage και ρυθμίστε την έως 20 V τάσης. Μαύρος αισθητήρας στη γείωση και κόκκινος αισθητήρας στην πιν. Ενεργοποιήστε τη συσκευή. Αν το πολυμέτρη μετρήσει μια σταθερή τάση είτε 3.3 V είτε 5 V, έχετε βρει το pin Vcc. Αν λάβετε άλλες τάσεις, δοκιμάστε με άλλες θύρες.
Για να αναγνωρίσετε τη θύρα TX, DC voltage έως 20 V τάσης, μαύρος αισθητήρας στη γείωση, και κόκκινος αισθητήρας στην πιν, και ενεργοποιήστε τη συσκευή. Αν βρείτε ότι η τάση κυμαίνεται για μερικά δευτερόλεπτα και στη συνέχεια σταθεροποιείται στην τιμή Vcc, έχετε πιθανώς βρει τη θύρα TX. Αυτό συμβαίνει επειδή κατά την ενεργοποίηση, στέλνει κάποια δεδομένα αποσφαλμάτωσης.
Η θύρα RX θα είναι η πιο κοντινή στις άλλες 3, έχει τη χαμηλότερη διακύμανση τάσης και τη χαμηλότερη συνολική τιμή από όλα τα pins UART.
Μπορείτε να μπερδέψετε τις θύρες TX και RX και τίποτα δεν θα συμβεί, αλλά αν μπερδέψετε τη θύρα GND και τη θύρα VCC μπορεί να καταστρέψετε το κύκλωμα.
Σε ορισμένες συσκευές στόχους, η θύρα UART είναι απενεργοποιημένη από τον κατασκευαστή απενεργοποιώντας το RX ή TX ή ακόμη και και τα δύο. Σε αυτή την περίπτωση, μπορεί να είναι χρήσιμο να παρακολουθήσετε τις συνδέσεις στην πλακέτα κυκλωμάτων και να βρείτε κάποιο σημείο διακοπής. Ένα ισχυρό στοιχείο για την επιβεβαίωση της μη ανίχνευσης του UART και της διακοπής του κυκλώματος είναι να ελέγξετε την εγγύηση της συσκευής. Αν η συσκευή έχει αποσταλεί με κάποια εγγύηση, ο κατασκευαστής αφήνει κάποιες διεπαφές αποσφαλμάτωσης (σε αυτή την περίπτωση, UART) και επομένως, πρέπει να έχει αποσυνδέσει το UART και θα το επανασυνδέσει κατά την αποσφαλμάτωση. Αυτά τα pins διακοπής μπορούν να συνδεθούν με συγκόλληση ή καλώδια jumper.
Ο ευκολότερος τρόπος για να αναγνωρίσετε τον σωστό baud rate είναι να κοιτάξετε την έξοδο του pin TX και να προσπαθήσετε να διαβάσετε τα δεδομένα. Αν τα δεδομένα που λαμβάνετε δεν είναι αναγνώσιμα, αλλάξτε στον επόμενο δυνατό baud rate μέχρι τα δεδομένα να γίνουν αναγνώσιμα. Μπορείτε να χρησιμοποιήσετε έναν USB-to-serial adapter ή μια πολυλειτουργική συσκευή όπως το Bus Pirate για να το κάνετε αυτό, σε συνδυασμό με ένα βοηθητικό σενάριο, όπως το baudrate.py. Οι πιο κοινοί baud rates είναι 9600, 38400, 19200, 57600 και 115200.
Είναι σημαντικό να σημειωθεί ότι σε αυτό το πρωτόκολλο πρέπει να συνδέσετε το TX μιας συσκευής με το RX της άλλης!
Το τσιπ CP210X χρησιμοποιείται σε πολλές πλακέτες πρωτοτύπων όπως το NodeMCU (με esp8266) για σειριακή επικοινωνία. Αυτοί οι αντάπτορες είναι σχετικά οικονομικοί και μπορούν να χρησιμοποιηθούν για να συνδεθούν με τη διεπαφή UART του στόχου. Η συσκευή έχει 5 pins: 5V, GND, RXD, TXD, 3.3V. Βεβαιωθείτε ότι συνδέετε την τάση όπως υποστηρίζεται από τον στόχο για να αποφύγετε οποιαδήποτε ζημιά. Τέλος, συνδέστε το pin RXD του αντάπτορα με το TXD του στόχου και το pin TXD του αντάπτορα με το RXD του στόχου.
Σε περίπτωση που ο αντάπτορας δεν ανιχνεύεται, βεβαιωθείτε ότι οι οδηγοί CP210X είναι εγκατεστημένοι στο σύστημα υποδοχής. Μόλις ο αντάπτορας ανιχνευθεί και συνδεθεί, εργαλεία όπως το picocom, minicom ή screen μπορούν να χρησιμοποιηθούν.
Για να καταγράψετε τις συσκευές που είναι συνδεδεμένες σε συστήματα Linux/MacOS:
Για βασική αλληλεπίδραση με τη διεπαφή UART, χρησιμοποιήστε την παρακάτω εντολή:
Για το minicom, χρησιμοποιήστε την παρακάτω εντολή για να το ρυθμίσετε:
Configure the settings such as baudrate and device name in the Serial port setup
option.
After configuration, use the command minicom
to start get the UART Console.
Σε περίπτωση που δεν είναι διαθέσιμοι προσαρμογείς UART Serial σε USB, μπορεί να χρησιμοποιηθεί το Arduino UNO R3 με μια γρήγορη παραλλαγή. Δεδομένου ότι το Arduino UNO R3 είναι συνήθως διαθέσιμο παντού, αυτό μπορεί να εξοικονομήσει πολύ χρόνο.
Το Arduino UNO R3 έχει έναν προσαρμογέα USB σε Serial ενσωματωμένο στην πλακέτα. Για να αποκτήσετε σύνδεση UART, απλά αποσυνδέστε το τσιπ μικροελεγκτή Atmel 328p από την πλακέτα. Αυτή η παραλλαγή λειτουργεί σε παραλλαγές του Arduino UNO R3 που έχουν το Atmel 328p μη κολλημένο στην πλακέτα (χρησιμοποιείται η SMD έκδοση). Συνδέστε την ακίδα RX του Arduino (Ψηφιακή Ακίδα 0) στην ακίδα TX της διεπαφής UART και την ακίδα TX του Arduino (Ψηφιακή Ακίδα 1) στην ακίδα RX της διεπαφής UART.
Τέλος, συνιστάται να χρησιμοποιήσετε το Arduino IDE για να αποκτήσετε την Σειριακή Κονσόλα. Στην ενότητα tools
του μενού, επιλέξτε την επιλογή Serial Console
και ρυθμίστε την ταχύτητα baud σύμφωνα με τη διεπαφή UART.
Σε αυτό το σενάριο θα καταγράψουμε την επικοινωνία UART του Arduino που στέλνει όλες τις εκτυπώσεις του προγράμματος στο Σειριακό Μόνιτορ.
Η κονσόλα UART παρέχει έναν εξαιρετικό τρόπο για να εργαστείτε με το υποκείμενο firmware σε περιβάλλον εκτέλεσης. Αλλά όταν η πρόσβαση στην κονσόλα UART είναι μόνο για ανάγνωση, μπορεί να εισάγει πολλούς περιορισμούς. Σε πολλές ενσωματωμένες συσκευές, το firmware αποθηκεύεται σε EEPROM και εκτελείται σε επεξεργαστές που έχουν μεταβλητή μνήμη. Επομένως, το firmware διατηρείται μόνο για ανάγνωση, καθώς το αρχικό firmware κατά την κατασκευή είναι μέσα στην EEPROM και οποιαδήποτε νέα αρχεία θα χαθούν λόγω της μεταβλητής μνήμης. Επομένως, η εξαγωγή του firmware είναι μια πολύτιμη προσπάθεια κατά την εργασία με ενσωματωμένα firmwares.
Υπάρχουν πολλοί τρόποι για να το κάνετε αυτό και η ενότητα SPI καλύπτει μεθόδους για την εξαγωγή firmware απευθείας από την EEPROM με διάφορες συσκευές. Ωστόσο, συνιστάται πρώτα να δοκιμάσετε την εξαγωγή firmware με UART, καθώς η εξαγωγή firmware με φυσικές συσκευές και εξωτερικές αλληλεπιδράσεις μπορεί να είναι επικίνδυνη.
Η εξαγωγή firmware από την κονσόλα UART απαιτεί πρώτα την πρόσβαση στους bootloaders. Πολλοί δημοφιλείς προμηθευτές χρησιμοποιούν το uboot (Universal Bootloader) ως bootloader τους για να φορτώσουν το Linux. Επομένως, η πρόσβαση στο uboot είναι απαραίτητη.
Για να αποκτήσετε πρόσβαση στον bootloader, συνδέστε την θύρα UART στον υπολογιστή και χρησιμοποιήστε οποιοδήποτε από τα εργαλεία Serial Console και κρατήστε την τροφοδοσία της συσκευής αποσυνδεδεμένη. Μόλις η ρύθμιση είναι έτοιμη, πατήστε το πλήκτρο Enter και κρατήστε το. Τέλος, συνδέστε την τροφοδοσία στη συσκευή και αφήστε την να εκκινήσει.
Κάνοντας αυτό θα διακόψει το uboot από το φόρτωμα και θα παρέχει ένα μενού. Συνιστάται να κατανοήσετε τις εντολές του uboot και να χρησιμοποιήσετε το μενού βοήθειας για να τις καταγράψετε. Αυτό μπορεί να είναι η εντολή help
. Δεδομένου ότι διαφορετικοί προμηθευτές χρησιμοποιούν διαφορετικές ρυθμίσεις, είναι απαραίτητο να κατανοήσετε τον καθένα ξεχωριστά.
Συνήθως, η εντολή για την εξαγωγή του firmware είναι:
που σημαίνει "dump μνήμης". Αυτό θα εκτυπώσει τη μνήμη (Περιεχόμενο EEPROM) στην οθόνη. Συνιστάται να καταγράψετε την έξοδο της Σειριακής Κονσόλας πριν ξεκινήσετε τη διαδικασία για να καταγράψετε το dump μνήμης.
Τέλος, απλώς αφαιρέστε όλα τα περιττά δεδομένα από το αρχείο καταγραφής και αποθηκεύστε το αρχείο ως filename.rom
και χρησιμοποιήστε το binwalk για να εξαγάγετε τα περιεχόμενα:
Αυτό θα παραθέσει τα πιθανά περιεχόμενα από το EEPROM σύμφωνα με τις υπογραφές που βρέθηκαν στο αρχείο hex.
Ωστόσο, είναι απαραίτητο να σημειωθεί ότι δεν είναι πάντα η περίπτωση ότι το uboot είναι ξεκλείδωτο ακόμη και αν χρησιμοποιείται. Αν το Enter Key δεν κάνει τίποτα, ελέγξτε για διαφορετικά πλήκτρα όπως το Space Key, κ.λπ. Αν ο bootloader είναι κλειδωμένος και δεν διακόπτεται, αυτή η μέθοδος δεν θα λειτουργήσει. Για να ελέγξετε αν το uboot είναι ο bootloader για τη συσκευή, ελέγξτε την έξοδο στην UART Console κατά την εκκίνηση της συσκευής. Μπορεί να αναφέρει το uboot κατά την εκκίνηση.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)