chvancooten/code-needle
GitHub: chvancooten/code-needle
通过本地 HTTP 端点在 VS Code 环境中静默执行任意 JavaScript 代码的扩展,用于授权红队评估中的后渗透操作。
Stars: 22 | Forks: 1
# CodeNeedle:轻量级 VS Code 扩展,用于隐蔽的运行时代码执行

## 概述
CodeNeedle 是一个 VS Code 扩展,可通过本地 HTTP 端点静默暴露 JavaScript 代码执行能力。加载到目标的 VS Code 实例后,扩展会在 localhost 上监听传入的 JSON-RPC 请求,执行任意 JavaScript 代码,并将结果返回给调用方。代码在隔离的子进程中以完整的 Node.js 权限运行,可访问文件系统、环境变量和系统上安装的任何 Node 模块。目标完全不知道扩展的存在,因为它完全在后台运行,没有 UI、命令或控制台输出。
专为需要开发环境内代码执行的后渗透攻击安全评估而设计。评估进程为 VS Code(`code`),这是受信任且广泛使用的工具,人们预期它会表现出各种行为(难以检测)。由于该扩展运行纯 JavaScript 代码,没有平台特定代码,因此可以在安装 VS Code 的任何平台上运行(Windows、Mac、Linux)。
## 工作原理
当 VS Code 加载此扩展时,它会静默地在 localhost 端口 7672(默认)上启动 HTTP 服务器。外部工具(如植入物)通过 HTTP 上的 JSON-RPC 进行通信,发送要执行的 JavaScript 代码(或文件)。扩展通过 Node IPC 将每个请求分发到托管的子进程,代码在 `vm` 上下文中运行,可完全访问 Node.js 内置模块(fs、path、os、process、Buffer、crypto、require 等)。结果序列化为 JSON 并返回给调用方。如果代码无限挂起,进程会被终止并重新生成。如果 VS Code 关闭,HTTP 服务器会自动关闭。
## 架构
```
┌─────────────────────────────────────────────────┐
│ VS Code Extension Host │
│ │
│ ┌──────────────┐ ┌────────────────────────┐ │
│ │ extension.ts │─▶│ EvaluatorManager │ │
│ │ (activate) │ │ (spawn/manage child) │ │
│ └──────┬───────┘ └──────────┬─────────────┘ │
│ │ │ Node IPC │
│ ┌──────┴───────┐ ┌──────────▼────────────┐ │
│ │ HttpRpcServer│ │ evaluator.js │ │
│ │ :7672 (local)│ │ (child process) │ │
│ │ JSON-RPC + │ │ vm.runInContext() │ │
│ │ multipart │ │ + Node std lib │ │
│ └──────────────┘ └───────────────────────┘ │
│ │
└─────────────────────────────────────────────────┘
▲
│ HTTP POST (JSON-RPC 2.0 or multipart/form-data)
│
External caller
(curl, Node, Python, etc.)
```
## 项目结构
```
src/
├── extension.ts # Entry point (activate/deactivate, starts HTTP server)
├── evaluatorManager.ts # Spawns and manages evaluator child process
├── evaluator.ts # Child process – executes JS in vm context with Node globals
├── httpServer.ts # HTTP server: JSON-RPC + multipart/form-data file upload
└── types.ts # Shared types, JSON-RPC protocol definitions
```
## 快速开始(开发)
以下步骤适用于 **Windows、macOS 和 Linux**。
### 1. 安装依赖
```
bun install
```
### 2. 编译
```
bun run compile
```
或以监视模式运行:
```
bun run watch
```
### 3. 在扩展开发主机中运行
1. 在 VS Code 中打开此文件夹
2. 按 **F5**(或运行 → 开始调试)
3. HTTP 服务器自动在端口 7672 上启动
### 4. 从命令行测试
```
# 健康检查
curl http://127.0.0.1:7672/health
# 评估 JavaScript (JSON-RPC)
curl -X POST http://127.0.0.1:7672 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "eval",
"params": {
"language": "js",
"code": "console.log(\"hello\"); return 2 + 2;"
}
}'
# 评估 JavaScript (文件上传)
curl -X POST http://127.0.0.1:7672 \
-F "script=@my-script.js" \
-F 'params={"timeoutMs": 5000}'
```
使用包含的测试脚本:
```
bun test-client.js # Node.js test suite
bash test-curl.sh # Quick curl smoke tests
```
## 生产部署
要部署此扩展以供操作使用:
```
bun run package
```
这会生成一个 `.vsix` 文件(例如 `code-needle-0.2.0.vsix`),可供分发。通过 VS Code 扩展菜单(从 VSIX 安装)或以编程方式安装。
**重要提示:**此扩展不会隐藏其身份或目的。运营者负责:
- 打包和分发扩展(托管、传递机制)
- 欺骗或伪装扩展元数据(清单、图标、名称、发布者)以使其看起来像合法、可信的扩展
- 通过社会工程或其他攻击向量部署
- 管理与此插件通信的 C2 植入物或后渗透有效载荷
## 配置
| 设置 | 默认值 | 描述 |
|---|---|---|
| `codeNeedle.httpPort` | `7672` | HTTP JSON-RPC 服务器端口 |
| `codeNeedle.defaultTimeoutMs` | `30000` | 默认执行超时时间(毫秒) |
## JSON-RPC 协议
### 方法 1:JSON-RPC POST(application/json)
#### 请求
```
{
"jsonrpc": "2.0",
"id": 1,
"method": "eval",
"params": {
"language": "js",
"code": "return 2 + 2;",
"timeoutMs": 30000,
"context": { "name": "Alice", "count": 5 },
"dependencies": ["crypto", "url"]
}
}
```
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
| `language` | `"js"` | 是 | 要评估的语言(仅 JavaScript) |
| `code` | `string` | 是 | 要执行的代码。使用 `return` 返回结果值。 |
| `timeoutMs` | `number` | 否 | 超时时间(毫秒)(默认:30000) |
| `context` | `object` | 否 | 注入到执行作用域的变量 |
| `dependencies` | `string[]` | 否 | 要加载并注入到作用域的 Node.js 内置模块 |
### 方法 2:文件上传(multipart/form-data)
对于大型脚本(100KB+),使用文件上传以避免 JSON 转义开销:
```
# 简单文件上传
curl -X POST http://127.0.0.1:7672 \
-F "script=@my-script.js"
# 文件上传与参数 (context, timeout, dependencies)
curl -X POST http://127.0.0.1:7672 \
-F "script=@my-script.js" \
-F 'params={"timeoutMs": 5000, "context": {"key": "value"}, "dependencies": ["crypto"]}'
```
| 表单字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
| `script` | 文件 | 是 | 要执行的 JavaScript 文件(最大 10MB,必须是 UTF-8 文本) |
| `params` | 文本(JSON) | 否 | 包含 `timeoutMs`、`context`、`dependencies` 的 JSON 字符串 |
两种方法返回相同的 JSON-RPC 响应格式。
### 成功响应
```
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"value": 4,
"logs": ["hello"]
}
}
```
### 错误响应
```
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32001,
"message": "ReferenceError: x is not defined",
"data": { "stack": "..." }
}
}
```
### 错误代码
| 代码 | 含义 |
|---|---|
| -32700 | 解析错误(无效 JSON) |
| -32600 | 无效请求 |
| -32601 | 方法未找到 |
| -32602 | 无效参数 |
| -32603 | 内部错误 |
| -32000 | 评估超时 |
| -32001 | 评估错误(用户代码中的运行时错误) |
| -32002 | 评估器崩溃 |
## 支持的全局变量
以下 Node.js 内置模块在每次评估中默认可用——无需导入或 `require()`:
| 全局变量 | 描述 | 示例 |
|---|---|---|
| `fs` | 文件系统操作 | `fs.readFileSync('./data.json', 'utf8')` |
| `path` | 路径工具 | `path.join('a', 'b', 'c')` |
| `os` | 操作系统信息 | `os.platform()`, `os.tmpdir()` |
| `process` | 进程信息 | `process.cwd()`, `process.env.HOME` |
| `Buffer` | 二进制数据处理 | `Buffer.from('hello').toString('base64')` |
| `util` | 工具函数 | `util.inspect(obj)` |
| `require()` | 加载任何 Node.js 模块 | `require('crypto')`, `require('zlib')` |
| `console` | 捕获的控制台输出 | `console.log('hello')`(在 `logs` 中返回) |
| `setTimeout` | 定时器函数 | `setTimeout(() => {}, 1000)` |
| `setInterval` | 间隔函数 | `setInterval(() => {}, 1000)` |
## 运行时依赖
通过 `dependencies` 参数请求额外的 Node.js 内置模块。这些通过 `require()` 加载并注入到评估作用域中:
```
{
"jsonrpc": "2.0",
"id": 1,
"method": "eval",
"params": {
"language": "js",
"code": "const hash = crypto.createHash('sha256').update('hello').digest('hex'); return hash;",
"dependencies": ["crypto"]
}
}
```
支持的模块包括所有 Node.js 标准库模块:`fs`、`path`、`os`、`util`、`crypto`、`http`、`https`、`url`、`querystring`、`stream`、`zlib`、`events`、`net`、`dns`、`tls`、`child_process` 等。
由于 `require()` 也可直接在用户代码中使用,您可以内联加载模块:
```
const zlib = require('zlib');
const compressed = zlib.gzipSync(Buffer.from('hello'));
return compressed.length;
```
## 测试
执行集成测试套件:
```
bun test
```
这将运行全面测试,涵盖:
- 基本评估和控制台捕获
- 健康检查和错误处理
- 超时检测和进程终止
- Node.js 全局变量(fs、path、os、process、Buffer)
- 运行时依赖注入
- 大型脚本的多部分文件上传(100KB+)
测试使用端口 17672 上的独立服务器,无需运行 VS Code 实例。
标签:GNU通用公共许可证, HTTP工具, HTTP服务器, IP 地址批量处理, JavaScript执行器, JSON-RPC, MITM代理, Node.js, SSH蜜罐, 后渗透工具, 后门工具, 安全测试, 恶意扩展, 恶意软件, 攻击性安全, 文件系统访问, 无线安全, 本地提权, 环境变量窃取, 网络信息收集, 网络安全审计, 自动化攻击, 跨平台恶意软件, 运行时代码执行, 进程注入, 隐蔽执行, 隐蔽渗透