0x00:前言
中国电信是三大运营商中最大的固网宽带接入服务提供商,同时也是最早开始建设光纤宽带的运营商。如下图,从早期的e8-C,到后来的天翼智能网关1.0,2.0,3.0以及最新的4.0,其固网终端接入设备(后统称:光猫)始终走在三大运营商的最前列。前期,在另一个平台以及我们的微信公众号上陆陆续续写了一些电信光猫的分析文章,但很粗浅。随着分析工作的不断进行,以及team在时间上的“堆砌”,对电信光猫的了解也更加深入,对其安全性的研究也更加全面。我们将从这篇文章开始继续发表电信光猫的分析文件,其中会涉及一些安全相关的问题。
0x01:文章内容
从天翼网关3.0开始,电信在其光猫中大胆的引入了lxc容器技术,这使得电信光猫的功(可)能(玩)性得到了极大提升,因此也无法用一篇文章就把这只猫给掰扯清楚,预期得2-3篇文章吧。关于PT926光猫的分析,大致脉络如下图所示:
0x02:源代码获取
获取光猫中的文件信息有两个渠道,一个是直接读取固件,另一个是通过telnet或SSH获得光猫的root权限dump文件系统。第一种方法获取到的是压缩文件格式存储的、未展开的源文件,配置文件等,然而涉及光猫运行的信息及参数需要进一步分析。第二种方法获取到的是操作系统加载至内存后,完全展开的文件系统中的数据,既包括了相关源文件,也包括了内核状态数据,光猫运行的mib数据库。不论是获取固件还是获取动态的系统数据,获得光猫root权限的shell都是必答题。
2.1、获取光猫超级管理员账户(telecomadmin)密码
由于光猫的特殊性,从e8-C光猫(甚至是e8系列猫)开始,电信光猫都内置了telecomadmin账户,即光猫玩家口中的电信光猫超级用户,该账户默认密码为:nE7jA%5m。但是,光猫运行一段时间后,电信后端会定期更新密码,更新后的密码为:telecomadminXXXXXXXX,其中XXXXXXX为8位的随机数。不同生产厂商的光猫有不同的方法可以获取telecomadmin超级账户的密码,当然实在不行还可以向电信客服或者电信安装师傅索要,虽然他们不一定会给。
对于PT926G而言,有至少2种方法可以获得超级用户对应的密码。一个是通过web端任意文件访问的漏洞,将/var/config/lastgood.xml文件拷贝至U盘中。另一种方法是,利用光猫FTP服务器访问权限漏洞,直接读取/var/config/lastgood.xml文件。该文件中保存了当前超级用户的密码。当然,退一万步,还可以直接将光猫反复重置,使用出厂默认的密码登录。
通过上述2种方法中的任意一种方法,均可获得
2.2、开启(允许访问)光猫系统中的SSH或telnet
对于电信天翼网关3.0而言,开启telnet的方法有2种,一种是临时性开启,另一种是永久性开启,在chinadsl.net论坛上都有具体的方法。
利用前一步中获取的lastgood.xml文件,可以找到telecomadmin账户对应的密码,利用该账户登录光猫web portal。确认以telecomadmin权限成功登录光猫后,访问http://192.168.1.1:8080/bd/saveconf.asp,下载config.xml配置文件。
Config.xml文件中包含了登录telnet登录光猫所需要的2个密码。其中,登录telnet所用的账户admin对应的密码为TeleCom_1234。登陆之后,su所需的密码为TeleCom_xxxxxx,其中xxxxxx位电信运营商随机分配的6位随机数。
此外,以telecomadmin权限登录光猫后,访问http://192.168.1.1/bd/versioninfo.asp页面,也可以获得telnet登录密码及使能密码,如下图:
2.3、获取源文件:固件和运行时文件
天翼网关3.0默认的shell是基于busybox的,提供了dd命令,可以很简单的获取光猫固件,具体操作流程如下图所示。导出的固件可以直接保存到挂载的U盘中,也可以逐一将固件保存到/var目录下,通过busybox tftp命令发送到配置好的外部TFTP服务器。
0x03:启动脚本分析
3.1、一些必要的废话
天翼网关系列产品一直都是采用Linux作为底层操作系统,当然是经过魔改之后的Linux,同时还被电信贴上了一堆光鲜亮丽的标签,例如:
“天翼网关2.0承载着家庭网络中心、家庭服务中心、家庭数据中心的重要使命,此次在MWCS17上的首次亮相更是显现出中国电信及运营商在智慧家庭市场上的决心与成果,面对万物互联的时代,未来运营商与互联网企业之间的竞合关系将更为紧密且激烈,如何积极把握下一个智慧家庭市场的窗口期,形成具有竞争力的生态关系,将成为每一个参与其中的企业不得不思考的核心议题。”【1】
“张明杰指出,中国电信整个OS可以远程随时随地升级,不断优化和迭代。业务是通过插件化的方式,通过平台,包括用户的自助可以随时随地加载、卸载,真正意义上实现了从网络终端将它达到一个高水平。同时也可以较长时间的保护硬件的投资,而不是说硬件自行下发了以后做了一些变化就得重新采购。这个是天翼网关形成的基础能力、连接能力,包括对于存储的对接以及智能安防的对接。”【2】
如上,这些看着高大上的文字描述极易让人产生错觉。一方面,运营商以及产品供应商容易陷入自我陶醉般的眩晕;另一方面,很多hacker会陷入莫名的自我否定或者畏惧,“能hack掉这么牛X的设备吗?”然而,如果我们换一个说法,很多东西就没有那种迷惑性了,比如:
天翼智能网关:= SOC + Linux + lxc + middleware
3.1.1 SOC
天翼网关进化的过程是个软硬件同时进化的过程,从最老的e8-C,到高度集成化的天翼网关4.0。下图是友华天翼网关4.0 PT928 E的电路板。其中,散热片下方的是一颗联发科的SOC芯片,RTL9607C。
图3-2:天翼网关4.0电路板
图3-3:天翼网关4.0 /proc/cpuinfo
对比一下电信初代电信光猫e8-C的电路图,差别很明显。从电路板来看,e8-C的集成度明显不如天翼网关4.0。
3.1.2 Linux
从e8-C开始到最新的天翼网关4.0,电信光猫底层操作系统(相较于lxc容器而言)自始至终都是部署的Linux操作系统。具体到PT926G而言,通过uname命令可以查看内核信息。
3.1.3 lxc
从天翼网关3.0开始,光猫内部除了运行底层Linux系统之外,还运行了OpenWrt的lxc容器。因此,光猫的功能性得到了极大扩展,这也就是前面电信大佬们所谓的极大扩展了光猫的兼容性,支持数百个第三方插件。其实,OpenWrt所能运行的插件远不止这个数,电信大佬们还是很谦虚的。
3.1.4 中间件
天翼网关中间件运行于底层操作系统之上,主要负责电信运营商侧的业务逻辑,包括但不限于基于tr069光猫管理业务。这一块内容偏重电信业务逻辑,不在本文分析内容之列。如果感兴趣,可以搜索“电信
itms”【3】
3.2、光猫启动脚本分析
Linux系统上电之后的执行流程如下图所示。
按照上图逻辑,电信光猫完成boot之后,创建init进程,并执行/etc/inittab脚本,完成系统的初始化。
从上图中“console::sysinit:/etc/init.d/rcS”配置信息可以看出,系统启动将读取/etc/init.d/rcS完成余下的启动流程。
A)rcS脚本
/etc/init.d/rcS脚本文件内容如下。脚本执行后,程序将从当前目录下rc0脚本开始依次检查并执行存在的脚本程序。
B)rc2脚本
rc2脚本执行以下操作:
—— 用于挂载文件系统,包括proc,sysfs,tmpfs等等
—— 创建系统运行所需的目录,主要位于/var目录下
—— 执行/etc/scripts目录下部分脚本,例如/etc/scripts/mnt_tmpfs.sh,/etc/scripts/mnt_cfgfs.sh等
—— 修改内核变量,例如:/proc/sys/kernel/hotplug,/proc/sys/net/unix/max_dgram_qlen
—— 设置本机回环地址
C)rc3脚本
rc3脚本主要完成以下初始化任务:
—— 判断是否需要重置光猫
—— 启动并在后台运行配置程序/bin/configd
—— 完成启动过程中配置文件相关操作,包括/var/config下的各种xml配置文件
—— 设备初始化操作,包括电源,DSP芯片等
—— 软件版本检测
—— 判断光猫业务模式,EPON或GPON,并进行相应的初始化操作,例如加载设备驱动等
—— 设置Linux内核nice值
D)rc4脚本
rc4脚本主要负责完成ubi文件系统的初始化工作,包括:
—— 调用/etc/scripts/mount_ubifs.sh脚本,挂载ubi文件系统(Unsorted Block Image File System, UBIFS)【4】
—— 创建目录
/opt/upt/apps/etc/dbus-1/system.d和/opt/upt/apps/youhua。目的为何?暂不知晓。
E)rc6脚本
rc6脚本仅创建/var/samba目录,后续光猫启动过程中会向该目录写入文件及目录。
光猫运行时/var/samba目录下内容见下图。
F)rc10脚本
rc10脚本设置了光猫运行时的内核参数,包括IP4协议及内核异常相关的参数。
G)rc12脚本
rc12脚本加载文件系统相关的内核驱动,实现对NTFS文件系统的内核支持,以提高NTFS文件系统访问效率,如下图。
H)rc14脚本
rc14脚本设置内核对IP v6的支持,如下图。很好奇为什么没有把IP4和IP6相关的内核设置操作放到同一个脚本?
I)rc17脚本
rc17脚本主要执行以下操作,如下图:
—— 设置内核转储路径及转储方式
—— 后台运行/bin/yhdiag诊断程序
J)rc21脚本
rc21脚本创建/var/run/dbus目录以支持dbus运行,如下图:
K)rc32脚本
rc32脚本执行以下操作,如下图:
—— 后台运行/bin/startup程序,其负责执行光猫的网络配置,防火墙配置,配置并运行ftp、samba等服务器配置等重要的操作。根据team的分析,lxc容器相关的操作也是在startup进程中完成的,后续会对lxc容器加载及运行进行全面的分析,如果感兴趣可以关注与freebuf同名的微信公众号“邓肯安全小组”。
—— 准备dbus运行环境,例如:创建目录,调用dbus- uuidgen
—— 创建cpus相关的目录,并将/etc/cups/conf目录下所有配置文件拷贝至/var/cups/conf目录
L)rc34脚本
rc34脚本执行以下操作,如下图:
—— 设置防火墙性能参数,即iptables期望表最大值,nf_conntrack_expect_max
——socket缓存最大值,即rmem_max
—— 执行voip相关程序
—— 启用并设置看门狗
M)rc35脚本
rc35脚本主要完成lxc容器相关操作,如下图。该部分内容对分析电信最新款光猫极为重要,即支持lxc容器实现双web应用的光猫。
—— 执行/etc/scripts/lxc_start.sh脚本完成lxc容器初始化操作,例如创建目录,挂载文件系统
—— 后台运行/bin/ctmanagedaemon
—— 执行/etc/scripts/fw_loaded.sh脚本,似乎是在执行固件加载后的检查工作
—— 修改部分涉及lxc的内核运行参数
—— 执行/etc/scripts/vm_tuning.sh脚本,检测内存状态,并修改涉及lxc的内核运行参数
3.3、启动脚本分析综述
—— team将天翼网关3.0的启动脚本/etc/init.d/*与e8-C,天翼网关1.0及天翼网关2.0的启动脚本进行了对比,发现只有天翼网关3.0才采用了/etc/init.d/rcS脚本逐一执行/etc/init.d/目录下其它脚本的实现方法。对于其它天翼网关而言,都是通过一个独立的/etc/init.d/rcS脚本完成全部启动操作。这样的变化或许是因为天翼光猫3.0引入了lxc容器,加之希望通过模块化的方法让脚本编写更加清晰。
—— team最关心的操作是lxc容器,毕竟这是天意光猫3.0中最大的特色。在OpenWrt的加持下,光猫自身的功能性和可玩性得到了极大提升。在chinadsl.net上阅读了众多帖子,加之team对光猫的深入分析,确定了光猫容器管理程序/usr/sbin/saf。光猫在完成了大部分启动流程后,通过/etc/init.d/rc32脚本执行在后台执行startup程序,即“startup&”。/bin/startup程序执行后,进一步调用/bin/proxyDaemon程序,并由该程序执行“saf service 8 9 10”启动容器。该流程是基于当前分析工作得出的结论,还需进一步分析确认详细的执行流程,以及saf程序的实现逻辑。
0x04:小结
碍于篇幅,本文就天翼网关3.0的基本软硬件特性和特点进行了简单的介绍,然后着重分析了光猫系统的启动流程。如果对本文内容感兴趣,欢迎留言催更!
0x05:参考
【1】MWC落幕!中国电信“天翼网关”2.0完美呈现!//https://www.sohu.com/a/153967240_515599
【2】打造智慧家庭连接新生态,中国电信明年推天翼网关3.0版本//https://www.sohu.com/a/208951906_234937
【3】ITMS在网络中的位置和作用. // https://wenku.baidu.com/view/c546b44edeccda38376baf1ffc4ffe473368fdc5.html?fr=income3-doc-search&_wkts_=1681573923872&wkQuery=电信+itms
【4】UBI文件系统-----UBI文件系统概念、UBI文件系统开销、UBI文件系统使用方法// https://zhuanlan.zhihu.com/p/383367301