W zaczynającej się serii artykułów postaramy się omówić proces inżynierii wstecznej routera. Będzie to Huawei HG533. Pierwszy etap tego procesu polegać będzie na analizie urządzenia i poszukiwaniu portów szeregowych, które często pozostawiane są w urządzeniu do debugowania i wsparcia technicznego na etapie projektowania i produkcji.
Jakkolwiek celem inżynierii wstecznej będzie router to te same zasady zastosować można do dowolnego innego urządzenia z wbudowanym systemem, a jest ich w naszych domach coraz więcej. Wszystkie relatywnie skomplikowane urządzenia: drukarki, kamery IP itp będą miały embeddowany system, najczęściej jakiś Linux. Wiele z nich wyposażone będzie w porty szeregowe, które umożliwią "dobranie się" do systemu i komunikację z nim.
Poszukiwanie portu szeregowego
Większość portów UART w urządzeniach komercyjnych ma od 4 do 6 pinów, zazwyczaj położonych blisko jednego z układów scalonych, a czasami nawet opisane są na PCB. Jako że nie są one przewidziane do wykorzystania przez użytkownika w gotowym urządzeniu, zazwyczaj nie ma w nich wlutowanych pinów.
W analizowanym urządzeniu uwagę przyciągają dwa nieobsadzone złącza (były one puste do momentu, gdy autor artykułu nie przylutował do nich pinów, widocznych na zdjęciu:
Analizowany układ wyposażony jest, jak się wydaje, w dwa porty szeregowe - na pokładzie są dwa układy scalone wyposażone w interfejs UART. Po prześledzeniu ich lokalizacji na PCB oraz połączeń ścieżek pomiędzy nimi a głównym procesorem systemu, możemy odnaleźć, który z nich jest podłączony do CPU/SoC - to on najpewniej będzie dla nas najbardziej wartościowy i będzie transferował najciekawsze dane. Spróbujmy się do niego podłączyć i zobaczmy co każdy z portów ma nam do zaoferowania.
Identyfikacja niewykorzystanych pinów
Więc mamy dwa rządki pinów, które - na pierwszy rzut oka - mogą nam dać dostęp do portów szeregowych. Pierwszym co musimy zrobić, to sprawdzenie które z pinów tych złącz nie są do niczego podłączone i są, zasadniczo, bezużyteczne. Aby to zrobić stosujemy prostą sztuczkę - prześwietlamy płytkę latarką. Wystarczy że poświecimy na PCB od tyłu i popatrzymy na nią od góry. Wtedy powinniśmy zobaczyć coś takiego:
Można wtedy łatwo zidentyfikować czy któraś z warstw PCB ma jakieś połączenie z polem lutowniczym złącza. W przypadku naszej płytki, wygląda to następująco (od lewej):
* Podłączone do czegoś (widać pojedynczą ścieżkę na godzinie drugiej).
* Niepodłączony.
* Podłączony do wylewki lub bardzo grubej ścieżki - z pewnością jest to jeden z pinów zasilania, masy (GND) lub VCC.
* Podłączony z czterech stron, najpewniej jest to drugi pin zasilania - nie ma żadnych sensownych powodów, aby pin w UARTcie miał podłączenie do czterech różnych ścieżek. Najpewniej jest to więc połączenie z inną warstwą wylewki (z dodaną tzw. termalką, czyli ułożeniem miedzi na laminacie, które pozwala lepiej wlutować się w pin potrzebne jest mniej ciepła do rozgrzania pola - przyp.red.).
* Kolejny pin do czegoś podłączony.
Lutowanie złącza do pól dla łatwiejszego dostępu
Pola lutownicze widoczne na zdjęciu są dwoma portami szeregowymi. Jeśli chcemy się z nimi skontaktować musimy dolutować do nich np. goldpiny, jednakże nie jest to takie proste. Jakkolwiek są one polami dla elementów przewlekanych, to dziurka w PCB wypełniona jest twardym i trudnotopliwym lutowiem, więc ciężko wlutować tam element THT.
W przypadku pierwszego złącza autor zdecydował się przylutować piny do górnej strony złącza. W przypadku drugiego portu przed lutowaniem postanowił przewiercić malutkim wiertłem pole lutownicze, aby móc umieścić tam element przewlekany. Do tego celu wykorzystany został Dremel (ale nada się każda inna wiertarka szybkoobrotowa - przyp.red.) i bardzo cieniutkie wiertło. Rozwiązanie sprawdziło się doskonale, jak widać na zdjęciu.
Identyfikacja poszczególnych pinów i ich funkcji
W analizowanym routerze mamy zatem dwa porty, a w każdym 4 wykorzystane piny. Nadal nie wiemy, czy porty te są wykorzystane i aktywne, jakim protokołęm komunikuje się system etc. Aby to było możliwie, musimy zidentyfikować funkcyjne porty interfejsu UART.
Standard tego protokołu identyfikuje 6 rodzajów pinów w złączu:
* Tx - pin nadawania, łączący się z pinem Rx po naszej stronie.
* Rx - pin odbioru, łączący się z pinem Tx po naszej stronie.
* Masę - GND.
* Zasilanie - VCC.
* CTS - pin kontroli transmisji.
* DTR - drugi pin kontroli transmisji.
Ostatnie dwa piny często są nieużywane i nie są konieczne do transmisji. To co potrzebujemy najbardziej to Tx i Rx.
Dodatkowo wiemy, że piny Tx i Rx są domyślnie podciągane do zasilania. Za podciągania pinu nadawania odpowiada kontroler interfejsu, co oznacza, że jeśli nie jest on podłączony to napięcie na pinie będzie pływać.
Musimy zatem zidentyfikować trzy piny; to minimum do zestawienia interfejsu: Masę, Tx oraz Rx.
Dwa z pinów już udało nam się zidentyfikować jako piny zasilania (VCC i GND) - który jest który łatwo możemy rozpoznać z wykorzystaniem multimetru (na opcji pomiaru ciągłości do innego, znanego punktu masy/zasilania lub na opcji woltomierza mierząc napięcie stałe pomiędzy tymi punktami).
Aby rozpoznać Rx i Tx korzystamy z powyższych wskazówek. Napięcie na pinie Tx będzie podciągnięte do zasilania przez transmiter w urządzeniu. Napięcie na pinie odbiorczym - Rx - będzie pływać do momentu, w którym do układu podłączymy interfejs od naszej strony.
Mamy teraz dostatecznie dużo informacji, aby móc rozważać podłączenie interfejsu do systemu. Wykorzystamy w tym celu konwerter USB-UART, który podłączmy do zidentyfikowanych linii Tx, Rx i masy. Nie możemy podłączać pinów losowo, bo może to uszkodzić któreś z urządzeń, więc dobrze zastanówmy się i rozumiejmy co robimy.
Jeśli chcemy lepiej rozpoznać funkcje pinów, to możemy wykorzystać analizator logiczny lub oscyloskop. Wpinamy go w pin jaki wstępnie zidentyfikowaliśmy jako nadawczy, gdzie powinniśmy zobaczyć tego rodzaju transmisję:
Po sprawdzeniu poszczególnych pinów oscyloskopem, wiemy już, że:
* VCC to 3,3 V względem pinu GND. W naszym przypadku są to piny 2 i 3 odpowiednio.
* Tx jest tam, gdzie się spodziewaliśmy, dodatkowo widać tam transmisję.
* Rx jest na ostatnim pinie, jaki jest używany. Napięcie tam oscyluje wokół zera, ponieważ nie podłączyliśmy jeszcze nadajnika z naszej strony.
Teraz wiemy już na pewno jaki jest rozkład pinów w złączu, co sprawia, że możemy podłączyć już interfejs do komputera. Jednakże musimy odpowiedzieć sobie teraz na kolejne pytanie - jakie są parametry transmisji. Nie musimy się bawić w "zgadnij baudrate", nie mówiąc już innych detalach, jak znak końca linii, kontrola parzystości etc, oczywiście jeśli mamy analizator logiczny z możliwością analizy interfejsów. Wtedy urządzenie od razu pokaże nam jakie dane są poprawne.
Na zdjęciu poniżej widzimy analizę transmisji dla jednego z ustawień. Widzimy, że w pewnym momencie w transmisji pojawia się ciąg znaków: \n\r\n\rU-Boot 1.1.3 (Aug...) - a to już coś nam mówi, m.in. to, że trafiliśmy w poprawne ustawienia.
Jak mamy już pinout i baudrate układu, możemy rozpocząć komunikację z urządzeniem.
Podłączanie portu szeregowego
Teraz jak wiemy już wszystko o układzie od strony sprzętowej, możemy zacząć gadać. Łączymy się z interfejsem w routerze dowolnym mostkiem USB-UART. Tak w przypadku autora wygląda gotowy "do rozmowy" system, wraz z wpiętym oscyloskopem do monitorowania transmisji:
Teraz możemy uruchomić terminal na komputerze i popatrzeć co nadaje układ. Podstawowy interfejs UART zaczyna wyrzucać nam całkiem przydatne informacje. Autor do podłączenia się do interfejsu wykorzystał następujące komendy pod Linuksem:
Co widzimy podczas ładowania się systemu na routerze? Takie coś:
‘Command line interface’?? No to jesteśmy w domu! Po naciśnięciu 4 dostajemy się do linii komend w bootloaderze systemu operacyjnego linuksa.
Jeśli naciśniemy 3 to zobaczymy, jak system operacyjny ładuje się, a potem zobaczymy komunikat witający nas w systemie i proszący o zalogowanie się. Jeśli developerzy zadali sobie trochę trudu to mogli zmienić domyślne hasło logowania, ale w tym przypadku tak nie było i możemy zalogować się do systemu (z prawem roota!) wpisując użytkownika admin i hasło admin. W przypadku innych urządzeń dane te mogą być inne, ale często są to domyślne dane, których spis znaleźć można w sieci. Po wpisaniu danych logowania, możemy rozpocząć buszowanie w systemie:
W naszym routerze powłoką jest BusyBox - podobny do normalnego Linuxowego shell, który omówimy dokładniej w kolejnej części. Najważniejsze, że uzyskaliśmy do niego dostęp i mamy uprawnienia roota.
Kolejne kroku
Mając dostęp do linii komend BusyBoxa możemy zacząć grzebać w oprogramowaniu. Zależnie od tego jak wszystko zostało w systemie rozwiązane możemu uzyskać dostęp do haseł, o ile są zapisane w pliku tekstowym, certyfikatów TLS, różnych prywatnych API, jeśli nie są one zabezpieczone etc.
W kolejnej części artykułu skupimy się bardziej na inżynierii wstecznej oprogramowania w systemie routera, tym jakie różne są tryby bootowania OSa na urządzeniu, jak robić zrzuty pamięci etc. Wszystko to możemy zrobić mając tak bezpośredni dostęp do firmware urządzenia.
Źródło: http://jcjc-dev.com/2016/04/08/reversing-huawei-router-1-find-uart/
Jakkolwiek celem inżynierii wstecznej będzie router to te same zasady zastosować można do dowolnego innego urządzenia z wbudowanym systemem, a jest ich w naszych domach coraz więcej. Wszystkie relatywnie skomplikowane urządzenia: drukarki, kamery IP itp będą miały embeddowany system, najczęściej jakiś Linux. Wiele z nich wyposażone będzie w porty szeregowe, które umożliwią "dobranie się" do systemu i komunikację z nim.
Poszukiwanie portu szeregowego
Większość portów UART w urządzeniach komercyjnych ma od 4 do 6 pinów, zazwyczaj położonych blisko jednego z układów scalonych, a czasami nawet opisane są na PCB. Jako że nie są one przewidziane do wykorzystania przez użytkownika w gotowym urządzeniu, zazwyczaj nie ma w nich wlutowanych pinów.
W analizowanym urządzeniu uwagę przyciągają dwa nieobsadzone złącza (były one puste do momentu, gdy autor artykułu nie przylutował do nich pinów, widocznych na zdjęciu:
Analizowany układ wyposażony jest, jak się wydaje, w dwa porty szeregowe - na pokładzie są dwa układy scalone wyposażone w interfejs UART. Po prześledzeniu ich lokalizacji na PCB oraz połączeń ścieżek pomiędzy nimi a głównym procesorem systemu, możemy odnaleźć, który z nich jest podłączony do CPU/SoC - to on najpewniej będzie dla nas najbardziej wartościowy i będzie transferował najciekawsze dane. Spróbujmy się do niego podłączyć i zobaczmy co każdy z portów ma nam do zaoferowania.
Identyfikacja niewykorzystanych pinów
Więc mamy dwa rządki pinów, które - na pierwszy rzut oka - mogą nam dać dostęp do portów szeregowych. Pierwszym co musimy zrobić, to sprawdzenie które z pinów tych złącz nie są do niczego podłączone i są, zasadniczo, bezużyteczne. Aby to zrobić stosujemy prostą sztuczkę - prześwietlamy płytkę latarką. Wystarczy że poświecimy na PCB od tyłu i popatrzymy na nią od góry. Wtedy powinniśmy zobaczyć coś takiego:
Można wtedy łatwo zidentyfikować czy któraś z warstw PCB ma jakieś połączenie z polem lutowniczym złącza. W przypadku naszej płytki, wygląda to następująco (od lewej):
* Podłączone do czegoś (widać pojedynczą ścieżkę na godzinie drugiej).
* Niepodłączony.
* Podłączony do wylewki lub bardzo grubej ścieżki - z pewnością jest to jeden z pinów zasilania, masy (GND) lub VCC.
* Podłączony z czterech stron, najpewniej jest to drugi pin zasilania - nie ma żadnych sensownych powodów, aby pin w UARTcie miał podłączenie do czterech różnych ścieżek. Najpewniej jest to więc połączenie z inną warstwą wylewki (z dodaną tzw. termalką, czyli ułożeniem miedzi na laminacie, które pozwala lepiej wlutować się w pin potrzebne jest mniej ciepła do rozgrzania pola - przyp.red.).
* Kolejny pin do czegoś podłączony.
Lutowanie złącza do pól dla łatwiejszego dostępu
Pola lutownicze widoczne na zdjęciu są dwoma portami szeregowymi. Jeśli chcemy się z nimi skontaktować musimy dolutować do nich np. goldpiny, jednakże nie jest to takie proste. Jakkolwiek są one polami dla elementów przewlekanych, to dziurka w PCB wypełniona jest twardym i trudnotopliwym lutowiem, więc ciężko wlutować tam element THT.
W przypadku pierwszego złącza autor zdecydował się przylutować piny do górnej strony złącza. W przypadku drugiego portu przed lutowaniem postanowił przewiercić malutkim wiertłem pole lutownicze, aby móc umieścić tam element przewlekany. Do tego celu wykorzystany został Dremel (ale nada się każda inna wiertarka szybkoobrotowa - przyp.red.) i bardzo cieniutkie wiertło. Rozwiązanie sprawdziło się doskonale, jak widać na zdjęciu.
Identyfikacja poszczególnych pinów i ich funkcji
W analizowanym routerze mamy zatem dwa porty, a w każdym 4 wykorzystane piny. Nadal nie wiemy, czy porty te są wykorzystane i aktywne, jakim protokołęm komunikuje się system etc. Aby to było możliwie, musimy zidentyfikować funkcyjne porty interfejsu UART.
Standard tego protokołu identyfikuje 6 rodzajów pinów w złączu:
* Tx - pin nadawania, łączący się z pinem Rx po naszej stronie.
* Rx - pin odbioru, łączący się z pinem Tx po naszej stronie.
* Masę - GND.
* Zasilanie - VCC.
* CTS - pin kontroli transmisji.
* DTR - drugi pin kontroli transmisji.
Ostatnie dwa piny często są nieużywane i nie są konieczne do transmisji. To co potrzebujemy najbardziej to Tx i Rx.
Dodatkowo wiemy, że piny Tx i Rx są domyślnie podciągane do zasilania. Za podciągania pinu nadawania odpowiada kontroler interfejsu, co oznacza, że jeśli nie jest on podłączony to napięcie na pinie będzie pływać.
Musimy zatem zidentyfikować trzy piny; to minimum do zestawienia interfejsu: Masę, Tx oraz Rx.
Dwa z pinów już udało nam się zidentyfikować jako piny zasilania (VCC i GND) - który jest który łatwo możemy rozpoznać z wykorzystaniem multimetru (na opcji pomiaru ciągłości do innego, znanego punktu masy/zasilania lub na opcji woltomierza mierząc napięcie stałe pomiędzy tymi punktami).
Aby rozpoznać Rx i Tx korzystamy z powyższych wskazówek. Napięcie na pinie Tx będzie podciągnięte do zasilania przez transmiter w urządzeniu. Napięcie na pinie odbiorczym - Rx - będzie pływać do momentu, w którym do układu podłączymy interfejs od naszej strony.
Mamy teraz dostatecznie dużo informacji, aby móc rozważać podłączenie interfejsu do systemu. Wykorzystamy w tym celu konwerter USB-UART, który podłączmy do zidentyfikowanych linii Tx, Rx i masy. Nie możemy podłączać pinów losowo, bo może to uszkodzić któreś z urządzeń, więc dobrze zastanówmy się i rozumiejmy co robimy.
Jeśli chcemy lepiej rozpoznać funkcje pinów, to możemy wykorzystać analizator logiczny lub oscyloskop. Wpinamy go w pin jaki wstępnie zidentyfikowaliśmy jako nadawczy, gdzie powinniśmy zobaczyć tego rodzaju transmisję:
Po sprawdzeniu poszczególnych pinów oscyloskopem, wiemy już, że:
* VCC to 3,3 V względem pinu GND. W naszym przypadku są to piny 2 i 3 odpowiednio.
* Tx jest tam, gdzie się spodziewaliśmy, dodatkowo widać tam transmisję.
* Rx jest na ostatnim pinie, jaki jest używany. Napięcie tam oscyluje wokół zera, ponieważ nie podłączyliśmy jeszcze nadajnika z naszej strony.
Teraz wiemy już na pewno jaki jest rozkład pinów w złączu, co sprawia, że możemy podłączyć już interfejs do komputera. Jednakże musimy odpowiedzieć sobie teraz na kolejne pytanie - jakie są parametry transmisji. Nie musimy się bawić w "zgadnij baudrate", nie mówiąc już innych detalach, jak znak końca linii, kontrola parzystości etc, oczywiście jeśli mamy analizator logiczny z możliwością analizy interfejsów. Wtedy urządzenie od razu pokaże nam jakie dane są poprawne.
Na zdjęciu poniżej widzimy analizę transmisji dla jednego z ustawień. Widzimy, że w pewnym momencie w transmisji pojawia się ciąg znaków: \n\r\n\rU-Boot 1.1.3 (Aug...) - a to już coś nam mówi, m.in. to, że trafiliśmy w poprawne ustawienia.
Jak mamy już pinout i baudrate układu, możemy rozpocząć komunikację z urządzeniem.
Podłączanie portu szeregowego
Teraz jak wiemy już wszystko o układzie od strony sprzętowej, możemy zacząć gadać. Łączymy się z interfejsem w routerze dowolnym mostkiem USB-UART. Tak w przypadku autora wygląda gotowy "do rozmowy" system, wraz z wpiętym oscyloskopem do monitorowania transmisji:
Teraz możemy uruchomić terminal na komputerze i popatrzeć co nadaje układ. Podstawowy interfejs UART zaczyna wyrzucać nam całkiem przydatne informacje. Autor do podłączenia się do interfejsu wykorzystał następujące komendy pod Linuksem:
Co widzimy podczas ładowania się systemu na routerze? Takie coś:
Code:
Please choose operation:
3: Boot system code via Flash (default).
4: Entr boot command line interface.
0
‘Command line interface’?? No to jesteśmy w domu! Po naciśnięciu 4 dostajemy się do linii komend w bootloaderze systemu operacyjnego linuksa.
Jeśli naciśniemy 3 to zobaczymy, jak system operacyjny ładuje się, a potem zobaczymy komunikat witający nas w systemie i proszący o zalogowanie się. Jeśli developerzy zadali sobie trochę trudu to mogli zmienić domyślne hasło logowania, ale w tym przypadku tak nie było i możemy zalogować się do systemu (z prawem roota!) wpisując użytkownika admin i hasło admin. W przypadku innych urządzeń dane te mogą być inne, ale często są to domyślne dane, których spis znaleźć można w sieci. Po wpisaniu danych logowania, możemy rozpocząć buszowanie w systemie:
Code:
-------------------------------
-----Welcome to ATP Cli------
-------------------------------
Login: admin
Password: #Password is ‘admin'
ATP>shell
BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# ls
var usr tmp sbin proc mnt lib init etc dev bin
W naszym routerze powłoką jest BusyBox - podobny do normalnego Linuxowego shell, który omówimy dokładniej w kolejnej części. Najważniejsze, że uzyskaliśmy do niego dostęp i mamy uprawnienia roota.
Kolejne kroku
Mając dostęp do linii komend BusyBoxa możemy zacząć grzebać w oprogramowaniu. Zależnie od tego jak wszystko zostało w systemie rozwiązane możemu uzyskać dostęp do haseł, o ile są zapisane w pliku tekstowym, certyfikatów TLS, różnych prywatnych API, jeśli nie są one zabezpieczone etc.
W kolejnej części artykułu skupimy się bardziej na inżynierii wstecznej oprogramowania w systemie routera, tym jakie różne są tryby bootowania OSa na urządzeniu, jak robić zrzuty pamięci etc. Wszystko to możemy zrobić mając tak bezpośredni dostęp do firmware urządzenia.
Źródło: http://jcjc-dev.com/2016/04/08/reversing-huawei-router-1-find-uart/
Cool? Ranking DIY