
ZyxelルーターのファームウェアとMIPSアーキテクチャを掘り下げて楽しみましょう
本チュートリアルは、情報提供および教育目的のみで作成されています。倫理的ハッキング、情報セキュリティ、サイバーセキュリティは、デジタル情報やコンピュータを利用するすべての人にとって馴染みのある題材であるべきだと考えています。ハッキングがどのように行われるかを知らなければ、ハッカーから身を守ることは不可能だと考えています。
$ IDA Pro +7.0 (you can use Radar2 since IDA is quite expensive)
$ Router running Rompager 4.07 : there're immense number of them such as TP-Link TD-W8951*, ZyXEL P-660R, Billion BiPAC 51**/52**
$ UART to USB
Misfortune Cookie の脆弱性はかなり前から存在していますが、その技術的な詳細を解説した分析は今だに公開されていません。Check Point によると、影響を受けるソフトウェアは AllegroSoft 製の組み込み Web サーバ RomPager です。インターネット全体を対象にしたスキャンによれば、利用可能なエンドポイントの数という点で RomPager はおそらく世界で最も普及している Web サーバソフトウェアです。RomPager は通常、デバイスに同梱されるファームウェアに組み込まれています。この特定の脆弱性は 2002 年にコードベースに導入されました。さらに、露出しているデバイスは RomPager の 4.34 より前のバージョン(特に 4.07)を使用しているものです。
このチュートリアルでは、Rompager 4.07 を使用している ZXHN H108L を使います。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="ZXHN H108L"
Content-Type: text/html
Transfer-Encoding: chunked
Server: RomPager/4.07 UPnP/1.0
EXT:
ではシリアルポートを使ってみましょう。まず、ボーレートを確認する必要があります。
$ sudo stty -F /dev/ttyUSB0
出力:
speed 115200 baud; line = 0;
-brkint -imaxbel
device
私は minicom を使っています。screen から HyperTerminal まで何でも使えますが、安定性の点で私はこれを好みます ;)
$ sudo minicom -s
+-----------------------------------------------------------------------+
| A - Serial Device : /dev/modem |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? |
+-----------------------------------------------------------------------+
| Screen and keyboard |
| Save setup as dfl |
| Save setup as.. |
| Exit |
| Exit from Minicom |
+--------------------------+
これで準備完了です:
$ sudo minicom -D /dev/ttyUSB0 -b 115200
Bootbase Version: VTC_SPI1.26 | 2012/12/26 16:00:00
RAM: Size = 8192 Kbytes
Found SPI Flash 2MiB GD25Q16 at 0xbfc00000
SPI Flash Quad Enable
Turn off Quad Mode
RAS Version: ZXHN H108LV4.0.0a_ZRQ_MA
System ID: $2.12.162.0(G94.BY.2)3.20.19.0| 2014/03/21 20140321_v006 | 2014
Press any key to enter debug mode within 3 seconds.
..........
可能なコマンドを表示するには:
$ ATHE
======= Debug Command Listing =======
AT just answer OK
ATHE print help
ATBAx change baudrate. 1:38.4k, 2:19.2k, 3:9.6k 4:57.6k 5:115.2k
ATENx,(y) set BootExtension Debug Flag (y=password)
ATSE show the seed of password generator
ATTI(h,m,s) change system time to hour:min:sec or show current time
ATDA(y,m,d) change system date to year/month/day or show current date
ATDS dump RAS stack
ATDT dump Boot Module Common Area
ATDUx,y dump memory contents from address x for length y
ATRBx display the 8-bit value of address x
ATRWx display the 16-bit value of address x
ATRLx display the 32-bit value of address x
ATGO(x) run program at addr x or boot router
ATGR boot router
ATGT run Hardware Test Program
ATRTw,x,y(,z) RAM test level w, from address x to y (z iterations)
ATSH dump manufacturer related data in ROM
ATDOx,y download from address x for length y to PC via XMODEM
ATTD download router configuration to PC via XMODEM
ATUR upload router firmware to flash ROM
< press any key to continue >
このファームウェアには、動的解析に非常に役立つ隠しコマンドのセットがあります。問題は、レジスタを表示したりブレークポイントを設定したりできないことですが、幸いにもこれらの隠しコマンドを使えばその機能が得られるはずです。それらを表示して使うには ATEN を使う必要があります。ただし、このコマンドはパスワードを必要とします。ではどうすればいいのでしょうか? パスワードジェネレータのアルゴリズムを見つけるためにファームウェアをリバースエンジニアリングしましょう。
(静的解析)まずファームウェアファイルを見てみましょう:
$ binwalk ras
binwalk1
$ dd if=ras of=rom1.lzma bs=1 skip=85043 count=66696
$ dd if=ras of=rom2.lzma bs=1 skip=350259 count=3350556
$ lzma -d <rom1.lzma> rom1
$ lzma -d <rom2.lzma> rom2
次に、抽出したファイルのシグネチャを確認してみましょう:
$ binwalk -Y rom1
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 MIPS executable code, 32/64-bit, big endian, at least 1250 valid instructions
string は、バイナリファイルが何であるか、何を含んでいるかの概要をつかむのに最適なツールです。パスワードアルゴリズムが見つかるかどうか見てみましょう:
$ strings rom1 | grep -i aten
$ strings rom2 | grep -i aten
どうやら、ファームウェアがまだ圧縮されているため、それを見ることはできません。つまり、デバッグモードを使ってルータからダンプする必要があります:
$ ATDO bfc00000, 1f0000
xmodem
最初に思い浮かぶのは、ディスパッチテーブルを探すことです。なぜかって? ただの直感です。もう一つの選択肢は if-elif ですが、それは長い連続になるでしょう。ユーザーが提供したパスワードの妥当性をチェックするためにです。そして、私が得た結果は次のとおりです:
ROM:800158A0 CmdTable: .word unk_80015C20 # DATA XREF: sub_8000E3D8+4Co
ROM:800158A0 # sub_8000E3D8+90o ...
ROM:800158A4 .word sub_8000E6D0
ROM:800158A8 .byte 0
ROM:800158A9 .byte 0
ROM:800158AA .byte 0
ROM:800158AB .byte 0
ROM:800158AC .word aJustAnswerOk # " just answer OK"
ROM:800158B0 .word aAthe # "ATHE"
ROM:800158B4 .word CMD_SHOW_HELP_ATHE
ROM:800158B8 .byte 0
ROM:800158B9 .byte 0
ROM:800158BA .byte 0
ROM:800158BB .byte 0
ROM:800158BC .word aPrintHelp # " print help"
ROM:800158C0 .word aAtba # "ATBA"
ROM:800158C4 .word CMD_ATBA
...
ROM:800158D0 .word aAten # "ATEN"
ROM:800158D4 .word CMD_ATEN
MIPS のワードが 4 バイトであることに注意してください。では CMD_ATEN を見てみましょう:
ROM:8000FF84 lw $a0, 8($s0)
ROM:8000FF88 jal sub_80013654
ROM:8000FF8C li $a1, 0
ROM:8000FF90 jal passwd_generator
そして次は:passwd_generator