Mit rejt a doboz?

Varázsoljuk elő a root jelszót a router-ből

Az egész egy ártatlannak tűnő blog bejegyzéssel kezdődött, amiben egy hardveres CTF pályává alakított mini router-ről meséltek. Érdekes ötlet volt és amikor egy speciális csipeszt csatlakoztattak a router flash memóriájához, hogy így férjenek hozzá az összes rajta tárolt adathoz, már tudtam, hogy ezt én is szeretném kipróbálni.

Nem sokkal később meg is rendeltem a router-t és a speciális csipeszt (némi extrával). A router már az egyel frissebb V2-es változat volt, de reméltem, hogy ez nem fog problémákat okozni. Már csak ki kellett várni, hogy megérkezzen.

Előkészületek

Két alternatív csatlakozási pont is van, amin elindulhatunk majd, az egyik az UART soros kommunikáció, a másik a csipesz és a flash memória SPI soros kommunikációja. Szerencsére a Raspberry Pi mindkettőt anyanyelvi szinten beszéli, úgyhogy egy 3B+-os modellt halásztam elő az egyik fiókból, hogy tolmácsoljon. Valószínűleg bármelyik másik modell is megteszi, de előfordulhat, hogy a szükséges beállítások egy kicsit mások.

A Raspberry Pi-on lévő UART kivezetéssel a saját terminálját lehet elérni, ami jelenleg akadályozza az irányú törekvéseinket, hogy egy másik eszköz terminálját vezéreljük vele. Így az első feladat az, hogy ezt a funkciót letiltsuk. Ehhez a /boot/cmdline.txt fájlból el kell távolítanunk a console=serial0,115200 részt, aztán hozzá kell adnunk egy dtoverlay=disable-bt sort a /boot/config.txt-hez és végül még egy systemctl disable hciuart parancsot is le kell futtatnunk.

Ha már itt vagyunk, rögtön engedélyezhetjük az SPI-t is a raspi-config parancsot futtatva (Interfacing Options > SPI), később úgyis kelleni fog.

Szükségünk lesz még némi szoftverre is, ezek telepítésén is túleshetünk.

# apt-get install minicom binwalk python-lzma git
# pip install cstruct
# git clone https://github.com/sviehb/jefferson.git
# cd jefferson/
# python setup.py install

A minicom biztosítja majd az UART soros kommunikációt, a binwalk fogja tudni kicsomagolni nekünk a router-ről lementett dump-ot, a jefferson-ra a binwalk-nak lesz szüksége, hogy tudjon kezelni JFFS2 fájlrendszert is, a többit pedig a jefferson-hoz kell feltelepítenünk.

Ha minden megvan, mehet még egy reboot, biztos, ami biztos és meg is vagyunk a beállításokkal.

Soros konzol

Miután megérkezett a router, rendhagyó módon kezdődött az ismerkedésünk. Darabokra szedtem. Gyorsan meggyőződtem róla, hogy a V2-es változaton is szerepelnek a megfelelő chip-ek és csatlakozók majd rádugtam a gépre és végigmentem az első-beállítás-varázslón.

A soros csatlakozás

Összedugdostam a router pin-jeit a Rapsberry Pi megfelelő pin-jeivel (a földet a földhöz, az RX-et és a TX-et pedig kersztbe kell kötni), indítottam egy minicom -b 115200 -o -D /dev/serial0 parancsot majd újraindítottam a router-t.

A router összekötve a Raspberry Pi-jal

El is kezdett jönni a boot-olás szokásos kimenete, majd miután végzett Enter-t nyomtam (amire a kimenet fel is hívta a figyelmemet) és kaptam is egy root shell-t.

Ez már-már elszomorítóan könnyű lenne egy CTF-nek, de úgy tűnik a gyári állapotban nincsen semmilyen védelem a konzolon. Gondoltam, ha már itt vagyok, megpróbálom egy kicsit megnehezíteni a saját dolgomat. A /etc/inittab fájlban lecseréltem a ::askconsole:/bin/ash --login sort ::askconsole:/bin/login-ra, újraindítottam és az Enter megnyomása után máris egy login prompt várt.

Egy fokkal jobb, de sajnos boot közben észrevettem egy érdekes sort a kimenetben. Még egy újraindítás, egy F betű és egy Enter megnyomása a megfelelő pillanatban és ismét egy root shell büszke tulajdonosa lehettem a failsafe mód jóvoltából. Egy kis kutatgatás után arra jutottam, hogy erre sajnos nincs egyszerű megoldás, a gyári firmware-rel nem is megoldható, így egyelőre elengedtem a dolgot.

Flash memória

A flash memória egy kicsit közelebbről

Térjünk is át inkább a csipeszre. Áramtalanítottam az eszközt, összedugdostam a csipesz nem harapós végét a Raspberry Pi megfelelő pin-jeivel (amiben nagy segítségemre volt a chip dokumentációja) majd a harapós végét ráeresztettem a flash memóriára.

Dump-oljunk flash memóriát

Az eredeti leírás alapján a Reset gombot nyomva kellene tartani a router-en, hogy a két eszköz össze tudjon barátkozni, de a megfelelő flashrom parancs csak nem akart kedvező kimenetet adni. Az egyik LED-nek is világítania kellett volna, ha jól haraptam rá a memóriára, de ez sem történt meg.

# flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000
flashrom  on Linux 4.19.97-v7+ (armv7l)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
No EEPROM/flash device found.
Note: flashrom can never write if the flash chip isn't found automatically.

Ellenőriztem az összes kábelt, hogy jó helyre megy-e, gyanúba keveredtek a jumper kábelek és a csipesz gyártási minősége is, de a multiméter szerint minden rendben volt arrafelé. Végül tanácstalanságomban, többszöri csipesz újraigazgatás után megpróbáltam a Reset nyomva tartása nélkül is és csodák csodájára működött. Úgy tűnik a V2-es változat mégis csak különbözik néhány apró részletben.

# flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000 -r dump.bin
flashrom  on Linux 4.19.97-v7+ (armv7l)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on linux_spi.
Reading flash... done.

Az eredmény egy 16 megabájtos bináris, ami tartalmazza az eszköz által használt fájlrendszereket (milyen kis helyen is el tud férni egy Linux). Mivel OpenWRT fut a gépen, ezért egész jó elképzeléseink lehetnek arról, hogy mit is kellene ebben a fájlban találni.

Kell, hogy legyen egy SquashFS, ami a rendszer nagy részét tartalmazza és menet közben read-only-ként van felcsatolva és van egy JFFS2 fájlrendszer, ami read-write és a felhasználó módosításait tartalmazza. Ezen a ponton ért a megvilágosulás, hogy hogyan is oldják meg a gyári beállítások visszaállítását a router-eken. Csak törlik a módosításokat tartalmazó fájlrendszer teljes tartalmát.

Nincs más hátra, mint kicsomagolni a binwalk -Me dump.bin parancs segítségével, majd megvizsgálni az eredményt.

# ls -Al _dump.bin.extracted/
total 14496
-rw-r--r--   1 root root 10442640 Apr  3 10:20 1CE416.squashfs
-rw-r--r--   1 root root  4390912 Apr  3 10:20 BD0000.jffs2
drwxr-xr-x 145 root root     4096 Apr  3 10:20 jffs2-root
drwxrwxr-x  16 root root     4096 Aug  5  2019 squashfs-root

Tényleg keletkezett egy squashfs-root, aminek a tartalma ránézésre egy sztenderd Linux-os / könyvtárnak néz ki, és egy jffs2-root, aminek a tartalma már kicsit furcsább.

Innen már csak pár jól irányzott find parancs, hogy megtaláljuk az eredeti shadow fájlt a jelszó hash-ekkel, esetleg OpenVPN kliens beállításokat keressünk, amivel akár más hálózatokba is továbbmehetünk rosszalkodni. Az ellopott jelszó hash-eket pedig otthonunk nyugalmában ráérősen fejthetjük vissza egy 10 videokártyás jelszó törő szörnyeteggel.

Összegzésként talán annyit, hogy nem alaptalan dolog a hálózati eszközök fizikai védelme, érdemes 12+ karakteres jelszavakat választani, ha nem akarjuk, hogy néhány órán belül brute-force-olják a hash-t és hogy ez az egész nem csak router-ekre lehet igaz, hanem bármilyen IoT eszközre, ahol nem figyeltek eléggé ezeknek a hátsó bejáratoknak a lezárására.

További olvasnivalók

This post is also available in english: What's in the box?

Hozzáfűznél valamit?

Dobj egy emailt a blog kukac deadlime pont hu címre.

Feliratkoznál?

Az RSS feed-et ajánljuk, ha kedveled a régi jó dolgokat.