作者:L.A.M@Duncan SecTeam
0x00:引言
由于缺乏对电信天翼网关的全面了解,因此错误地认为可以用一篇文章把这个东西讲清楚。呵呵,毕竟我还只是个没见过世面的年轻人!
为了表达诚意,这篇文章会一口气把天翼网关的启动过程,lxc容器及saf程序分析,配置文件及其读写操作全部抖搂出来,也算是给电信天翼网关系列暂时画上个省略号吧。嘿嘿,期待上海电信研究院对天翼网关的下一次大修———天翼网关 4.0。
在开始正文之前,还是按照Duncan SecTeam的老规矩,祭上本文的mindmap,便于各位客官把握文章脉络,“挑肥拣瘦”。
0x01:电信天翼智能网关的简介
电信天翼网关从最老的A8-C、E8-C等设备发展到目前最新的天翼网关4.0经历了至少5个主要的版本代际【1】,如下图。目前,电信天翼网关4.0已经完成了集中采购,按理说已经在某些省市上市了吧【2】。
PS:图片截取自文章【1】
由于我们team只接触过天翼网关2.0和3.0设备,因此没办法对较为老旧的A8-C、E8-C以及天翼网关1.0设备进行分析,也就没法判断电信官方宣称的“智能OS”是否就是PT632和ZN600为代表的天翼网关2.0和3.0所安装“Linux tc”操作系统。很期待能够拿到一台天翼网关4.0设备,这样就可以再写一篇关于天翼网关“智能OS”的文章,再忽悠小编几块钱稿费啦^_^
再者,文章【1】中对电信宽带做了一个较为全面且通俗易懂的介绍,从中不仅能学知识,还能帮助大家了解一下天翼网关的发展脉络,因此我就不好意思在这里占用篇幅了,不然要挨小编骂了。。。
0x002:ZN600系统加载
ZN600光猫的启动脚本是/etc/init.d/rcS文件,说实话这文件还真值得仔细品品,一是可以学到很多shell脚本知识,这个脚本绝对不会让我这么个脚本小子去写的;二是,的确可以了解天翼网关的各种瓜,哈哈哈。
Step 1:检查配置文件。如果/userfs/profile.cfg配置文件的确存在的话,把文件的权限修改为可读可写可执行。这个有点没明白,配置文件为什么要搞成可执行呢?
Step 2:确定Linux内核版本。从代码来看,应该是在系统中预先定义了内核版本信息,如果对应的版本字符串不为空,则加载指定版本的Linux内核。这个操作说明Linux tc是一个有故事的OS,曾经灵魂附体过好多猫,阔怕。。。就是这个if-else语句的写法着实有点让人觉得好奇怪哟。。。
Step 3:挂载文件系统,然后根据预先设定的值并判断是否支持DBus,如果支持则执行Lxc容器先关操作。
在rcS启动脚本最后的一段代码也验证了我们关于tcapi与DBus之间的关系。如果不支持DBus,那么就使用tcapi来对voice,wifi,igddbus,saf以及tr069c等五个进程对应的Process_Entry进行设置。
Step 4:网络初始化。在进行一系列的目录操作后,系统就开始进行网络的配置了。东西太多,就没有一一展开写了。
Step 5:检查CPU型号,并加载对应的驱动模块。
Step 6:诡异的结尾。按照电信的尿性,下面截图中的SC和CQ应该分别代表了四川和重庆,可是为什么要区别对待呢?一旦判断猫是四川的,就在/tmp/rcs_load_ok中写个1。如果猫是重庆的,就要执行cqct_backinfo程序,然后还要在后台跑/usr/script/qoe_cqct.sh的脚本。这啥情况啊???
0x03:Lxc容器技术与saf容器管理程序
1、Lxc容器技术
作为一个脚本小子,对Linux Container容器技术了解着实不多啊。为了写这个破文章,查了好多资料,有一个叫做linuxcontainers.org的网站,一开始以为是介绍Linux Container技术的官方主站,没想到是Ubuntu赞助的一个站点。不过,redhat官网的文章【3】还不错,至少还能读明白一点东西。不过,对Linux Container容器技术技术的描述上,我还是最喜欢master的解释:对于容器里的每一个程序而言,她们都以为自己才是操作系统的最(正)爱(房),然而她们都不知道这个叫做Linux的操作系统其实只是一个渣男,他有一票的女朋友。。。
至于虚拟机技术和容器技术的区别嘛?我理解就是一个从没被扒出来过的渣男与被拔出来的渣男之间的区别吧。请原谅我这个脚本小子,这些技术确实超越了我小脑瓜能够理解的范围。。。
PS:原谅我连5毛钱都值不了的PS技术。。。
2、saf容器管理程序待补充
ZN600光猫上的saf程序很有可能是上海电信研究院写的,整体的代码量应该是不太大的。Team里头没几个懂逆向的,因此对于这个基于MIPS架构编译的elf文件,着实不是我想要提及的。不过,从chinadsl.cn论坛上找到的为数不多的帖子来看,这玩意的确是一个专门用来管理Linux Container的管理器。既然有了这个wrapper,那么天翼“智能OS”就无情地阉割了标准Linux Container容器技术中的一票API。
而且,另外一个有趣的事情是,不同厂商生产的天翼智能网关中,saf程序的名字并非完全一样,或多或少留下了生产厂商的烙印。文章【4】中提到华为的天翼光猫对应的容器管理程序是saf-huawei,但在兆能和中兴的设备上却是简单的一个saf。
因为程序反向分析这个技能已经完全超出我这个脚本小子的能力范围了(努力学习ing),因此只能寄希望于各位潜水的大佬和路过的大牛看官们了。。。不过,以我们对master他老人家的了解,这老爷子应该会搞定saf的密码,然后以一种优雅的方法去操纵容器里的OpenWrt!
3、OpenWrt的版本判定
由于整个OpenWrt被电信工程师(也可能是兆能的工程师)改得有点狠,很多细节的地方也都被抹掉了,因此要判定ZN600到底跑的哪个版本OpenWrt还是不太容易。下面的截图是从OpenWrt容器中/etc目录下查看到的OpenWrt版本信息,可以看出工程师们可以抹去了版本信息,这对于Hacker而言着实让人极为很反感。不过,我们还是可以从中看出这个OpenWrt的一些信息,比如内部规定的发行版本信息以及更为关键的编译日期:2020年11月24日12点04分48秒,估计是在星期二午饭之前编译的~_^
本以为他们对于版本信息的修改会止步于此,于是就扒到了更深的LuCi里头去,查一下LuCi的版本信息,阔怕啊。。。改得好彻底啊!!!
在OpenWrt官网找遍了,没找到任何R3754的LuCi版本。但仅仅因为这个就判断LuCi的版本信息是被篡改了,还有显得有些不够严谨。因此,我们在Ubunt里头安装Lxc并运行了OpenWrt 21版本,查看了原汁原味的LuCi版本信息是啥样的。最后,严谨的验证了我们认定电信工程师篡改了LuCi版本信息。
4、切入OpenWrt容器
非常羡慕文章【5】的作者songee,他手上拿到的可不是“太监”光猫,那猫保留的Lxc程序要多一些。其中,lxc-attach这个程序是可以直接切入到Lxc容器内部的,获得一个容器内OpenWrt的root用户shell。
而ZN600则是一只彻头彻尾的“太监”猫!下面第一张图是从Linux tc上截取的,第二张图则是在容器里头OpenWrt截取的。果真是,没有对比就没有伤害啊。。。
我们team能够切入到容器里头的OpenWrt还得感谢chinadsl.net论坛的大神achaoge在文章【6】中提供的技术思路——利用Linux系统的rc.local文件实现开机自启动,然后在别的端口运行telnet服务程序。这个方法有两个好处:一是,避开电信工程师苦心编写的saf容器管理程序,不跟这货正面刚,打不赢,咱玩儿迂回包抄;二是,这个方法还解决了telnet服务自启动(持久化)。
按照achaoge在文章【6】中给出的方法,登录ZN600光猫之后,在/opt/upt/apps/apps/etc/目录下,创建rc.local文件并写入以下内容。
在重新启动光猫之后,就可以通过telnet连接ZN600光猫的1123端口,登录到OpenWrt容器中。
0x04:配置文件获取
1、光猫基本配置信息——/userfs/profile.cfg
从前面对/etc/init.d/rcS启动脚本的分析,我们可以清楚地看到,ZN600开机之后的第一件事情就是读取配置文件/userfs/profile.cfg。这个配置文件中定义了各个不同厂商的光猫硬件信息和相关的软件配置信息。这个配置文件的设计思路很简单,如果某个参数或者选项被设定了则将其对应名称的字符串值赋值为y;否则,直接用#注销掉这个参数或选项。
从我们的分析来看,这个配置文件应该是光猫厂商自己的配置文件,没有针对特定的运营商,甚至没有针对特定的地域范围。除此之外,在/userfs目录下还有一个名为romfile_f.cfg的xml格式配置文件,没有去进一步验证这两文件是不是内容一致。
再者,/etc/profile.cfg配置文件中有一个配置选项让脚本小子们差点吓出尿了。下面第一张截图是sublime截图,第二张是telnet到ZN600之后的截图。还好#妥妥的在那儿,阔怕啊。。。
2、天翼智能网关系统配置信息——/etc/romfile_f.cfg
这是一个xml格式的配置文件,存储了包括智能网关超级后台用户密码在内的各种系统配置信息,如下图:
很多人,包括我们这帮傻小子在内,一直以为天翼智能网关只有两个账户:一个后台超级管理账户以及一个登录Web后台的普通用户。万万没想到啊,还有“第三者”!不过,我们尝试过了各种方法,这个第三者始终无法插足Web后台。。。
3、其它配置文件——备胎
在/userfs目录下,还有一堆的配置文件,除了前面说到的那两个外,还有一些涉及到具体地域的配置文件。
把这些文件下载到本地之后,逐一查看,全部都是加密了的。。。
看到这些文件,心都凉了,咋整啊?没想到,下载到本地以后,file命令已查看,就是拿gzip压缩了一下而已。虚惊一场。。。
4、实时查看配置文件——tcapi
正如同我们在PT632光猫分析中说的那样,天翼系列智能网关实现了一个名叫tcapi的程序,它的作用就是读写及应用系统配置信息,是用以查看当前配置文件的正确解法。
0x05:Some Tricks
由于Linux tc里面阉割了busybox,这个问题team的前两篇文章已经说过了,干掉find和grep命令。当然,天翼智能网关的“智能OS”自始至终就把Linux系统内置的alias命令排除在外(这一点最恶心人)。
1、开启telnet
关于开启电信光猫telnet的方法其实就那么一两种,在牛人一堆的chinadsl.net一搜就能找到。但是,碍于电信集采的时候选定了好几家厂商,因此各个厂商在实现上会略有区别,所以光猫开启telnet的方法因为因为厂商的不同略有差异。再者,不同地域的电信公司也会有一些奇怪的电信光猫超级后台密码管理策略,比如每隔一段时间通过TR069协议检查超级后台密码是否更改,如果更改就直接给你换个新的;再者,不同地域默认的后台超级管理密码也可能不一样,当然还需要进一步、全面的分析和验证(已经在chinadsl.net注册账号了,准备找大神和大牛们请教^_~)。
再者,前面Lxc容器技术部分也提到了如何利用rc.local文件实现容器内telnet的自启动和持久化。个人觉得这个技巧最为精妙,用最简单的方法,实现了最暴力的穿透。
2、物理机与OpenWrt容器之间的文件交换
是的,电信工程师“过分到”阉割vi的地步了,因此要想在上面写个东西挺难的。咋整呢?
我们可以通过在物理机里面添加rc.local文件实现与OpenWrt共享rc.local配置文件,那么同样可以添加别的文件啊!但是,文件夹的话有些问题,只能共享目录,不能在共享的目录下方共享别的文件(努力找原因…)。
再者,如果你不想去动系统相关的配置文件,那也可以在ZN600的U口上插个U盘,这样也能实现容器内外之间的文件共享。
用U盘来在交换文件可以做到容器内外双向传递!
3、文件下载
如果只希望下载特定文件到自己电脑进行分析的话,可以利用上一篇介绍PT632光猫文章中的方法,利用替换原本系统配置文件的方法,下载所需要的特定文件。这种方法对于急需分析某个文件而言,特别方便。
再者,如果希望下载大量文件的话,还是拷贝到U盘好使,我们一开始也是这样干的,不想去动手配置FTP服务器。
最后,可以在本地配置一个允许上传文件的FTP服务器,这样就可以用Linux tc中busybox所导出的ftpput上传文件。
0x04:总结
1、功能性。其实,天翼网关中涉及Moden那部分几乎没什么变化,毕竟各种底层的协议已经设计好了,而且除非电信网络有了实质性的性能提升,几乎不会有大的变动。当然,在原有的基础上加上一个LXC跑起来的OpenWrt的话,那一切就变得有意思了,毕竟那么多的插件可以用,功能性几乎是呈几何增长啊。
2、易用性。其实,绝大多数家庭都用不到那些OpenWrt插件,更别说ClamAV这样的安全插件了。不过,既然是脱胎于天翼智能网关,那么传统的那套操作界面也没有实质性变化,对于绝大多数家庭而言,也就那样吧。
3、安全性。由于引入了LXC和OpenWrt,从理论上来说,功能性增加了,攻击面也会相应的增加。还好,LXC自身是一项非常成熟的虚拟化技术,安全性还是信得过吧。再者,OpenWrt毕竟跑在Jail里,没有过硬的漏洞应该是打不穿的。还有,不得不说一下那帮电信工程师,的确是很有经验并且很在意安全的,那么严格的阉割(三大里头)也只有他们干得出来了。
0x05:参考
1、《决定宽带上网速率的主要因素》. http://gd.189.cn/kd/kdfw/kpWap.html
2、《中国电信2021年天翼网关4.0集采结果公布:中兴通讯成最大赢家》. https://new.qq.com/omn/20210524/20210524A095YF00.html
3、《什么是Linux容器?》. https://www.redhat.com/zh/topics/containers/whats-a-linux-container
4、《[光猫] 玩机:激活华为光猫的小宇宙-openwrt》 .http://www.chinadsl.net/thread-158737-1-1.html
5、《F650/F450、HS8145等ARM平台,LXC容器内运行 OpenWrt 19.07.1 子系统》 .http://www.chinadsl.net/thread-166731-1-1.html
6、《中兴 F450A/F650A 免 TTL 持久开 ssh》 .http://www.chinadsl.net/thread-165040-1-1.html