网络安全之命令执行漏洞复现
0x01 漏洞介绍
漏洞等级:严重
Webmin 是功能最强大的基于 Web 的 Unix 系统管理工具。管理员通过浏览器访问 Webmin 的各种管理功能并完成相应的管理动作。在版本 1.997 之前的 Webmin 中存在一个任意命令注入漏洞,触发该漏洞需登录 Webmin。
0x02 漏洞影响范围
WebMin 版本小于 1.997
0x03 漏洞利用条件
此漏洞需身份验证;
并且该账户必须有权限访问软件包更新模块,需要访问“Software Package Updates”模块才能触发漏洞;
0x04 漏洞复现
环境搭建
1. 使用 vulhub 搭建环境,把 vulhub 下载到本地。
![](https://static001.geekbang.org/infoq/6a/6a979d7fa05d1242c2460c6d5c4aca87.png)
2. 进入 vulhub/webmin/CVE0=-2019-15107,使用此环境进行 CVE-2022-36446 漏洞复现。
![](https://static001.geekbang.org/infoq/24/24d5c731cb1fa631a5bd3713c2a47c6b.png)
①网络安全学习路线
②20 份渗透测试电子书
③安全攻防 357 页笔记
④50 份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100 个漏洞实战案例
⑧安全大厂内部教程
3. 访问https://ip:10000
,出现以下界面表示环境部署成功。
![](https://static001.geekbang.org/infoq/06/06699a45fe7ed20f4513ae0b3147b622.png)
4. 接下来需要修改 webmin 的密码,需要进入容器中修改。
![](https://static001.geekbang.org/infoq/c9/c92ca017b2bb3b091da9801477d74539.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
漏洞复现
1. 以上设置完之后,使用 root/root 登录 webmin。
![](https://static001.geekbang.org/infoq/f2/f26302ba105bc2aa57d7fdf385e071d4.png)
2. 抓取登录后的任意数据包。
![](https://static001.geekbang.org/infoq/4f/4fa76c006bd7874fa30949f6a5ea3399.png)
3. 发送到 Repeater 模块,更改请求方式为 POST。
![](https://static001.geekbang.org/infoq/06/0667926f8efe2bedff5cfd19e2d74ed9.png)
4. 更改请求路径为/package-updates/update.cgi ,添加 payload,发送请求,返回包中出现命令执行结果。
![](https://static001.geekbang.org/infoq/ae/ae391176c9b7945f9eb3f20939e8c367.png)
![](https://static001.geekbang.org/infoq/61/6187174527c14862933befb9126ee9da.png)
EXP
也可直接通过脚本进行漏洞利用,EXP 地址:https://github.com/p0dalirius/CVE-2022-36446-Webmin-Software-Package-Updates-RCE。
![](https://static001.geekbang.org/infoq/fa/faffa48aa6cc5551d5cd8d00d2f15892.png)
有可能会出现以下报错
![](https://static001.geekbang.org/infoq/8b/8b3471a397f8a81274c1c9ccd71939f4.png)
将CVE-2022-36446.py
文件中的soup = BeautifulSoup(r.content, 'lxml')
全部改为 soup = BeautifulSoup(r.content, 'html.parser'),再重新执行即可。
![](https://static001.geekbang.org/infoq/93/931c3455be6c2098fedfcdaf29581638.png)
漏洞分析
命令执行**:**
当应用需要调用外部程序处理某些内容的情况下,就会用到一些执行系统命令的函数,比如最常见的 php 中的 system、exec、shell_exec 等等。当用户可以控制命令执行函数中的参数时,就可以注入一些恶意的系统命令到正常的命令中,造成命令执行攻击。
Webmin 是目前功能最强大的基于 web 的 unix 系统管理工具,管理员通过浏览器访问 webmin 的各种管理功能并完成相应的管理动作。
Webmin 使用操作系统包管理器(apt、yum 等)来执行包更新和安装。由于缺乏输入清理(1.997 之前的 Webmin 中的 software/apt-lib.pl 缺少 UI 命令的 HTML 转义),可以注入将连接到包管理器调用的任意命令。
此漏洞需要身份验证,并且该账户必须有权限访问软件包更新模块,用户可以通过在新软件包安装期间执行系统命令,并以 root 权限运行命令。
![](https://static001.geekbang.org/infoq/52/5280bb1bca493b364fa221f1030bfd4d.png)
该模块在/package-updates/文件夹下开发。其中有一个 update.cgi 文件,该文件中第 39 行使用参数 U 指定用户的包名称,并在第 50 行检查请求中是否存在“confirm”参数。第 57 行,如果请求中没有“confirm”参数,就会调用带有变量“pkgnames”的“list_package_operations()”函数,其中存储了包名。
![](https://static001.geekbang.org/infoq/ec/ec505f6ccedfc7bf207d489f7580f400.png)
通过/package-updates/update.cgi
文件的第 4 行可知道,“list_package_operations”
函数位于“pakage-updates-lib.pl”
文件中。
![](https://static001.geekbang.org/infoq/ea/ea47ef38a3fd4cc44dcd3ac17840419d.png)
“list_package_operations()”
函数定义于pakage-updates-lib.pl
文件的第 408 行。此函数将“$name”的值(即包名)发送到第 412 行中名为 software 文件中的“update_system_operations()”
函数。
![](https://static001.geekbang.org/infoq/2e/2e3eee32748b7dc9ca9d24fe2ec2bdb1.png)
再通过搜索功能找到定义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()”
函数来执行系统命令,也是通过此函数对系统运行的命令进行安全控制,也防止用户在此注入命令。
![](https://static001.geekbang.org/infoq/d9/d9a8ffa9731ad60da2b79f8e2fa37b49.png)
再继续看 update.cgi 文件,如果需要安装一个包,则会调用第 129 行的“package_install()”函数。
![](https://static001.geekbang.org/infoq/ca/ca7b9eea1425cc9985c4d5cf66ebc41c.png)
通过查找,package_install()函数位于“package-updates-lib.pl”文件中第 300 行。查看函数内容发现,“update_system_install()”函数是通过“$name”变量调用的,它是用户在第 345 行给出的包名(从之前的分析得出,这些函数是在 apt-lib.pl 文件中定义的)。
![](https://static001.geekbang.org/infoq/ac/ac1cedfeb4c644c9ea3d114928d11244.png)
![](https://static001.geekbang.org/infoq/10/10a39998cc2bfc71e330c70758ee1b55.png)
再查看 apt-lib.pl 文件,找到相关函数。
第 18 行看到函数的第一个参数(即用户之前发送的包名)被分配给“update”变量被包含在了命令中,而且没有做任何的控制机制。第 46 行发现,相关的命令会直接在系统上执行,也是没有做任何的控制机制。
所以,用户可以通过在新的软件包安装请求中提供“confirm”参数,并在软件包中指定在系统上运行命令的值,以 root 权限在系统上执行命令。
![](https://static001.geekbang.org/infoq/0d/0dba207063fffe0f0d852cd520ac198a.png)
0x05 检测 POC 规则编写
![](https://static001.geekbang.org/infoq/bb/bbeb1f88a64dfd8b5d16291fb24c891b.png)
0x06 漏洞修复
1. 升级到 1.997 及以上版本 2. 补丁获取
评论