読者です 読者をやめる 読者になる 読者になる

Buffalo ルータのファームウェアアップデータを分解する

WZR-HP-G450Hファムウェアアップデータを分解する手順を調べたのでメモ.

使用ツール

buffalo-enc

$ cd
$ git clone git://git.openwrt.org/openwrt.git --depth 1
$ cd openwrt/tools/firmware-utils/src
$ gcc -o ~/buffalo-enc buffalo-enc.c buffalo-lib.c

unsquashfs-lzma

$ cd
$ git clone https://github.com/mirror/firmware-mod-kit.git --depth 1
$ cd firmware-mod-kit/src/others/squashfs-4.0-lzma
$ make
$ cp unsquashfs-lzma ~

分解する

$ cd
$ unzip -x wzrhpg450h-188.exe
$ cd wzrhpg450h-188
$ grep -abo start wzr_hp_g450h_jp_188
20:start
208:start
$ tail -c+209 < wzr_hp_g450h_jp_188 > b1.bin
$ ~/buffalo-enc -d -i b1.bin -o b2.bin
Magic           : 'start'
Seed            : 0xec
Product         : 'WZR-HP-G450H'
Version         : '1.88'
Data len        : 21651456
Checksum        : 0x20bd9f5c
$ binwalk b2.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             uImage header, header size: 64 bytes, header CRC: 0x5AF62ABA, created: Thu Jan 21 17:59:24 2016, image size: 21651392 bytes, Data Address: 0x80002000, Entry Point: 0x8020A9F0, data CRC: 0x95476FBA, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "Linux Rootfs Combined Image"
64            0x40            LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 2873876 bytes
1048576       0x100000        Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 20599552 bytes,  4063 inodes, blocksize: 131072 bytes, created: Thu Jan 21 17:59:22 2016

$ tail -c+1048577 < b2.bin > b3.bin
$ ~/unsquashfs-lzma b3.bin

所感

重要なバイナリの多くが /bin/busybox/bin/rc へのシンボリックリンクになっている. GPL に感染しているコードは http://opensource.buffalo.jp/gpl_wireless.html で公開されていて, /bin/busybox もこれに含まれているが, プラットフォーム固有の機能, 特に /www/cgi-bin/* の実体である /bin/rc は含まれていないようだ.

例えば /etc 下のいくつかのファイルは /tmp 下へのシンボリックリンクになっていて, 推測であるが, /bin/rc 内にコードされているデータをシステム起動時にそこへ書き出す仕様になっているようだ.

今回, この簡単な調査を行った動機としてファームウェアバージョン 1.88 において一部界隈で有名な bufpy アカウントにアクセスできなくなった問題があり, パスワードが変更されただけなら調べられるだろうと思ったのだが, どうやら /bin/rc にハードコードされていた bufpy アカウントの設定がまるごと削除されたらしく, どうにもならないことがわかった.

なおファームウェアは通常のアップデートと同じ手順で旧バージョンを食わせればダウングレード可能だが, 設定が吹き飛ぶので注意されたい.