记一次对某网络移动硬盘的GetShell – 作者:MactavishMeng

这个移动硬盘盒买的是一个比较便宜的产品,因此功能比较简单,与电脑的USB接口连接的时候就是正常的移动硬盘,当USB口连到充电器电源时,插上网线就能实现远程访问的功能。这里的远程访问分为两部分,局域网访问互联网访问

远程访问是通过客户端完成,在硬盘联网并自动获取IP地址后,打开客户端输入SN即可自动连接。当客户端与硬盘处于同一局域网时,将切换到局域网模式,其通信的端口和方式等都会发生变化。通过客户端,除了可以访问文件,还可以进行一些功能性的设置,如打开SAMBA、打开BT下载功能等。

端口扫描

在尝试做一些有趣的事情之前,先惯例扫描一下目标开放的端口。

image-20200308171743173.png

通过nmap识别出来的服务可以大致知道各个端口的用途。那么一些服务为unknown的端口就很可能是其信令的通信端口,后面的尝试中可以多多留意一下。

抓包&分析

为了分析其信令,必然需要进行抓包。使用Wireshark进行抓包,对数据包进行统计,可以看到目标IP 192.168.1.8 的通信中几乎全部都是在13111这个端口上。对该端口的TCP连接进行分析,以打开根目录这个动作为例,其TCP流如下:

image-20200308173009442.png

这里其实很明显看得出来,信令就是JSON格式的,其中header部分中的cmd就是信令的类型,101显然就代表了“列出目录”,那其他动作可以逐一抓包分析获得。

值得注意的是,图中信令的开头有四个点,查看数据包可以看到是4个Hex Bytes,为 0xa3 0x00 0x00 0x00,而换一个目录打开的时候就会变化,比如打开根目录的文件夹 1 的时候,它就变成了0xa6 0x00 0x00 0x00

image-20200308173658166.png

image-20200308173643823.png

这里推测可能是校验,但是试了一些操作后发现,只有第一位会变化,后面三位都是0x00 0x00 0x00的状态,再仔细观察,以0xa6开头的信令为例,其Data部分长度为170 bytes,除去头部 4 bytes,剩余的 166 bytes 转换成Hex即为0xa6

此处其他信令的分析不再赘述,如复制文件、删除文件等。

让我们开始吧!

既然已经知道了信令构成,那让我们试着操控信令,做一些客户端做不到(不让做)的事情。

列出任意目录

首先,列出目录功能中,path参数中的值是一个相对路径的形式,那如果加上 ../会出现什么呢?拿出Python,写一个发送TCP数据的代码,发送内容中的path就填写NewDisk-A\/..\/,返回上一级目录,看看它返回了什么:

image-20200308174940128.png

返回了一个列表,只有一个文件夹叫..。虽然没啥信息,但证明了信令是有效的。那再试试../../

image-20200308175236496.png

WOW!成功了!返回了一个很大的 JSON 串,包含了很多文件和文件夹名称。这样理论上来说我们就可以浏览系统中任意的文件夹里的文件了。

除了列出目录,还可以通过在路径上加../来复制文件、删除文件,操纵整个系统里的文件(只要有权限)

看看80端口

虽然能替换系统文件如rc.local来更改自启的程序从而让它运行某些指定进程,但是这样第一很麻烦,第二是万一改失败了可能系统都起不来更加麻烦。所以想能不能通过Web来搞一搞命令注入或者远程执行。

通过浏览器访问它的80端口,得到这样一个“固件升级”的界面:

image-20200308175939850.png

点进去是上传文件:

image-20200308180004137.png

尝试了半天都没找到什么突破点,但是突然看到这个页面的文件名:a_fu2.shtml

SHTML格式的文件是可以被服务器解析的,支持includeechoexec等指令,在返回客户端前会由服务端先处理其中的一些指令后再显示出来。

正好可以利用这一点,制作一个含有exec命令执行的shtml页面,来开启一些功能,如反弹shell,更方便的去进行研究。

编写一个HTML文档,body中插入exec

<body>
<h1>Hello World</h1>
<!--#exec cmd="telnetd -l /bin/ash"-->
</body>

执行该SHTML后,系统会开启一个无鉴权的telnet服务。

将这个文件通过客户端上传到硬盘根目录,再构造信令移动到www目录下(和a_fu2.shtml同级)。

当试图访问的时候,发现竟然报了404 Not Found ???

image-20200308180946418.png

想了一想,可能是系统中有设置路由(最终证实的确如此),那我删除掉一个文件,再上传一个同名文件总行了吧!

于是看了下这个文件夹里的内容,有个stm.shtml,是升级boot分区的,反正用不到,先删了再说!

将自己编写的那个文件重命名,删除原有的stm.shtml文件,用信令跨目录复制过去(具体细节和列出文件部分类似,不过多赘述)。

浏览器访问,终于成功了:

image-20200308181323185.png

这时候用telnet客户端连接,成功进入!

image-20200308181506272.png

getShell之后,进去随便看了看,似乎是基于OpenWRT构建的系统,应该是可以安装OpenWRT的软件,后面应该还有其他的可玩性吧。

补充

telnet进去后查看配置文件,发现了关于为什么 自定义的文件名404 的情况,在httpd.conf文件中对用到的资源文件进行了路由设置:

image.png

总结

由于时间限制,就没有继续对系统进行探究了,也算是一次简单的渗透,虽然需要登录后的session才能进行接下来的操作,但是通过监控客户端行为,发现Windows客户端会将Session存储在C:\programdata文件夹里,获取起来还是相对容易的。

shtml比较冷门,似乎现在都没人用这个技术了,但是它能在服务端执行命令这个功能还是挺强大的。其他支持的命令可以参考这里:SHTML 教程 – Areas – 博客园

来源:freebuf.com 2020-03-09 09:05:13 by: MactavishMeng

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论