LD-WBBR/Bの新ファームウェア解析
from 4/5/2004
関連:LD-WBBR/Bの解析
関連:LD-WBBR/Bについて
新ファームウェア
エレコムさんが方針転換をしたようで、セキュリティfixの新ファームウェアが出た。
今回はこのファームウェアを解析する。使用したのは LD-WBBR/B 用のファームウェア
LD-WBBRB233.exe である。この新しいファームウェアの kernel は
Linux version 2.4.2 (root@VMware_Linux)
(gcc version 2.97 20001120 (experimental)) #485 Thu Apr 15 20:15:35 JST 2004
となり、kernel のバージョンはあがってないが、コンパイルをし直したようである。
前回の
Linux version 2.4.2 (root@VMware_Linux)
(gcc version 2.97 20001120 (experimental)) #482 Mon Jun 17 14:30:23 JST 2002
と比べると、約2年の間があり、その間に 3回ほどコンパイルを行ったようである。
なかみ1
以下、 initrd の中身である。
[toyota@kashyyyk]372% tree
.
|-- a -> /crom/a
|-- bin -> /crom/bin
|-- crom
|-- dev
| |-- console -> ttyS0
| |-- crom
| |-- initrd
| |-- kmem
| |-- mem
| |-- modem -> ttyS1
| |-- null
| |-- ppp
| |-- ptmx
| |-- pts
| |-- ram -> ram1
| |-- ram0
| |-- ram1
| |-- ram2
| |-- tap0
| |-- tsdrv0
| |-- tsdrv1
| |-- tty
| |-- tty0
| |-- ttyS0
| |-- ttyS1
| |-- usblpt0
| `-- zero
|-- etc
| |-- codepages -> /mnt/usr/local/samba/lib/codepages
| |-- dhclient-script
| |-- dhcpd.conf
| |-- fstab
| |-- group
| |-- hostname
| |-- hosts
| |-- hosts.allow
| |-- hosts.deny
| |-- hosts.org
| |-- inetd.conf
| |-- init
| |-- init.d
| | |-- rc.local
| | |-- rcS
| | `-- reboot
| |-- inittab
| |-- ioctl.save
| |-- issue
| |-- issue.net
| |-- login.defs
| |-- mime.types
| |-- nsswitch.conf
| |-- passwd
| |-- ppp
| | |-- chap-secrets
| | |-- firewall-masq
| | |-- firewall-standalone
| | |-- ip-down
| | |-- ip-down.d
| | |-- ip-up
| | |-- ip-up.d
| | |-- options
| | |-- pap-secrets
[error opening dir]
| | |-- peers
| | |-- plugins
| | |-- pppoe.conf
| | |-- resolv
| | |-- resolv.conf
| | `-- rp-pppoe-gui
| | |-- conf.base
| | |-- connection-info
| | `-- passwd
| |-- profile
| |-- protocols
| |-- services
| |-- shadow
| |-- smb.conf -> ../usr/local/samba/lib/smb.conf
| `-- syslog.conf
|-- i
| |-- ash.static
| `-- mount.static
|-- i.sh
|-- lib -> /crom/lib
|-- lost+found
|-- mnt
|-- proc
|-- root
|-- sbin -> /crom/sbin
|-- tmp
|-- usr -> /crom/usr
|-- usr_local_etc
| |-- mdn.conf
| |-- mdnsproxy.base
| `-- ppxp
| |-- catcap
| |-- chat
| | |-- justnet
| | |-- modemlogin
| | `-- nifty
| |-- conf
| | |-- debug
| | |-- default
| | |-- gettyppp
| | |-- lcp.def
| | |-- modem
| | |-- ppxprc
| | |-- qdial
| | |-- report
| | |-- serial
| | |-- serial.os
| | `-- server
| |-- ip
| | |-- droutedown
| | |-- drouteup
| | |-- drupmq
| | |-- hroutedown
| | |-- hrouteup
| | |-- rcstart
| | `-- rcstop
| |-- keybind
| |-- modem
| | |-- default -> generic
| | |-- generic
| | |-- me1414
| | |-- mn128
| | `-- standard
| |-- passwd
| `-- rc
|-- var
`-- wwwroot
27 directories, 102 files
以下の緑のファイルが、なくなったと思うファイル。しかし、 [error opening dir] が
出ているので、確実ではない。
| `-- rc
| |-- dnsproxy.rc
| |-- start
| `-- stop
|-- var
| |-- dhcp
| |-- lock
| |-- log
| | `-- ppxp
| |-- mdnsproxy
| |-- run
| |-- spool
| `-- state
| `-- dhcp
| `-- dhcpd.leases
`-- wwwroot
|-- MODEL
|-- VERSION
|-- phase
|-- side_mode
`-- tsap -> /crom/wwwroot/tsap
なかみ2
以下、フラッシュの中(と思われる)の中身である。赤の部分が増えたファイル。
[toyota@kashyyyk]374% tree
.
|-- a
| |-- bin
| | |-- df
| | |-- ls
| | |-- ping
| | `-- ps
| |-- lib
| | `-- libproc.so.2.0.6
| |-- sbin
| `-- usr
| |-- bin
| | |-- sum
| | `-- tail
| `-- local
| `-- sbin
| `-- ttcp
|-- bin
| |-- bash
| |-- cat
| |-- cp
| |-- dd
| |-- echo
| |-- false
| |-- grep
| |-- hostname
| |-- kill
| |-- login
| |-- mkdir
| |-- mount
| |-- netstat
| |-- pwd
| |-- rm
| |-- sed
| |-- sh -> bash
| |-- sleep
| |-- umount
| `-- uname
|-- lib
| |-- ld-2.2.1.so
| |-- ld-linux.so.2 -> ld-2.2.1.so
| |-- libc-2.2.1.so
| |-- libc.so
| |-- libc.so.6 -> libc-2.2.1.so
| |-- libc.so.6.1 -> libc-2.2.1.so
| |-- libcrypt-2.2.1.so
| |-- libcrypt.so -> libcrypt.so.1
| |-- libcrypt.so.1 -> libcrypt-2.2.1.so
| |-- libdl-2.2.1.so
| |-- libdl.so -> libdl.so.2
| |-- libdl.so.2 -> libdl-2.2.1.so
| |-- libnss_dns-2.2.1.so
| |-- libnss_dns.so -> libnss_dns.so.2
| |-- libnss_dns.so.2 -> libnss_dns-2.2.1.so
| |-- libnss_files-2.2.1.so
| |-- libnss_files.so -> libnss_files.so.2
| |-- libnss_files.so.2 -> libnss_files-2.2.1.so
| |-- libpam.so -> libpam.so.0
| |-- libpam.so.0 -> libpam.so.0.72
| |-- libpam.so.0.72
| |-- libpthread-0.9.so
| |-- libpthread.so -> libpthread.so.0
| |-- libpthread.so.0 -> libpthread-0.9.so
| |-- libresolv-2.2.1.so
| |-- libresolv.so -> ../../lib/libresolv.so.2
| |-- libresolv.so.2 -> libresolv-2.2.1.so
| |-- librt-2.2.1.so
| |-- librt.so -> librt.so.1
| |-- librt.so.1 -> librt-2.2.1.so
| |-- libtermcap.so.2 -> libtermcap.so.2.0.8
| |-- libtermcap.so.2.0.8
| `-- modules
|-- sbin
| |-- brctl
| |-- dhclient
| |-- halt
| |-- ifconfig
| |-- init
| |-- iptables
| |-- klogd
| |-- mke2fs
| |-- mount.smbfs -> /usr/sbin/smbmount
| |-- reboot -> halt
| |-- route
| `-- syslogd
|-- usr
| |-- bin
| | |-- basename
| | |-- brg_down.sh
| | |-- brg_up.sh
| | |-- cleanup.sh
| | |-- ctlm
| | |-- dhcpCS.sh
| | |-- dhcp_clnt_down.sh
| | |-- dhcp_clnt_up.sh
| | |-- dhcp_serv_down.sh
| | |-- dhcp_serv_up.sh
| | |-- dialer_down.sh
| | |-- dirname
| | |-- expr
| | |-- flets
| | |-- id
| | |-- killall
| | |-- logger
| | |-- masq_init.sh
| | |-- mdnsproxy_down.sh
| | |-- mdnsproxy_up.sh
| | |-- mount.sh
| | |-- msq_down.sh
| | |-- msq_init.sh
| | |-- msq_up.sh
| | |-- msq_up_wan.sh
| | |-- mt.sh
| | |-- nkf
| | |-- param_print.sh
| | |-- pppipget.sh
| | |-- pppoaup.sh
| | |-- ppxp
| | |-- ppxpd_down.sh
| | |-- rep_clitest.sh
| | |-- reset_eth0.sh
| | |-- restart_daemon.sh
| | |-- roamd
| | |-- roamd_down.sh
| | |-- roamd_up.sh
| | |-- scif_off.sh
| | |-- scif_on.sh
| | |-- setsid
| | |-- shttpd.sh
| | |-- tail.sh
| | |-- tap0conf.sh
| | |-- tty
| | `-- umountmnt.sh
| |-- lib
| |-- local
| | |-- etc -> /usr_local_etc
| | |-- lib
| | | `-- iptables
| | | |-- libipt_DNAT.so
| | | |-- libipt_MASQUERADE.so
| | | |-- libipt_SNAT.so
| | | |-- libipt_icmp.so
| | | |-- libipt_standard.so
| | | |-- libipt_tcp.so
| | | `-- libipt_udp.so
| | |-- sbin
| | | |-- mdnsproxy
| | | |-- ppxpd
| | | `-- shttpd
| | `-- share
| | `-- mdnkit
| | `-- jp.map
| |-- sbin
| | |-- adsl-connect
| | |-- adsl-start
| | |-- adsl-status
| | |-- adsl-stop
| | |-- clictlm
| | |-- clitest
| | |-- dhcpd
| | |-- execf
| | |-- in.telnetd
| | |-- inetd
| | |-- io
| | |-- iwconfig
| | |-- pppd
| | |-- pppoe
| | |-- tsap_adsld
| | `-- tsap_flashd2
| `-- share
| `-- terminfo
| `-- k
| `-- kterm
`-- wwwroot
`-- tsap
|-- ecgi
| |-- AdslStat.class
| |-- ConnStat.class
| |-- auto_conn.cgi -> tsap.cgi
| |-- confirm.cgi -> tsap.cgi
| |-- dial.cgi -> tsap.cgi
| |-- dialconf.cgi -> tsap.cgi
| |-- discdial.cgi -> tsap.cgi
| |-- discpppoa.cgi -> tsap.cgi
| |-- discpppoe.cgi -> tsap.cgi
| |-- ecgi -> ../ecgi
| |-- ehtml -> ../ehtml
| |-- eimage -> ../eimage
| |-- idebug.cgi -> tsap.cgi
| |-- initnetwork.cgi -> tsap.cgi
| |-- ipup_mdnsproxy.cgi -> tsap.cgi
| |-- kantan0.cgi -> tsap.cgi
| |-- kantan1.cgi -> tsap.cgi
| |-- kantan2.cgi -> tsap.cgi
| |-- kantan3.cgi -> tsap.cgi
| |-- kantan4.cgi -> tsap.cgi
| |-- kantanA.cgi -> tsap.cgi
| |-- kantanM.cgi -> tsap.cgi
| |-- logoff.cgi -> tsap.cgi
| |-- macconf.cgi -> tsap.cgi
| |-- maclist.cgi -> tsap.cgi
| |-- mforward.cgi -> tsap.cgi
| |-- misc.cgi -> tsap.cgi
| |-- modem_info.cgi -> tsap.cgi
| |-- network.cgi -> tsap.cgi
| |-- pblkadd.cgi -> tsap.cgi
| |-- pblkdel.cgi -> tsap.cgi
| |-- pblock.cgi -> tsap.cgi
| |-- pforward.cgi -> tsap.cgi
| |-- pfwdadd.cgi -> tsap.cgi
| |-- pfwddel.cgi -> tsap.cgi
| |-- pppoa.cgi -> tsap.cgi
| |-- pppoaconf.cgi -> tsap.cgi
| |-- pppoe.cgi -> tsap.cgi
| |-- pppoeconf.cgi -> tsap.cgi
| |-- print.cgi -> tsap.cgi
| |-- reboot.cgi -> tsap.cgi
| |-- setdialconf.cgi -> tsap.cgi
| |-- setfact192_AP2.cgi -> tsap.cgi
| |-- setfact192_AP3.cgi -> tsap.cgi
| |-- setfactest_AP2.cgi -> tsap.cgi
| |-- setfactest_AP3.cgi -> tsap.cgi
| |-- setidebug.cgi -> tsap.cgi
| |-- setiptables.cgi -> tsap.cgi
| |-- setkantanA.cgi -> tsap.cgi
| |-- setkantanC.cgi -> tsap.cgi
| |-- setkantanM.cgi -> tsap.cgi
| |-- setmisc.cgi -> tsap.cgi
| |-- setnetwork.cgi -> tsap.cgi
| |-- setpasswd_initialize.cgi -> tsap.cgi
| |-- setpppoaconf.cgi -> tsap.cgi
| |-- setpppoeconf.cgi -> tsap.cgi
| |-- settingtop.cgi -> tsap.cgi
| |-- settop.cgi -> tsap.cgi
| |-- settop_A.cgi -> tsap.cgi
| |-- settop_B.cgi -> tsap.cgi
| |-- settop_D.cgi -> tsap.cgi
| |-- settop_E.cgi -> tsap.cgi
| |-- settop_K.cgi -> tsap.cgi
| |-- settop_M.cgi -> tsap.cgi
| |-- setwvlan.cgi -> tsap.cgi
| |-- side.cgi -> tsap.cgi
| |-- syslog.cgi -> tsap.cgi
| |-- top.cgi -> tsap.cgi
| |-- tsap.cgi
| |-- wep.cgi -> tsap.cgi
| `-- wvlan.cgi -> tsap.cgi
|-- ehtml
| |-- confirm.html
| |-- dialconf.html
| |-- dialdown.html
| |-- dialup.html
| |-- end.html
| |-- end_reboot.html
| |-- end_refresh.html
| |-- end_top.html
| |-- idebug.html
| |-- iptables.html
| |-- kantan1.html
| |-- kantan2.html
| |-- kantan3.html
| |-- kantan4.html
| |-- kantanA.html
| |-- kantanM.html
| |-- macconf.html
| |-- maclist.html
| |-- mforward.html
| |-- misc.html
| |-- modem_info.html
| |-- network.html
| |-- network2.html
| |-- pblock.html
| |-- pforward.html
| |-- pppoaconf.html
| |-- pppoadown.html
| |-- pppoaup.html
| |-- pppoeconf_AP2.html
| |-- pppoeconf_AP3.html
| |-- pppoedown.html
| |-- pppoeup.html
| |-- settingtop.html
| |-- side.html
| |-- syslog.html
| |-- top_A.html
| |-- top_B.html
| |-- top_D.html
| |-- top_E.html
| `-- wvlan.html
`-- eimage
|-- Dialup.gif
|-- Dialup_g.gif
|-- Dmz.gif
|-- Dmz_g.gif
|-- Hensyu.gif
|-- Hozon.gif
|-- Ichiran.gif
|-- Ippatu.gif
|-- Ippatu_g.gif
|-- Mac.gif
|-- Main.gif
|-- Memory.gif
|-- Modoru.gif
|-- Network.gif
|-- Next.gif
|-- No.gif
|-- PPPoA.gif
|-- PPPoA_g.gif
|-- PPPoE.gif
|-- PPPoE_g.gif
|-- Packet.gif
|-- Packet_g.gif
|-- Reboot.gif
|-- Rebootflash.gif
|-- Rogoff.gif
|-- Saihyouji.gif
|-- Saikidou.gif
|-- Sakujyo.gif
|-- Setudan.gif
|-- Setuzoku.gif
|-- Setuzokuset.gif
|-- Touroku.gif
|-- Tuika.gif
|-- Virtual.gif
|-- Virtual_g.gif
|-- Wireless.gif
|-- Yes.gif
|-- bridge.gif
|-- bridge_g.gif
|-- broadlogo.gif
|-- c_batsu.gif
|-- c_check.gif
|-- c_white.gif
|-- laneedlogo.gif
|-- ttl_dialjotai.gif
|-- ttl_dialsettei.gif
|-- ttl_dialsetuzoku.gif
|-- ttl_dmz.gif
|-- ttl_ippatu.gif
|-- ttl_kantan.gif
|-- ttl_macitiran.gif
|-- ttl_macsettei.gif
|-- ttl_musen.gif
|-- ttl_network.gif
|-- ttl_packet.gif
|-- ttl_poajotai.gif
|-- ttl_poasettei.gif
|-- ttl_poasetuzoku.gif
|-- ttl_poejotai.gif
|-- ttl_poesettei.gif
|-- ttl_poesetuzoku.gif
|-- ttl_setteijokyo.gif
|-- ttl_syosai.gif
`-- ttl_virtual.gif
33 directories, 319 files
なくなったファイル(シンボリックリンクだけど)は iptables.cgi のみ。
セキュリティ fix は iptables.cgi の削除だけで、残りは bridge mode 用の
変更だと思われる。
変更内容について
エレコムさんのファームウェアのページには、変更内容が以下のように書かれている。
・Telnetポートを無効にしました。
・当社メンテナンス用に設けていた管理用アカウント/CGIを削除しました。
・WAN側からのファームアップを禁止しました。
・ファームアップの際にパスワードが必要になりました。
・ファームウェアファイルにスクランブルをかけました。
1つ1つ確認してみる。
・Telnetポートを無効にしました。
initrd の中身から /etc/inetd.conf を確認した。
#telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
となっている。無効になっているようである。
・当社メンテナンス用に設けていた管理用アカウント/CGIを削除しました。
initrd の中身から /etc/passwd を確認した。
[toyota@kashyyyk]376% cat passwd
root:x:0:0:root:/root:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
www-data::33:33:www-data:/var/www:/bin/sh
ftp:x:104:104::/home:/bin/sh
nobody:x:65534:65534:nobody:/home:/bin/sh
tsubota アカウントが削除されている。しかし、パスワードが設定されていないユーザ
www-data がまだ存在するようである。telnet が無効になったといえ、これはちょっと
考えて欲しかった。
なかみ2、の内容から iptables.cgi が削除されたのは確認した。
私は最初、「管理用アカウント/CGIを削除しました。」を見て、 CGI という名前の
アカウントを削除したのかと思った。「管理用アカウントとCGIを削除しました。」と
書いて欲しかった。
(2004年5月10日追記:いつのまにか表示が「アカウントとCGI」に変更されてました)
・WAN側からのファームアップを禁止しました。
まだ確認していません。
・ファームアップの際にパスワードが必要になりました。
まだ確認していません。
・ファームウェアファイルにスクランブルをかけました。
これは、ダウンロードしたファームウェアファイル WBBRB133.exe にスクランブルを
かけている、ということのようであるが、スクランブルがかかっていること自体は
確認した。しかし、ファームウェアをアップロードする際の通信は、ここで言う
スクランブルが掛かっていないため、パケットキャプチャソフトを使うか、もしくは
9002 番ポートを使った簡単なサーバソフトを作ることにより、中身が取り出せる。
なかみ、なかみ2はこうして取り出したものである。
そう考えると、ここでスクランブルをかけた意味が良くわからない。何の意味が
あって、スクランブルをかけたのだろう。
tsap.cgi について
CGI のプログラム本体である tsap.cgi を眺めていたのだけど、中に複数のプロバイダの
アカウント情報が存在するようである。具体的に言うと、 tsubota さんが使っていたと
思われるユーザ名とパスワードである。この情報については試していないので(当たり前か)
確実かどうかは不明である。
上記の、なかみ、なかみ2、を取り出したプログラムを公開しようと思ったのだが、
この情報が含まれているので、公開しないことにした。
感想
1ヶ月弱の期間で対応したのは、素晴らしいと思うが、全般に渡ってもう少しチェックを
して欲しかった。ファームウェアファイルにスクランブルをかけた点について、深読み
すると色々と考えられるのだが、中身に自信があるのだったら必要ないのでは、と思う。
|