路由器漏洞复现分析第二弹:CNVD-2018-01084

1月17日,CNVD公开了D-LinkDIR 615/645/815 service.cgi远程命令执行漏洞(CNVD-2018-01084),freebuf上有前辈写了一篇漏洞复现和poc的文章(http://www.freebuf.com/new/160716.html)。

在上一篇文章(http://www.freebuf.com/vuls/160040.html)里实际操作了一下用qemu system模式模拟路由器环境,那这一次再通过分析CNVD-2018-01084实际操作一下用qemu user 模式配合IDA对固件做调试。

漏洞信息 :

D-Link DIR 615/645/815路由器1.03及之前的固件版本存在远程命令执行漏洞。该漏洞是由于service.cgi中拼接了HTTP POST请求中的数据,造成后台命令拼接,导致可执行任意命令。

一 运行环境分析

先下载到相关固件,dir815_FW_102.bin,此文件对应D-Link815路由器102版本固件 ,binwalk解开后找到cgibin文件.

IDA打开Cgibin看一下main函数,如果要运行到处理service.cgi函数的分支,需要将一个参数设为相应的字符串

尝试了之前网上一些大神的脚本方法,用标准输入的参数方式或者是直接在qemu命令后面加参数的方式,如下的代码,都没能成功

后来发现需要用qemu -0 的方式来指定参数第一个参数

运行cgibin,还需要配置一些必要的参数,搜索一下servicecgi_main,发现里面及其子函数cgibin_parse_request里面会取如下的环境变量,如果不配置相应的环境变量那么cgibin运行后会直接走到http 解析失败的分支。

因此在执行cgibin时还需要加入如下的环境变量

如果需要调试还要加入 -g 参数指定端口号,那么整合成如下的shell脚本:

Ubuntu下面先切换到root用户再运行此脚本,

此时cgibin就已经在等待调试器连接的状态。

二 调试器设置

调试器可以选择如下的两种方法:

1. 用buildroot里面编译好的gdb来调试,

步骤如图所示,用gdb启动要调试的文件后设置相应的远程调试地址和端口

2.用IDA来远程调试,

首先Ubuntu里安装wine,再用wine运行ida

用ida打开cgibin

debugger option里设置

F9开始调试,选择文件和端口,参数等

确认附加到远程进程里

然后发现ida断在库函数里面

F9运行,就到main函数入口处了

三 调试过程

CGI中一般通过getenv或stdlib库函数getenv来获得环境变量获取post过来的数据,

在cgibin中未找到stdin,scanf这样的函数或者字符串,因此把要注入的命令当做输入参数传递不能成功,仔细检查每一个genenv,把要注入的命令放到request_uri环境变量时候成功

当取到request_uri后,如下图,会去取”?”后面的内容,也就是我们注入的参数,

因此在我们的shell脚本里面需要如下修改:

http解析成功后,就是验证cookie的sess_ispoweruser函数,直接修改了返回值v0过掉,

接下来就是用去取request_uri里面的参数,里面可以存在event,action,service三种类型的命令,

找到event参数后,v0的值为CHECKFW&ls&:

继续往下进入lxmldbc_system函数,vsnprintf将v0的内容输出到s0,s0的值为” eventCHECKFW&ls& > /dev/null “ ,已经是我们预期要执行的注入命令,然后赋值给a0作为system命令的第一个参数。

在shell脚本里加入 -strace参数 ,可以看到此时的系统调用,如图,system函数执行了我们需要的参数,但是却报错

目前的qemu版本:

造成以上错误的原因是,qemu2.5 user模式并未实现execve函数,需要下载带补丁版本的qemu2.9版本并调加-evecve参数,

最终的shell脚本如下:

再执行后如图,注入的ls命令成功执行

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

python之Windows调试

然后在代码的那个idle界面为代码添加断点,所谓断点简单的说就是调试程序时需要停顿的位置,一般在函数的入口,参数变化的行添加,这里只在fac函数入口添加一个断点...

8810
来自专栏云计算与大数据

研发:如何防止混合内容

查找和修正混合内容是一项重要任务,但可能非常耗时。本指南将介绍可为此过程提供帮助的一些工具和技术。如需了解混合内容本身的更多信息,请参阅什么是混合内容。

11030
来自专栏北京马哥教育

注意!Python中的10个常见安全漏洞及修复方法

编写安全的代码很困难,当你学习一门编程语言、一个模块或框架时,你会学习其使用方法。在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准...

16000
来自专栏木头编程 - moTzxx

ThinkPHP 框架下支付宝支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

47830
来自专栏SpringBoot 核心技术

SpringBoot核心技术:探究Actuator的默认开放节点 & 详细健康状态

系统的监控在分布式的设计中显得尤为重要,因为分开部署的缘故,并不能及时的了解到程序运行的实时状况,之所以重要所以SpringBoot也给我提供了一套自动监控的A...

33930
来自专栏北京马哥教育

精通Linux常用的100+命令大全万字详解长文(珍藏版)

运维行业正在变革?推荐阅读:30万年薪Linux运维工程师成长魔法 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、...

636100
来自专栏Alice

iOS开发多线程在实际项目中的运用

        同一时间,CPU只能处理一条线程,也就是只有一条线程在工作。所谓多线程并发(同时)执行,

9220
来自专栏北京马哥教育

HTTP cookies 详解

HTTP cookies,通常称之为“cookie”,已经存在很长时间了,但是仍然没有被充分理解。首要问题是存在许多误解,认为 cookie 是后门程序或病毒,...

30140
来自专栏python爬虫日记

python下以api形式调用tesseract识别图片验证码

之前在博文中介绍在python中如何调用tesseract ocr引擎,当时主要介绍了shell模式,shell模式需要安装tesseract程序,并且效率相对...

20920
来自专栏积累沉淀

Java程序员面试题集(86-115)

Java程序员面试题集(86-115) 摘要:下面的内容包括Struts 2和Hibernate的常见面试题,虽然Struts 2在2013年6月曝出高危漏...

30570

扫码关注云+社区

领取腾讯云代金券