安全老司机 | Struts2漏洞爆发后,与黑客的一次正面交锋
故事开始
“我们可能被黑客攻击了!!!”接到客户急匆匆的一个电话。
我赶紧打开电脑查看报警邮件,提示存在一个反弹Shell的攻击行为。
这大半夜,客户的服务器居然正在主动尝试连接外部其它服务器。在那个瞬间,我都能想象得出来,服务器另一端那个穿着“黑衣服”的人,面对“冒着新鲜热气儿”的Shell唾手可得的那种狂喜。显然,黑客正在疯狂攻击,情况甚是紧急,需要在黑客造成真正破坏之前阻止他们。
做技术的人都知道,反弹Shell一般是外网渗透的最后一步,也是内网渗透的第一步。反弹Shell对服务器安全乃至内网安全的危害不必多说。
多年的一线拼杀经验告诉我,黑客一般是利用远程命令执行、远程代码执行、Webshell、Redis未授权访问可执行系统命令等漏洞,执行反弹命令,使目标服务器发出主动连接请求,从而绕过防火墙的入站访问控制规则。
初试无果
因为客户正好部署了青藤的大数据安全产品,能够记录展示每台服务器系统交互Shell的命令,包括操作者IP,操作终端,操作用户,操作详情等关键信息。但是出乎意料的是,在反弹Shell这十几分钟时间内,日志上居然没发现任何黑客执行反弹Shell操作等相关的异常操作行为。
改变思路
显然,黑客不是通过在服务器端执行命令的常规方式进行反弹,一定是有其它资产存在漏洞,被黑客利用了。为找到根本原因,我通过青藤资产清点工具对该主机上运行的资产(如虚拟机、web站点、web服务、web框架等)进行全面了解,发现该服务器上存在Struts 2的Web框架,凑巧的是该版本正好存在S2-045漏洞。很可能,这就是黑客入侵的源头了。
资产清点发现存在漏洞的Struts2版本要说著名RCE(远程代码执行)漏洞,Struts2框架漏洞最为“经典”,一经爆发就被各安全厂商作为高危紧急漏洞处理。S2-045漏洞是由报错信息包含OGNL表达式,并且被带入了buildErrorMessage这个方法运行,造成远程代码执行。S2-045只有一种触发形式,就是将OGNL表达式注入到HTTP头的Content-Type中。
柳暗花明
为确认真正攻击源,通过查看Tomcat日志发现存在反弹Shell行为的恶意IP,正在通过post请求方式访问客户服务器上一个Struts2页面。至此,基本可以判断攻击者正是通过Struts2的反序列化漏洞进行攻击,从而完成反弹Shell的操作。值得庆幸,因为及时发现和快速响应,黑客的攻击行为未对服务器造成任何伤害。
进行反击
首先通过防火墙立即封堵该IP,同时在WAF上设置规则,拦截该请求,进一步对Struts2漏洞立马打补丁。
写在最后
攻防的较量从未停止,黑客与白帽子间的斗争也越演越烈。在Struts2框架漏洞这个战场上,需要持续深入地研究,才能占有主动权。虽然从过去出现的Struts漏洞看,恶意OGNL表达式的注入点无处不在,但随着Struts2框架版本不停迭代,很多漏洞都被修补。
在这里笔者也提醒各位安全负责人,一定要及时打补丁以及使用最新版的Struts框架,避免被不法分子利用而造成损失。同时,对request请求的参数名、参数值、cookie参数名、action的名称、Content-Type内容、filename内容、请求体内容(反序列化漏洞)进行验证,降低后期被黑客利用可能性。