Hackni si svůj router (NETGEAR WG103)

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: hodza
Datum: 24.8.2014
Hodnocení/Hlasovalo: 1.48/58

Craig Heffner před nedávnem informoval veřejnost o zadních vrátkách u vybraných routerů D-Link a následně i u některých routerů Tenda. Po přečtení jeho příspěvků mě zajímalo, jak si v tomto ohledu stojí i další výrobci a tak jsem se rozhodl, že se pustím do vlastní analýzy.

Vulnerable routerShodou okolností a k mému štěstí se mi na stole objevil bezdrátový Access Point NETGEAR WG103. Nejedná se sice o žádnou horkou novinku na trhu - zařízení je vyráběno již poměrně dlouhou dobu, nicméně výrobce k němu pokud se nepletu poskytuje doživotní záruku a navíc mě zaujalo označení řady "ProSafe" který ve mě evokoval "pocit ještě většího bezpečí"...

Na zařízení jsem spínačem reset provedl obnovu do továrního nastavení a počal jej testovat. Jelikož web rozhraní zrovna neoplývalo rychlostí, narychlo jsem ho prozkoumal a poté se rozhodl, že se pustím rovnou do analýzy firmware.

Firmware (verzi 2.2.5) jsem do svého testovacího stroje s Debianem stáhl přímo ze stránek výrobce:

# mkdir ~/firmware
# cd ~/firmware
# wget -c http://www.downloads.netgear.com/files/GDC/WG103/WG103_V2.2.5_firmware.zip

Po rozbalení archívu se ukázaly soubory WG103_V2.2.5_firmware.tar a WG103_V2.2.5 Release_Note.html

# aptitude install unzip
# unzip WG103_V2.2.5_firmware.zip
Archive:  WG103_V2.2.5_firmware.zip
  inflating: WG103_V2.2.5_firmware.tar
  inflating: WG103_V2.2.5 Release_Note.html

Relase note jsem přeskočil a rozbalil TAR se samotným firmware.

# tar -xvf WG103_V2.2.5_firmware.tar

Objevily se čtyři soubory

Jádra systému (vmlinux.bin.l7) ani kontrolních součtů (root_fs.md5 a kernel.md5) jsem si opět moc nevšímal. To co mě zaujalo byl soubor rootfs.squashfs. Neočekával jsem sice nějaké vysoké zabezpečení image filesystému, ale že to bude až tak jednoduché mě opravdu překvapilo. K prohlédnutí jednotlivých souborů už stačilo SquashFS archív pouze rozbalit. Tady ovšem nastala chyba - SquashFS vyhodil chybovou hlášku: "Can't find a SQUASHFS superblock on rootfs.squashfs"

# aptitude install squashfs-tools
# mkdir firmware-extracted
# unsquashfs rootfs.squashfs firmware-extracted/
Can't find a SQUASHFS superblock on rootfs.squashfs

Bylo mi jasné že buď nesedí verze UnsquashFS nebo že je ve SquashFS použita nějaká komprese. Rozhodl jsem se tedy filesystém prozkoumat BinWalkem. Ten mi prozradil, že se opravdu jedná o SquashFS, ovšem vybavený kompresí LZMA + drobným problémem jménem big endian.

# aptitude install python python-magic
# wget -c http://ftp.us.debian.org/debian/pool/main/b/binwalk/binwalk_1.0-1_amd64.deb
# dpkg -i binwalk_1.0-1_amd64.deb
# binwalk rootfs.squashfs
DECIMAL         HEX             DESCRIPTION
-------------------------------------------------------------------------------------------------------
0               0x0             Squashfs filesystem, big endian, lzma signature, version 3.1, size: 4380852 bytes,  1345 inodes, blocksize: 65536 bytes, created: Fri Jan 20 00:46:46 2012

Jelikož jsem byl líný dokolečka stahovat a rekompilovat zdrojové kódy různých verzí Squashfs-Tools s podporou LZMA, šáhnul jsem po "hotovém řešení" v podobě Firmware-Mod-Kit-u. Ten zjistil, že je filesystém zabalen verzí 3.3 s podporou LZMA a dokonce se mu jej podařilo extrahovat.

# wget -c https://firmware-mod-kit.googlecode.com/files/fmk_099.tar.gz --no-check-certificate
# tar -xvf fmk_099.tar.gz
# aptitude install g++ build-essential zlib1g-dev liblzma-dev
# cd fmk/src/others/
# make
# cd ../..
# ./unsquashfs_all.sh ../rootfs.squashfs ../firmware-extracted/
Attempting to extract SquashFS .X file system...
Trying ./src/others/squashfs-2.0-nb4/unsquashfs...
Trying ./src/others/squashfs-3.0-e2100/unsquashfs-lzma...
Trying ./src/others/squashfs-3.0-e2100/unsquashfs...
Trying ./src/others/squashfs-3.2-r2/unsquashfs...
Trying ./src/others/squashfs-3.2-r2-lzma/squashfs3.2-r2/squashfs-tools/unsquashfs...
Trying ./src/others/squashfs-3.2-r2-hg612-lzma/unsquashfs...
Trying ./src/others/squashfs-3.2-r2-wnr1000/unsquashfs...
Trying ./src/others/squashfs-3.2-r2-rtn12/unsquashfs...
Trying ./src/others/squashfs-3.3/unsquashfs...
Trying ./src/others/squashfs-3.3-lzma/squashfs3.3/squashfs-tools/unsquashfs...
created 1004 files
created 99 directories
created 197 symlinks
created 45 devices
created 0 fifos
File system sucessfully extracted!
MKFS="./src/others/squashfs-3.3-lzma/squashfs3.3/squashfs-tools/mksquashfs"

Rozbalený firmware víceméně ničím nepřekvapil - standardní adresářová struktura, BusyBox a hromada zbytečných wrapperů tak jak to u těchto zařízení bývá.

# cd ../firmware-extracted/
# ls
bin  dev  etc  home  lib  linuxrc  proc  root  sbin  tmp  usr  var

Největší "poklad" jsem nalezl v adresáři /home/www

# ls ~/firmware/firmware-extracted/home/www
background.html   boardData103.php  checkConfig.php   common.php  downloadFile.php    header.php  include      linktest.php       login_header.php  logout.php           recreate.php   saveTable.php     support.link  thirdMenu.html  tmpl BackupConfig.php  body.php          checkSession.php  config.php  getBoardConfig.php  help        index.php    LOCOMATE_11p       login.php         packetCapture.php    redirect.html  sessionCheck.inc  templates     thirdMenu.php   UserGuide.html boardData102.php  button.html       clearLog.php      data.php    getJsonData.php     images      killall.php  login_button.html  logout.html       productregistration  redirect.php   siteSurvey.php    test.php      titleLogo.php   wpsstatus.php

Po prohlédnutí zdrojových kódů se mi udělalo hodně zle. Tolik bezpečnostních chyb jsem pohromadě snad ani neviděl. Nebudu zde odhalovat jednotlivé bezpečnostní problémy, tak alespoň jeden libový za všechny: v souboru recreate.php jsem nalezl následující kód:

Bez hlubšího zkoumání kontextu předpokládám, že měl sloužit k vygenerování nové session_id a prodloužení celého sezení. Na začátku však kodér zapomněl přidat kontrolu, zda-li je uživatel již přihlášený (v systému je pouze jeden uživatel - admin). Díky této fatální chybě tak stačí přes webový prohlížeč zadat adresu

https://IP_ADRESA_ROUTERU/recreate.php?username=admin
čímž se vygeneruje sezení s již přihlášeným administrátorem. Útočník tak vůbec nepotřebuje znát přihlašovací údaje aby se dostal k administraci celého zařízení. Podobných chyb je ve web rozhraní více....

Na tomto případě lze krásně vidět, že ani dostatčně silné heslo nemusí být nutně nepřekonatelnou bariérou proti zákeřným útočníkům.


Varování: Výše uvedený text slouží výhradně k výukovým účelům. Autor jakýmkoliv způsobem nikoho nenavádí k neužití nalezené chyby nebo k páchaní jiné trestné činnosti. Výrobce zařízení Netgear byl kontatován a zhruba po týdnu odpověděl, ať kontaktuji přímo centrálu v Polsku. Uvidíme, jak se bude komunikace vyvíjet dále.