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命令后面加参数的方式,如下的代码,都没能成功

echo "$INPUT" |chroot . ./qemu ./htdocs/cgibin

chroot . ./qemu  ./htdocs/cgibin service.cgi

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

chroot. ./qemu  -0 “service.cgi” ./htdocs/cgibin.

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

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

-E REQUEST_METHOD="POST" -E CONTENT_LENGTH=10 -EREQUEST_URI="service.cgi  -ECONTENT_TYPE="application/x-www-form-urlencoded"  -EHTTP_COOKIE="uid=aaaaa"

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

#!/bin/bash

PORT=1234

cp $(which qemu-mipsel-static) ./qemu

chroot . ./qemu  -0 "service.cgi" -EREQUEST_METHOD="POST"  -E REQUEST_URI="service.cgi" -E CONTENT_LENGTH=$LEN -ECONTENT_TYPE="application/x-www-form-urlencoded"  -EHTTP_COOKIE="uid=aaaaa"  -g $PORT -E REMOTE_ADDR="127.0.0.1” ./htdocs/cgibin

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脚本里面需要如下修改:

-E  REQUEST_URI="service.cgi\?EVENT=CHECKFW%26ls%26"

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脚本如下:

#!/bin/bash

PORT="1234"

chroot . ./qemu  -0 "service.cgi" -EREQUEST_METHOD="POST"  -E REQUEST_URI="service.cgi\?EVENT=CHECKFW%26ls%26" -ECONTENT_LENGTH=$LEN -ECONTENT_TYPE="application/x-www-form-urlencoded"  -E HTTP_COOKIE="uid=aaaaa" -g $PORT -E REMOTE_ADDR="127.0.0.1"  -execve -strace./htdocs/cgibin

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

路由器漏洞复现分析第二弹:CNVD-2018-01084的更多相关文章

  1. 路由器漏洞复现分析第三弹:DVRF INTRO题目分析

    这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘. 本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击. DVRF: ...

  2. CVE-2021-3129:Laravel远程代码漏洞复现分析

    摘要:本文主要为大家带来CVE-2021-3129漏洞复现分析,为大家在日常工作中提供帮助. 本文分享自华为云社区<CVE-2021-3129 分析>,作者:Xuuuu . CVE-202 ...

  3. Wordpress4.9.6 任意文件删除漏洞复现分析

    第一章 漏洞简介及危害分析 1.1漏洞介绍 WordPress可以说是当今最受欢迎的(我想说没有之一)基于PHP的开源CMS,其目前的全球用户高达数百万,并拥有超过4600万次的超高下载量.它是一个开 ...

  4. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  5. 泛微OA E-cology(CNVD-2019-32204)远程命令执行漏洞复现分析

    漏洞复现 影响版本: E-cology 7.0 E-cology 8.0 E-cology 8.1 E-cology 9.0   直接在网站根目录后加入组件访问路径 /weaver/bsh.servl ...

  6. hdfs源码分析第二弹

    以写文件为例,串联整个流程的源码: FSDataOutputStream out = fs.create(outFile); 1. DistributedFileSystem 继承并实现了FileSy ...

  7. 通过qemu复现路由器漏洞

    目录 简介 环境搭建 固件解包 复现漏洞,IDA调试 参考资料 简介 qemu和vmware一样,一种虚拟机软件,只不过qemu能够虚拟的平台更加丰富一些.能够虚拟很多嵌入式平台的设备. 工作上需要向 ...

  8. Ecshop 2.x_3.x SQL注入和代码执行漏洞复现和分析

    0x00 前言 问题发生在user.php的的显示函数,模版变量可控,导致注入,配合注入可达到远程代码执行 0x01 漏洞分析 1.SQL注入 先看user.php的$ back_act变量来源于HT ...

  9. 通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

    1.基本信息: 2017/11/27,Check Point 软件技术部门报告了一个华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞.看 ...

随机推荐

  1. 关于spark RDD trans action算子、lineage、宽窄依赖详解

    这篇文章想从spark当初设计时为何提出RDD概念,相对于hadoop,RDD真的能给spark带来何等优势.之前本想开篇是想总体介绍spark,以及环境搭建过程,但个人感觉RDD更为重要 铺垫 在h ...

  2. BZOJ2631 tree 【LCT】

    题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...

  3. codeforces ~ 1009 B Minimum Ternary String(超级恶心的思维题

    http://codeforces.com/problemset/problem/1009/B B. Minimum Ternary String time limit per test 1 seco ...

  4. HTTP协议中GET、POST和HEAD的介绍

    HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...

  5. 汕头市队赛 SRM 07 A 你的麻将会排序吗

    A 你的麻将会排序吗 SRM 07 曾经有过一些沉迷日麻的小孩纸,后来呀,他们都去寻找自己的世界了. kpm也是这样的小孩纸.他想有一只自动整理牌的机器.当麻将以给定的顺序进入机器时,通过机器的运转, ...

  6. NOIP 2016 提高组 复赛 Day2T1==洛谷2822 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  7. Linux内核中的中断栈与内核栈的补充说明【转】

    转自:http://blog.chinaunix.net/uid-12461657-id-3487463.html 原文地址:Linux内核中的中断栈与内核栈的补充说明 作者:MagicBoy2010 ...

  8. Android控件点击事件

    1. 介绍 本文介绍了Android控件的点击事件 Android控件点击(onClick)事件可以用如下三种方式来实现 2. 实现onClick方法 在layout的xml中指定onClick方法, ...

  9. Altium Designer 网络连接方式Port和Net Label详解

    1.图纸结构      图纸包括两种结构关系: 一种是层次式图纸,该连接关系是纵向的,也就是某一层次的图纸只能和相邻的上级或下级有关系:另一种是扁平式图纸,该连接关系是横向的,任何两张图纸之间都可以建 ...

  10. 包嗅探和包回放简介-tcpdump,tcpreplay

    一.  嗅探 1.1  嗅探技术简介 1.1.1  目标 嗅探的目标:获取在网络上传输的各种有价值信息:账号.密码.非公开协议 1.1.2  原理 嗅探的原理:大多数嗅探都是在以太网内,利用数据链路层 ...