0xsyr0/Security-Awareness-Calculator
GitHub: 0xsyr0/Security-Awareness-Calculator
一款用于安全意识培训的 VSCode 扩展滥用演示工具,展示恶意扩展如何实现任意代码执行、反向 Shell 投递和 Firefox 会话 Cookie 窃取。
Stars: 3 | Forks: 0
# 安全意识计算器
## ⚠️ 免责声明
本仓库包含的安全意识工具严格专为授权的渗透测试、红队演练和内部安全意识演示而开发。所有工具仅供**教育和演示目的**使用。
**本工具并未将 OPSEC 纳入考量,仅旨在用于受控的演示环境。**
**对于因使用或滥用本仓库中任何工具而造成的任何损害、数据丢失或法律后果,作者概不负责。使用本仓库的任何组件即表示您对自己的行为承担全部责任。**
请仅在您拥有或获得明确书面授权进行测试的系统上使用这些工具。在大多数司法管辖区,未经授权的使用是非法的。
## 背景与动机
本项目的存在是因为它所演示的攻击已不再停留在理论层面。以下真实发生的安全事件直接促成了这些工具的开发,并构成了其旨在支持的安全意识培训的核心叙事。
### Shai-Hulud 和 Mini Shai-Hulud (2025–2026)
在 2025 年 9 月至 2026 年 5 月期间,一个被追踪为 **TeamPCP**(Google 威胁情报小组同时将其追踪为 UNC6780)的威胁行为者,在 npm 和 PyPI 生态系统中发起了一场代号为 **Shai-Hulud** 的持续性、协同性软件供应链攻击。
该攻击活动以一种自我传播的蠕虫为核心,它会窃取开发者和云凭据,然后利用这些凭据发布其他受感染的恶意软件包——将软件供应链本身转变为传播媒介。每个被攻陷的 CI/CD pipeline 都会成为新的分发节点,在无需攻击者进一步干预的情况下实现指数级扩散。
该蠕虫经历了三代的演变:
- **Shai-Hulud**(2025 年 9 月)——最初的变体。npm 生态系统中观察到的首个自我复制恶意软件。它会收集维护者 token 并利用它们自动发布投毒包。
- **Shai-Hulud 2.0 / SHA1-Hulud**(2025 年 11 月)——增加了 wiper 功能并扩大了凭据窃取范围。Microsoft 于 2025 年 12 月发布了相关的检测与响应指南。
- **Mini Shai-Hulud**(2026 年 4 月至 5 月)——当前一代。得名于恶意软件回传基础架构中嵌入的特征字符串:在受害者账户上新创建的 GitHub 仓库会带有描述 *"A Mini Shai-Hulud has Appeared"*,这是对《沙丘》中沙虫的致敬。
该变体首次实现了关键突破,成功感染了携带有效 SLSA Build Level 3 来源证明的软件包,证明流程完整性控制是可以被绕过的。
已确认的受害者包括 TanStack(React Router——每周下载量超过 1200 万次)、UiPath、MistralAI、Aqua 的 Trivy 安全扫描器、CheckMarx 的 KICS、LiteLLM 库、Telnyx SDK、AntV 等。下游影响波及了欧盟委员会公共网站、Mercor 以及两台 OpenAI 员工设备的违规访问。
该攻击活动将持久化机制注入到了 AI 编程代理的配置中——特别是 `.claude/settings.json` 的 SessionStart 钩子和 `.vscode/tasks.json` 的 folderOpen 触发器——以确保在每个开发者会话中重新执行恶意软件,即使最初的软件包感染后来被修复。
### GitHub 遭入侵事件(2026 年 5 月)
本项目最直接的动机:**GitHub 在其一名开发者安装了恶意 VSCode 扩展后遭到入侵**。TeamPCP 声称获取了约 4,000 个 GitHub 代码库的访问权限,并在 BreachForums 上出售这些资料。GitHub 确认了至少 3,800 个受感染的代码库,其中包含 GitHub 自己的源代码。
攻击向量非常简单——一名开发者安装了带有木马的 VSCode 扩展,该扩展窃取了凭据,随后这些凭据通过供应链将感染向外扩散。没有零日漏洞利用,没有复杂的恶意软件分发基础架构。仅仅是一个 VSCode 扩展。
这就是本项目存在的原因。开发者和 IT 人员普遍对 VSCode 扩展的攻击面存在误解。大多数人认为从看似可信的来源安装扩展是安全的。事实并非如此。
### 为什么 VSCode 扩展很危险
VSCode 扩展以登录用户的完整权限执行。没有沙盒机制,没有权限模型,没有能力限制。一个扩展可以读取文件系统、执行任意进程、发起网络连接,并在重启后持续存在——所有这些都是静默进行的,全部在安装时发生,除了点击安装外无需任何用户交互。
`activationEvents: ["*"]` 清单字段会导致扩展在安装时以及随后的每次 VSCode 启动时立即激活。攻击面就是安装提示本身。
## OPSEC 声明
本工具**并未将 OPSEC 纳入考量**,仅旨在用于受控的演示环境。以下已知弱点是为了演示清晰度而故意保留的,在使用前必须充分了解:
- **未加密的 C2 通信** —— implant 与 `c2.py` 之间的所有流量均通过原始 TCP socket 以明文形式传输。没有 TLS,没有流量混淆,没有 domain fronting。任何网络监控解决方案都能轻松识别并捕获会话。
- **明文长度前缀帧** —— 命令和响应使用 4 字节的大端序长度标头进行帧化处理。这是一种众所周知的协议模式,IDS/IPS 特征码和基于网络的 EDR 可以检测到它。
- **无 beacon 抖动或休眠** —— implant 会立即连接并保持持久连接。这种行为极其异常,会被监控来自 `Code.exe` 或 `python.exe` 持久性出站连接的 EDR 解决方案标记。
- **无进程注入或进程镂空** —— reverse shell 作为独立的 `python.exe` 或 Node.js 进程运行,没有尝试伪装成合法的进程树。父子进程关系显得极其可疑。
- **无反分析或沙盒规避** —— 没有环境检查、VM 检测或基于休眠的规避。任何沙盒都会立即触发 payload。
- **无 payload 加密或混淆** —— cookie 脚本和 stager 中使用的 base64 只是编码,而非加密,任何分析师都能轻松将其还原。
- **MAC 地址 IP 混淆仅是表面功夫** —— `obfuscator.py` 中的混淆是一种简单的十六进制编码方案,无法抵御静态或动态分析。它仅用于说明内联解码的概念,仅供教育目的使用。
- **硬编码的操作者值** —— `stage.js` 和 `extension.js` 需要手动替换 `
` 和 `` 占位符。忘记替换这些内容会导致 implant 静默失败。
- **C2 无身份验证** —— `c2.py` 接受来自任何来源的连接。在演示期间,请将其绑定到特定接口或通过防火墙规则限制访问。
- **Web 应用程序存在蓄意漏洞** —— `Web_Application/app.py` 被设计为具有故意的安全弱点:在会话 cookie 中以明文形式存储凭据、没有 `httponly` 标志、没有 `secure` 标志、没有 CSRF 保护、没有速率限制、没有输入验证以及硬编码的凭据。绝不能将其部署在隔离的演示环境之外。
- **仅针对 Firefox 的 cookie 提取** —— 窃取 cookie 的功能仅针对 Firefox。Edge 148+ 实现了 App-Bound Encryption (v20),可防止从非浏览器进程中提取 cookie。这是一个已知的限制,也是探讨不同浏览器安全态势差异的一个故意设计的讨论点。
- **无清理或自删除功能** —— stager 会将文件写入 `%TEMP%`,且在执行后不会自我删除。每次演示运行后都需要手动清理。
- **单会话 C2** —— C2 可以处理多个会话,但没有持久化存储、没有任务队列,也没有重连逻辑。因网络中断而丢失的会话需要完全重新安装扩展才能恢复。
## 仓库结构
```
Security-Awareness-Calculator/
├── Images/ — extension icon (128x128 PNG)
│ ├── icon.png
│ └── Security_Awareness_Calculator.png
├── Obfuscator/ — MAC-address IP/port obfuscator
│ └── obfuscator.py
├── SimpleC2/ — C2 server, weaponized extension, and stager
│ ├── c2.py — Python C2 with Firefox cookie stealing
│ ├── extension.js — weaponized VSCode extension stager template
│ └── stage.js — Node.js reverse shell stage (operator template)
├── Test_Cookies/ — standalone Firefox cookie diagnostic tool
│ └── test_cookies.py
├── VSCode_ext/ — unweaponized PoC extension (pops calc.exe only)
│ ├── [Content_Types].xml
│ ├── extension/
│ │ ├── extension.js
│ │ ├── icon.png
│ │ └── package.json
│ └── extension.vsixmanifest
├── VSCode_ext_weaponized/ — weaponized extension template
│ ├── [Content_Types].xml
│ ├── extension/
│ │ ├── extension.js
│ │ ├── icon.png
│ │ └── package.json
│ └── extension.vsixmanifest
└── Web_Application/ — insecure demo web app for session theft
└── app.py
```
## 前置条件
### 演示虚拟机 (Windows)
```
winget install Python.Python.3.12
pip install flask pycryptodome
winget install Mozilla.Firefox
```
进行窃取 cookie 的演示需要使用 Firefox。Edge 148+ 使用了 App-Bound Encryption (v20),可防止从非浏览器进程中提取 cookie。Firefox 将 HTTP cookie 以明文 SQLite 格式存储,且没有额外的加密层。
必须为 Firefox 配置以下 `about:config` 值,以防止 cookie 在关闭时被清除:
| 设置项 | 所需值 |
|---|---|
| `privacy.sanitize.sanitizeOnShutdown` | `false` |
| `privacy.clearOnShutdown.cookies` | `false` |
### 攻击者虚拟机 (Kali)
```
python3 -m venv venv
source venv/bin/activate
pip install pycryptodome
```
## 阶段 1 — 非武器化 PoC (`VSCode_ext/`)
### 功能说明
在安装时立即启动 `calc.exe`。没有网络连接,没有数据收集,没有持久化。用于演示 VSCode 扩展以完整的本地用户权限执行且没有沙盒隔离。计算器弹窗作为一个安全、可见且易于理解的指标,表明在登录用户上下文中执行了任意代码。
### 构建
不需要 npm —— 使用 zip 手动打包:
```
cd VSCode_ext
mkdir -p vsix-build/extension
cp extension/extension.js extension/package.json vsix-build/extension/
cp '[Content_Types].xml' extension.vsixmanifest vsix-build/
cd vsix-build
zip -r ../Security_Awareness_Calculator.vsix . -x "*.DS_Store"
```
或者使用 vsce:
```
npm install -g @vscode/vsce
vsce package --allow-missing-publisher
```
### 图标生成
```
cairosvg Icons/icon.svg -o Icons/icon.png -W 128 -H 128
```
或者使用 Inkscape:
```
inkscape Icons/icon.svg --export-filename=Icons/icon.png -w 128 -h 128
```
### `package.json`
```
{
"name": "security-awareness-calculator",
"displayName": "Security Awareness Calculator",
"description": "⚠️ Security Awareness PoC — For authorised testing only. See https://github.com/0xsyr0/Security-Awareness-Calculator",
"version": "0.0.1",
"publisher": "syro",
"icon": "icon.png",
"engines": {
"vscode": "^1.80.0"
},
"activationEvents": ["*"],
"main": "./extension.js",
"contributes": {}
}
```
### 安装
```
code --install-extension Security_Awareness_Calculator.vsix
```
### 卸载
```
code --list-extensions
code --uninstall-extension syro.security-awareness-calculator
```
## 阶段 2 — 武器化扩展 (`VSCode_ext_weaponized/`)
### 功能说明
弹出 `calc.exe` 以产生视觉冲击,然后从操作者的 HTTP 服务器获取并执行 `stage.js`,建立与 `c2.py` 的 reverse shell。
### 操作者设置 —— 使用前必读
此模板以非功能状态发布。在构建之前,请替换 `VSCode_ext_weaponized/extension/extension.js` 中的所有占位符:
| 占位符 | 描述 |
|---|---|
| `` | 您的 C2/监听器 IP 地址 |
| `` | 用于阶段分发的 HTTP 服务器端口 |
切勿将填入实际值的文件提交回此仓库。
### 构建
```
cd VSCode_ext_weaponized
mkdir -p vsix-build/extension
cp extension/extension.js extension/package.json vsix-build/extension/
cp '[Content_Types].xml' extension.vsixmanifest vsix-build/
cd vsix-build
zip -r ../Security_Awareness_Calculator_Weaponized.vsix . -x "*.DS_Store"
```
### 安装
```
code --install-extension Security_Awareness_Calculator_Weaponized.vsix
```
### 卸载
```
code --uninstall-extension syro.security-awareness-calculator-weaponized
```
## 阶段 3 — 混淆器和 Reverse Shell (`Obfuscator/obfuscator.py`)
生成一个经过 MAC 地址混淆的 Python reverse shell payload,可直接注入到演示虚拟机上的目标脚本中。输出将被写入 `payload.output`。
```
python3 Obfuscator/obfuscator.py
python3 Obfuscator/obfuscator.py 192.168.1.100 9001
```
`payload.output` 已通过 `.gitignore` 从仓库中排除。切勿提交包含实际操作者值的文件。
## 阶段 4 — C2 服务器 (`SimpleC2/c2.py`)
### 运行
```
source venv/bin/activate
# Terminal 1 — serve stage.js
python3 -m http.server 80
# Terminal 2 — C2 listener
python3 SimpleC2/c2.py
```
### 主菜单命令
| 命令 | 描述 |
|---|---|
| `sessions` | 列出所有处于存活/死亡状态的活跃会话 |
| `use ` | 通过短 ID 与会话交互 |
| `clear_sessions` | 从列表中移除已断开的会话 |
| `help` | 显示帮助菜单 |
| `quit` | 关闭 C2 服务器 |
### 会话命令
| 命令 | 描述 |
|---|---|
| `steal_cookies` | 窃取并解码 Firefox 的 session_token cookie |
| `dump_cookies [host]` | 导出所有 Firefox cookie,可选 host 过滤器 |
| `debug_cookies` | 转储原始 Firefox cookie 元数据以进行诊断 |
| `whoami` | 当前用户上下文和权限 |
| `pwd` | 打印当前工作目录 |
| `cd ` | 更改工作目录 |
| `dir [path]` | 列出目录内容 |
| `mkdir ` | 递归创建目录 |
| `type ` | 将文件内容打印到屏幕 |
| `writefile ` | 将文本写入目标上的文件 |
| `download ` | 从目标下载文件到 Kali |
| `upload ` | 将本地文件上传到远程路径 |
| `background` | 返回主菜单(会话保持活跃) |
| `exit` | 终止并关闭会话 |
| `<任意命令>` | 直接传递给目标上的 cmd.exe 执行 |
## 阶段 4 — Web 应用程序 (`Web_Application/app.py`)
模拟一个不安全的企业登录门户,使用 base64 编码且包含明文凭据的会话 cookie。用于演示如何通过从文件系统中提取 Firefox cookie 来窃取会话 token。
```
python app.py
```
运行在端口 5000。默认凭据:
| 用户名 | 密码 |
|---|---|
| `jdoe` | `Summer2024!` |
| `admin` | `P@ssw0rd123` |
### 演示流程
1. 在演示虚拟机上打开 Firefox
2. 导航至 `http://127.0.0.1:5000`
3. 以 `jdoe` 或 `admin` 身份登录
4. 通过 **File → Exit** 关闭 Firefox —— 需要正常关闭以确保 cookie落盘刷新
5. 从 C2 会话运行 `steal_cookies`
6. 将以明文形式打印凭据,并自动生成 curl 重放命令
### 从 Kali 重放会话
```
curl -s http://:5000/dashboard \
-H "Cookie: session_token="
```
## Cookie 诊断工具 (`Test_Cookies/test_cookies.py`)
独立脚本,用于在运行完整的 C2 演示之前,验证 Firefox cookie 提取功能是否能在演示虚拟机上正常工作。请在 Firefox 通过 File → Exit 关闭后运行。
```
python test_cookies.py
```
## `.gitignore`
```
payload.output
*.vsix
__pycache__/
*.pyc
venv/
```
## 修复建议
| 控制措施 | 阶段 |
|---|---|
| 通过 Intune/SCCM 实现 VSCode 扩展白名单 | 1, 2 |
| 通过注册表策略阻止 `vscode://` URI 处理程序 | 1, 2 |
| 通过 `extensions.allowed` 策略禁用 `.vsix` 安装 | 1, 2 |
| 监控源自 `Code.exe` 的出站连接 | 2 |
| 通过 AppLocker/WDAC 限制从 `%TEMP%` 执行脚本 | 2, 3 |
| 针对计划任务脚本的应用程序控制策略 | 3 |
| 对原始 TCP reverse shell 进行网络监控和告警 | 2, 3 |
| 在发生任何供应链事件后轮换所有 CI/CD 密钥和开发者 token | 1, 2 |
| 始终在会话 cookie 上设置 `httponly=True` 和 `secure=True` | 4 |
| 切勿将凭据编码到会话 token 中 —— 使用不透明的服务端 ID | 4 |
| 通过 endpoint 管理强制执行浏览器强化策略 | 4 |
| 使用启用了 App-Bound Encryption 的基于 Chromium 的浏览器 | 4 |
| 通过策略禁用 Firefox cookie 持久化或强制执行 cookie 加密 | 4 |
| 监控 `.vscode/tasks.json` 和 `.claude/settings.json` 是否存在未经授权的修改 | 1, 2 |
## 资源
### Shai-Hulud 和 Mini Shai-Hulud
- [Mini Shai-Hulud 常见问题解答 — Tenable](https://www.tenable.com/blog/mini-shai-hulud-frequently-asked-questions)
- [Mini Shai-Hulud:多生态系统开发者供应链攻击 — Cloud Security Alliance](https://labs.cloudsecurityalliance.org/research/csa-research-note-mini-shai-hulud-multi-ecosystem-supply-cha/)
- [Mini Shai-Hulud 恶意软件感染数百个开源包 — CyberScoop](https://cyberscoop.com/mini-shai-hulud-supply-chain-malware-attack/)
- [Team PCP 的 Mini Shai-Hulud 撕裂开源信任 — ReversingLabs](https://www.reversinglabs.com/blog/mini-shai-hulud-tears-at-oss-trust)
### GitHub 违规访问事件
- [TeamPCP 通过投毒的 VS Code 扩展入侵了 GitHub 内部代码库 — Help Net Security](https://www.helpnetsecurity.com/2026/05/20/github-breached-teampcp/)
- [TeamPCP 发起针对 GitHub 的供应链攻击 — Technology Org](https://www.technology.org/2026/05/22/teampcp-github-supply-chain-attack/)
- [GitHub 数据泄露与 TeamPCP 供应链攻击狂潮有关](https://www.moroccoworldnews.com/2026/05/306024/github-breach-linked-to-teampcp-supply-chain-attack-spree/)
### VSCode 扩展安全
- [利用 VSCode 扩展作为初始访问途径 — MDSec](https://www.mdsec.co.uk/2023/08/leveraging-vscode-extensions-for-initial-access/)
### 通用供应链安全
- [2026 软件供应链安全报告 — ReversingLabs](https://www.reversinglabs.com)
- [SLSA 框架 — 软件制品供应链级别](https://slsa.dev)
- [OpenSSF 记分卡 — 评估开源项目安全性](https://securityscorecards.dev)标签:MITM代理, 恶意软件演示, 数据可视化, 数据泄露, 逆向工具