[转载]高恪开启SSH

  • 目的:开启高恪软路由SSH功能

  • 实现方法:将官方镜像文件进行二次打包

本文着重介绍遇到的问题以及解决、分析的思路和方法,并不是Step by step的教学。文章最后会附一份已经开启ssh的高恪镜像文件。由于目标为非开源项目,过程中一些关于反向工程的内容将不做详述,感兴趣的朋友请自行研究。

一、

由于高恪本身不提供shell能力,因此直接尝试从镜像文件入手。

分析安装镜像

从官方下载了一份img镜像,直接挂载到虚拟机可以正常安装并运行,于是乎尝试查看此镜像文件

fdisk -l ../../GOCLOUD-SX1200-5.2.1.21015.img

$ fdisk -l ../../GOCLOUD-SX1200-5.2.1.21015.img
$ fdisk -l ../../GOCLOUD-SX1200-5.2.1.21015.img
Disk ../../GOCLOUD-SX1200-5.2.1.21015.img: 33.9 MiB, 35544576 bytes, 69423 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device                                Boot Start    End Sectors  Size Id Type
../../GOCLOUD-SX1200-5.2.1.21015.img1 *       63  17135   17073  8.3M 83 Linux
../../GOCLOUD-SX1200-5.2.1.21015.img2      17199 214703  197505 96.4M 83 Linux

可以清楚的知道,包含两个分区。第一个分区显然是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

然后尝试获得分区信息

$ file part2.img
part2.img: Squashfs filesystem, little endian, version 4.0, 26537434 bytes, 1078 inodes, blocksize: 262144 bytes, created: Wed Nov 17 04:20:40 2021

很幸运,得到此分区为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

此处提供的镜像不包含安装程序,因此直接写入块设备即可。


打赏 支付宝打赏 微信打赏

评论

Top