前言

这段时间在入门Web方向,发现Burp Suite这款工具的使用频率还是比较高的,所以有必要写一篇使用总结,方便自己遗忘之后回来翻阅查看

那么首先涉及到的问题就是工具的安装

安装

版本问题

版本号?

事实上到写下本文的2023年8月为止,Burp Suite仍然在以每个月release3个小版本的速度更新中

那么该如何在如此众多的版本中进行选择呢?

一般来说选择软件工具时

使用稍微旧一些的版本,能在网上找到更多教程

而使用较新一些的版本,能体验到许多新功能

不过相对Burp Suite这款软件来说,老版本的教程仍然对新版本适用,因为主要功能的ui并没有变化

我使用的版本是v2023.6.2,原因是Burp Suite在2022年之后的版本中内置了浏览器,这样可以免去配置代理的工作。同时这个版本也不会太新,相对来说较为稳定,Bug会少一些。

社区版or专业版?

官方提供了Community Edition(社区版)和Professional(专业版)两种版本给我们选择

其实两种版本的软件都拥有我们在做Web题时会用到的模块,而专业版增加的保存功能其实在做CTF题时并没有太大的用处

所以两种版本均可选择

这里我选择的是专业版

事实上

在这里我推荐使用英文版,不仅能让你对专业名词更加熟悉,而且在很多情况下,比如线下赛时,官方提供的工具均为英文版,这时用惯了中文版的你就会有点手足无措

资源链接

链接:https://pan.baidu.com/s/1tUzFVqUhr-_3t3Rqs6YvqQ?pwd=1111
提取码:1111

配置

CA证书下载及导入

使用Burp Suite做安全测试时,要抓取HTTPS的包的话,是需要有Burp Suite的CA证书的,否则浏览器不支持。

如果不做配置,则会出现如下图的问题

这里以我使用的BurpSuitePro_v2023.6.2版本为例,为BurpSuite的内置浏览器配置CA证书

配置步骤如下:

  1. 将Burp Suite的CA证书下载到本地一共有两种方法

    点击进入软件的Proxy模块,点击Proxy settings

    点击Import/export CA certificate按钮

    勾选 Certificate in DER format,点击Next

    输入cacert.der,点击Next

    此时在Burp Suite 的同级目录下会多出一个刚刚生成的cacert.der 文件

  2. Burp suite内置的浏览器内核为Chromium,为chrome浏览器导入CA证书的步骤与本教程类似

    进入内置浏览器的设置 - 隐私与安全界面,点击隐私与安全栏下的安全按钮

    点击高级栏下的管理设备证书按钮

    受信任的根证书颁发机构栏下导入并安装上一步下载的CA证书

此时再次抓包https://www.baidu.com,就可以正常进行了

Intruder爆破模块介绍

BurpSuite的Intruder是一个高度可配置的自动化攻击模块。可以用来爆破用户名或密码,还可以用来当作简单的爬虫使用

在CTF题中一般在爆破时会用到

界面介绍

Postions

Positions界面主要用于配置爆破模式Payload的位置

payload翻译成中文叫“载荷”。一般指的是在网络通信中传输的有效载荷(Data payload),也可以理解为在某种类型的消息或数据包中携带的实际数据。在计算机网络中,例如在HTTP请求或响应中,payload就是实际的数据部分,而不包括协议头或其他元数据。在加密中,payload也可以指加密算法中的明文部分,即需要被保护的数据。

一般来说,CTF中的payload也指漏洞利用时,真正在目标系统执行的代码或指令。

其实这里的payload更多可以理解为数据中的变量,即字典爆破的参数

Payloads

Payloads界面是有关变量payload的具体配置

有关payload type的详细介绍可以参考这篇文章:[Burp Suite完整教程] Intruder Attack type&Payloads – 拥有上千种姿态的攻击模式_软测小生的博客-CSDN博客

但是平时最常用的类型还是Simple list,即使用字典进行爆破

Payload processing的一些常用可选规则如下:

规则 描述
Add prefix 添加一个文字前缀
Add suffix 添加一个文字后缀
Match/replace 将替换匹配特定正则表达式的有效载荷的任何部位,替换成一个文字字符串
Substring 提取有效载荷的子字符串,可以指定开始索引及长度
Reverse substring 从后向前获取子字符串
Modify case 将payload全转为大写或小写,或者首字母大写及驼峰命名
Encode URL,HTML,Base64和ASCII码等编码规则
Decode URL,HTML,Base64和ASCII码等解码规则
Hash 将payload转为其hash值

Resource pool

Resource pool用于配置爆破时的请求数和延迟,合理配置可以缓解带宽压力,同时也能防止被目标站点封禁

Settings

这个页面主要是爆破及结果的一些设置

比较有用的是Grep - Match项,可以提前设置一些关键词,结果中与之匹配的报文会被标记出来

例如做ctf题之前可以在规则中添加flag关键词

爆破模式

Sniper(狙击手)

正如名字狙击手一样,Sniper模式一次只会爆破一个position的变量,而其他变量则会显示为变量名

sniper的特点是只需要指定一个Payload Set,但会针对每个变量逐项的替换。

假设我们设置两个变量,payload set设置为 11,22,33

那么会按以下顺序爆破:

11:password

22:password

33:password

username:11

username:22

username:33

Battering ram(攻城锤)

攻城锤模式下所有位置的变量一起变化,且所有变量遍历同一个字典

假设我们设置两个变量,payload set设置为 11,22,33

那么会按以下顺序爆破:

11:11

22:22

33:33

Pitchforck(草叉模式)

Pitchfork的特点是多个字典同时进行

每个变量要有自己的字典文件,也就是说每个变量有一个属于自己的Payload set,但是要注意的是每个Payload set里面的payload个数要一样。

假设我们设置两个变量,payload set1设置为 11,22,33,payload set2设置为 aa,bb,cc

那么会按以下顺序爆破:

11:aa

22:bb

33:cc

Cluster bomb(集束炸弹)

集束炸弹模式是最常用的,因为请求报文中需要爆破的变量一般很少会是相同的

该模式下每个变量对应一个字典,并且进行交集破解,尝试各种组合。

爆破的顺序则是循环遍历每个payload set2

假设我们设置两个变量,payload set1设置为 11,22,33,payload set2设置为 aa,bb,cc

那么会按以下顺序爆破:

11:aa

11:bb

11:cc

22:aa

22:bb

22:cc

33:aa

33:bb

33:cc

ctfshow web21-28

web21(用户名密码爆破)

打开目标站点后发现需要登录

将题目给的字典附件下载到本地

既然给了字典,那么自然而然就能想到要用爆破的方法

这里使用burp suite自带的Intruder模块

随便输入一个用户名和密码,发现用户名:密码在请求报文中被base64编码

将请求报文转入Intruder

用户名和冒号为admin:不变,设置成第一个变量,而密码需要用提供的字典爆破,设置成第二个变量

所以此时选用Cluster bomb模式

接下来设置两个payload变量

payload1:

payload2:

开始爆破,得到正确的密码,并将报文转入Repeater

得到最终flag

web22(子域名爆破)

题目提示爆破子域名,使用工具layer进行爆破即可

web23(源码分析)

题目给出的源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 11:43:51
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
error_reporting(0);

include('flag.php');
if(isset($_GET['token'])){
$token = md5($_GET['token']);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo $flag;
}
}
}else{
highlight_file(__FILE__);

}
?>

分析代码得:

flag的md5值的(第2位+第15位+第18位)/第2位=第32位

使用以下脚本进行爆破:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
error_reporting(0);
$string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
print (strlen($string)."\n");

for ($a = 0; $a < 62; $a++) {
for ($b = 0; $b < 62; $b++) {
for ($c = 0; $c < 62; $c++) {
$flag = $string[$a] . $string[$b] . $string[$c];
$token = md5($flag);
if (substr($token, 1, 1) === substr($token, 14, 1) && substr($token, 14, 1) === substr($token, 17, 1)) {
if ((intval(substr($token, 1, 1)) + intval(substr($token, 14, 1)) + substr($token, 17, 1)) / substr($token, 1, 1) === intval(substr($token, 31, 1))) {
echo $flag . "\n";
}
}
}
}
}

随便选一个爆破后的结果作为tocen即可

web24(伪随机数)

题目给出的源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:26:39
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(372619038);
if(intval($r)===intval(mt_rand())){
echo $flag;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}

?> Linux version 5.4.0-148-generic (buildd@lcy02-amd64-112) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023 Linux version 5.4.0-148-generic (buildd@lcy02-amd64-112) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023

这里考到一个知识点,即mt_srand()函数

mt_scrand(seed)用于分发seed种子。指定seed后,使用mt_rand()生成的随机数为固定值,或者称为伪随机数

自 PHP 4.2.0 起,不再需要用 srand()或 mt_srand() 给随机数发生器播种 ,因为现在是由系统自动完成的。

如指定seed,则生成的是伪随机数

编写php脚本得到r的值

web25(伪随机数爆破)

题目给出的源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));
$rand = intval($r)-intval(mt_rand());
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
Linux version 5.4.0-148-generic (buildd@lcy02-amd64-112) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023 Linux version 5.4.0-148-generic (buildd@lcy02-amd64-112) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023

get请求的$r以及输出的$rand能让我们确定该种子生成的第一个随机数的值,后面两个随机数则能通过php_mt_seed爆破种子来确定

在python中,存在MT19937攻击,同样,php中也能利用梅森旋转算法的特性,从生成的随机数反推随机数种子

这里用到工具php_mt_seed,事实上这个工具并不需要投喂624个32位的数据,因为php中生成的随机数位数较小

它的原理其实是穷举所有的种子并根据枚举出的种子生成随机数序列再跟已知的随机数序列做比对来验证种子是否正确

工具下载链接:php_mt_seed - PHP mt_rand() 种子饼干 (openwall.com)

安装指令:

1
2
3
# 在php_mt_seed-4.0/ 目录下
make
gcc -Wall -march=native -mtune=generic -O2 -fomit-frame-pointer -funroll-loops -fopenmp php_mt_seed.c -o php_mt_seed

该工具需安装在linux环境下运行

用法:./php_mt_seed.c 随机数

先通过get请求测试r=100

得到随机数1为$100+1931798008=1931798108$

使用burp抓包发现php版本为7.1以上

丢入php_mt_seed工具中爆破,得到seed可能为110936901、327092611和2027529594

测试第一个种子,在本地生成三个随机数

得到cookie值$1571155150+1115554962=2686710112$,使用burp传入r和token,得到flag

web26(弱口令密码爆破)

观察界面,这一题依然是爆破用户名和密码

既然用户名里已经提示管理员账号为root,那我们只需要爆破密码即可

使用Intruder的狙击手模式

在网上随便找一份弱密码字典开始爆破

非常幸运地爆破出密码

这题也提醒我们平常要备一些弱口令密码字典

web27(生日爆破)

进入题目站点的主页面

点击学生学籍信息查询系统会跳转到如下界面,猜测是用来查询账号密码的

点击录取名单会下载如下表格

可以看到身份证号码的生日一栏刚好被遮住,所以需要我们爆破生日

随便选择一个学生,在学生学籍信息查询系统中进行爆破

使用Dates形式的Payload,从1990年爆破到2005年的日期,并且使用身份证中生日的格式

找到响应报文最长的一条,得到登录信息

将信息unicode解码

登录系统后得到flag

web28(目录爆破)

观察目标站点的目录,非常具有特点,均为数字

由于是简单的数字组成的目录,尝试用burp爆破目录

使用集束炸弹模式,且目录层数与默认页面一致

两层目录的payload均使用数字模式,从1遍历到100

爆破得到flag