Skip to content

Commit

Permalink
v1.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Ar3h committed Feb 4, 2025
1 parent f53b1ac commit 0bf75f2
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 117 deletions.
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
## 1.3.0

- [功能] 新增 [SerializationDumper](https://github.com/NickstaDB/SerializationDumper) 解析Java序列化数据,并自定义修改任意类
SUID 等功能
- [功能] 开放 Chains 插件编写,参考:https://github.com/Java-Chains/chains-plugin-demo ,前端支持reload重加载插件
- [功能] 新增 Hessian2ToStringPayload,通过 except 可触发toString链
- [功能] 前端提供展示所有 Payload、Gadget 基础信息
- [功能] 新增 CommonsBeanutils5 Gadget,适用于 cb 1.10 版本
- [功能] 新增 FakeMySQLReadPayload 读文件利用,同时兼容 fileread_/etc/passwd 格式 ,参考 https://github.com/4ra1n/mysql-fake-server
- [功能] Generate 生成模块提供 URL Encoding 编码选项
- [功能] gadget 注解中新增 preTags 字段,可用于指定前面的链
- [功能] 同步更新 [Class-Obf](https://github.com/jar-analyzer/class-obf) v1.4.0 版本
- [优化] JNDI、JRMP 等模块若端口未开放则会进行提醒
- [优化] 前端图标展示
- [优化] 整理后端代码
- [Bugfix] 修复Groovy生成Jar的问题。现在可以通过 OtherPayload -> GroovyJarConvert 中生成 Fastjson Groovy Jar

## 1.2.4

- [功能] 同步更新 Class-Obf v1.3.1 版本 (https://github.com/jar-analyzer/class-obf) @4ra1n
Expand Down
199 changes: 145 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<h4 align="right">中文 | <strong><a href="./README_EN.md">English</a></strong> </h4>
<h4 align="right">中文 | <strong><a href="./en/README_EN.md">English</a></strong> </h4>
<h1 align="center">Web Chains</h1>
<div align="center">
<img alt="downloads" src="https://img.shields.io/github/downloads/java-chains/web-chains/total"/>
Expand All @@ -9,65 +9,130 @@
</div>
</div>

`Web-Chains` 项目,又名 `Java-Chains` 项目,我们站在巨人肩膀上,致力于打造最强的 `Java` 安全研究领域的瑞士军刀
`Web-Chains`/`Java-Chains` 是一个 Java Payload 生成与漏洞利用 Web 平台,便于广大安全研究员快速生成 Java Payload,以及对
JNDI 注入、MySQL JDBC 反序列化、JRMP 反序列化等漏洞进行方便快速测试,能够在一定程度上提高测试效率。

> 我们站在巨人肩膀上,致力于打造最强的 Java 安全研究领域的瑞士军刀
<p align="center">
<img src="./img/main.png" />
</p>

## 介绍

`Web-Chains` 含有六大模块:

1. `Generate`: 生成模块
- `Java` 反序列化原生 `Payload` 生成
- `Hessian1/2` 反序列化 `Payload` 生成
- `Hessian1` 支持生成 `HessianServlet` 格式反序列化数据
- `Shiro` 数据生成(自定义 `KEY` 使用 `GCM` 混淆字符等)
- `AMF3` 数据生成(基于原生数据多种进阶组合)
- `XStream` 数据生成(基于原生数据多种进阶组合)
- `BCEL` 字节码生成(直接执行命令,内存马生成,回显生成,探测字节码,读写文件)
- `Class` 字节码生成(直接执行命令,内存马生成,回显生成,探测字节码,读写文件)
- 多种数据库 JDBC Payload 生成(`Derby` | `H2` | `PostgreSql` | `Sqlite`
- `SnakeYAML/SpringBeanXML/Velocity/OGNL/MVEL/SPEL/JS/GROOVY`
- Java反序列化、Hessian反序列化支持以下混淆方式:
- 随机集合混淆
- 垃圾类插入
- 去除字节码符号信息
- `TC_RESET` 填充,仅适用于Java反序列化
- `UTF-8 Overlong Encoding` 混淆
- 一些高级选项:
- 自定义类名/定义字节码版本,支持使用 Class-Obf 进行字节码混淆
- 选择 `Commons Beanutils` 链的多种 `comparator` 类型
- 支持生成 `TemplatesImpl` 格式
- 支持生成 `SnakeYaml Jar` 格式
- 支持生成 `Fastjson Groovy` 格式
- 支持生成 `JavaWrapper` 格式
- 支持生成 `charsets.jar` 格式
- 支持增强魔改版 `JMG/JEG` 格式 (java echo generator, java memshell generator)
2. `JNDI`: JNDI 注入利用模块
- `JndiBasicPayload`: LDAP 远程加载字节码
- `JndiDeserializationPayload`: LDAP 中基于 javaSerializedData 字段实现的反序列化
- `JndiResourceRefPayload`: LDAP 基于 BeanFactory 的 Tomcat EL、Groovy等利用
- `JndiReferencePayload`: LDAP 基于其他 ObjectFactory 的Reference利用,例如各种DataSource JDBC利用
- `JndiRMIDeserializePayload`: LDAP 高版本 JDK 绕过之RMI反序列化
- `JndiRefBypassPayload`: LDAP 高版本 JDK 绕过之ReferenceBypass
- `JndiShowHandPayload`: JNDI梭哈链,一键测试常规利用链,提高测试效率
3. `Fake MySQL`
- `FakeMysqlPayload`: 经典 MySQL JDBC 反序列化利用姿势
- `FakeMysqlShowHandPayload`: FakeMySQL梭哈链,一键测试常规反序列化链,提高测试效率
4. `JRMPListener`
- 可配合 JRMPClient 反序列化链实现RMI低版本的绕过
5. `TCP Server`
- 一个简易的 TCP Server,可以将生成的Payload文件挂载到TCP端口服务上
- 适用于 Derby 反序列化 RCE 场景,可直接通过tcp端口获取反序列化数据
6. `HTTP Server`
- 一个简易的HTTP服务器,将生成的Payload文件挂载到HTTP端口服务上
- 适用于 postgresql 远程加载 SpringBeanXML 文件等场景
## 模块介绍

`Web-Chains` 含有以下六大模块

### 生成模块(Generate)

`JavaNativePayload`: Java 反序列化原生 Payload 生成

`HessianPayload`: Hessian1 反序列化 Payload 生成,并支持 HessianServlet 格式反序列化数据

`Hessian2Payload`: Hessian2 反序列化 Payload 生成

`ShiroPayload`: Shiro Payload 生成,在某些特殊环境下方便手动进行生成与测试
- 支持自定义 AES KEY
- 支持 AES GCM 模式
- 支持插入 Base64 混淆字符

`OtherPayload`
- `CharsetJarConvet`: 生成 charsets.jar 包,适用于 SpringBoot 下文件上传 RCE 场景
- `GroovyJarConvert`: 生成 fastjson-groovy.jar 包,适用于 Fastjson 高版本下通过 Groovy 链加载特定格式 Jar 包实现 RCE)
- `SnakeyamlJarConvert`: 生成 snakeyaml.jar 包,适用于 SnakeYaml 通过 SPI 加载特定格式 Jar 包实现 RCE

- `JDBCPayload`: JDBC Payload 生成
- H2 JDBC
- PostgresSQL
- ...

`ExpressionPayload`: 表达式 Payload 生成,本质上是将表达式加载字节码模板中的字节码部分进行替换,推荐手动实现
- `BcelConvert`: BCEL 格式字节码生成
- `JsConvert`: Oracle Nashorn JS 表达式加载字节码
- `VelocityConvert`: Velocity 通过 bcel 来加载字节码
- ...

`BytecodePayload`: 字节码生成
- 例如可生成执行命令字节码、Sleep字节码、DNSLog字节码,注入内存马字节码,回显字节码、中间件探测字节码、写文件字节码、下载文件字节码
- 支持自定义字节码版本
- 支持自定义字节码类名
- 支持生成 TemplatesImpl 字节码格式 - 实现 AbstractTranslet 接口
- 支持使用 Class-Obf 进行字节码混淆

`XStreamPayload`: XStream 数据生成,暂未全面测试,部分Payload无法使用

---

本平台生成的 Payload 支持的一些混淆情况如下:

| | JavaNativePayload | HessianPayload | Hessian2Payload |
|-----------------------| ----------------- | -------------- | --------------- |
| 随机集合脏数据填充 ||||
| 垃圾类填充 ||||
| UTF-8 Overlong Encoding ||||
| TC_RESET 填充 ||||

---

注:若想通过 UserCustomByteArrayFromXXX 提供自定义的Java序列化字节流数据来进行混淆,那么目前暂不支持使用随机集合与垃圾类插入混淆,这与混淆的实现有关,具体支持情况如下:

| | JavaNativePayload(自定义序列化场景) |
| ----------------------- | ----------------------------------- |
| 随机集合混淆 ||
| 垃圾类插入 ||
| UTF-8 Overlong Encoding ||
| TC_RESET 填充 ||

### JNDI 注入利用模块 (JNDI)

支持六种利用姿势,外加一个便于一键测试常见链的 ShowHand 链

`JndiBasicPayload`: LDAP 远程加载字节码

`JndiDeserializationPayload`: LDAP 中基于 javaSerializedData 字段实现的反序列化

`JndiResourceRefPayload`: LDAP 基于 BeanFactory 的 Tomcat EL、Groovy等利用

`JndiReferencePayload`: LDAP 基于其他 ObjectFactory 的Reference利用,例如各种DataSource JDBC利用

`JndiRMIDeserializePayload`: LDAP 高版本 JDK 绕过之RMI反序列化

`JndiRefBypassPayload`: LDAP 高版本 JDK 绕过之ReferenceBypass

`JndiShowHandPayload`: JNDI梭哈链,一键测试常规利用链,提高测试效率

### Mysql JDBC 反序列化利用模块 (Fake MySQL)

`FakeMysqlPayload`: 经典 MySQL JDBC 反序列化利用姿势

`FakeMysqlShowHandPayload`: FakeMySQL梭哈链,一键测试常规反序列化链,提高测试效率

### JRMP 反序列化利用模块 (JRMPListener)

可配合 JRMPClient 反序列化链实现RMI低版本的绕过

### TCP Server

一个简易的 TCP Server,可以将生成的Payload文件挂载到TCP端口服务上,访问该端口即可返回指定内容

适用于 Derby 反序列化 RCE 场景,可直接通过tcp端口获取反序列化数据

### HTTP Server

一个简易的HTTP服务器,将生成的Payload文件挂载到HTTP端口服务上,访问指定端口即可返回指定内容

适用于 postgresql 远程加载 SpringBeanXML 文件等场景


### 小工具(Tools)

底层调用了 SerializationDumper,能够解析序列化数据,并能实现手动更改类的 serialVersionUID 字段

![SerializationDumper.png](./img/SerializationDumper.png)

## 快速开始

**特别注意:我们只对 8011 端口进行了保护,需要登陆后访问,其他端口可能存在被反制的风险,请自行注意**
**特别注意:我们默认只对 8011 端口进行了随机密码的登陆保护。其他端口可能存在被反制的风险,使用完相关功能后记得及时关闭相应端口
**

### 方式一:Docker

Expand All @@ -87,7 +152,7 @@ docker run -d \
-p 50000:50000 \
-e CHAINS_AUTH=true \
-e CHAINS_PASS= \
javachains/webchains:1.2.4
javachains/webchains:1.3.0
```

可通过环境变量配置鉴权或密码;
Expand All @@ -112,21 +177,24 @@ docker logs $(docker ps | grep javachains/webchains | awk '{print $1}') | grep -

登录页面:`http://your-ip:8011`


### 方式二:Jar包启动

⚠️仅支持 JDK8,推荐使用 Temurin8/Zulu8 JDK

使用 `java -jar web-chains.jar` 即可启动,每次启动后会打印出随机生成的密码

默认监听 0.0.0.0 ,登录页面:`http://your-ip:8011` (使用这里的用户名密码登录)

可通过环境变量设置web登录密码,例如:

Linux:

```bash
export CHAINS_PASS=[your_password] && java -jar web-chains.jar
```

Windows:

```cmd
set CHAINS_PASS=[your_password] && java -jar web-chains.jar
```
Expand All @@ -135,6 +203,28 @@ set CHAINS_PASS=[your_password] && java -jar web-chains.jar

详细使用文档:https://www.yuque.com/shenjingwa-leuvd/wpqdhf/eekyvau9fcblzzt0

## 其他

本工具的优势:

1. 相较于命令行的各种工具,Web 界面上的操作更加简单易用,能够在很方便的生成 JNDI 注入、MySQL JDBC 等测试 Payload
2. 将各种 Payload 进行解耦与复用,前端动态渲染参数输入框,方便拓展与维护
3. 搜集整理并覆盖了较为全面的 Java、Hessian 等反序列化 Payload,集成了各种小 trick 以及混淆等姿势

劣势(同时也是待改进的点):

1. 生成的某些冷门 Payload 组合无法正常使用。由于解耦会导致组合的复杂度上升,并且目前无法覆盖测试所有 Payload
组合。针对该情况,目前的缓解措施是通过 Payload 输出框上方的有个下拉选项【预设链】,提供了测试好的链子组合,可以提供一些参考。
生成冷门 Payload 组合建议提前测试一下,若发现无法正常运行的 Payload 可以提交 Issues 反馈
2. 由于需要各种依赖去生成Payload,所以项目的 jar 包的体积较大 (200+MB)
3. 比较冷门的以及实战价值比较低的 Payload 暂未集成

常见问题:

问:为什么用 Web,而不是 Java GUI?

答:各有优势,但是我认为 Web 适用场景较广,主要是很方便的在服务器上操作生成 JNDI 注入等 Payload

## 更新内容

[CHANGELOG.md](./CHANGELOG.md)
Expand Down Expand Up @@ -163,6 +253,7 @@ set CHAINS_PASS=[your_password] && java -jar web-chains.jar
- https://github.dev/LxxxSec/CTF-Java-Gadget
- https://github.com/pen4uin/java-memshell-generator
- https://github.com/pen4uin/java-echo-generator
- https://github.com/NickstaDB/SerializationDumper
- https://xz.aliyun.com/t/5381
- http://rui0.cn/archives/1408

Expand Down
17 changes: 17 additions & 0 deletions CHANGELOG_EN.md → en/CHANGELOG_EN.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
## 1.3.0

- [Feature] Added [SerializationDumper](https://github.com/NickstaDB/SerializationDumper) for parsing Java serialized data, enabling custom modification of class SUIDs, etc.
- [Feature] Enabled Chains plugin development. See: https://github.com/Java-Chains/chains-plugin-demo. The frontend supports plugin reloading.
- [Feature] Added Hessian2ToStringPayload; a toString chain can be triggered via `except`.
- [Feature] The frontend now displays basic information for all Payloads and Gadgets.
- [Feature] Added CommonsBeanutils5 Gadget, suitable for cb version 1.10.
- [Feature] Added FakeMySQLReadPayload for file reading exploitation, compatible with `fileread_/etc/passwd` format. See https://github.com/4ra1n/mysql-fake-server.
- [Feature] The Generate module now offers a URL Encoding option.
- [Feature] Added the `preTags` field in gadget annotations, which can be used to specify preceding chains.
- [Feature] Synchronously updated [Class-Obf](https://github.com/jar-analyzer/class-obf) to version v1.4.0.
- [Improvement] JNDI, JRMP, etc. modules will now provide a warning if the port is not open.
- [Improvement] Improved frontend icon display.
- [Improvement] Refactored backend code.
- [Bugfix] Fixed the Groovy Jar generation issue. Fastjson Groovy Jars can now be generated through OtherPayload -> GroovyJarConvert.


## 1.2.4

- [Feature] Synchronized update to Class-Obf v1.3.1 (https://github.com/jar-analyzer/class-obf) @4ra1n
Expand Down
7 changes: 4 additions & 3 deletions README_EN.md → en/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
<img alt="release" src="https://img.shields.io/github/v/release/java-chains/web-chains"/>
<img alt="GitHub Stars" src="https://img.shields.io/github/stars/Java-Chains/web-chains?color=success"/>
<div align="center">
<img src="img/logo.png" width="60" alt="center">
<img src="../img/logo.png" width="60" alt="center">
</div>
</div>

The `Web-Chains` project, also known as the `Java-Chains` project, stands on the shoulders of giants and is committed to
building the Swiss Army knife of the strongest `Java` security research

<p align="center">
<img src="./img/main_EN.png" />
<img src="../img/main_EN.png" />
</p>

## 介绍
Expand Down Expand Up @@ -90,7 +90,7 @@ docker run -d \
-p 50000:50000 \
-e CHAINS_AUTH=true \
-e CHAINS_PASS= \
javachains/webchains:1.2.4
javachains/webchains:1.3.0
```

Authentication and password can be configured via environment variables:
Expand Down Expand Up @@ -160,6 +160,7 @@ Acknowledgments:
- https://github.dev/LxxxSec/CTF-Java-Gadget
- https://github.com/pen4uin/java-memshell-generator
- https://github.com/pen4uin/java-echo-generator
- https://github.com/NickstaDB/SerializationDumper
- https://xz.aliyun.com/t/5381
- http://rui0.cn/archives/1408

Expand Down
Binary file added img/SerializationDumper.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed img/group.png
Binary file not shown.
Binary file modified img/main.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified img/main_EN.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed img/zanShang.jpg
Binary file not shown.
46 changes: 0 additions & 46 deletions old/Dockerfile

This file was deleted.

3 changes: 0 additions & 3 deletions old/README.md

This file was deleted.

Loading

0 comments on commit 0bf75f2

Please sign in to comment.