Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

admin 2022年4月2日08:54:21评论512 views字数 3704阅读12分20秒阅读模式
嗨,朋友你好,关于JavaWeb代码审计
欢迎跟我一起来学习。
炼石计划之50套JavaWeb代码审计
第五套:若依管理系统某版本
第六套:任务调度系统
第七套:OFCMS
第八套:企业级报表平台
第九套:JPress

正在按部就班,循序渐进

火热练习ing......

关注我们,时刻跟着学习。




下文配套的练习环境版本

可从文末处获取。


一、项目简介

RuoYi 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Apache  Shiro、MyBatis、Thymeleaf、Bootstrap),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。

内置功能详解如下:

  1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。

  2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。

  3. 岗位管理:配置系统用户所属担任职务。

  4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。

  5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。

  6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。

  7. 参数管理:对系统动态配置常用参数。

  8. 通知公告:系统通知公告信息发布维护。

  9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。

  10. 登录日志:系统登录日志记录查询包含登录异常。

  11. 在线用户:当前系统中活跃用户状态监控。

  12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。

  13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。

  14. 系统接口:根据业务代码自动生成相关的api接口文档。

  15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。

  16. 缓存监控:对系统的缓存查询,删除、清空等操作。

  17. 在线构建器:拖动表单元素生成相应的HTML代码。

  18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。

若依官方网站:
http://www.ruoyi.vip/

二、项目搭建

1、环境要求

JDK >= 1.8 (推荐1.8版本)
Mysql >= 5.7.0 (推荐5.7版本)
Maven >= 3.0

2、Windows环境的项目部署流程

基于windows10操作系统。

①、命令行进入Mysql,创建数据库名为ry,并切换使用该数据库。

create datavase ry; 创建名为ry的数据库
use ry; 切换使用ry数据库

②、将项目文件中的/sql/ry_20200323.sql的数据导入到ry数据库,注意导入路径中应使用正斜杠/

source /绝对路径/sql/ry_20200323.sql; 导入数据库文件

③、使用IDEA打开本项目,等待Maven自动加载依赖项,如果时间较长需要自行配置Maven加速源。几个现象表明项目部署成功。pom.xml文件无报错,项目代码已编译为classRun/Debug Configurations...处显示可以运行。

④、修改srcmainresourcesapplication-druid.yml配置文件内容,主要修改数据库连接地址,如下图所示:

Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

⑤、点击启动Run/Debug Configurations...本项目。

⑥、项目访问地址如下:

  • 后台地址:http://127.0.0.1:8088/login

记得自己配下端口号,默认的是80端口。

⑦、登录账号密码adminadmin123


3、Linux环境的项目部署流程

基于VMware虚拟机中的搭建的Ubuntu20操作系统

注意:以下步骤需要Ubuntu系统中安装所需的软件,可参考星球之前发的一篇文章:https://t.zsxq.com/Ea6qF6Y

本项目的默认打包方式就是JAR形式。并且本项目构建为SpringBoot多模块形式。我们所需要的运行的Jar程序打包在了RuoYi-v4.2/ruoyi-admin/target目录下。

整体部署流程如下:

①、使用IDEA打开项目,我们修改一下数据源链接地址。如下图所示:

Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

我为了方便,将数据源直接连接到了Windows下的Mysql,也就是PHPstaduy一键启动的。如果你也想这样做,请注意以下几点:

  • 宿主机和虚拟机需要在同一网段下,简单来说就是能互相ping通。

  • Mysql启用远程访问,命令如下:

GRANT ALL PRIVILEGES ON *.* ‘root’@’%’ identified by ‘root’ WITH GRANT OPTION;
flush privileges;

②、使用Maven打包项目,选择若依总项目,依次点击cleanpackage,如下图所示:

Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

③、我们将最终生成的ruoyi-admin.jar文件,复制粘贴Vmware虚拟中的Ubuntu桌面。

④、下一步,我们打开命令行,CD进入Desktop,使用sudo java -jar ruoyi-admin.jar运行项目。启动成功如下图所示:

Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。


⑤、最后我们就可以正常访问了。

⚠️注意:

  • java -jar启动若依项目需要管理员权限,因此要在前面加上sudo,如果报错说找不到命令。需要修改/etc/sudoers文件中Defaults secure_path位置,在后面加上java路径,如下图所示:

sudo vim /etc/sudoers 打开该文件
  • 如果想要在其他环境中访问ruoyi,需要关闭防火墙,或者激活特定端口。偷个懒,直接关闭防火墙。

sudo ufw disable 关闭防火墙


3、单点漏洞审计

3.2、Shiro密钥硬编码代码审计

通过查看pom.xml文件,我们了解到本套项目使用了Shiro组件。我们进一步查看Shiro配置文件时,发现了Shiro密钥硬编码写在了代码文件中。代码位于

RuoYi-v4.2ruoyi-frameworksrcmainjavacomruoyiframeworkconfigShiroConfig.java

第331行。如下图所示:

Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

在黑盒测试中,我们常使用爆破的方式来探测目标是否使用了常见的弱密钥。

但在代码审计我们可以直接通过搜索关键字setCipherKey,来看看密钥是否硬编码在了代码中。

攻击者在知道了密钥后,就可以构造恶意payload,经过序列化、AES加密、base64编码操作加工后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞,进而在目标机器上执行任意命令。

既然我们从代码处知道了密钥,那么我们就可以直接对他进行反序列化攻击了。


四、渗透测试漏洞挖掘

2、Shiro反序列化漏洞验证

2.1、漏洞简述

Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。

尽管官方更新了很多版本,但还是没有将反序列化的本身问题解决。后续版本使用了每次生成一个密钥的方法来解决该漏洞。但是由于开源系统,或者教学代码范例常将弱密钥硬编码等原因,因此导致很多开发人员疏忽,经验不足而导致该问题的产生。


通过查看pom.xml文件我们确定了Shiro版本为1.4.2Shiro 1.4.2版本对于Shiro反序列化来说是个分水岭。由于CVE-2019-12422漏洞的出现,也就是Shiro Padding Oracle Attack漏洞。Shiro在1.4.2版本开始,由AES-CBC加密模式改为了AES-GCM。所以我们在做漏洞验证时,要将payload改成AES-GCM加密模式。

2.2、漏洞验证

在黑盒测试中,我们可以在Cookie中添加rememberMe=123,如果响应Set-Cookie头返回rememberMe=deleteMe,那么就可可以确定该系统使用了Shiro框架。如下图所示:

Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

下面我们使用攻击脚本进行漏洞验证,该脚本在已添加至附件中。


【欢迎加入炼石计划,解锁该部分,跟着大家一起学习~】


第五套若依系统代码审计正按部就班火热练习中,本次练习真的力荐,各种高危漏洞等你学习。如果大家想循序渐进跟着学习JavaWeb代码审计,欢迎扫码加入炼石计划。

想要学习若依后面完整版代码审计教程,欢迎加入炼石计划。

【炼石计划加入方式】

方式一

公众号回复关键字

xq

【玄说安全知识星球成员免费畅享炼石计划50套代码审计课程】


方式二

现加入炼石计划知识星球价格为99元一年,自加入起计算。随着课程有序推进,价格只增不减。现在投资自己最为合适。


Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。


点击下方链接获取【前八套】练习环境

50套JavaWeb代码审计【前八套】练习环境分享给你,内附配套代码审计教程。


内含本文【若依管理系统

以及前几套练习环境对应代码审计文章





原文始发于微信公众号(玄魂工作室):Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月2日08:54:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做。https://cn-sec.com/archives/862374.html

发表评论

匿名网友 填写信息