本文目的:关闭光猫内自动运行的JAVA插件,并实现开机自动调用用户的程序启动

移动定制版F7607P不带LXC容器,取而代之的是JAVA虚拟机,内置多个插件,包括名为CMCCDPI的插件,用途可以从名字上窥见。机器rootfs分区为jffs2格式,挂载为只读。之前尝试过修改分区内容再写回闪存,但发现中兴对该分区有多重CRC校验和RSA证书签名,直接修改该分区的难度超出我的能力范围,遂转战其他地方。

分区结构如下:

/ # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 10000000 00020000 "whole flash"
mtd1: 00200000 00020000 "u-boot"
mtd2: 00200000 00020000 "others"
mtd3: 00200000 00020000 "parameter tags"
mtd4: 00200000 00020000 "wlan"
mtd5: 00800000 00020000 "usercfg"
mtd6: 00600000 00020000 "middle"
mtd7: 02800000 00020000 "kernel1"
mtd8: 02800000 00020000 "kernel2"
mtd9: 03200000 00020000 "osgi1"
mtd10: 03200000 00020000 "osgi2"
mtd11: 03600000 00020000 "plugin_data"
mtd12: 024e0000 00020000 "rootfs"

挂载点如下:

查看/etc/下的各个自启动脚本,都没有任何调用其他分区程序的漏洞,就不打这里的主意了。ps查看正在运行的程序,可以看到所有的程序都是位于/bin或/sbin目录下,除了一个JAVA程序,位于/usr/java/bin目录下,df查看挂载点,发现/usr/java这个目录的挂载来源是是/usr/tmp目录下的镜像文件osgi.img,这就有办法了,替换掉这个镜像里的java程序为我们自己的启动脚本就行了。而/usr/tmp目录的挂载来源又是ubi0_0,应该就是mtd9和mtd10了,且挂载为只读。

先把osgi.img这个文件拷贝出来,发现是squanfs格式的镜像,debian下使用unsquashfs osgi.img命令解开镜像,然后进去bin目录,将原始的java程序重命名为java_renamed, 新建一个名为java的脚本,内容如下

#!/bin/sh

if [ ! -f /tmp/started ]; then
        /usr/plugin/startup.sh &
        if [ -f /mnt/usb1_1/startup.sh ]; then
           /mnt/usb1_1/startup.sh &
        fi
        touch /tmp/started
else
        echo "device already started"
fi
exit 1

脚本会自动调用可写目录/usr/plugin下的脚本startup.sh,如果检查到优盘中存在startup.sh文件的话,同样会调用。因为java程序有个守护进程osgid,每分钟会检测一次java程序是否运行,没运行的话会重复启动,所以我还在脚本开头加了一个判断逻辑,如果是开机后第一次启动就继续调用 startup.sh,否则退出

保存后记得chmod +x java给它执行权限,回到根目录外,使用mksquashfs命令把修改后的文件夹打包会squashfs镜像文件osgi_mod.img,记得加压缩参数-comp xz

接下来就是用修改后的osgi.img文件替换/usr/tmp下的osgi.mod。/usr/tmp挂载为只读,用如下命令重挂载为可写mount -o remount,rw ubi0_0 /usr/tmp,然后删除原来的osgi.img,发现个问题,删除文件后可用空间不增加,导致新的镜像文件不能写入,找不到解决办法,重启后解决。替换镜像后再次重启,进入/usr/java/bin目录,发现java程序成功被替换掉,startup.sh脚本被成功调用

startup.sh中加什么内容就看自己了,我先加了个开启telnet的命令,这样不用担心telnet被关。需要注意的是,osgid和java程序的运用用户不是root,是osgi用户,权限可能受限,目前发现在/userconfig目录下没有执行权限,所以不要把启动脚本放到这个目录下。其他的命令倒是没见受限,比如sendcmd命令设置telnet开关。光猫内所有的程序都是root用户运行,除了这个osgid

至于JAVA插件,java程序都被调换了,那自然运行不了了

尝试编译了udpxy放进去,能正常运行和监听,接口设置中添加了IPTV接口,改了iptables防火墙规则,但就是获取不到组播数据。之前在华为和天邑的光猫中也是一样的情况,还有待高人指点。7z b跑了下分,可能编译的原因,只能使用单核,成绩很一般

有人可能会问,加了自启动又有什么卵用?答:光猫拨号又没有软路由24小时待机的用户,可以把需要的程序编程成armv8放进去运行,armv8比较常见,很多二进制文件都可以拿来直接用