几个月前分享过一篇标题为 《基于Cloudflare Pro和 Snippets 的WAF防护规则》 的帖子,这期是对上一期的一个拓展。
这期有三个关键词:
- 打探敌情。
分析开源的DDOS脚本,挖掘攻击特征。
- 5秒盾穿盾。
坊间传闻,CF五秒盾可以被轻易击穿,网站被攻击时开启了CF五秒盾,仍被轻松击垮,真实情况究竟如何?
- Bot score。
什么是Bot Score?以下是 Cloudflare 官方文档 对此说明。
A bot score is a score from 1 to 99 that indicates how likely that request came from a bot.
机器人评分是一个从1到99的分数,表示该请求来自机器人的可能性有多大。(Claude翻译)
一、打探敌情
知己知彼,对网站防护来说,了解攻击者的脚本和方法也是很有必要的。所谓天下代码一大抄,攻击者的脚本很大概率也是互相“借鉴”,虽然不少脚本/程序是付费的,但我们也许从网上的开源脚本可以对攻击者的手段窥探一二?
以下提到的脚本仅作为分析用途,切勿用于非法操作。
以下脚本均收集自互联网,仅供研究用途。
脚本特征分析
- 随机tls指纹。
为什么要随机化指纹?因为高版本的CF套餐会对一些常见机器指纹进行识别,比如说curl、wget、urllib这种发起的请求指纹是固定的,如果采用默认指纹,很大概率会被精准识别并封禁,而随机化指纹可以规避这一点。这也使得CF的Bot score(CF Bussiness以及以上套餐可以启用)判断可能并不那么准确,也就是说仅从指纹角度(虽然CF的bot score不完全依赖于tls指纹)做防护其实并不是那么靠谱。
- 随机UA。
IPhone、Windows、Linux、Firefox、Chrome、Edge等各种系统、各种版本的组合的随机UA组合,使得从UA角度封禁恶意流量变得困难。
- 随机路径。
随机路径和随机字符串组合使得攻击更具迷惑性。
- 随机Referer
一方面是增加攻击分析的难度,另一方面的原因似乎是为了在一定程度上防止触发CF的HTTP DDoS。
- 不符合正常情况的随机化。
随机化一方面让防守变得困难,一方面也暴露出了部分不符合真实浏览环境的特征。
比如
bypass.js脚本中,这部分随机headers代码(节选)
const fetch_site = ["same-origin", "same-site", "cross-site", "none"];
let headers = {
":authority": parsedTarget.host,
":scheme": "https",
":path": parsedTarget.path "?" randstr(3) "=" generateRandomString(10, 25),
":method": "GET",
"pragma": "no-cache",
"upgrade-insecure-requests": "1",
"accept-encoding": encoding_header[Math.floor(Math.random() * encoding_header.length)],
"cache-control": cache_header[Math.floor(Math.random() * cache_header.length)],
"sec-fetch-mode": fetch_mode[Math.floor(Math.random() * fetch_mode.length)],
"sec-fetch-site": fetch_site[Math.floor(Math.random() * fetch_site.length)],
"sec-fetch-dest": fetch_dest[Math.floor(Math.random() * fetch_dest.length)],
"user-agent": "/5.0 (" nm2 "; " nm5 "; " nm3 " ; " kha " " nm4 ") /Gecko/20100101 Edg/91.0.864.59 " nm4,
"referer": referers[Math.floor(Math.random() * referers.length)],
...(Math.random() < 0.5 ? { "cf-connecting-ip": spoofed } : {}),
...(Math.random() < 0.5 ? { "x-forwarded-for": spoofed } : {}),
};
其中请求头sec-fetch-site为四选一随机,referer也是随机域名。但实际上在真实情况下,referer为其他域名时,sec-fetch-site不可能等于same-origin、same-site,所以这类请求必然是异常流量。
这类不符合常规的随机化情况在其他脚本里也有不少,比如在TLSBOOM.js中随机UA包含
const osList = ['Windows NT 10.0', 'Windows NT 6.1', 'Windows NT 6.3', 'Macintosh', 'Android', 'Linux'];
而该脚本同时还随机化了sec-ch-ua-mobile请求头
headers["sec-ch-ua-mobile"] = randomElement(["?0", "?1"]);
这两者随机化搭配可能会造成一种异常组合,也就是UA包含Android时,sec-ch-ua-mobile为?0,而这种情况很显然不符合正常流量。
- 老旧的请求头。
CF-Strong.js中encoding_header有包含identity,而实际上现代浏览器不可能包含这个值(Grok:一些极简客户端或旧设备可能显式发送Accept-Encoding: identity,但这在现代浏览器中几乎看不到。)。
再比如x-requested-with等于XMLHttpRequest和accept-charset这类请求头的出现也很大概率意味着异常流量,以及高版本的Chromium内核浏览器不大可能出现TE请求头。
通过对攻击者的脚本分析,我们能总结出一些异常流量的特征,并部署至WAF规则中去。
二、5秒盾穿盾
坊间传闻,CF五秒盾可以被轻易击穿,网站被攻击时开启了CF五秒盾,仍可以被轻松击垮 😦
通过互联网检索相关关键词,我们可以找到不少相关贴文。
比如这篇帖子
《大佬,CF5秒盾被打穿,还有什么办法,防御CC码?》
👇
https://hostloc.com/thread-995849-1-1.html
再比如《CloudFlare 5秒盾验证码还可以穿!》
👇
https://hostloc.com/thread-711964-1-1.html
另外这篇帖子下还有留言回复
“就我个人而言,tg上看到好多可以打穿五秒盾的接业务的” -MoeWang
事实上,这类情况大致分两种:
-
源站ip泄露。攻击者通过Censys、Shodan等溯源,找到源站IP,绕过CDN对直接对源站发起攻击。
-
真被“穿盾”了。目前来说,市面上的确存在提供“穿盾”的网站攻击服务。大多提供“穿盾”服务的DDoS/CC攻击者的攻击手段是:调用浏览器,自动化点击五秒盾、获取cf_clearance的cookie,之后用同样的ip和ua以及获取到的cookie批量请求站点(出于性能考虑,这时候的批量请求一般就不由浏览器发起了)。此外,实际上获取到cookie后,后续发起请求的并不要求一定是相同的ip,同/24段的ip都可以携带相同的cookie进行请求,比如说ip 6.6.6.1获取到的cookie,ip 6.6.6.2、ip 6.6.6.3、ip 6.6.6.251等都可以携带通过。
针对第二类情况的额外补充: ① 攻击者绕盾的成功率(获取cf_clearance的成功率)并非100%。② 获取cf_clearance的成功率一定程度上取决于ip质量,部分机房ip在自动化场景下可能很难通过验证。③这类穿盾请求的确可以击溃大多站点。
缓解措施:
-
封禁AS200373。
-
降低 Challenge Passage 的有效期,也就是调低获取 cf_clearance 获取后的有效期(默认为30分钟)。
-
设置速率限制。
-
其实穿盾请求也是有特征的,或者说看似无懈可击,实际上有迹可循,可以尝试对攻击特征进行分析。
三、Bot Score
目前CF Bot Score仅对企业用户开启。Pro用户可以浅尝CF的Definitely automated管理 (对应Bot score 1分),也就是识别被CF判定为100%为机器流量的请求,而Bussiness用户则可以启用带有识别Likely automated请求的Bot管理 (对应Bot score 2-29分),而Enterprise用户则可以解锁CF Bot Score完整版。

就Pro版本而言,Definitely automated的识别其实是有限的。以www.nodeseek.com为例,利用网站测试工具进行测试,可以发现部分机器流量没法被很好识别。403状态码表明被CF Bot Management识别,200则表明正常通过👇。

Bussiness带有识别Likely automated请求的Bot管理对自动化请求有更强的识别能力,基本上能识别大多常见的机器流量,但无法识别之前提到的随机化指纹发起的请求,且可能有误报(把真实访客识别为机器人)。
此外Bot score似乎与ip挂钩,同样的环境,同样的设备,不同的ip几乎同一时间请求可能会得到差别很大的分数。考虑到VPN的普遍使用,完全依赖Bot Score判断请求是否由真人发起可能不太靠谱,否则可能会出现一些令访客不愉快的情况。
示例一:由真实浏览器发起的真人请求,被误判为Likely automated。这也是为什么部分用户偶尔遇到访问Chatgpt甚至访问Cloudflare Dashboard跳盾的原因,其实很可能是CF Bot Management的误报👇

示例二:自动化请求却获取较高的分数,而这类请求从Bot Score层面也就无法拦截了。👇

🔗 不相关链接
🌐 IPLark https://iplark.com/
🔍 ip查询 https://iplark.com/search

占楼。
那目前来说,如果源站不泄露的话最好的方案就是封禁一些ASN咯
好贴