山灵M2x真好玩


双十二为了耳朵愉悦,购买了 DT880,为了能推动这个玩意儿,之前的山灵 M1 自然是不行了,于是在综合比较后选择了山灵 M2x,选择山灵 M2x 的原因有如下几点:

  1. 手上有山灵 M1,且对其体验满意
  2. 看评测感觉还不错
  3. Linux 系统,根据之前拆山灵 M1 包的经验,感觉可玩性不错,可以拿来当玩具玩
  4. 支持国砖

好了言归正传,接下来来记录一下我的搞事过程。因为这篇文章是到货以后 hack 掉才写的,所以一些截图是边写边截的。

难易度:简单。

0x01 探索固件

之前研究过山灵 M1 的固件,山灵 M1 的固件就是很简单的一个 ubifs 的镜像,估计更新也就是直接把这个镜像给怼进 mtd,里面的 Linux 是 buildroot 的。M1 的系统中有 sshd,这也是我买山灵 M2x 的原因,因为它有 WiFi,可能可以直接 ssh 进去。

于是在到货的前一晚,我先在官网上下载了最新的镜像,然后拆了它。要吐槽的一点是,说好的 .tar.gz 结果并没有 gz 过。

Screenshot_20191215_134047.png

根据分析 nand 文件夹里放的就是固件文件了。

诶!怎么和之前不一样了!之前是单个 bin 就完事儿了,现在怎么是一堆 update*.zip!而且每个文件都有用 SignApk 签名,那看来通过修改 ubi 文件来搞事这一点是行不通了。那就先把所有内容提出来吧。

Screenshot_20191215_134831.png

提出来就可以看到 m2xsystem.ubi_*,盲猜是把 ubi 分卷了。然后阅读 update.xml 可得更新文件名为 m2xsystem.ubi 然后分为了 48 个 chunk,那就是确实这样了。用 cat m2xsystem.ubi_* > m2xsystem.ubi 得到了完整的 ubifs 镜像。然后将其挂载。

Screenshot_20191215_135531.png

好,那我们就可以看看这个系统了。

接下来是 soha 游览系统的时间,此处略去 1k 字。

看完系统,我找到的唯一能用来玩的就是 /etc/thttpd.conf,里面有跑一个 Web 服务,阅读了其中指向的 /usr/share/web 之后发现了这似乎是个通过 Web 上传文件的功能,然后我把其中的 cgi 文件都拿出来准备之后研究。因为升级固件的 zip 们有签名,在不拆机的情况下最快捷的应该也就是这个了。山灵 M1 有 ssh,但是 M2x 就没有了。

Screenshot_20191215_140721.png

顺便发现个好玩的,/home 里面有个 chenyou 文件夹,目测是 chenyou 同志打包的时候没注意把这些带进来浪费空间了。

Screenshot_20191215_140757.png

0x02 Web 好玩

一共有六个 cgi 文件。

Snipaste_2019-12-15_14-17-50.png

阅读 /usr/share/web 中的 HTML 和 JS 之后,得知六个文件分别用来创建文件夹、删除文件、下载文件、列目录、移动文件、上传文件。

把得到的 cgi 文件拖进 IDA,仔细阅读后得出以下结论:

  1. 所有 path 在传的时候都是系统的绝对路径
  2. list.cgi 列文件的时候限制了列出的扩展名
  3. 上传等地方的扩展名限制是仅前端的
  4. create 里面是 system("mkdir"),delete 里面是 system("rm"),move 和 upload 里面是 system("mv")
  5. 而且没有过滤引号,也就是说 system() 里面的指令是可以注入的。

Snipaste_2019-12-15_14-25-25.png

得到这些资料我就心满意足的睡觉去了。

0x03 在手里没活过五分钟

到货了以后首先验货验完然后试听,这些结束后我开始搞事了。首先连上 WiFi,然后打开其 WiFi 传歌功能。

Snipaste_2019-12-15_14-33-41.png

根据我昨晚得到的资料,首先尝试通过 cgi 上传一个文件到 SD 卡中。

Snipaste_2019-12-15_14-37-17.png

因为 list.cgi 限制,所以只能通过 USB 来看。显然上传成功了(那肯定,毕竟都已经读过一遍反编译的 cgi 了)。

Snipaste_2019-12-15_14-38-31.png

然后尝试上传一个 html 到 /usr/share/web 下面,但是 gg 了。文件上传上去默认是带了 x 属性,然后 thttpd 不愿意用。

Snipaste_2019-12-15_14-44-22.png

那这时候就可以利用那个注入漏洞了。将 path 改为 /usr/share/web/hack.html"; chmod 644 /usr/share/web/hack.html # 再上传一次,就成功了。(万呆呆(即 twd2)表示“soha试图栽赃陷害”)

Snipaste_2019-12-15_14-46-01.png

其实只是为了使用 html 才会需要用到那个注入漏洞。如果是上传一个 cgi 文件,那么本身带 x 属性就很方便了,上传一个 webshell 到 web 目录下即可使用。

0x04 getshell

最后就用 getshell 来结尾吧。很简单,用 C 读入 QUERY_STRING 然后用 popen/fgets 然后输出就行了。

Snipaste_2019-12-15_17-39-15.png

0x05 工程预留测试

我又游览了一遍 ROM,发现启动播放器主程序的 /etc/init.d/S90play 有这样一段代码。

if [ -f /mnt/mmc/factory_test/a35c2bg0suw=rvbsug97z8#2fp ] && [ -f /mnt/mmc/factory_test/factorytestapp ]
then
    /mnt/mmc/factory_test/factorytestapp &
else
    /usr/bin/shanling-play &
fi

即如果开机时的 SD 卡上的 factory_test 文件夹里存在一个名为 a35c2bg0suw=rvbsug97z8#2fp 的文件,那么就会执行这个文件夹下面的 factorytestapp

这个就不需要利用漏洞就可以搞事了。

0x06 ssh

晚上编译了一个 dropbear,然后把它放在了 SD 卡里,然后用上面发现的工程测试 factorytestapp 让它可以在开机的时候启动。然后就可以玩了。

Snipaste_2019-12-15_22-51-02.png


协议: 本文根据 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License 进行授权。

标签: ctf 山灵 hack 安全


撰写新评论

account_circle
mail
insert_link
mode_comment