废话
这个漏洞是2025年3月24日公布的漏洞。在这之后很多师傅都发布了相关的技术分析文章,小弟也是观摩了一番内容都非常丰富。
今天刚好清明节假期正好有空也来写一篇对于这个漏洞的理解与后续利用。
漏洞介绍
Vite在开发服务器模式下,提供了@fs功能,原本是为了让开发者访问服务允许范围内的文件。正常情况下,如果请求的文件超出了这个允许范围,Vite应该返回“403 Restricted”,提示访问受限。但在请求URL中添加?raw??或?import&raw??这样的特殊参数时,就能绕过原本的文件访问限制检查。
Vite在处理请求的多个环节中,会移除类似?的结尾分隔符,但在查询字符串的正则匹配过程中,却没有考虑到这种特殊情况,利用这个缺陷,就能读取目标文件的内容。例如:
地址/etc/passwd?raw??
地址/etc/passwd?import&raw??
地址/@fs/etc/passwd?raw??
地址/@fs/etc/passwd?import&raw??
具体的漏洞分析其他大佬写的都非常详细我这边就不过多的聊了。
linux服务器深度利用
众所周知linux系统是由文件夹组成的系统,目录树大致如下(不同版本略有不同)
其中值得注意的是这几个文件
/etc/shadow
/root/.bash_history
shadow
什么是shadow
/etc/shadow是linux系统中存储用户加密后密码文件,该文件只有root用户才能访问。
接下来,了解一下linux的密码结构。
密码格式解释:
用户名:加密后的密码:最后更改密码的日期:最小密码天数:最大密码天数:警告天数:失效宽限期:账户到期日:保留字段
ubuntu虚拟机的密码示例:
qq:$6$d5WOu04sdVK9Nyjm$cmN4vVzxLa23HkPQgMCs6S1OYhjJHDuf3nyBKMbbGkEhkPTBiWjYlhcN73XKwHD5xCAK8t95tAKZdxrd.Sp.s/:20182:0:99999:7:::
ubuntu虚拟机的密码解释:
用户名:qq
加密后的密码:$6$d5WOu04sdVK9Nyjm$cmN4vVzxLa23HkPQgMCs6S1OYhjJHDuf3nyBKMbbGkEhkPTBiWjYlhcN73XKwHD5xCAK8t95tAKZdxrd.Sp.s/
最后更改密码的日期:20182
最小密码天数:0
最大密码天数:99999
警告天数:7
失效宽限期:空
账户到期日:空
保留字段:空
加密方式:
$1$:MD5
$2a$, $2b$, $2y$:Blowfish
$5$:SHA-256
$6$:SHA-512
$y$:Yescrypt
$argon2id$:Argon2
目前最新版的kali、ubuntu的密码都使用了Yescrypt加密方式,这个加密方式是里面最强的。如果你读出的密码不是使用这个那还有一线生机。
shadow利用
当时使用地址/etc/shadow?raw??
成功读取到目标密码后该怎么深入利用。
以我的ubuntu虚拟机密码为例,把密码内容保存在文本中,使用kali自带的john工具来破解密码。
现在很多厂商为用户着想都会把ssh的默认22端口改成其他的,这需要你对目标进行扫描来确定ssh端口。然后就可以使用这个密码来连接目标。有的还会限制请求连接的ip,还是要看运气。
.bash_history
什么是.bash_history
.bash_history是linux系统中Bash Shell自动记录用户命令历史的文件,存储在用户的录下。它的作用是方便用户回溯和重复使用之前输入的命令,提高操作效率。
如果你想查看root用户以前输入过的命令,可以直接使用命令:history
或者查看他的.bash_history文件。
但是也存在其他情况,在装系统时引导会让你创建一个低权限的账户。在日常这个账户足够你的使用,除了一些需要高权限的操作会用到root账户。作为日常账号那肯定也会积攒下许多命令。
以qq这个账户为例,怎么才能查看到qq这个账户以前输入过哪些命令。
linux的root账户是有自己独立的文件的,目录位置上面提到了。其他用户的文件夹则统一都放在/home文件夹下。
进入目标账户的文件下就可以查看到.bash_history文件,查看历史命令和root的方式一样这里就不过多演示。
.bash_history利用
当密码没有被破解出来不甘心,就想掏点东西出来才行。那么首先你需要查看/etc/shadow文件,来确认目标存在哪些账户。
网页直接看这些文字都会团在一起,看起来非常费劲。可以找换行符转换行工具让内容格式正常
找账户存在两种可能。第一种只有root账户,这个案例就是。也就是说他只有一个账户的历史命令
第二种就是我们在装系统时引导让我们创建一个低权限账户的情况。例如qq这个账户有密码,但是root账户是空的。这并不是意味着root账户没有密码,而是因为早期的Unix系统允许root用户无密码登录,但这带来了严重的安全风险。现在的linux发行版默认禁用root密码登录,改为使用sudo机制。这种就存在有两个账户的历史命令。具体多少个账户请随机应变。
确认好目标存在哪些账户,接下来就具体查看账户的历史命令。有时网页显示中文会编码错误,可以在开发者模式里复制页面内容
root用户:地址/root/.bash_history?raw??
其他用户:地址/home/用户/.bash_history?raw??
分析历史命令后找到了网站的后台地址
配置信息看一手
数据库账号和密码搞到手
后续在历史命令中也找到了
连接到数据直接翻管理员密码,并成功登录到系统后台
任意文件读取不仅仅只能做这些,有可能还可以通过读配置文件来获取认证需要的key、读取网站的日志来获取敏感的目录位置,有几率还会有账号密码啥的、又或者跟着切换目录和打包的命令,把备份文件下载下来等。
思考
在2024年某次全国护网行动中很荣幸和安恒成为队友一起并肩作战。其中有位师傅的漏洞令我印象非常深刻,说出来你有可能不信。
大致过程就是插件识别到了一个系统框架,这个框架存在任意文件读取漏洞,碰巧这个系统还没修!师傅进而读取历史命令得到了ssh密码。最让人意想不到就是密码获取的途径非常炸裂,管理员sudo提权时密码输错。报错后在命令行单独输了一遍密码!单独输了一遍密码你敢信!就这样密码被明文记录到历史命令中!后面也是通过这台机器横向打了许多目标。
任意文件读取最大的特点就是参数后面会带有?path=,这个经常在头像处能看到,师傅们可以多多留意。