关注公众号,输入“学习交流”加入交流群
觉得不错的话,可以多点赞、分享、关注
介绍
这个功能作为综合burp fuzz插件的关键子功能,这两天也是看了不少项目,在研究了bypass-bot-detection、ja3proxy、burp-awesome-tls这些优秀的项目后,以后也是有了一些思路和自己的思考,这里也是对内容进行整理分析和分享一些burp指纹对抗的方法。
以前感觉不是很明显,但是这两年waf明显上的不少了,特别是银行方面的项目,有时候一半的站都有burp指纹拦截,所以感觉自己给工具写一个burp tls ja3指纹绕过还是挺有必要的。
国外waf方面可能会比较多的有这些校验拦截之类的,但是在国内的话,waf做这些方面的会少很多。
额外点
大家有的时候的目光,不用光盯着对抗上面,很多老的方法反而是经久不衰的,就比如下面所有介绍的方法,其实本质上也是绕过waf的一种过程,但是如果你能获取到他的真实ip,只要他没开着强制域名访问,那就waf都不用绕了,省时省力很多了。
burp指纹对抗1-HTTP证书页面特征
1.证书页方面的分析和检测
通过了解,burp会去访问会访问http://burp
和http://burp/favicon.ico
这样的url,这个大家应该都比较熟悉,这个是一个导出证书所使用的网站,大家应该还是比较熟悉的,但是证书导入到浏览器以后,就没什么作用了,但是不关闭设置的话,他会经常去请求这个网站,这就是特征点了,这里整一个html页面用于检测。
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>Burp 检测</title>
</head>
<body>
<divid="content"></div>
<h2id='indicator'>Loading...</h2>
<script>
function burp_found() {
let e = document.getElementById('indicator');
e.innerText = '发现走了burp代理,你是攻击者 !!!';
}
function burp_not_found() {
let e = document.getElementById('indicator');
e.innerText = '未发现走burp代理,顺利通行.';
}
</script>
<imgstyle="display: none;"src='http://burp/favicon.ico'onload='burp_found()'onerror='burp_not_found()'/>
</body>
</html>
正常请求该页面,没挂burp代理,访问可以顺利通行。
这里就是一个挂载burp代理的请求,访问网站可以看到很容易就被检测到了
这些之类的语句也都能进行检测
<imgstyle="display: none;"src='http://burp/favicon.ico'onload='burp_found()'onerror='burp_not_found()'/>
<linkrel="stylesheet"href="http://burp/"onload='burp_found()'onerror='burp_not_found()'">
<scriptsrc="http://burp/test.js"onload='burp_found()'onerror='burp_not_found()'">
2.证书页方面的绕过
如果使用的是SwitchyOmega之类的插件,就可以通过添加不代理的地址列表将burp添加进去就可以了
然后就是也可以通过修改burp的配置来进行绕过
burp指纹对抗2-HTTP报错页面特征
1.报错页面方面的分析
在挂载burp的代理的请求遇到的报错页面是这样的,报错页面中会显示关于burp的一些特征,但是我感觉这方面检测会很少,因为现在大部分感觉就是检测tls ja3值和akamai指纹之类+加一些限制之类的。
2.报错页面方面的绕过
一样在burp设置,打开忽略浏览器的Burp错误信息
burp指纹对抗3-ua头http请求包特征
1.ua头http请求包分析
首先这里看到burp的设置中的匹配和替换,他这里是默认开启了一个请求包ua头的替换的
这里详细看看,他会将数据包传入的头,默认替换成该User-Agent头,这个也就被当做了一个特征进行处理。
这个的方式处理起来也是挺简单,就是关掉该ua头替换,如果还是不行的话,可以选择替换成其他的ua头也就差不多了
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36
2.ua头http请求包绕过
主要就是取消那个默认的替换就可以了。
如果还有问题的话,可以自己选择替换成别的ua头或者是自己添加,或者就是最干脆的取消所有ua头替换,使用请求头原始的。
burp指纹对抗4-WebSocket请求头特征
1.请求头特征的分析和检测
首先我们可以使用python做一个ws的请求,走burpsuite的代理
import websocket
def on_open(ws):
print("连接已打开")
ws.send("Hello")
if __name__ == "__main__":
ws_url = "ws://echo.websocket.burp" # 替换自己的ws请求url
ws = websocket.WebSocketApp(
ws_url,
on_open=on_open,
)
ws.run_forever(
http_proxy_host="127.0.0.1",
http_proxy_port=8080,
proxy_type="http"
)
这里就可以看到他传输的特征
然后这里对比一下正常传输的,发现是会多一层Sec-Websocket-Extensions请求头的
2.请求头特征的分析绕过
还是在设置中进行修改,关掉删除就行了,但是我感觉检测这个的很少,一方面使用的不多,另一方面一些正常的请求也可能会不带这个的。
burp指纹对抗5-tls ja3指纹修改
1.tls ja3指纹分析
来到关键的内容了,主要的也就是这方面的内容了,tls的ja3值。
TLS 版本、加密套件、扩展和一些值,都是可以从请求中获取的,所以在之前主要用于requests、aiohttp之类的爬虫常用的库的检测,就是防爬虫使用的,后续呢也是加入了burp的这些的ja3指纹了。
首先看到python requests的tls ja3值,这是client和server的tls ja3值
也可以在Cipher Suites中看看他的套件,requests使用的套件还是挺多
然后这里看到chrome的tls ja3的值和套件,还是不多的
然后是burp的,这些套件和ja3的指纹都是很明显的传输特征
这里使用一些检测测试的平台来对burp原始请求进行测试,可以看到提取的burp ja3指纹值也是相同的,而且提示检测是人类的几率是1%,基本就可以判断是一个有问题的请求。
当然光看这一个平台怎么行,看到另一个平台这里可以看到正常的浏览器是不支持tls1.1和tls1.0的,这是被认为不安全的。
但是在burp代理中,他是支持tls1.1和tls1.0,这也是一方面的小特征,但是感觉关系不是很大。
2.tls ja3指纹绕过
方法可以结合起来使用
方法一:
比较吃运气的一个方法,我发现一些不同版本的burp的tls ja3指纹不同,而且一些waf只会记录一些版本的tls ja3指纹,所以这就是你切换burp发现有些网站没有被拦截了的原因
这里顺便放一个吾爱Datch burp破解的各个版本的链接,方便大家用于下载
123网盘(不限速 需登录 免客户端 )[https://www.123pan.com/s/F2W5Vv-Rk7Vv.html[1]](https://www.123pan.com/s/F2W5Vv-Rk7Vv.html[2])提取码:52pj
百度网盘链接:[https://pan.baidu.com/s/1J_CUxLKqC0h3Ypg4sQV0_g[3]](https://pan.baidu.com/s/1J_CUxLKqC0h3Ypg4sQV0_g[4])提取码:52pj
方法二:
修改tls加密套件,虽然 burp的源码我们是获取不了,也不能修改的,但是我们可以对他的套件进行一些修改
修改完套件,我这里是做一些增加的,这里可以看到他的client的tls ja3的值是发生了一些改变了
但是在waf的检测平台中,他还是被认为是有问题的,所以简单的修改套件的话,有些作用,但是作用不大
方法三:
这就是我也在做的方法,就是搞一个tls ja3指纹修改的插件。
现在基本都是使用中转的方法,因为burp是没有源码方面泄露的嘛,所以基本都只能burp走一个上层代理,进行修改ja3指纹,burp-awesome-tls就是这样的。
下面展示的是ja3proxy、burp-awesome-tls、Bypass_bot_detection的效果。
结论:burp-awesome-tls自定义伪装效果最佳,Bypass_bot_detection效果感觉是很不错的,Bypass_bot_detection可以选择单个url进行修改绕过,针对性比较强不会干扰到其他插件方面的运行。
我们首先尝试ja3proxy的效果,首先在本地起一个端口,然后给burp挂上,上级代理
可以看到基本都是变化了,重要的是请求也基本正常了,因为我们是模拟成了一个360的浏览器的请求了
然后这里看到Bypass_bot_detection的效果,他是burp的插件,他的好处呢,就是不会怎么影响到其他插件的运行,而且他不会对所有请求url进行修改,
最后就是我们所熟知的burp-awesome-tls,不愧是更新了很久的插件了,普遍检测都在90%以上。
但是的话,他是在本地起一个端口,走代理修改的,就所有流量都会经过自己本地的127.0.0.1起的一个端口,就导致了可能会对一些插件的运行会造成一些影响。
Python-requests tls指纹修改
1.requests tls指纹分析
首先的话,requests的指纹我们在上面看过了,为什么要单独搞一个呢,因为可以简单修改一下库的源码,当前是简单的修改一下,难的我也搞不太了,这里可以做一些简单的绕过。
首先requests常用于爬虫之类的,所以也是肯定是被一些waf记录的,这里我们首先看到这里,这里他是去请求一个挂着可以拦截爬虫的网站。
然后这里我们看一下requests的ja3 指纹,首先可以看到他的ja3指纹,然后就是发现他的akamai指纹甚至是空,这个问题也是很大的。
2.requets tls指纹绕过
方法一:
首先就是一个库啊,curl_cffi库,一个魔改后的库,可以模拟各种浏览器的指纹,看看下面效果还是挺不错的。
方法二:
想到一劳永逸的方法肯定是修改源码,但是ssl的不好改,tls的套件我们还是挺好改。
这里我们要知道requests其实就是对urllib的一个封装,这里我们去找到我们python目录下面的urllib3的ssl,通过该命令我们可以直接获取urllib3的位置
python3 -c "import urllib3; print(urllib3.__file__)"
然后在它的util目录下面,找到ssl_.py
这里搜索到DEFAULT_CIPHERS,这里可以看到他使用的一些套件加密,这里对其中两个进行注释
然后重新去请求可以看到ja3的值变化了,但是有问题akamai指纹的值是没有东西,所以该方法只能绕过一些简单的waf,就是那些只记录了默认tls的ja3值的waf的。
burp如何绕过CloudFlare的指纹护盾
cloudFlare是国外的waf,算是一个挺常见的waf了,他的指纹方面主要就是这几个方面
1.tls ja3指纹2.HTTP/2 指纹3.请求头信息4.js 指纹信息(获取浏览器、操作系统和硬件信息,用于区分真人或者机器人)5.行为检测(请求的频率 之类的)
注意点:
如果没有绕过成功,可能有以下几种原因:
1.他有请求的频率限制,这个是结合js获取的指纹信息,如果都尝试了没有成功,可以尝试换一个浏览器,可能当前浏览器和自己的指纹被记录了2.注意一些被动扫描的插件,导致的一些poc请求,这些可能会导致ip被禁掉
绕过步骤:
我们主要需要先绕过前面三个,才能谈后续的内容
1.在挂着burp代理的,去请求某个网站,提示报错,这个页面很明显就是CloudFlare waf的页面
2.首先就是尝试去伪装tls ja3和HTTP/2的指纹,我这里使用的是bypass-bot-detection,设置对该域名设置指纹和HTTP2
3.发现还是存在问题,这里之前说过burp还有一个ua头的绕过,特别是CloudFlare有对请求头的内容进行查看
特别是Accept、User-Agent的之类头的校验是比较严格的,这里看到修改后,成功绕过CloudFlare waf的指纹认证。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
burp-awesome-tls源码及流程分析
然后来到我们的源码及其流程分析,首先看到burp-awesome-tls,这里我们可以看到分成两部分的,一个是go写的、另一个方面是java的。
go部分主要是代理服务器修改tls所使用的。
java部分主要就是插件前端各个部分的内容。
java部分没什么好说,其实主要就是页面设置的一些东西,主要部分内容在这里,ServerLibrary.java中,可以看到他会先去判断本地的环境,比如是windows就dll文件等,而他加载的文件就是上面go编译的。
这里看到go的内容,首先就是主入口main.go文件,这里声明好了import "C",就是为了允许 Go 代码与 C 代码交互,首先通过输入的参数,通过server.StartServer()启动端口
在启动端口的时候,这里也会去做一些初始化的操作,比如NewCertificateAuthority,他会去生成自签名 CA 证书
然后他就会从请求头中提取配置信息
然后在这里判断是否要使用我们的截获的HexHelloClient
然后我们需要知道他所使用的指纹是哪里获取的,这里看到fingerprints.go,可以看到他是从https://github.com/bogdanfinn/tls-client/blob/master/profiles/profiles.go[5]中获取的各个浏览器指纹内容
最后就是设置我们请求的内容,将内容发送过去
参考文件及工具:
https://s1nja.github.io/2025/03/29/Burpsuite%E7%89%B9%E5%BE%81%E6%A3%80%E6%B5%8B%E5%AF%B9%E6%8A%97/index.html
https://github.com/bright-cn/bypass-cloudflare
https://ares-x.com/2021/04/18/SSL-%E6%8C%87%E7%BA%B9%E8%AF%86%E5%88%AB%E5%92%8C%E7%BB%95%E8%BF%87/
https://github.com/LyleMi/ja3proxy
https://github.com/sleeyax/burp-awesome-tls
https://github.com/PortSwigger/bypass-bot-detection
原文始发于微信公众号(深潜sec安全团队):Burpsuite-http|ws|tls指纹对抗分析以及绕过 及如何绕过CloudFlare的指纹护盾 小部分源码分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论