双十二为了耳朵愉悦，购买了 DT880，为了能推动这个玩意儿，之前的山灵 M1 自然是不行了，于是在综合比较后选择了山灵 M2x，选择山灵 M2x 的原因有如下几点： 穷 手上有山灵 M1，且对其体验满意 看评测感觉还不错 Linux 系统，根据之前拆山灵 M1 包的经验，感觉可玩性不错，可以拿来当玩具玩 支持国砖 好了言归正传，接下来来记录一下我的搞事过程。因为这篇文章是到货以后 hack 掉才写的，所以一些截图是边写边截的。 难易度：简单。 0x01 探索固件 之前研究过山灵 M1 的固件，山灵 M1 的固件就是很简单的一个 ubifs 的镜像，估计更新也就是直接把这个镜像给怼进 mtd，里面的 Linux 是 buildroot 的。M1 的系统中有 sshd，这也是我买山灵 M2x 的原因，因为它有 WiFi，可能可以直接 ssh 进去。 于是在到货的前一晚，我先在官网上下载了最新的镜像，然后拆了它。要吐槽的一点是，说好的 .tar.gz 结果并没有 gz 过。 根据分析 nand 文件夹里放的就是固件文件了。 诶！怎么和之前不一样了！之前是单个 bin 就完事儿了，现在怎么是一堆 update*.zip！而且每个文件都有用 SignApk 签名，那看来通过修改 ubi 文件来搞事这一点是行不通了。那就先把所有内容提出来吧。 提出来就可以看到 m2xsystem.ubi_*，盲猜是把 ubi 分卷了。然后阅读 update.xml 可得更新文件名为 m2xsystem.ubi 然后分为了 48 个 chunk，那就是确实这样了。用 cat m2xsystem.ubi_* > m2xsystem.ubi 得到了完整的 ubifs 镜像。然后将其挂载。 好，那我们就可以看看这个系统了。 接下来是 soha 游览系统的时间，此处略去 1k 字。 看完系统，我找到的唯一能用来玩的就是 /etc/thttpd.conf，里面有跑一个 Web 服务，阅读了其中指向的 /usr/share/web 之后发现了这似乎是个通过 Web 上传文件的功能，然后我把其中的 cgi 文件都拿出来准备之后研究。因为升级固件的 zip 们有签名，在不拆机的情况下最快捷的应该也就是这个了。山灵 M1 有 ssh，但是 M2x 就没有了。 顺便发现个好玩的，/home 里面有个 chenyou 文件夹，目测是 chenyou 同志打包的时候没注意把这些带进来浪费空间了。 0x02 Web 好玩 一共有六个 cgi 文件。 阅读 /usr/share/web 中的 HTML 和 JS 之后，得知六个文件分别用来创建文件夹、删除文件、下载文件、列目录、移动文件、上传文件。 把得到的 cgi 文件拖进 IDA，仔细阅读后得出以下结论： 所有 path 在传的时候都是系统的绝对路径 list.cgi 列文件的时候限制了列出的扩展名 上传等地方的扩展名限制是仅前端的 create 里面是 system("mkdir")，delete 里面是 system("rm")，move 和 upload 里面是 system("mv") 而且没有过滤引号，也就是说 system() 里面的指令是可以注入的。 得到这些资料我就心满意足的睡觉去了。 0x03 在手里没活过五分钟 到货了以后首先验货验完然后试听，这些结束后我开始搞事了。首先连上 WiFi，然后打开其 WiFi 传歌功能。 根据我昨晚得到的资料，首先尝试通过 cgi 上传一个文件到 SD 卡中。 因为 list.cgi 限制，所以只能通过 USB 来看。显然上传成功了（那肯定，毕竟都已经读过一遍反编译的 cgi 了）。 然后尝试上传一个 html 到 /usr/share/web 下面，但是 gg 了。文件上传上去默认是带了 x 属性，然后 thttpd 不愿意用。 那这时候就可以利用那个注入漏洞了。将 path 改为 /usr/share/web/hack.html"; chmod 644 /usr/share/web/hack.html # 再上传一次，就成功了。（万呆呆（即 twd2）表示“soha试图栽赃陷害”） 其实只是为了使用 html 才会需要用到那个注入漏洞。如果是上传一个 cgi 文件，那么本身带 x 属性就很方便了，上传一个 webshell 到 web 目录下即可使用。 0x04 getshell 最后就用 getshell 来结尾吧。很简单，用 C 读入 QUERY_STRING 然后用 popen/fgets 然后输出就行了。 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 让它可以在开机的时候启动。然后就可以玩了。