窥探Cloudflare WAF防护 (关键词:打探敌情、5秒盾穿盾、Bot score)

几个月前分享过一篇标题为 《基于Cloudflare Pro和 Snippets 的WAF防护规则》 的帖子,这期是对上一期的一个拓展。

这期有三个关键词:

  1. 打探敌情。

分析开源的DDOS脚本,挖掘攻击特征。

  1. 5秒盾穿盾。

坊间传闻,CF五秒盾可以被轻易击穿,网站被攻击时开启了CF五秒盾,仍被轻松击垮,真实情况究竟如何?

  1. 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翻译)

一、打探敌情

知己知彼,对网站防护来说,了解攻击者的脚本和方法也是很有必要的。所谓天下代码一大抄,攻击者的脚本很大概率也是互相“借鉴”,虽然不少脚本/程序是付费的,但我们也许从网上的开源脚本可以对攻击者的手段窥探一二?

以下提到的脚本仅作为分析用途,切勿用于非法操作。

以下脚本均收集自互联网,仅供研究用途。

https://files.fm/u/jdwrrm82jp

脚本特征分析

  1. 随机tls指纹。

为什么要随机化指纹?因为高版本的CF套餐会对一些常见机器指纹进行识别,比如说curl、wget、urllib这种发起的请求指纹是固定的,如果采用默认指纹,很大概率会被精准识别并封禁,而随机化指纹可以规避这一点。这也使得CF的Bot score(CF Bussiness以及以上套餐可以启用)判断可能并不那么准确,也就是说仅从指纹角度(虽然CF的bot score不完全依赖于tls指纹)做防护其实并不是那么靠谱。

  1. 随机UA。

IPhone、Windows、Linux、Firefox、Chrome、Edge等各种系统、各种版本的组合的随机UA组合,使得从UA角度封禁恶意流量变得困难。

  1. 随机路径。

随机路径和随机字符串组合使得攻击更具迷惑性。

  1. 随机Referer

一方面是增加攻击分析的难度,另一方面的原因似乎是为了在一定程度上防止触发CF的HTTP DDoS。

  1. 不符合正常情况的随机化。

随机化一方面让防守变得困难,一方面也暴露出了部分不符合真实浏览环境的特征。

比如
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,而这种情况很显然不符合正常流量。

  1. 老旧的请求头。

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

事实上,这类情况大致分两种:

  1. 源站ip泄露。攻击者通过Censys、Shodan等溯源,找到源站IP,绕过CDN对直接对源站发起攻击。

  2. 真被“穿盾”了。目前来说,市面上的确存在提供“穿盾”的网站攻击服务。大多提供“穿盾”服务的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在自动化场景下可能很难通过验证。③这类穿盾请求的确可以击溃大多站点。

缓解措施:

  1. 封禁AS200373。

  2. 降低 Challenge Passage 的有效期,也就是调低获取 cf_clearance 获取后的有效期(默认为30分钟)。

  3. 设置速率限制。

  4. 其实穿盾请求也是有特征的,或者说看似无懈可击,实际上有迹可循,可以尝试对攻击特征进行分析。

三、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

点赞
  1. IPLark说道:

    占楼。

  2. VPS-Town说道:

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

  3. task5788说道:

    好贴

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮