CTF 学习笔记

1.信息收集

敏感目录

通过敏感目录泄露,我们往往能获取网站的源代码和敏感的URL地址,如网站的后台地址等。

git泄露:通过开发过程中未删除的.git文件夹,攻击者可以通过.git文件夹中获取开发人员提交过的所有源码。

(1)常规git泄露:

没有任何其他操作,可以通过运用现成的工具或自己编写的脚本即可获取网站源码或者flag。(工具如scrabble)

(2)git回滚

git作为一个版本控制工具,会记录每次提交(commit)的修改,所以存在git泄露时,flag(敏感)文件可能在修改中被删除或被覆盖了,这时我们可以利用git的“git reset”命令来恢复到以前的版本。我们先利用scrabble工具获取源码,再通过“git reset--hard HEAD^”命令跳到上一版本(在git中,用HEAD表示当前版本,上一个版本是HEAD^),即可获取到源码。
查看历史版本可以通过以下代码实现:

1
2
3
4
5
6
7
#第一种方式
#跳到上一版本
git reset
#第二种方式
#查看每个commit修改了哪些文件
git log-stat
git diff HEAD commit-id
(3)git分支

每次提交时,git会自动串成一条时间线,这一条时间线就是一条分支。git通过多个分支,划分为不同的工作线。


如果没有新建分支,那么只有一个分支,git中默认为master分支。master分支为主线产品分支。通过开发分支进行修改,修改后合并到主分支。我们要找的flag或敏感文件可能不会藏在当前分支中,这时使用“git log”命令只能找到在当前分支上的修改,并不能看到我们想要的信息,因此需要切换分支来找到想要的文件。分支相关的操作命令如下:

操作命令 功能
git init -b <分支名称> 同时创建:仓库+分支
git branch<分支名称> 已有仓库,再创建分支
git checkout -b<分支名称> 已有仓库,创建并切换到分支
git branch 分支查看
git checkout<分支名称> 切换分支
git branch -D<分支名称> 删除分支
git branch -m<原名称><新名称> 重命名分支
git merge <被合并分支名称> 台并到当前分支


如果需要还原其他分支的代码,需要通过手工进行文件的提取,这里以GitHacker为例。GitHacker的使用十分简单,通过执行命令“python GitHacker.py url",可以再本地看到生成的文件夹,进入后执行“git log--all”“git branch-v”,只能看到master分支的信息。如果执行“git ref log”命令,就可以看到一些checkout的记录,通过checkout的命令可以查询到相关的不同分支的信息,可以通过手工的方式进行下载分支的head信息。

1
2
wget http://127.0.0.1:8000/.git/refs/heads/secret 
#通过该命令可以保存head信息到“.git/refs/heads/secret”文件夹下

恢复head信息后,我们可以复用GitHacker的部分代码,以实现自动恢复分支的效果。在GitHacker的代码中可以看到,他是先下载object文件,再使用git fsck检测,并继续下载缺失的文件。此处可以直接复用检测缺失文件并恢复的fixmissing函数。我们注释掉程序最后调用main的部分,修改为如下代码:
修改后重新执行“python GitHacker.py”命令,运行该脚本,再次进入生成的文件夹,执行“git log--all”“git branch-v”命令,则secret分支的信息就可以恢复了,从git log中找到对应提交的hash,执行“git diff HEAD b94c”(b94c为hash的前4位)命令,即可得到flag

(4)git泄露的其他利用

除了查看源码的常见利用方式,泄露的git中也可能有其他有用的信息,如.git/config文件夹中可能含有access token信息,从而可以访问这个用户的其他仓库。

2.SVN泄露

SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范将SVN隐藏文件夹暴露于外网环境,可以利用.svn/entries或wc.db文件获取服务器源码等信息。可以利用工具:dvcs-ripper,Seay-svn(windows下的源代码备份漏洞利用工具)。

3.HG泄露

在初始化项目时,HG会在当前文件夹下创建一个.hg隐藏文件夹,其中包含代码和分支修改记录等信息。这里推荐工具:dvcs-ripper.

4:总结经验

不论是.git这些隐藏文件,还是实战中的admin之类的敏感后台文件夹,其关键在于字典的强大,读者可以在某些工具的基础上进行一次开发,以满足自己需要。可以使用开源的目录扫描工具:dirsearch
CTF线上比赛往往会有重定向一类问题。例如,只要访问.git,便会返回403,此时试探着访问**.git/config,如果有文件内容返回,就说明存在git泄露,反之,一般不存在。而在SVN泄露中,一般是在entries中爬取源代码,但有时会出现entries为空的情况,这时注意wc.db文件存在与否,便可通过其中的checksumpristine**文件夹中获取源代码。

敏感备份文件

通过一些敏感的备份文件,我们往往能获得某一文件的源码,亦或网站的整体目录等。

1.gedit备份文件

在Linux下,用gedit编辑器保存后,当前目录下会生成一个后缀为“~”的文件,其文件内容就是刚编辑的内容,如果flag文件具备备份文件,就可以访问该文件,进行得到flag。

2.vim备份文件

vim是目前运用得最多的Linux编辑器,当用户在编辑文件但意外退出时(如通过SSH连接到服务器时,在用vim编辑文件的过程中可能遇到因为网速不够导致的命令行卡死而意外退出的情况),会在当前目录下生成一个备份文件,文件名格式为:.文件名.swp,该文件用来备份缓冲区中的内容即退出时的文件内容,针对SWP备份文件,我们可以用“vim-r”命令恢复文件的内容。这里先模拟执行“vim flag”命令,随后直接关闭客户端,当前目录下会生成一个.flag.swp文件。恢复SWP备份文件的办法是,先在当前目录下创建一个flag文件,再使用“vim-r flag”命令,即可得到意外退出时编辑的内容

3.常规文件

常规文件所依靠的无非就是字典的饱和性,不论是CTF比赛中还是现实世界中,我们都会碰到一些经典的有辨识的文件,从而让我们更好地了解网站。这里只是简单举一些例子,具体还需要读者用心搜集记录。
robots.txt:记录一些目录和CMS版本信息
readme.md:记录CMS版本信息,有的甚至有Github地址。
www.zip/rar/tar.gz 往往是网站的源码备份

4.总结经验

在CTF线上比赛的过程中,出题人往往会在线运维题目,有时会因为各种情况导致SWP备份文件的生成,所以在比赛过程中可以编写实时监控脚本,对题目服务进行监控。
vim在第一次意外退出时生成的备份文件为*.swp,第二次意外退出时的为*.swo,第三次退出时的为*.swn,以此类推。vim的官方手册中还有*.un.文件名.swp类型的备份文件。
句另外,在实际环境中,网站的备份往往可能是网站域名的压缩

Banner识别

在CTF线上比赛中,一个网站的Banner信息(服务器对外显示的一些基础信息)对解题有着十分重要的作用,选手往往可以通过Banner信息来获得解题思路,如得知网站是用ThinkPHP的Web框架编写时,我们可以尝试ThinkPHP框架的相关历史漏洞。或者得知这个网站是Windows服务器,那么我们在测试上传漏洞时可以根据Windows的特性进行尝试。这里介绍最常用的两种Banner识别方式。

1.自行搜集指纹库

Github上有大量成型且公开的CMS指纹库,读者可以自行查找,同时可以借鉴一些成型扫描器对网站进行识别。

2.使用已有工具

我们可以利用Wappalyzer工具(见图1-1-10),同时提供了成型的Python库,用法如下:

在data目录下,apps.json文件是其规则库,读者可以根据自己需求自由添加。3.总结经验
在进行服务器的Banner信息探测时,除了通过上述两种常见的识别方式,我们还可以尝试随意输入一些URL,有时可以通过404页面和302跳转页面发现一些信息。例如,开启了debug选项的ThinkPHP网站会在一些错误页面显示ThinkPHP的版本。

2.从信息搜集到题目解决

下面通过一个CTF靶场赛场景的复盘,来展示如何从信息搜集到获得flag的过程。

1.环境信息

  • Windows 7.
  • PHPstudy 2018(开启目录遍历)
  • DedeCMS(织梦CMS,未开启会员注册)。

2.解题步骤

通过访问网站,根据观察和Wappalyzer的提示(见图1-1-11和图1-1-12),我们可以发现这是搭建在Windows上的DedeCMS,访问默认后台目录发现是404,见图1-1-13。



这时我们可以联想到DedeCMS在Windows服务器上存在后台目录爆破漏洞(漏洞成因在这里不过多叙述,读者可以自行查阅),我们在
本地运行爆破脚本,得到目录为zggga111,见图1-1-14。但是经过测试,我们发现其关闭了会员注册功能,也就意味着我们不能利用会员密码重置漏洞来重置管理员密码。我们应该怎么办?其实,在DedeCMS中,只要管理员登录过后台,就会在data日录下有个相应的session文件,而这个题目恰好没有关闭目录遍历,见图1-1-15。所以我们可以获得管理员的session值,通过editcookie修改Cookie,从而成功进入后台,见图1-1-16。
然后在模板的标签源码碎片管理中插入一段恶意代码,即可执行任意命令,见图1-1-17和图1-1-18。




3.总结

这个例子可以反映信息搜集的重要性,体现在如下两方面。
一是服务器的信息,针对windows服务器,大概率意味着我们去寻找CMS在其上的一些漏洞。
二是在不知道密码和无法重置的情况下,通过CMS网站本身的特性,结合目录遍历来实现最后的RCE(Remote Command/CodeExecute,远程命令/代码执行)。


CTF 学习笔记
http://yoursite.com/2024/09/21/CTF 学习笔记/
Author
John Doe
Posted on
September 21, 2024
Licensed under