Reverse Engineering Router

Ďalší článok zo série Reverse Engineering zariadení. Ako ide doba dopredu, je treba aj domácnosť trochu vylepšiť čo sa týka nového domáceho routeru. Či už ide o to dosiahnuť vyššiu rýchlosť, lepšie pokrytie alebo možnosť využiť nové štandardy nesmieme zabúdať na bezpečnosť. V článku sa dočítate o analýze kódu routeru, o tom ako pokročilo zabezpečenie takýchto zariadení a tiež spôsob ako na takomto zariadení získať oprávnenie root.

Tentokrát sa pozrieme na router pre domácnosti značky TP-Link s označením Archer AX23.

Picture1

Nestrácajme čas, zapojíme router, prihlásime sa do konfigurácie a hneď uvidíme niekoľko vecí, ktoré z pohľadu bezpečnosti nie sú úplne v poriadku.

Picture2
Picture3

Vidíme pekné GUI, pekné obrázky, ..., “poor network“?, “Update”? Router sa okamžite po spustení snaží pripojiť k dodávateľovi do Cloudu na základe čoho zistí kvalitu spojenia a tiež či je dostupná nová aktualizácia. Toto sú síce pekné QoL (Quality of Life) funkcionality ale z pohľadu bezpečnosti sa zase vystavujeme tomu, že musíme dôverovať ďalšiemu dodávateľovi. V prípade zariadenia ako je router, cez ktoré „tečú“ všetky vaše dáta je toto obzvlášť citlivá vec. Ďalšia otázka je, čo všetko o tomto zariadení ešte nevieme.

Podobne ako by postupoval útočník pri pokuse prelomiť obranu nejakej spoločnosti/aplikácie, začíname fázou v ktorej sa snažíme získať informácie o zariadení. Naším konečným cieľom je získať úplnú kontrolu nad zariadením. To dokážeme docieliť buď vlastnou úpravou firmwaru zariadenia alebo priamo nahraním OpenWrt firmwaru. V dobe písania článku bohužiaľ nebola podpora OpenWrt pre náš router. Zostáva nám teda upraviť si firmware po našom. Zariadenie dovoľuje aktualizáciu firmwaru ale bez znalosti formátu tohto súboru je riziko, že zariadenie zničíme.

Jedným zo spôsobov akým dokážeme dosiahnuť náš cieľ je nájdenie zraniteľnosti, ktorá nám umožní spúšťať ľubovoľné príkazy na zariadení. Takéto chyby bývajú u podobných zariadení bežné a po chvíľke hľadania na internete je možné nájsť hneď niekoľko kandidátov. Najčastejšími chybami bývajú chýbajúce ošetrenie vstupov pri použití diagnostických funkcionalít ako napr. ping alebo traceroute. Bohužiaľ náš router nie je proti nájdeným zraniteľnostiam na internete zraniteľný a teda musíme hľadať ďalej.

Picture4

Pri analýze webovej komunikácie zistíme tiež ďalšiu zaujímavosť, a to že dotazy sú šifrované a kryptograficky podpísané.

Picture5

Zrazu sa zdá, že stojíme proti ťažšiemu protivníkovi než sme pôvodne predpokladali. Prejdeme si teda čo všetko môžeme vykonať / kde by sa mohla vyskytovať najpravdepodobnejšie nejaká chyba. Máme funkcionalitu pre lokálnu aktualizácia, teda niekde na internete by mali existovať súbory s firmwarom pre zariadenie.

Picture6

Taktiež máme funkcionalitu, ktorá dovoľuje stiahnuť/zálohovať aktuálne nastavanie a neskôr ho obnoviť z tejto zálohy.

Picture7

Našťastie firmware je voľne dostupný na stiahnutie a nástroj binwalk z neho dokáže extrahovať súborový systém.

Picture8

Firmware by sme teoreticky mohli upraviť a nahrať takto upravený firmware. Zariadenia niekedy kontrolujú kryptografický podpis nového firmwaru pri aktualizácii aby práve nedošlo ku nahraniu iného než výrobcom určeného firmwaru. My sme touto cestou nešli kvôli riziku, že ak by zariadenie nekontrolovalo integritu nového firmwaru mohlo by dôjsť k poškodeniu zariadenia.

Naopak od firmwaru, záloha konfigurácie, ktorú je možné stiahnúť, je pravdepodobne šifrovaná.

Picture9

V tomto momente ale môžeme aspoň analyzovať získaný firmware. Z webovej komunikácie a tiež zo zdrojových kódov vieme, že web server využíva LuCI WebUI. Jedná sa o riešenie, ktoré používa aj práve OpenWrt pre WebUI a z toho dôvodu sme usúdili, že je menšia pravdepodobnosť nájsť chybu priamo vo WebUI než keby si WebUI vytváral priamo dodávateľ (nepísané pravidlo). Je teda lepšie sa zamerať na niečo iné než samotné WebUI, teda funkcionality, ktoré výrobca vytváral sám pre seba, prípade funkcionality ktorými stávajúce riešenie rozšíril. Niečo na čo sa môžeme určite zamerať je konfigurácia, je síce šifrovaná ale my máme prístup k firmware a teda mali by sme z neho vyčítať ako sa šifruje.

Ďalším hľadaním na internete zistíme, že podobné routre šifrujú konfigurácie konkrétnym skriptom, v ktorom je priamo napísané heslo. Skript by mal vyzerať podobne ako ukážka nižšie.

Picture10

Bohužiaľ, náš router je novší a už netrpí úplne na túto zraniteľnosť. Náš skript vyzerá teda trochu inak. (Jedná sa o inú časť súboru, no je vidieť, že heslo priamo v tomto skripte nie je a používa sa trochu iná metóda.)

Picture11

V tomto momente vieme čo hľadáme a tiež kde to hľadáme – spôsob šifrovania v súbore luci.model.crypto(.lua). Stačí nám teda stiahnuť nástroj pre dekompiláciu LUA a máme vyhrané, či?

Picture12

Ako prvé narazíme na chybovú hlášku, ktorá podľa internetu má veľký počet príčin. V rámci nášho kontextu ale filtrujeme príčiny pre OpenWrt a nakoniec zistíme, že OpenWrt používa rôzne doplnky a tie klasický nástroj luadec nedokáže dekompilovať. Stiahneme preto luadec priamo pre OpenWrt.

Picture13

Posunuli sme sa snáď správnym smerom, teraz máme inú chybovú hlášku. Tu nám pomôže článok, ktorý rieši rovnaký problém ako my (viď referencie). Autor tento problém vysvetľuje podrobnejšie, no v skratke sa jedná o substitúciu identifikátorov inštrukcií LUA virtuálneho stroja. Napr. ak máme inštrukciu RET s ID x a inštrukciu CLOSE s ID y, substitúcia prehodí ID RET a CLOSE tak, že po novom bude mať RET ID y a CLOSE bude mať ID x, analogicky pre ostatné inštrukcie. Okrem vysvetlenia problému autor vytvoril aj skript, ktorý tento problém rieši.

Picture14

Zasa raz zisťujeme, že náš router/firmware je trochu inej verzie a že síce nám internet pomáha, musíme do toho vložiť i niečo svoje. Vyššie zmienený skript funguje, ale pár ID inštrukcií nedokáže správne vyvodiť z daných dát. Našťastie pre nás zostávajúci počet inštrukcií, ku ktorým musíme správne definovať ID je malý a jednoducho to môžeme tipnúť/použiť hrubú silu. Po úspešnej dekompilácií konečne nachádzame funkcionalitu, ktorú hľadáme.

Picture15

Okrem tejto funkcionality analyzujeme aj reťazce v tomto súbore. Tie obsahujú zaujímavé a podozrivé časti, ktoré spojením prezrádzajú ako rozšifrovať zálohovanú konfiguráciu.

Picture16
Picture17
Picture18

Niekedy, keď už človek dorazí do cieľa a spätne sa pozrie na cestu, ktorú prešiel, zistí že existovala oveľa jednoduchšia cesta. Presne tak to bolo aj v tomto prípade, keď už sme totiž získali informácie pre dešifrovanie (konkrétne spôsob, kľúč a IV) a dali ich do Google tak z toho vypadlo nasledovné. Tento trik by sa mohol nazývať “Reverse GoogleFu” – Keď jednoduchým spôsobom dokážete vygoogliť informácie, ktoré ste predtým museli náročne získať iným spôsobom.

Picture19

Pre rozšifrovanie a rozbalenie konfigurácie sme vytvorili nasledujúci skript.

Picture20

A konečne takto vyzerá rozšifrovaná konfigurácia.

Picture21

Po krátkej analýze konfigurácie zistíme, že obsahuje rôzne skryté WiFi siete s náhodne (náhodne vyzerajúce) vygenerovanými SSID a heslami. Ťažko povedať čo si máme o tomto myslieť.

Picture22

Možno sú to len WiFi siete pre podporu Mesh WiFi, alebo skryté zadné vrátka výrobcu? Pri hľadaní odpovede sme našli nasledujúce.

Picture36
Picture37

Neznámy človek na internete nám sľubuje, že je to pre OneMesh a nie sú tam žiadne bezpečnostné zraniteľnosti, tak to musí byť pravda. Bolo by možno zaujímavé zistiť či ostatné WiFi routre používajú rovnaké heslá alebo sa tieto heslá generujú podľa nejakých pravidiel, prípadne sa pozrieť na bezpečnosť týchto sietí, no to je momentálne mimo tohto článku.

Naopak, práve takéto scenáre, kedy nám výrobca tvrdí, že je to funkcionalita a nie bezpečnostná diera, ktorá sa nedá vypnúť aj keď túto funkcionalitu vôbec nepoužívate, sú motiváciou pre úpravu firmwaru. S naším prístupom ku konfigurácií a možnosťou nahrať upravenú konfiguráciu môžeme skúsiť nájsť chybu priamo v tejto funkcionalite.

Zase raz ďalším hľadaním na internete nájdeme informáciu o možnom povolení služby SSH.

Picture23

Internety píšu, že ak do vyššie zobrazenej konfigurácie pridáme ďalší parameter s názvom RemoteSSH s hodnotou on, tak sa služba SSH povolí pre rovnakého užívateľa s akým sa prihlasujeme do WebUI.

Picture24

Bohužiaľ, zasa sme prišli neskoro a táto chybička už bola opravená a nefunguje. Pretože máme prístup ku firmware, môžeme sa o tom presvedčiť na vlastné oči – výrobca danú funkcionalitu zakomentoval.

Picture26

Internety tiež napísali kopec ďalších možných miest pre zraniteľnosti, napr. vloženie príkazov do hostname zariadenia a pod. Žiadny z nájdených spôsobov nefungoval, no môže to tiež znamenať, že sme málo hľadali.

Po dlhšej analýze sme našli funkcionalitu, ktorá svojou povahou priamo napovedala, že do nej môžeme zadať príkazy na spustenie.

Picture27

Malo by sa jednať o definíciu správania pri stlačení fyzického tlačítka priamo na routery. Bohužiaľ, zrovna hodnoty vo vetve button (teda aj hodnota handler), nie sú zapisovateľné. Tento fakt sa dá overiť kvôli existencii inej chyby na ktorú sme narazili. Na routery v skutočnosti služba SSH beží, ale heslo k nej nepoznáme a heslo k WebUI nefunguje. Táto služba sa ale dá zneužiť na čítanie ľubovoľného súboru a to kvôli možnosti špecifikovať BannerFile v konfigurácii.

Picture29

Môžeme teda čítať súbor /etc/passwd alebo tiež aktuálnu konfiguráciu routera. Banner sa zobrazí po pripojení na službu SSH, ešte pred samotným prihlásením. Obrázok nižšie zobrazuje nastavenie funkcionality pri stlačení tlačítka na routery – aj po našom prepísaní v konfigurácií sú zobrazené originálne hodnoty.

Picture28

Následne analyzujeme skript, ktorý spracúva konfiguračný súbor. Z tohto skriptu sa zdá, že tlačítka nie sú nejako staticky definované, ale že sa jednoducho prečíta celá vetva button a tá sa konvertuje na jednotlivé možnosti.

Picture30

Nešlo nám prepísať stávajúci handler, čo ale ak vytvoríme úplne novú definíciu tlačítka. Ako handler vložíme kód pre nadviazanie spojenia na našu stanicu. Tento kód sa vykoná ak tlačítko budeme držať od 0 do 10 sekúnd. Jednotlivé handlery sa prekrývajú ale snáď to nebude vadiť.

Picture31

Novú konfiguráciu nahráme do routera, reštartujeme, spustíme netcat na našej stanici, stlačíme tlačítko na routery a ...

Picture33

A úspešne sme získali root oprávnenia na routery. Teraz môžeme vykonávať ľubovoľné úpravy. Problém ale je, že po reštarte zariadenia sa naše zmeny vymažú. Je to preto, lebo súborový systém, ktorý upravujeme existuje len v operačnej pamäti. Pre trvalé zmeny je nutné použiť nástroj nvrammanager. Pomocou tohto nástroja vieme vypísať jednotlivé partície alebo ich upraviť a tým upraviť náš router natrvalo.

Picture34

Záver

Nová doba prináša nové smart zariadenia, okrem klasických zásuviek, vysávačov, chladničiek, pračiek prišlo nakoniec aj na routre. Nie každý ale chce mať tieto chytré funkcionality v zariadení, cez ktoré prúdia pakety s jeho číslom karty, súkromnými správami alebo inými citlivými údajmi. Prípadne, mať zariadenie, ktoré je prístupovým bodom do vašej domácej siete ale nemať možnosť vypnúť podozrivé alebo priamo nechcené funkcionality. Z pohľadu bezpečnosti chcete mať nad zariadením plnú kontrolu a tam kde ju nemáte si nemôžete byt istí. Taktiež, konečne budeme môcť spraviť tú zmenu, kvôli ktorej sme toto celé absolvovali. Naše vlastné pozadie na login obrazovke.

Picture35

Referencie