CTFHub 信息泄露通关笔记10:SVN泄露(2种方法)
目录
一、svn泄露
二、DVCS-Ripper工具
1、工具简介
2、下载安装
(1)下载安装DVCS-Ripper
① Git命令下载
② Web页面下载
(2)基本使用方法
3、利用步骤
三、渗透实战
1、打开靶场
2、目录扫描发现.svn文件
3、dvcs ripper渗透
4、查看index.php
5、获取flag
(1)方法1:grep查找flag
(2)方法2:cat查看flag
本文通过CTFHub的信息泄露-svn泄露关卡的渗透实战,系统剖析了svn泄露的机制、风险及利用技术。当开发人员不慎将.svn目录部署至生产环境时,攻击者可借此获取项目源码、提交历史等关键数据。通过实战演示,文章完整呈现了从靶场目录扫描发现.svn泄露,到运用dvcs-ripper工具成功还原项目并获取flag的全过程。
一、svn泄露
SVN(Subversion)是一种集中式版本控制系统,广泛用于软件开发中管理文件版本变更,通过创建 .svn
隐藏目录存储版本库元数据(如文件快照、提交历史、配置信息等),方便开发者追踪代码修改、回溯历史版本。
而 SVN 泄露 则是因网站部署时未删除 .svn
目录,导致该目录被公开访问所引发的信息泄露问题。攻击者可利用 dvcs-ripper
等工具,通过访问目标网站的 .svn
路径(如 http://example.com/.svn
),提取其中的版本库数据,还原源代码、历史提交记录甚至旧版本中的敏感信息等。
二、DVCS-Ripper工具
1、工具简介
DVCS-Ripper(通常也叫 rip-*.pl
)是一款专门用于检测和利用配置错误的安全工具。它的核心功能是:当发现一个网站意外地暴露了其版本控制系统的元数据目录(如 .git
, .svn
, .hg
)时,它能够远程下载并重建整个代码仓库,从而造成源代码泄露。
项目地址: https://github.com/kost/dvcs-ripper
方面 | 描述 |
---|---|
主要用途 | 渗透测试与CTF竞赛。用于利用“源代码泄露”,帮助安全研究人员和攻击者获取网站的完整源代码,以便进一步分析(如硬编码的密钥、API令牌、数据库凭证、逻辑缺陷等)。 |
支持的系统 | 支持多种分布式版本控制系统(DVCS)和集中式系统: • Git ( rip-git.pl )• Subversion (SVN) ( rip-svn.pl )• Mercurial (Hg) ( rip-hg.pl )• Bazaar (Bzr) ( rip-bzr.pl ) |
工作原理 | 工具会模拟版本控制客户端的行为,通过HTTP请求逐个下载仓库的元数据文件(如 index , HEAD , objects/info/packs , entries 等),解析这些文件以获取文件列表和其对应的哈希值,然后根据这些哈希值下载所有代码对象,最终在本地重建出一个完整的、可用的代码仓库。 |
2、下载安装
(1)下载安装DVCS-Ripper
dvcs-ripper 的核心功能是从泄露的版本控制目录(如.git、.svn)中提取并恢复数据,它能识别版本库的文件结构,自动下载相关组件并重建完整仓库,包含源代码、历史提交记录等,可通过 Git命令下载或者在官网下载源码。
① Git命令下载
sudo git clone https://github.com/kost/dvcs-ripper
② Web页面下载
对于源码中的pl后缀的脚本,其主要功能和对应的目标系统如下表所示。
脚本名称 | 目标系统 | 主要功能 |
---|---|---|
rip-git.pl | Git (.git ) | 下载并重建暴露的 Git 仓库 |
rip-svn.pl | Subversion (.svn ) | 下载并重建暴露的 SVN 仓库 |
rip-hg.pl | Mercurial (.hg ) | 下载并重建暴露的 Hg 仓库 |
rip-bzr.pl | Bazaar (.bzr ) | 下载并重建暴露的 Bzr 仓库 |
rip-cvs.pl | CVS (CVS/ ) | 下载并重建暴露的 CVS 仓库 |
(2)基本使用方法
DVCS-Ripper 的运行依赖于一些 Perl 模块,需要安装响应的依赖库,具体如下所示。
#安装依赖文件
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl
进入到dvcs-ripper目录中,验证安装是否成功,具体方法如下所示。
# 进入你克隆的目录
cd dvcs-ripper# 运行工具需要指定 perl 解释器和脚本路径
perl rip-git.pl --help# 或者给脚本添加执行权限后直接运行
chmod +x rip-git.pl
./rip-git.pl --help
3、利用步骤
dvcs-ripper工具对svn源码泄露的利用过程如下所示,先安装 perl 及相关依赖,克隆工具仓库并进入目录;再通过 rip-svn.pl 脚本,以目标包含.svn 目录的 URL 为参数执行提取;完成后进入生成的本地仓库目录,查看提取出的版本库文件、历史记录等内容,从中寻找敏感信息,整个过程通过解析泄露的 SVN 目录结构自动重建仓库实现信息获取。。
# 1. 安装dvcs-ripper(确保系统已安装perl及相关依赖)
sudo apt install -y perl libio-socket-ssl-perl libdbi-perl libdbd-mysql-perl# 2. 克隆dvcs-ripper仓库
git clone https://github.com/kost/dvcs-ripper.git
cd dvcs-ripper# 3. 利用rip-svn.pl脚本检测并提取SVN泄露(-u指定目标URL)
perl rip-svn.pl -u http://example.com/.svn/
# 工具会自动执行以下步骤:
# - 探测并下载SVN核心文件:entries, wc.db, pristine/ 等
# - 解析entries或wc.db文件获取版本库文件列表和校验和
# - 根据校验和从pristine/目录下载所有文件内容
# - 在本地重建完整的SVN工作副本,保存在以目标主机命名的目录中
# - 完成后可直接浏览下载的文件寻找配置文件、源代码和敏感信息# 4. 进入生成的本地仓库目录(通常以目标域名命名)
cd example.com# 5. 查看提取的SVN版本库内容,寻找敏感信息(如配置文件、历史提交记录)
ls -la
cat 敏感文件路径 # 例如:cat config.php 或查看日志文件# 说明:整个过程通过解析目标网站暴露的.svn目录结构,自动下载版本库元数据、文件快照等,重建本地可访问的SVN仓库,便于挖掘泄露的敏感数据
三、渗透实战
1、打开靶场
打开关卡如下所示,提示信息为“当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露。”,提示本关卡可以利用SVN泄露进行渗透测试。点击打开题目,此时系统自动创建Docker环境,下图蓝色部分的URL地址就是靶场环境。
打开靶场URL,页面提示"信息泄露-subversion,flag在服务端旧版本的代码中”,具体如下所示。
http://challenge-ef525d7f8675f9b7.sandbox.ctfhub.com:10800/
2、目录扫描发现.svn文件
通过目录扫描工具对challenge-ef525d7f8675f9b7.sandbox.ctfhub.com:10800进行渗透,这里选择使用dirmap工具进行渗透,命令如下所示。
python3 dirmap.py -ihttp://challenge-ef525d7f8675f9b7.sandbox.ctfhub.com:10800/ -lcf
-
-i http://challenge-ef525d7f8675f9b7.sandbox.ctfhub.com:10800/:
-i
是指定扫描目标的参数,目标是http://challenge-
ef525d7f8675f9b7.sandbox.ctfhub.com:10800/
。工具会默认对该 URL 进行目录扫描,探测潜在的隐藏目录或文件。 -
-lcf
(--loadConfigFile
):该参数表示加载项目根目录下的dirmap.conf
配置文件,使用文件中定义的详细扫描规则(如字典模式、递归扫描、请求头设置等)。
dirmap的扫描结果如下所示,在网站根目录下发现了.svn文件夹。
3、dvcs ripper渗透
使用dvcs ripper脚本对上一步发现的网站根目录下的svn文件进行渗透测试,通过dvcs ripper工具远程访问目标服务器泄露的.svn文件
,使用 rip-svn.pl
脚本以管理员权限(sudo
)从目标 URL http://challenge-ef525d7f8675f9b7.sandbox.ctfhub.com:10800/.svn
中提取 Subversion(SVN)版本库信息,完整的命令如下所示。
sudo ./rip-svn.pl -u http://challenge-ef525d7f8675f9b7.sandbox.ctfhub.com:10800/.svn
运行结果如下所示,输出显示使用 dvcs-ripper
工具的 rip-svn.pl
脚本对目标 URL 的 .svn
目录进行了 SVN 泄露利用:工具检测到目标使用了新的 SVN 客户端存储格式,识别出版本库信息(路径 file:///opt/svn/ctfhub
及唯一标识),并尝试还原目录结构,成功恢复了 index.html
文件。
4、查看index.php
使用cat index.php查看index.html文件,这段 index.html
内容显示这是一个与 CTFHub 信息泄露相关的页面,主题为 "Subversion"(即 SVN 版本控制系统)。页面明确提示 "Flag 在服务端旧版本的源代码中",结合之前的 SVN 泄露利用操作,说明目标的 flag 并未直接存在于当前版本的文件中,而是隐藏在 SVN 版本库的历史提交记录或旧版本文件里。
└─# cat index.html
<html><head><meta charset="UTF-8" /><title>CTFHub 信息泄露 SVN</title>
</head><body><h1>信息泄露 - Subversion</h1><br/><p>Flag 在服务端旧版本的源代码中</p>
</body></html>
5、获取flag
(1)方法1:grep查找flag
使用grep命令查找flag相关文件,递归地搜索 ./svn/pristine/
目录及其所有子目录下的所有文件,找出任何包含字符串 "ctfhub"
的内容,并打印出匹配的行及其所在的文件名。由于CTFHub靶场的特点是前缀为“ctfhub”,故而完整命令如下所示。
grep -r "ctfhub" .svn/pristine/
参数 | 含义 |
---|---|
grep | 一个强大的Linux文本搜索工具,用于在文件中查找匹配指定模式(字符串或正则表达式)的行。 |
-r | 递归(Recursive) 选项。它告诉 grep 不仅搜索当前目录下的文件,还要递归地进入所有子目录进行搜索。这是整个命令的关键。 |
"ctfhub" | 这是要搜索的模式(Pattern),即普通的文本字符串。命令会在文件内容中查找任何包含连续字母 ctfhub 的地方。 |
./svn/pristine/ | 这是要开始搜索的目录路径。 |
运行结果如下所示,
kali@kali:~/ljn/dvcs-ripper
└─# grep -r "ctfhub" .svn/pristine/
.svn/pristine/a7/294d4e4625c9b4ab240223d871068cd0d9833fc1.svn-base:ctfhub{6e5716008d759b6b60c9f738}
这个命令之所以有效且重要,是因为它直接搜索了 SVN 用于存储文件内容的核心目录。
-
./svn/pristine/
目录是什么?-
在 SVN 1.7 及以上版本中,
pristine/
目录是.svn/
里的一个特殊文件夹。 -
它被称为 “ pristine store ”(原始存储)。SVN 会在这里存储工作副本中所有文件原始版本的副本(以其校验和命名)。
-
这样做的目的是为了能够快速进行差异比较(
svn diff
)和还原操作(svn revert
),而无需每次都访问远程仓库。
-
-
为什么要在这里搜索?
-
当你使用
rip-svn.pl
等工具下载暴露的.svn
目录时,pristine/
文件夹会被一并下载。 -
这个目录里包含了网站所有源代码和资源文件的原始内容。即使开发者在工作目录中修改或删除了某些敏感信息(如密码、flag),它们的原始版本仍然安全地存储在
pristine/
中。 -
因此,
pristine/
目录是寻找历史代码、备份版本和敏感信息的金矿。
-
(2)方法2:cat查看flag
进入到.svn/pristine目录中,遍历子目录中的每个文件,发现flag,具体过程如下所示。
kali@kali:~/ljn/dvcs-ripper$ cd .svn
kali@kali:~/ljn/dvcs-ripper/.svn$ ls
entries format pristine text-base tmp wc.db wc.db-journal
kali@kali:~/ljn/dvcs-ripper/.svn$ cd pristine/
kali@kali:~/ljn/dvcs-ripper/.svn/pristine$ ls
29 bf
kali@kali:~/ljn/dvcs-ripper/.svn/pristine$ cd 29
kali@kali:~/ljn/dvcs-ripper/.svn/pristine/29$ ls
294d4e4625c9b4ab240223d871068cd0d9833fc1.svn-base
kali@kali:~/ljn/dvcs-ripper/.svn/pristine/29$ cat 294d4e4625c9b4ab240223d871068cd0d9833fc1.svn-base
ctfhub{6e5716008d759b6b60c9f738}
.svn/pristine/
是 SVN 版本库中存储文件快照的核心目录,里面的文件以哈希值命名,保存了不同版本文件的原始内容,故而如果不适用grep方法查找,而是使用手动的方式查看flag具体过程如下所示。