diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e515e8..200fa70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/README.md b/README.md index ac2689a..d7a5309 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -
-## 介绍 - -`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 @@ -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 ``` 可通过环境变量配置鉴权或密码; @@ -112,9 +177,10 @@ 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` (使用这里的用户名密码登录) @@ -122,11 +188,13 @@ docker logs $(docker ps | grep javachains/webchains | awk '{print $1}') | grep - 可通过环境变量设置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 ``` @@ -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) @@ -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 diff --git a/CHANGELOG_EN.md b/en/CHANGELOG_EN.md similarity index 61% rename from CHANGELOG_EN.md rename to en/CHANGELOG_EN.md index 4636020..0368724 100644 --- a/CHANGELOG_EN.md +++ b/en/CHANGELOG_EN.md @@ -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 diff --git a/README_EN.md b/en/README_EN.md similarity index 97% rename from README_EN.md rename to en/README_EN.md index 78c0090..29f35cc 100644 --- a/README_EN.md +++ b/en/README_EN.md @@ -5,7 +5,7 @@
- +
## 介绍 @@ -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: @@ -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 diff --git a/img/SerializationDumper.png b/img/SerializationDumper.png new file mode 100644 index 0000000..4f42ded Binary files /dev/null and b/img/SerializationDumper.png differ diff --git a/img/group.png b/img/group.png deleted file mode 100644 index 056a758..0000000 Binary files a/img/group.png and /dev/null differ diff --git a/img/main.png b/img/main.png index 501a6c7..ee2ceb8 100644 Binary files a/img/main.png and b/img/main.png differ diff --git a/img/main_EN.png b/img/main_EN.png index c871ead..32ca9a0 100644 Binary files a/img/main_EN.png and b/img/main_EN.png differ diff --git a/img/zanShang.jpg b/img/zanShang.jpg deleted file mode 100644 index bbd7a9c..0000000 Binary files a/img/zanShang.jpg and /dev/null differ diff --git a/old/Dockerfile b/old/Dockerfile deleted file mode 100644 index b5a263d..0000000 --- a/old/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -# 使用 Ubuntu 20.04 基础镜像 -FROM ubuntu:20.04 - -# 设置环境变量以避免交互式安装提示 -ENV DEBIAN_FRONTEND=noninteractive - -# 清除所有代理环境变量并设置 apt 配置禁用代理 -RUN unset http_proxy https_proxy ftp_proxy HTTP_PROXY HTTPS_PROXY FTP_PROXY && \ - echo 'Acquire::http::Proxy "false";' > /etc/apt/apt.conf.d/00proxy && \ - echo 'Acquire::https::Proxy "false";' >> /etc/apt/apt.conf.d/00proxy - -# 更新系统并安装必要的依赖,包括 libc6、wget -RUN apt-get update && \ - apt-get install -y libc6 wget && \ - rm -rf /var/lib/apt/lists/* - -# 下载、解压 Java 安装目录 -RUN wget https://download.java.net/openjdk/jdk8u44/ri/openjdk-8u44-linux-x64.tar.gz && \ - tar -zxvf openjdk-8u44-linux-x64.tar.gz - -# 创建应用目录 -RUN mkdir /app && \ - mkdir /opt/java - -RUN mv java-se-8u44-ri /opt/java/ - -# 设置 JAVA_HOME 环境变量 -ENV JAVA_HOME=/opt/java/java-se-8u44-ri -ENV PATH=$JAVA_HOME/bin:$PATH - - -# 设置工作目录 -WORKDIR /app - -# 复制 JAR 文件到容器中的 /app 目录 -COPY web-chains-1.0.0-SNAPSHOT.jar /app/ - -# 复制配置文件目录 -COPY chains-config /app/chains-config - -# 暴露应用端口 -EXPOSE 8011 - -# 启动命令,后台运行 Java 应用并输出日志 -CMD nohup java -jar /app/web-chains-1.0.0-SNAPSHOT.jar > output.log 2>&1 & \ - tail -f output.log diff --git a/old/README.md b/old/README.md deleted file mode 100644 index 77ee58f..0000000 --- a/old/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## README - -历史的一些脚本,弃用,但保留备份 \ No newline at end of file diff --git a/old/docker-compose.yml b/old/docker-compose.yml deleted file mode 100644 index 41e9685..0000000 --- a/old/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -# docker-compose.yml -version: '3' - -services: - web-chains: - build: .. - ports: - - "8011:8011" - volumes: - - ./chains-config:/app/chains-config - - ./web-chains-1.0.0-SNAPSHOT.jar:/app/web-chains-1.0.0-SNAPSHOT.jar \ No newline at end of file