- 目的:开启高恪软路由SSH功能
- 实现方法:将官方镜像文件进行二次打包
本文着重介绍遇到的问题以及解决、分析的思路和方法,并不是Step by step的教学。文章最后会附一份已经开启ssh的高恪镜像文件。由于目标为非开源项目,过程中一些关于反向工程的内容将不做详述,感兴趣的朋友请自行研究。
起
由于高恪本身不提供shell能力,因此直接尝试从镜像文件入手。
分析安装镜像
从官方下载了一份img镜像,直接挂载到虚拟机可以正常安装并运行,于是乎尝试查看此镜像文件fdisk -l ../../GOCLOUD-SX1200-5.2.1.21015.img
1 | $ fdisk -l ../../GOCLOUD-SX1200-5.2.1.21015.img |
可以清楚的知道,包含两个分区。第一个分区显然是grub负责启动内核,因此可直接忽略。
当时我在这里有忽略了一个重点,是文件体积,导致后面走了许多弯路。fdisk显示第二个分区体积有96.4M,而整个镜像文件体积只有33.9M,这就应该意识到镜像存在压缩的情况。
尝试挂载第二个分区mount -o loop, offset=$((512*17199)) GOCLOUD-SX1200-5.2.1.21015.img /mnt/gocloud
,很显然,是失败了。
于是尝试单独把第二个分区拿出来dd if=GOCLOUD-SX1200-5.2.1.21015.img skip=17199 of=part2.img
然后尝试获得分区信息
1 | $ file part2.img |
很幸运,得到此分区为squashfs
文件系统。那么接下来就非常简单了,安装工具集squashfs-utils
,随后unsquashfs part2.img
得到第二个分区的内容。
此处,我又走了许多弯路,在这个镜像上,我花费了许多时间修改,并且填充回原镜像中测试,发现安装后我的修改并未生效。
歧
既然得到了目标镜像那么,很容易想到先让目标启动后,不进入指定的程序,而停留在shell阶段。因此可以找到文件/etc/inittab
$ cat squashfs-root/etc/inittab
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
ttyS0::askfirst:/usr/bin/vtysh
#tty1::askfirst:/usr/bin/vtysh
1::respawn:/bin/ash -c /usr/sbin/burner
#1::respawn:/usr/bin/fbterm-login fb0 tty1 guider
倒数第二行可以看到执行了/usr/sbin/burner
,将一整行修改为1::respawn:/bin/ash --login
后即可。然后就可以把镜像填装回去,启动试试看。
先将整个目录装填成squashfs
文件系统的封装格式mksquashfs squashfs-root squashfs.img -comp xz -all-root -no-xattrs -no-duplicates -b 256K
通常情况下,自行编译出来的squashfs文件系统会比原来的体积大,因此在将块设备装填回去之前,需要先对原镜像文件扩容并重新分区
# 将原镜像增加50M体积
dd if=/dev/zero bs=1M count=50 >> vm-102-disk-0.raw
# 重新分区
fdisk vm-102-disk-0.raw << EOF
d
2
n
p
2
17199
n
w
EOF
其中重新分区过程中,指定的第二分区起始位置(17199)应该与原分区一致。
扩容并重新分区后,就可以将自己的squashfs填充进去。
这里又有一个问题,我没有解决,我尝试直接使用dd回填失败
dd if=squashfs.img of=vm-102-disk-0.raw bs=512 seek=17199
原因不明
# 先将第二分区挂载为块设备
sudo losetup /dev/loop7 vm-102-disk-0.raw --offset $((17199*512))
# 数据回填
dd if=squashfs.img of=/dev/loop7
# 解除挂载
sudo losetup -d /dev/loop7
至此,vm-102-disk-0.raw
文件就可以直接拿回虚拟机启动看效果了。
试
当正常启动后,发现停留在了shell,先尝试执行原命令/usr/sbin/burner
后,则开始了安装,因此可以判断/usr/sbin/burner
是负责安装的脚本,cat /usr/sbin/burner
后可得知这是一个lua脚本,(此处略)反编译lua脚本后,可以知道这个脚本通过判断一系列环境后,将/SOFTROUTER-MINI.bin
文件通过ccrypt
命令解密后,直接dd写入磁盘,以完成安装。而ccrypt的密码是在脚本中固定写死的。
因此故技重施,可以得到解密后的SOFTROUTER-MINI.bin
文件,本质也是一个镜像文件(此处存在套娃),fdisk查看分区表后,结构与安装镜像几乎一致。
终
SOFTROUTER-MINI.bin
所包含的镜像,中可知,高恪是基于OpenWRT 14.07版本开发,唔,属实说是比较旧的,这大概也是迟迟没有支持IPv6的原因。
简单的修改了一下/etc/opkg.conf
和/etc/rc.local
就可以填装回去了,至于sshd可以通过opkg安装
opkg update
opkg install dropbear
/etc/init.d/dropbear enable
/etc/init.d/dropbear start
随后即可通过ssh访问高恪,默认情况下,root与admin用户密码均为admin
,请务必修改,同时请设置好防火墙,避免公网开放端口被恶意登录。
默认终端不再自动执行引导程序,如果需要使用的话,请输入命令guider
即可进入高恪原本的引导程序。
点击此处可以下载已开放权限的高恪 sx1200 5.2.1.21015,安装可以直接通过dd写入即可。
dd if=download_image.img of=/dev/sda
此处提供的镜像不包含安装程序,因此直接写入块设备即可。