0# 概述
师傅们好久不见!最近不是特别忙,就研究研究最新的漏洞。
刚好最近一大批漏洞都爆出来了,比如 CVE-2025-1097, CVE-2025-1098, CVE-2025-24514, CVE-2025-1974
Kubernetes Ingress-Nginx Admission Controller RCE Escalation,是危害性极大的高危漏洞,在内网渗透中能直接击穿K8S集群。
这些高危漏洞其实分析文章很多,看国内外众多大佬的分析都非常精彩,这里我也不献丑了。
但引起我关注的漏洞是 CVE-2025-30208
Vite Development Server Arbitrary File Read 这个任意文件读取漏洞。
其实我们很多时候都轻视了任意文件读取漏洞,特别是很多刚入行学习网安的师傅,往往瞧不上任意文件读取漏洞,其实这是一种偏见。
今天就从 CVE-2025-30208
发散去讲任意文件读取漏洞,这种漏洞是有操作空间的,况且 CVE-2025-30208
利用简单、覆盖面广,那就有必要拎出来和大家交流一下,今天我就来抛砖引玉一下。
1# 漏洞原理?
CVE-2025-30208
漏洞原理非常简单,就简单提一下:
Vite 开发服务器提供 @fs
机制,用于防止访问 Vite 允许列表之外的文件。然而,由于 URL 解析时的正则表达式处理不当,攻击者可以通过 ?raw??
或 ?import&raw??
等查询参数绕过访问限制,从而读取任意文件。
在 Vite 服务器的 URL 处理逻辑中,@fs
机制原本用于限制对非白名单目录的访问,例如:
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
Vite 在 URL 解析过程中会移除部分特殊字符,而未正确考虑查询参数的影响,导致攻击者可以构造类似如下的请求绕过安全检查:
GET /etc/passwd?raw??
GET /etc/passwd?import&raw??
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?import&raw??
由于 Vite 解析 URL 时未正确处理这些参数,导致绕过 server.fs.allow
限制,并返回任意文件内容。
按理说,此漏洞仅影响明确将 Vite 开发服务器暴露到网络的应用程序,即使用 --host
或 server.host
配置选项的情况。
但经过公网的资产测绘来看,涉及的数量非常可观,且实际测试的结果发现成功率较高,怪不得各家厂商都打上了高危的标签。
该漏洞Exploit工具已经公开,Github地址:https://github.com/ThumpBo/CVE-2025-30208-EXP
3# 什么是bash_history?
众所周知,Linux用户的根目录是有区别的,root
用户的根目录在 /root
,而其他用户的根目录一般在 /home/用户名
,比如我有一个名叫 demo
的用户,那这个用户的根目录在 /home/demo
下。
在Linux系统下每个用户的根目录下,都有四个bash隐藏文件,需要使用 ll -a
参数才会显示出来:
-rw------- 1 demo demo 1710 Jan 22 16:20 .bash_history
-rw-r--r-- 1 demo demo 28 Oct 3 09:07 .bash_logout
-rw-r--r-- 1 demo demo 237 Jan 12 12:53 .bash_profile
-rw-r--r-- 1 demo demo 331 Oct 11 08:07 .bashrc
其中今天要说的主角是 .bash_history
,它是Linux 命令的历史记录,会持久化存储,默认位置是当前用户根目录的 .bash_history
文件。
当 Linux 系统启动一个 Shell 时,Shell 会从 .bash_history
文件中,读取历史记录,存储在相应内存的缓冲区中。
我们平时所操作的 Linux 命令,都会记录在缓冲区中。包括 history
命令所执行的历史命令管理,都是在操作缓冲区,而不是直接操作 .bash_history
文件。
当我们退出 Shell,比如按下 Ctrl+D 时,Shell 进程会把历史记录缓冲区的内容,写回到 .bash_history
文件中去。
4# 漏洞利用纵深
好了,上面把基础部分说完了。既然理论存在,那就实践开始!
注明:以下内容均为外网重点目标的实际利用(说句实话,这次在该漏洞的应急上,某大国居然比我国表现差),请在遵守当地法律的情况下合理学习利用
首先通过该漏洞读取 /etc/passwd
文件,发现该Linux上存在的用户信息,通过搜索 /home/
关键词找到Linux上的实际用户,然后尝试读取 /root/.bash_history
文件,如下:
会发现显示 permission denied, open '/root/.bash_history'
这是因为不是所有业务都是用 root
账户起的(有些目标还是可以的),所以并没有权限读取 /root/.bash_history
文件,那接下来就要尝试其他用户,如下:
哦哟,你看我发现了什么?SSH服务的公钥 authorised_keys
和 .ssh/
文件夹路径!
其实刚看 .bash_history
很糊,内容都缩成一团了,但可以通过编辑器工具对内容进行格式化:
剩下的大家都猜的出来了,通过 CVE-2025-30208
读取 /home/d*****in/.ssh/id_rsa
成功拿到了私钥,成功拿下该服务器,其实也可以直接猜测路径:
/root/.ssh/id_rsa?import&raw??
/root/.ssh/id_ed25519?import&raw??
/@fs/root/.ssh/id_rsa?raw??
/@fs/root/.ssh/id_ed25519?import&raw??
通过尝试拼接这个URL,可以批量去尝试读取对方机器的SSH私钥,但不一定在 /root
下,如果是在其他用户的目录下,就需要像上面一样尝试从 /etc/passwd
拿到用户名,并读取 /home/用户名/.ssh/id_rsa
拿到私钥。
同时不止是找到SSH私钥,还可以在 .bash_history
找到数据库账号密码,认证需要的Key,以及SSH密码等等,如下:
没想到吧?
5# 任意文件读取还能这么玩?
好了,通过上面你应该认识到任意文件读取漏洞的危害了~
既然都说到任意文件读取漏洞了,接下来我要分享之前在某高校平台提交的任意文件读取组合技实现GetShell的实战报告(PS:该漏洞目前已经上报修复啦,且我不是在SRC平台提交的,有相关授权,说泄露报告的师傅就不必了,本次披露仅做警示作用!)
通过信息搜集和模糊测试,对核心平台头像地址进行探测,发现敏感地址 /stu/common/getPic?path=/2023/图片名
,模糊测试发现任意文件读取漏洞(且该接口无鉴权),链接如下:
https://xxxxxxxx.cn/system/common/getPic?path=/../../../../../../../../../../../../../../../../../etc/passwd
尝试对 root
账户和 *****admin
账户的历史执行命令进行读取:
在 /root/.bash_history
文件中,发现Tomcat的绝对路径,同样在 /home/*****admin/.bash_history
也找到类似的目录
于是对tomcat的敏感路径进行读取,发现Tomcat日志路径,链接如下:
https://xxxxxxxx.cn/system/common/getPic?path=/../../../../../../../../../../../../usr/local/apache-tomcat-8.5.50/logs/localhost_access_log.2023-10-25.txt
在Tomcat的日志文件中,可以清晰的看到平台登录的传参!!!在核心平台登录过程中,居然使用Get进行登录明文传输,而不是Post进行加密传输!
通过编写Python脚本利用该任意文件读取漏洞,可以批量下载日志文件:
再通过编写Python脚本对下载的TXT进行正则匹配和输出,最终得到18万行的核心平台用户的账户和明文密码,后续通过登录平台找到其他漏洞成功GetShell!
6# 总结
今天我就是来抛砖引玉,详细的讲解了任意文件读取漏洞的攻击利用链,任意文件读取漏洞一直是我们日常所忽视的漏洞,大部分情况下它可能是鸡肋的,但有时候就能作为神助攻,成功祝你GetShell!
如果师傅们还有一些骚姿势,可以在评论区秀出来,也可以和我友好交流哈哈~
评论 (0)