# UART {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} ## Podstawowe informacje UART to protok贸艂 szeregowy, co oznacza, 偶e przesy艂a dane mi臋dzy komponentami jeden bit na raz. W przeciwie艅stwie do tego, protoko艂y komunikacji r贸wnoleg艂ej przesy艂aj膮 dane jednocze艣nie przez wiele kana艂贸w. Powszechne protoko艂y szeregowe to RS-232, I2C, SPI, CAN, Ethernet, HDMI, PCI Express i USB. Og贸lnie linia jest utrzymywana w stanie wysokim (na warto艣ci logicznej 1), gdy UART jest w stanie bezczynno艣ci. Nast臋pnie, aby sygnalizowa膰 pocz膮tek transferu danych, nadajnik wysy艂a bit startowy do odbiornika, podczas kt贸rego sygna艂 jest utrzymywany w stanie niskim (na warto艣ci logicznej 0). Nast臋pnie nadajnik wysy艂a od pi臋ciu do o艣miu bit贸w danych zawieraj膮cych rzeczywist膮 wiadomo艣膰, po czym nast臋puje opcjonalny bit parzysto艣ci i jeden lub dwa bity stopu (z warto艣ci膮 logiczn膮 1), w zale偶no艣ci od konfiguracji. Bit parzysto艣ci, u偶ywany do sprawdzania b艂臋d贸w, rzadko wyst臋puje w praktyce. Bit stopu (lub bity) oznaczaj膮 koniec transmisji. Najcz臋艣ciej spotykan膮 konfiguracj臋 nazywamy 8N1: osiem bit贸w danych, brak parzysto艣ci i jeden bit stopu. Na przyk艂ad, je艣li chcieliby艣my wys艂a膰 znak C, czyli 0x43 w ASCII, w konfiguracji UART 8N1, wys艂aliby艣my nast臋puj膮ce bity: 0 (bit startowy); 0, 1, 0, 0, 0, 0, 1, 1 (warto艣膰 0x43 w systemie binarnym) i 0 (bit stopu). ![](<../../.gitbook/assets/image (764).png>) Narz臋dzia sprz臋towe do komunikacji z UART: * Adapter USB na szeregowy * Adaptery z chipami CP2102 lub PL2303 * Narz臋dzie wielofunkcyjne, takie jak: Bus Pirate, Adafruit FT232H, Shikra lub Attify Badge ### Identyfikacja port贸w UART UART ma 4 porty: **TX**(Transmit), **RX**(Receive), **Vcc**(Voltage) i **GND**(Ground). Mo偶esz znale藕膰 4 porty z literami **`TX`** i **`RX`** **napisanymi** na PCB. Ale je艣li nie ma 偶adnych wskaz贸wek, mo偶esz spr贸bowa膰 znale藕膰 je samodzielnie, u偶ywaj膮c **multimetru** lub **analizatora logicznego**. Z u偶yciem **multimetru** i zasilania urz膮dzenia wy艂膮czonego: * Aby zidentyfikowa膰 pin **GND**, u偶yj trybu **Testu Ci膮g艂o艣ci**, umie艣膰 czarny przew贸d w ziemi i testuj czerwonym, a偶 us艂yszysz d藕wi臋k z multimetru. Na PCB mo偶na znale藕膰 kilka pin贸w GND, wi臋c mo偶esz znale藕膰 lub nie ten, kt贸ry nale偶y do UART. * Aby zidentyfikowa膰 port **VCC**, ustaw tryb **DC voltage** i ustaw go na 20 V. Czarny przew贸d na ziemi, a czerwony na pinie. W艂膮cz urz膮dzenie. Je艣li multimetr mierzy sta艂e napi臋cie 3.3 V lub 5 V, znalaz艂e艣 pin Vcc. Je艣li otrzymasz inne napi臋cia, spr贸buj z innymi portami. * Aby zidentyfikowa膰 port **TX**, ustaw tryb **DC voltage** na 20 V, czarny przew贸d na ziemi, a czerwony na pinie, i w艂膮cz urz膮dzenie. Je艣li zauwa偶ysz, 偶e napi臋cie waha si臋 przez kilka sekund, a nast臋pnie stabilizuje si臋 na warto艣ci Vcc, najprawdopodobniej znalaz艂e艣 port TX. Dzieje si臋 tak, poniewa偶 podczas w艂膮czania wysy艂a pewne dane debugowania. * Port **RX** b臋dzie najbli偶szy pozosta艂ym 3, ma najmniejsze wahania napi臋cia i najni偶sz膮 og贸ln膮 warto艣膰 ze wszystkich pin贸w UART. Mo偶esz pomyli膰 porty TX i RX i nic si臋 nie stanie, ale je艣li pomylisz porty GND i VCC, mo偶esz uszkodzi膰 obw贸d. W niekt贸rych urz膮dzeniach docelowych port UART jest wy艂膮czany przez producenta poprzez wy艂膮czenie RX lub TX lub nawet obu. W takim przypadku mo偶e by膰 pomocne prze艣ledzenie po艂膮cze艅 na p艂ytce drukowanej i znalezienie punktu wyj艣cia. Silnym wskazaniem na potwierdzenie braku wykrycia UART i przerwania obwodu jest sprawdzenie gwarancji urz膮dzenia. Je艣li urz膮dzenie zosta艂o wys艂ane z jak膮艣 gwarancj膮, producent pozostawia pewne interfejsy debugowania (w tym przypadku UART) i dlatego musia艂 od艂膮czy膰 UART, a nast臋pnie ponownie go pod艂膮czy膰 podczas debugowania. Te piny wyj艣ciowe mo偶na po艂膮czy膰 przez lutowanie lub przewody zworkowe. ### Identyfikacja pr臋dko艣ci baud UART Naj艂atwiejszym sposobem na zidentyfikowanie poprawnej pr臋dko艣ci baud jest spojrzenie na **wyj艣cie pinu TX i pr贸ba odczytania danych**. Je艣li dane, kt贸re otrzymujesz, nie s膮 czytelne, prze艂膮cz si臋 na nast臋pn膮 mo偶liw膮 pr臋dko艣膰 baud, a偶 dane stan膮 si臋 czytelne. Mo偶esz u偶y膰 adaptera USB na szeregowy lub urz膮dzenia wielofunkcyjnego, takiego jak Bus Pirate, aby to zrobi膰, w po艂膮czeniu z pomocnym skryptem, takim jak [baudrate.py](https://github.com/devttys0/baudrate/). Najcz臋stsze pr臋dko艣ci baud to 9600, 38400, 19200, 57600 i 115200. {% hint style="danger" %} Wa偶ne jest, aby pami臋ta膰, 偶e w tym protokole musisz po艂膮czy膰 TX jednego urz膮dzenia z RX drugiego! {% endhint %} ## Adapter CP210X UART do TTY Chip CP210X jest u偶ywany w wielu p艂ytkach prototypowych, takich jak NodeMCU (z esp8266) do komunikacji szeregowej. Te adaptery s膮 stosunkowo niedrogie i mog膮 by膰 u偶ywane do 艂膮czenia z interfejsem UART urz膮dzenia docelowego. Urz膮dzenie ma 5 pin贸w: 5V, GND, RXD, TXD, 3.3V. Upewnij si臋, 偶e pod艂膮czasz napi臋cie zgodnie z wymaganiami urz膮dzenia docelowego, aby unikn膮膰 uszkodze艅. Na koniec pod艂膮cz pin RXD adaptera do TXD urz膮dzenia docelowego i pin TXD adaptera do RXD urz膮dzenia docelowego. W przypadku, gdy adapter nie jest wykrywany, upewnij si臋, 偶e sterowniki CP210X s膮 zainstalowane w systemie gospodarza. Gdy adapter zostanie wykryty i pod艂膮czony, mo偶na u偶ywa膰 narz臋dzi takich jak picocom, minicom lub screen. Aby wylistowa膰 urz膮dzenia pod艂膮czone do system贸w Linux/MacOS: ``` ls /dev/ ``` Aby uzyska膰 podstawow膮 interakcj臋 z interfejsem UART, u偶yj nast臋puj膮cego polecenia: ``` picocom /dev/ --baud ``` Aby skonfigurowa膰 minicom, u偶yj nast臋puj膮cego polecenia: ``` minicom -s ``` Skonfiguruj ustawienia, takie jak baudrate i nazwa urz膮dzenia w opcji `Serial port setup`. Po skonfigurowaniu u偶yj polecenia `minicom`, aby uruchomi膰 konsol臋 UART. ## UART przez Arduino UNO R3 (wymienny chip Atmel 328p) W przypadku braku adapter贸w UART Serial do USB, Arduino UNO R3 mo偶na wykorzysta膰 w szybkim hacku. Poniewa偶 Arduino UNO R3 jest zazwyczaj dost臋pne wsz臋dzie, mo偶e to zaoszcz臋dzi膰 du偶o czasu. Arduino UNO R3 ma wbudowany adapter USB do Serial na samej p艂ycie. Aby uzyska膰 po艂膮czenie UART, wystarczy wyj膮膰 chip mikrokontrolera Atmel 328p z p艂yty. Ten hack dzia艂a na wariantach Arduino UNO R3, kt贸re maj膮 Atmel 328p niewlutowany na p艂ycie (u偶ywana jest wersja SMD). Pod艂膮cz pin RX Arduino (Pin Cyfrowy 0) do pinu TX interfejsu UART i pin TX Arduino (Pin Cyfrowy 1) do pinu RX interfejsu UART. Na koniec zaleca si臋 u偶ycie Arduino IDE, aby uzyska膰 konsol臋 szeregow膮. W sekcji `tools` w menu wybierz opcj臋 `Serial Console` i ustaw pr臋dko艣膰 baud zgodnie z interfejsem UART. ## Bus Pirate W tym scenariuszu zamierzamy pods艂uchiwa膰 komunikacj臋 UART Arduino, kt贸re wysy艂a wszystkie wydruki programu do Monitorowania Szeregowego. ```bash # Check the modes UART>m 1. HiZ 2. 1-WIRE 3. UART 4. I2C 5. SPI 6. 2WIRE 7. 3WIRE 8. KEYB 9. LCD 10. PIC 11. DIO x. exit(without change) # Select UART (1)>3 Set serial port speed: (bps) 1. 300 2. 1200 3. 2400 4. 4800 5. 9600 6. 19200 7. 38400 8. 57600 9. 115200 10. BRG raw value # Select the speed the communication is occurring on (you BF all this until you find readable things) # Or you could later use the macro (4) to try to find the speed (1)>5 Data bits and parity: 1. 8, NONE *default 2. 8, EVEN 3. 8, ODD 4. 9, NONE # From now on pulse enter for default (1)> Stop bits: 1. 1 *default 2. 2 (1)> Receive polarity: 1. Idle 1 *default 2. Idle 0 (1)> Select output type: 1. Open drain (H=Hi-Z, L=GND) 2. Normal (H=3.3V, L=GND) (1)> Clutch disengaged!!! To finish setup, start up the power supplies with command 'W' Ready # Start UART>W POWER SUPPLIES ON Clutch engaged!!! # Use macro (2) to read the data of the bus (live monitor) UART>(2) Raw UART input Any key to exit Escritura inicial completada: AAA Hi Dreg! AAA waiting a few secs to repeat.... ``` ## Dumping Firmware with UART Console UART Console zapewnia doskona艂y spos贸b na prac臋 z podstawowym oprogramowaniem w 艣rodowisku uruchomieniowym. Jednak gdy dost臋p do UART Console jest tylko do odczytu, mo偶e to wprowadza膰 wiele ogranicze艅. W wielu urz膮dzeniach wbudowanych oprogramowanie jest przechowywane w EEPROM i wykonywane w procesorach, kt贸re maj膮 pami臋膰 ulotn膮. Dlatego oprogramowanie jest utrzymywane w trybie tylko do odczytu, poniewa偶 oryginalne oprogramowanie podczas produkcji znajduje si臋 wewn膮trz EEPROM, a wszelkie nowe pliki mog艂yby zosta膰 utracone z powodu pami臋ci ulotnej. Dlatego zrzut oprogramowania jest cennym wysi艂kiem podczas pracy z wbudowanymi oprogramowaniami. Istnieje wiele sposob贸w, aby to zrobi膰, a sekcja SPI obejmuje metody ekstrakcji oprogramowania bezpo艣rednio z EEPROM za pomoc膮 r贸偶nych urz膮dze艅. Chocia偶 zaleca si臋 najpierw spr贸bowa膰 zrzutu oprogramowania za pomoc膮 UART, poniewa偶 zrzut oprogramowania za pomoc膮 urz膮dze艅 fizycznych i interakcji zewn臋trznych mo偶e by膰 ryzykowny. Zrzut oprogramowania z UART Console wymaga najpierw uzyskania dost臋pu do bootloader贸w. Wiele popularnych dostawc贸w korzysta z uboot (Universal Bootloader) jako swojego bootloadera do 艂adowania Linuksa. Dlatego uzyskanie dost臋pu do uboot jest konieczne. Aby uzyska膰 dost臋p do bootloadera, pod艂膮cz port UART do komputera i u偶yj dowolnego narz臋dzia Serial Console, a zasilanie urz膮dzenia powinno by膰 od艂膮czone. Gdy konfiguracja jest gotowa, naci艣nij klawisz Enter i przytrzymaj go. Na koniec pod艂膮cz zasilanie do urz膮dzenia i pozw贸l mu si臋 uruchomi膰. Zrobienie tego przerwie 艂adowanie uboot i wy艣wietli menu. Zaleca si臋 zrozumienie polece艅 uboot i u偶ycie menu pomocy do ich wylistowania. Mo偶e to by膰 polecenie `help`. Poniewa偶 r贸偶ni dostawcy u偶ywaj膮 r贸偶nych konfiguracji, konieczne jest zrozumienie ka偶dej z nich osobno. Zazwyczaj polecenie do zrzutu oprogramowania to: ``` md ``` kt贸re oznacza "zrzut pami臋ci". To zrzuci pami臋膰 (zawarto艣膰 EEPROM) na ekran. Zaleca si臋 zapisanie wyj艣cia z konsoli szeregowej przed rozpocz臋ciem procedury, aby uchwyci膰 zrzut pami臋ci. Na koniec wystarczy usun膮膰 wszystkie niepotrzebne dane z pliku dziennika i zapisa膰 plik jako `filename.rom`, a nast臋pnie u偶y膰 binwalk do wyodr臋bnienia zawarto艣ci: ``` binwalk -e ``` To b臋dzie lista mo偶liwych zawarto艣ci z EEPROM zgodnie z podpisami znalezionymi w pliku hex. Nale偶y jednak zauwa偶y膰, 偶e nie zawsze uboot jest odblokowany, nawet je艣li jest u偶ywany. Je艣li klawisz Enter nie dzia艂a, sprawd藕 inne klawisze, takie jak klawisz Spacji itp. Je艣li bootloader jest zablokowany i nie zostanie przerwany, ta metoda nie zadzia艂a. Aby sprawdzi膰, czy uboot jest bootloaderem dla urz膮dzenia, sprawd藕 wyj艣cie na konsoli UART podczas uruchamiania urz膮dzenia. Mo偶e wspomina膰 o uboot podczas uruchamiania. {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}