编者注:你真的会用 BurpSuite 吗?

转载自:https://forum.butian.net/share/686

BurpSuite Trick ALL In ONE (第一版)

0x01 Basic

1x1 Anti Burp by Web Interface

  1. 配置SwitchyOmega代理的时候增加设置如下列表的不走代理

    1
    2
    burp
    burpsuite

    -w624

  2. 在burpsuite的proxy的opions中禁用掉 web interface http://burpsuite

截屏2021-05-25 上午10.37.08

主要原因是防止被检测到使用burpsuite在抓包,最重要的是防止被检测到使用burp抓包之后返回蜜罐的响应信息给你。
参考: 《精确判断网站访问者是否是黑客的方法》

  1. 最好把burp的favicon.ico也删除
1
zip -d burpsuite_pro.jar "resources/Media/favicon.ico"

参考: 《使用javascript确认对方是否开burpsuite,蜜罐必备策略》

1x2 Anti Burp by JA3 指纹

cloudflare上的https站点使用burp和python均无法发包,应对的方式就是在burp的上游再加一个代理。

-w930

cloudflare的anti burp的项目: https://github.com/cloudflare/mitmengine

JA3 指纹原理: https://xz.aliyun.com/t/3889

0x02 Trick

2x1 Turbo Intruder

1/N 使用方法:

  1. 首先你需要安装这个插件
  2. 选中一个请求,点击右键选择Extensions-Send to turbo intruder

-w1416

2/N 一旦你向该插件发送请求,一个python编辑器就会打开,窗口会显示几个现有的python脚本,供你参考和使用。

-w1196

3/N 增加并发量或增加管道,然后点击攻击。示例代码见(或者下面):BurpTurboIntruderBasicFileWriteMultiParam.py

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
33
34
################### This section will mostly remain as it is ###################

def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=100,
pipeline=False
)
################### ---------------------------------------- ###################

# This attack will be similar to ClusterBomb technique
# As they are nested loops
# You can do almost anything here, with the power of python,
# this will be applied to request params where you have set %s %s in the Request section in the top
for firstParam in open('/usr/share/dict/words'):
for secondParam in open('/usr/share/dict/web2'):
engine.queue(target.req,
[
firstParam.rstrip(),
secondParam.rstrip()
])

# Do anything with response, let write it to a file.
def handleResponse(req, interesting):
# currently available attributes are req.status, req.wordcount, req.length and req.response
# add response to the table
table.add(req)
data = req.response.encode('utf8')
# Extract header and body
header, _, body = data.partition('\r\n\r\n')
# Save body to file /tmp/turbo.dat
output_file = open("/tmp/turbo.dat","a+")
output_file.write(body + "\n")
output_file.close()

-w1200

4/N 使用这个插件,你几乎可以在Burp里面用Python做任何事情
例如:

  • 处理自定义登录
  • 定制化的一些测试
  • 过滤你想要的请求
  • 添加速率限制、管道等

2x2 Match(匹配) and Replace(替换) 功能的有效使用

要点:
(1) False2True trick
(2) 在所有的参数处注入通用性payload

1/N False2True trick,当用户访问一个资源是未经授权的。通过在burp响应体匹配和替换中将服务器响应体从F更改为T,有很大的机会可以使隐藏的客户端控件取消隐藏属性。

-w1080

  1. 添加匹配和替换(Match and replace)。
    -w1138
  2. 添加所示的替换。
    -w1131

这是一个将false返回体更改为true的示例技巧。并且这是一个非常常见的用例。

2/N 今天的主要技巧。 在表格中自动的注入payload,而不是手动打出整个payload。

-w1133

3/N 上述匹配和替换规则将把请求主体中的所有KKK替换为SQLi和XSS这种通用型payload。
此处的示例载荷

1
'"><script src="somesrc"></script><h1>test

这样的话只要把 KKK 放在参数输入处,发送之后就会自动将对应的位置替换为示例中的有效载荷,这样就可以对XSS和SQLi漏洞进行发现。

PS: 其实这个功能也可以用于Hosts碰撞得到host对应的内网域名名之后,设置替换对应的内网域名。相关文章–利用HOSTS碰撞突破边界

-w928

2x3 Find References: Burp中最被低估和未被充分利用的功能

PS: 只有Pro版本的可以在整个Burp中去寻找URIs的references(引用),这个功能的重点是发现客户端脚本对后端的请求,从而发现更多的测试点。

1/N 从任何地方挑选请求,右击-> Engagement Tools -> Find References

-w1135

2/N 一个新的窗口将被打开,它将显示references和这些references的位置。位置可以是repeater, scanner等。reference可以是在请求、响应、头文件中。将会像图片中所示的那样被高亮显示。

-w1136

-w1136

3/N 可以用来发现浏览器的脚本发送的请求,并学习它来制作你对该端点的有效载荷请求。

参考: https://portswigger.net/burp/documentation/desktop/functions/search#Find-references

2x4 你可以在req模块中修改被压缩的数据

不要忽视BurpSuite中那些看起来的脏数据。可以保持这一设置,并在Burp中玩弄压缩数据

1/N 在Burp Proxy中,解压设置默认是禁用的,像这样启用它。

-w1062

2/N Before & After.

-w1137

-w1137

参考: https://portswigger.net/blog/burp-suite-tips-from-power-user-and-hackfluencer-stok

2x5 一次性检测所有攻击载荷的攻击效果

一次性检查intruder, repeater, sequencer等模块中数据包的响应信息,而不是每次都向浏览器发送反应。

一个一个检查intruder模块中的每一个测试结果是非常无聊的(特别是对XSS漏洞),所以你可以按照如下过程进行操作:

  1. 在启动intruder之前,转到BurpSuite的project options中 -> logging -> tick intruder response -> 将它保存为一个html文件

-w926

  1. 然后双击这个html文件,所有的XSS payload就会一起被触发了

2x6 禁止Firefox发送与其相关的请求

0/N 首先,为什么使用BurpSuite和Firefox的组合? 现在的BurpSuite已经内置了Chromium浏览器,为什么还要使用Firefox?

这是因为:

  • Burp内置的Chromium在每次不同的运行中都不能保持设置。
  • 每次都要重新安装插件
  • 不能禁用本地CORS检查
  • 不灵活等。

1/N 我个人使用火狐浏览器,如果你和我一样使用过它,你一定看到过很多 http://detectportal.firefox.com 的请求。
它们很吵,你可以右键点击,然后标记 “不要拦截”,但这也不是一个持久的方法。
在CE中,你没有session。

-w1138

-w1060

2/N 最好的办法是在Firefox上禁用这个功能,一劳永逸。
相信我,这很容易,这将是你的伟大投资。
进入about:config,完全禁用这个功能。

-w1137

-w1137

这个方法只是其中之一,还有两种解决方案

  1. 利用 功能
    BurpSuite -> Proxy -> Options -> TLS Pass Through.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.*\.gstatic\.com
.*\.googleapis\.com
.*\.pki\.goog
^.*?apple\..*$
^.*?icloud\..*$
^.*?mzstatic\..*$
^.*mozilla\.(com|net|org)$
^.*\.google\.com$
^.*\.gvt1\.com$
^.*\.ghostery\.(com|net)$
^.*\.aka\.ms$
^.*\.msecnd\.net$
^.*\.skype\.com$
^.*\.microsoft\.com$
^.*\.visualstudio\.com$
^.*\.msn\.com$
^.*\.azureedge\.net$
^sb\.scorecardresearch\.com$
^.*\.msedge\.net$
^.*\.bing\.com$
^.*\.windowsupdate\.com$
.*\.windows\.com
.*\.live\.com
.*\.digicert\.com

-w986

如果不想一条一条加,可以直接使用这个师傅的配置文件 @parsiya

img

PS: 也有师傅提出如果不需要拦截所有网页流量的话,可以用scope,scope的方法可以参考文章 《Towards a Quieter Burp History》

  1. 替换掉firefox的user.js文件,从源头上根治

将里面的 user.js 放到对应的profie下,firefox就不会发出一堆烦人的请求了

1
2
3
4
5
Windows: C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default

Mac OS X: Users/<username>/Library/Application Support/Firefox/Profiles/xxxxxxxx.default

Linux: /home/<username>/.mozilla/firefox/xxxxxxxx.default

2x7 宏(Macro):录制的会话

Part 1: What, How & Why?

1/N Burp套件中的宏(Macros)是用来记录一组请求的。

你首先通过代理传递请求,然后选择要添加到宏中的请求集来创建这些记录的请求。

要创建一个宏(Macro)。Project Options -> Sessions -> Macro

-w978

2/N 点击添加,代理标签将打开。

发送你想记录的请求。
点击确定。
宏将被记录下来,给它起个好听的名字。

-w971

-w1136

3/N 在会话中使用宏。

对于现在所有范围内的URL,在会话下的这个宏将在每个请求之前运行。

-w979

-w1065

-w988

N/N 使用案例

  • 拥有自定义登录的网站(常见的例子就是带token的情况)。
  • 有助于编写扩展插件。
  • IDOR测试。

这里结合一个测试案例来对其功能给一个直观的认识,靶场地址: https://vuln-demo.com/burp_macro/macro.php

这是典型的使用上一个请求响应中的token作为下一个请求的参数,你发送的请求才能够被后端成功接收的案例。

首先找有token的那个请求记录
img

点击 configure item -> add -> 双击对应的字符串,burp会自动创建对应的规则
img

之后设置使我们创建的宏生效(起作用+作用范围)就好了
img

img

随后在发包的时候只要看到我们的token是发包前更新的就可以验证宏设置成功了
img

但是这种的局限性就是他只能替换 token= 这种形式的,对于json或者其他则无能无力,此时就可以使用插件 burp-cph,关于这个插件的使用可以参考: 《当面对动态参数爆破时,我们该如何处理?》。但是这个插件还是比较复杂的,更简单一点的插件是 Burp Extractor,对应的文章介绍是 《BurpSuite Extender之巧用Marco和Extractor绕过Token限制》

Part 2: How to use to automate testing?

通过宏进行自动化,在为API和受保护的资源创建会话时使用宏。

一旦创建,将其作为会话(session)添加,并设置范围(scope)。在演示中,我将所有的URL添加为范围(scope)。

-w1067

现在,工具范围中提到的所有请求将被宏处理。

可以使用跟踪器(Tracer)来调试宏

-w984

-w1128

可以使用 portswigger 的lab来对 (Macros) 做练习
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-infinite-money

2x8 在BurpSuite中repeater模块的响应中快速追踪你修改的参数

当你在中继器选项卡中修改一个参数,它的值会反映在响应中,当你必须滚动查看变化的内容时,你可以启用这个切换键……真正的省时省力!

操作如下图片所示。

-w1137

-w1139

2x9 你在使用BurpSuite时也面临着缓存响应的问题吗?

如果受到了缓存的影响,那么关闭它就好了

在这个模块中开启以下两个规则 Proxy -> Options -> Match and Replace.

  • If-Modified-Since
  • If-None-Match

-w1071

有时我在Burp中看到304的响应,我不得不在Burp历史中挖掘,以检查第一次出现的响应并进行分析。移除这些头文件后,你可能不会再看到这样的响应。

2x10 在使用BurpSuite pro进行企业测试的时候,我们不应该捕获和存储企业的证书

使用的步骤以及为什么这点是重要的:

步骤:

  1. 临时项目/会话。
  2. 登录到应用程序,像正常一样。
  3. 识别哪些域的请求包含凭证。
  4. 在Burp中启动主项目。
  5. 将这些域添加到SSL穿透中。Proxy > Options > TLS Pass-Through

img

我为什么这样做。我保存了会话,而burp将存储这些凭证和会话。我个人不希望凭证被存储在文件中。
另一个重要的问题是,我们不是在测试SSO,而是在测试SSO背后的应用程序。

2x11 基于burp proxy history生成字典

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import xml.etree.ElementTree as ET
import urllib
import base64
import math
import sys
import re

# usage: Open Burp, navigate to proxy history, ctrl-a to select all records, right click and "Save Items" as an .xml file.
# python burplist.py burprequests.xml
# output is saved to wordlist.txt

def entropy(string):
#"Calculates the Shannon entropy of a string"
# get probability of chars in string
prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]

# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])

return entropy

def avgEntropyByChar(en,length):
# calulate "average" entropy level
return en / length

tree = ET.parse(sys.argv[1])
root = tree.getroot()
wordlist = []

for i in root:

# preserve subdomains, file/dir names with . - _
wordlist += re.split('\/|\?|&|=',i[1].text)

# get subdomain names and break up file names
wordlist += re.split('\/|\?|&|=|_|-|\.|\+',i[1].text)

# get words from cookies, headers, POST body requests
wordlist += re.split('\/|\?|&|=|_|-|\.|\+|\:| |\n|\r|"|\'|<|>|{|}|\[|\]|`|~|\!|@|#|\$|;|,|\(|\)|\*|\|', urllib.unquote(base64.b64decode(i[8].text)))

# response
if i[12].text is not None:
wordlist += re.split('\/|\?|&|=|_|-|\.|\+|\:| |\n|\r|\t|"|\'|<|>|{|}|\[|\]|`|~|\!|@|#|\$|;|,|\(|\)|\*|\^|\\\\|\|', urllib.unquote(base64.b64decode(i[12].text)))

auxiliaryList = list(set(wordlist))
final = []
avgEntropyByLength = {}

for word in auxiliaryList:
if word.isalnum() or '-' in word or '.' in word or '_' in word:
en = entropy(word)
# remove "random strings" that are high entropy
if en < 4.4:
final.append(word)

final.sort()

with open('wordlist.txt', 'w') as f:
for item in final:
f.write("%s\n" % item)

print "wordlist saved to wordlist.txt"

2x12 使用Burp来对目标进行批量扫描

很多时候我们会在burp上面集成很多萨漏洞扫描或者信息收集插件,所以可以借助设置上层代理的方式来将目标发送到burp,随后使用burp来对目标来做下一步的安全测试。

1
2
3
cat subs.txt | httpx | tee -a livesubs.txt
cat livesubs.txt | gau | tee -a wayback.txt
ffuf -u FUZZ -w wayback.txt -replay-proxy http://127.0.0.1:8080/

基于这个想法扩展一下,准备做一个中间层(数据包去重+重要信息提取),把爬虫(crawlergo, rad, LSpider)和Burp(xray也可以)联动起来,既然不知道用哪个爬虫那就全都要。 #TODO

2x13 IPtables + BurpSuite + Android 应用

  • 在设备上添加Burp CA
  • 绕过ca pinning
  • root设备(iptable需要)

Dport(是设定目的端口的参数) 80 路由 - 运行以下命令 (或许对443端口也需要做这样的事情)

1
2
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination <BURP_IP>:8080
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE

2x14 使用repeater模块测试那些通过反向代理的请求

img

例如 blogspot.com 这个网站,网站进行了反向代理的设置,它会检查子域并对其进行相应的路由,现在让我们为它改变host。

图 1 : Target 的值与 Host 的值相同的时候

16314241507193.png

图 2 : Target 的值与 Host 的值不相同的时候, 这个请求就会被路由到不同的站点

img

2x15 HTTP-Pipelining

HTTP-Pipelining方式的好处就是会产生跟域前置(domain fronting)相类似的效果,将恶意请求隐藏在正常请求之后,并且目前大多数服务器都是支持这个技术的。此测试技术可以参考文章《Using HTTP Pipelining to hide requests》。在burpsuite中可以使用如下方式来开启HTTP pipelining功能

img

img

PS: 其实初看这个概念你可能觉得陌生,但是这个技术点其实就是前一段时间最火的 HTTP-Request-Smuggling (HTTP请求走私漏洞)

2x16 在Intruder模块中设置过滤

过滤出那些呈现出特定响应的数据包

  1. 为Intruder的响应数据包创建一个过滤器。

img

img

  1. 载入payload开始fuzz
  2. 如果响应包含你在 “grep “中输入的字符串,将显示在一个额外的列中。
    -> 你只能关注你正在寻找的响应。
    img

2x17 Plugin: BurpBounty

在BurpSuite主动/被动扫描器中添加你自己的扫描规则。不需要写一行代码就可以在扫描器中自定义检查策略。

插件名称:BurpBounty扫描检查生成器。
这是一个相当容易使用的插件。从 BApp Store 安装,用简单的名字创建一个检查。给它一个严重性,检查输入你想执行/检查的req/res,并启用它。

img

img

img

2x19 Burp Collaborator

BurpSuite Collaborator是PortSwigger提供的一个托管网络服务,在手动测试中非常有用。

1/N 当你不清楚手动注入的有效载荷是否触发了与其他网站的交互时,就可以使用Collaborator来验证。Collaborator功能默认使用的是由PortSwigger托管的公共服务器。具体的工作原理如下图所示。

img

img

2/N Collaborator客户端的使用如下所示

  1. 启动Collaborator客户端
    img
  2. 点击复制,将创建一个带有<>.burpcollaborator.net域名的自定义URL。之后在payload中使用该URL
    img
  3. 轮询以查看在URL上发出的请求。
    img
  4. 用于请求的payload示例(这个案例中会产生DNS和HTTP两种请求)
    img

3/N 一些有用的场景

  • SQLi 盲注
  • SSRF
  • XSS
  • BlindXXE
  • 检测你能想到的任何出站的源负载
  • 逃避防火墙,如果出站的TCP请求被阻止而HTTP被允许的话

2x20 三步创建一个属于你自己的Burp Extender插件(Java类型)

  • 从Burp -> Extender -> APIs -> Save Interface files下载API接口。
    img
  • 创建一个名为burp的包,并将文件保存在那里,你可以选择任何你喜欢的IDE。
    img
  • 让IDE准备好构建JAR。
  • 创建文件名为BurpExtender并添加以下代码。
    img

2/n

  • 文件名Burp Extender将是你的插件的一个入口点,扩展接口在加载时在Burp中注册。该插件的所有逻辑都在这里。
  • 构建Jar
  • 在Burp中加载Jar。
    img
    img

3/n

  • 你也可以用这些命令从命令行建立Jar。 ```php

    代码位置 -> cd usercode

    .class文件的位置 -> mkdir build
    jar的位置 -> mkdir bin
    编译代码 -> javac -d build src/burp/

    .java

    建立jar -> jar cf bin/burpextender.jar -C build burp

    1
      

2x21 Autorize 与 IDOR(越权漏洞)

Autorize可以帮助你自动化的查找越权漏洞,基本的使用步骤如下:

  1. 首先在 Autorize 扩展中提供低权限/不同用户的 cookie 详细信息。
  2. 然后作为高权限用户使用浏览器并连接 burp 漫游并在易受攻击的网站上获取不同的资源。
  3. 对于您在站点上向高权限用户发出的每个请求,Autorize 扩展都会使用给定的低权限 cookie 重复相同的请求。
  4. 最后,您可以检查 Autorize 扩展是否已使用低特权 cookie 请求访问了任何特权资源。如果是,那就找了一个越权漏洞。

参考链接: Leveraging Burp Suite extension for finding IDOR(Insecure Direct Object Reference).

2x22 burp性能优化之最大限度地减少RAM和处理器的负荷

  1. 关闭你不用的 burp 扩展 – 只要禁用所有不使用的扩展,即使它们被加载,也会影响性能。
  2. 确定扫描仪的明确范围 – 你可以在配置中限制递归的深度
  3. 合并用于限定范围的正则表达式 – 如果你使用正则表达式来过滤流量,可以尝试将多个正则表达式合并为一个,性能上将会有所优化。
  4. Burp搜索功能比网站地图过滤器更快

2x23 通过代码层面的可视化来更好地理解BurpSuite中不同的intruder攻击类型

-w611

对于上面这个例子来说,如果我们想要去 使用 BurpSuite 的 Intruder 模块去 Fuzz 那么我们就首先会面临四种类型的选择:
-w476

  1. SNIPER
    • 单一有效载荷集
    • 相同的有效载荷一次适用于所有位置。
    • 适合于每次对单个参数进行模糊处理,在针对所有具有共同漏洞的有效载荷时非常有用。
    • loc1首先用相同的数据进行测试,然后是loc2,以此类推…
      用代码来表示就是
      -w915
  2. BATTERING RAM
    • 单一有效载荷
    • 每个有效载荷同时放置在每个位置上
    • 当攻击需要所有参数的相同输入时使用
      -w1254
  3. CLUSTER BOMB
    • 每个位置都有不同的有效载荷集。
    • 将此视为嵌套循环。对于locl的每个有效载荷,其他有效载荷的所有条目都被测试。(类似笛卡尔积)
      -w1054
  4. PITCH FORK
    • 每个位置都有不同的有效载荷集
    • 但每个有效载荷都是同时递增的
      -w1159

2x24 一种简单的在Android设备上安装证书的方式

Burp–>Proxy–>options–>import/export–>certificate in DER format–>cert–>next–>save

截屏2021-07-22 下午7.35.52

1
2
3
4
5
6
7
8
9
openssl x509 -inform DER -in cert -out cacert.pem
openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1
mv cacert.pem 9a5ba575.0 #hash from the above command output
adb shell "mount -o rw,remount/system"
adb push 9a5ba575.0 system/etc/security/cacerts/
adb shell "chmod 644 system/etc/security/cacerts/9a5ba575.0"o
mount-o ro,remount /system
adb remount
adb reboot