Java 安全漏洞靶场,用于测试IAST和扫描器的被动扫描功能,集合了多个安全漏洞,利用docker镜像为每个靶场独立环境运行。
文章:IAST实践总结
mvn版本
# mvn --version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_192, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_192/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"下载项目
git clone https://github.com/lokerxx/JavaVul以下是运行脚本:
| 文件 | 作用 | 运行 |
|---|---|---|
| docker-compose-build.yaml | 在容器里面构建jar包,每个靶场构建会重复构建(构建速度会很慢,不建议) | bash run-build_images.sh |
| docker-compose-local.yaml | 宿主机maven构建各个靶场的jar包,多个靶场可以基于maven缓存快速构建(推荐) | bash run-local-build.sh |
| docker-compose-remote.yaml | 直接去dockerhub下载我构建上传成功的镜像(镜像更新不及时) | bash run-remote.sh |
此外,需修改yaml文件里面
flask.environment.HOST为宿主机的IP,用于跑测试用例。然后我在yaml文件已经默认挂载agent.jar,如果你们要测试IAST agent功能,直接替换到agent/agent.jar即可。我这边自己写了一个简单的java agent,参考下面SimpleAgent
如果要测试被动代理扫描,需要修改
index/app.py里面proxy_mode为True,修改自己的代理地址:proxies
修改完成之后,根据自己的需求,运行上面表格的sh脚本部署运行即可。
因为漏洞应用比较多但是接口比较少,我给每个应用配置256-512M内存(测试运行要8G内存)。如果要配置大一点测试 IAST AGENT,则可以批量修改
docker-compose.yaml的-Xms256m -Xmx512m的环境变量
基本web漏洞的代码审计的细节,参考这里:https://github.com/lokerxx/CybersecurityNote/tree/master/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/JAVA%E6%BC%8F%E6%B4%9E
部署运行
| 文件 | 作用 | 运行 |
|---|---|---|
| docker-compose-microservice.yml | 运行多个springcloud微服务,用于测试多链路 IAST agent | run-local-service.sh |
测试用例
| 接口 | 压测命令 |
|---|---|
| http://ip:29998/process-user-data?userData=test | ab -n 1000 -c 20 "http://IP:29998/process-user-data?userData=test" |
访问:http://宿主机IP:5000/
我配置了三种模式:
- 攻击:发送一些payload,触发漏洞
- 正常:有可能是漏洞,但是发送是正常的数据
- 修复:漏洞已经修复,但是payload不生效(过滤或者报错)
- 误报:IAST或SAST误报检测的安全漏洞
其中右边测试按钮,可以对这个接口进行用例测试。
也可以自定义发送payload,进行调试
也可以批量发送请求,各个漏洞的回显,会在下面显示。
Java Agent 是一种工具,它可以使用 Java Instrumentation API 在运行时修改字节码。一个非常简单的 Java Agent 可以仅仅记录一个消息,以表明它已被加载。
首先,创建 Agent 类 SimpleAgent.java:
package my.agent;
import java.lang.instrument.Instrumentation;
public class SimpleAgent {
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("SimpleAgent 已加载");
}
}在这段代码中,premain 方法是 Java Agent 的入口点。它在应用程序的 main 方法之前被调用。
接下来,你需要一个 manifest 文件来指定 Agent-Class。创建一个名为 MANIFEST.MF 的文件,内容如下:
Manifest-Version: 1.0
Premain-Class: my.agent.SimpleAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
这个 manifest 文件指定了 agent 类并启用了一些功能,如类的重定义和重转换。
现在,将 Java Agent 编译并打包成 JAR 文件。假设你的 Java 文件在 src 目录中,使用 javac 和 jar 命令,你可以这样做:
- 编译 agent 类:
# javac -source 1.8 -target 1.8 -d . src/main/java/my/agent/SimpleAgent.java- 将编译后的类打包成带有 manifest 的 JAR 文件:
# jar cvfm SimpleAgent.jar MANIFEST.MF my/agent/SimpleAgent.class
added manifest
adding: my/agent/SimpleAgent.class(in = 492) (out= 320)(deflated 34%)现在你有了一个可以作为 Java Agent 使用的 SimpleAgent.jar。要将这个 agent 附加到你的应用程序上,启动 Java 应用程序时使用 -javaagent 选项,将SimpleAgent.jar重命名到./agent/agent.jar
# mv SimpleAgent.jar ../agent/agent.jar- https://github.com/vulhub/vulhub
- https://github.com/l4yn3/micro_service_seclab
- https://github.com/ffffffff0x/JVWA
- https://github.com/mamba-2021/myjavavul
- https://github.com/zhlu32/range_java_micro_service_seclab
- https://rasp.baidu.com/doc/install/testcase.html
- https://github.com/lemono0/FastJsonParty/


