版本控制(VCS),常见于git,svn,mercurial/hg等版本控制系统,在利用这些系统的时候,如果没有控制好操作,就容易造成文件泄露。
这里记录一下在版本控制下文件泄露的常用命令及工具。
GitHack .git 泄漏利用工具,可还原历史版本
lijiejie-GitHack 一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。
Git_Extract 尽可能的恢复所有目录,省去手动还原步骤
git log //显示到HEAD所指向的commit为止的所有commit记录 。使用reset HEAD~n 命令使HEAD指针向前移动,会导致HEAD之后的commit记录不会被显示。
git diff id //与相应提交的id比对
git ls-files --stage //检查保存在stage的文件
git reset --hard HEAD //放弃工作区和index的改动,HEAD指针仍然指向当前的commit.
首先从git/config信息里面可以得到仓库地址,然后
(1)下载.git/index文件,这是一种git特有的格式,在该文件中包含着文件名和文件SHA1值。
(2)根据该文件SHA1值到objects目录下载相应文件,具体路径somedomain/.git/objects/”XX”/”CHECKSUM”
(3)zlib解压文件,按照原始目录写入源代码。
dvcs-ripper 支持多种文件泄露查找工具,只能在linux环境下使用。需要perl环境。
安装这个工具,其需要一些环境,且不能在windows下使用。
yum install subversion //安装svn服务
yum install sqlite-devel sqllite //安装sqllit
yum install perl-DBD-SQLite perl-libwww-perl perl-IO-Socket-SSL //安装依赖
在使用中总是有各种问题,例如 svn: E155021,说我的svn版本过低,但是centos,yum安装已经是最新了。如果要解决就要手动安装最新版。去官网下载最新版svn源码,然后编译安装。 ./configure
然后又报错。
configure: error: no suitable APR found
安装apr环境,下载源码,编译安装,下载地址:https://apr.apache.org/download.cgi
然后出现这个错误
rm: cannot remove ‘libtoolT’: No such file or directory
解决方案
编辑 configure文件,查找 $RM “$cfgfile” 这个地方,用#注释掉
然后继续报错
configure: error: no suitable APRUTIL found
安装aprutil环境,然后编译时又报错
configure: error: APR could not be located. Please use the –with-apr option.
需要指定参数编译。
–with-apr=/usr/local/apr 添加编译参数 编译安装
又报错
xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
缺少依赖环境
yum install expat-devel
然后再编译安装svn
./configure –prefix=/usr/local/svn –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util
又报错
configure: error: Subversion requires SQLite
这可能是由于sqlite版本过低所导致的,yum安装的sqlite3版本还是比较低。去下载最新版本的sqllit3,编译安装。
下载地址:https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
然而并不是。查阅后发现需要下载这个,并放到svn的源码目录下
下载地址:https://www.sqlite.org/2020/sqlite-amalgamation-3310100.zip
在编译,又报错
configure: error: Subversion requires LZ4 >= r129, or use –with-lz4=internal
编译命令添加
./configure –prefix=/usr/local/svn –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –with-lz4=internal
又报错
configure: error: Subversion requires UTF8PROC
编译命令再修改
./configure –prefix=/usr/local/svn –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –with-lz4=internal –with-utf8proc=internal
make && make install ln -s /usr/local/svn/bin/svn /usr/bin/svn 创建完软连接就完成了svn最新版安装。
svnExploit 一款SVN源代码利用工具,其完美支持SVN<1.7版本和SVN>1.7版本的SVN源代码泄露
从svn的结构图可以看到一个目录text-base,这里有我们源文件的备份,比如要下载somedomain/phpinfo.php,直接访问目录somedomain/.svn/text-base/phpinfo.php.text-base,一般的服务器既不会阻止该目录也不会解释该后缀,我们就可以直接读到本地来。现在只是访问最顶层的文件信息,那怎么遍历呢?这里面就有.svn/entries,这个文件包含着该基础目录下所有的文件和目录,直接递推查找就行。
svn在1.6之后引入了wc.db来管理文件,该文件位于.svn/wc.db。普通文件位置:somedomain/.svn/pristine/”XX”/”CHECKSUM”.svn-base,CHECKSUM是文件的sha1值,xx则是他的前两位。那这个CHECKSUM去哪找呢?就是我们刚才提到的wc.db,这是一个sqlite数据库。数据库的大体结构如下:
$ sqlite3 wc.db .tables
ACTUAL_NODE NODES PRISTINE WC_LOCK
EXTERNALS NODES_BASE REPOSITORY WORK_QUEUE
LOCK NODES_CURRENT WCROOT
$ sqlite3 wc.db 'select local_relpath, checksum from NODES'
index.php|$sha1$4e6a225331f9ae872db25a8f85ae7be05cea6d51
scripts/menu.js|$sha1$fabeb3ba6a96cf0cbcad1308abdbe0c2427eeebf
style/style.js|$sha1$2cc5590e0ba024c3db77a13896da09b39ea74799
$ sqlite3 wc.db 'select local_relpath, ".svn/pristine/" || substr(checksum,7,2) || "/" || substr(checksum,7) || ".svn-base" as alpha from NODES;'
index.php|.svn/pristine/4e/4e6a225331f9ae872db25a8f85ae7be05cea6d51.svn-base
scripts/menu.js|.svn/pristine/fa/fabeb3ba6a96cf0cbcad1308abdbe0c2427eeebf.svn-base
style/style.js|.svn/pristine/2s/2cc5590e0ba024c3db77a13896da09b39ea74799.svn-base
第一步下载wc.db,然后从NODES表中找到文件名和其sha1值,最后构造下载链接。
dvcs-ripper 不再介绍了
hg init的时候会生成.hg
pip install mercurial
hg log # 查看仓库历史
hg pull # 拉取代码
hg status # 查看仓库状态
都可以使用dvcs-ripper