技术分享】ZN600电信光猫分析—研精钩深
作者:L.A.M@Duncan SecTeam
0×0
引⾔
由于缺乏对电信天翼⽹关的全⾯了解,因此错误地认为可以⽤⼀篇⽂章把这个东西讲清楚。呵呵,毕竟我还只是个没见过世⾯的年轻⼈!
为了表达诚意,这篇⽂章会⼀⼝⽓把天翼⽹关的启动过程,lxc容器及saf程序分析,配置⽂件及其读写操作全部抖搂出来,也算是给电信天翼⽹关系列暂时画上个省略号吧。嘿嘿,期待上海电信研究院对天翼⽹关的下⼀次⼤修———天翼⽹关 4.0。
在开始正⽂之前,还是按照Duncan SecTeam的⽼规矩,祭上本⽂的mindmap,便于各位客官把握⽂章脉络,“挑肥拣瘦”。
0×1
电信天翼智能⽹关简介
电信天翼⽹关从最⽼的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】中对电信宽带做了⼀个较为全⾯且通俗易懂的介绍,从中不仅能学知识,还能帮助⼤家了解⼀下天翼⽹关的发展脉络,因此我就不好意思在这⾥占⽤篇幅了,不然要挨⼩编骂了。。。
0×2
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//qoe_cqct.sh的脚本。这啥情况啊
0×3
Lxc容器技术与saf容器管理程序
1、Lxc容器技术
作为⼀个脚本⼩⼦,对Linux Container容器技术了解着实不多啊。为了写这个破⽂章,查了好多资料,有⼀个叫做的⽹站,⼀开始以为是介绍Linux Container技术的官⽅主站,没想到是Ubuntu赞助的⼀个站点。不过,redhat官⽹的⽂章【3】还不错,⾄少还能读明⽩⼀点东西。不过,对Linux Container容器技术技术的描述上,我还是最喜欢master的解释:对于容器⾥的每⼀个程序⽽⾔,她们都以为⾃⼰才是操作系统的最(正)爱(房),然⽽她们都不知道这个叫做Linux的操作系统其实只是⼀个渣男,他有⼀票的⼥朋友。。。
⾄于虚拟机技术和容器技术的区别嘛?我理解就是⼀个从没被扒出来过的渣男与被拔出来的渣男之间的区别吧。请原谅我这个脚本⼩⼦,这些技术确实超越了我⼩脑⽠能够理解的范围。。。
2、saf容器管理程序待补充
ZN600光猫上的saf程序很有可能是上海电信研究院写的,整体的代码量应该是不太⼤的。Team⾥头没⼏个懂逆向的,因此对于这个基于MIPS架构编译的elf⽂件,着实不是我想要提及的。不过,从chin
adsl论坛上到的为数不多的帖⼦来看,这玩意的确是⼀个专门⽤来管理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。关于猫的资料