# ts_rat **Repository Path**: cutecuteyu/ts_rat ## Basic Information - **Project Name**: ts_rat - **Description**: typescript实现的远控c2 - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-09 - **Last Updated**: 2026-02-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TCP 反向 Shell 基于 **TypeScript** 的 TCP 反向连接系统,允许服务端远程控制客户端执行 PowerShell 命令。 ## 系统架构 ``` ┌─────────────┐ TCP 连接 ┌─────────────┐ │ 服务端 │ <─────────────> │ 客户端 │ │ (Server) │ AES-256-GCM │ (Client) │ │ │ 加密传输 │ │ │ 接收结果 │ <─────────────> │ 执行命令 │ └─────────────┘ 返回结果 └──────┬──────┘ │ PowerShell ``` ## 功能特性 - ✅ TCP 反向连接(客户端主动连接服务端) - ✅ **AES-256-GCM 认证加密通信** - 所有数据传输都经过加密和完整性验证 - ✅ 支持多客户端同时连接 - ✅ 交互式命令行界面 - ✅ 客户端自动重连机制 - ✅ 命令执行超时保护 - ✅ 命令验证和安全检查(黑名单过滤) - ✅ JSON 格式数据传输 - ✅ 完整的 TypeScript 类型支持 - ✅ 模块化架构设计 - ✅ 可打包为独立 exe 文件 - ✅ 环境变量配置支持 ## 项目结构 ``` tcp-reverse-shell/ ├── src/ # TypeScript 源代码 │ ├── crypto.ts # AES-256-GCM 加密模块 │ ├── config.ts # 全局配置文件 │ ├── types/ │ │ └── index.ts # 类型定义 │ ├── utils/ │ │ └── errorHandler.ts # 统一错误处理 │ ├── server/ # 服务端代码 │ │ ├── index.ts # 主入口 │ │ ├── commands/ # 命令处理 │ │ ├── lib/ # 核心库 │ │ └── utils/ # 工具函数 │ └── client/ # 客户端代码 │ ├── index.ts # 主入口 │ ├── handlers/ # 消息处理器 │ ├── lib/ # 核心库 │ │ ├── commandExecutor.ts # 命令执行(防注入) │ │ └── commandValidator.ts # 命令验证 │ └── utils/ # 工具函数 ├── dist/ # 编译后的 JavaScript ├── package.json └── tsconfig.json ``` ## 快速开始 ### 安装依赖 ```bash cd tcp-reverse-shell npm install ``` ### 编译 TypeScript ```bash npm run build ``` ### 1. 启动服务端 ```bash # 使用编译后的代码 npm run server # 或使用 ts-node 直接运行(开发模式) npm run server:dev # 指定端口 node dist/server/index.js 5555 # 使用自定义密钥(推荐) $env:SHELL_SECRET_KEY="your-secure-key" npm run server ``` ### 2. 启动客户端 ```bash # 使用编译后的代码 npm run client # 或使用 ts-node 直接运行(开发模式) npm run client:dev # 指定服务端地址和端口 node dist/client/index.js 192.168.1.100 5555 # 使用自定义密钥(必须与服务器相同) $env:SHELL_SECRET_KEY="your-secure-key" npm run client ``` ## 服务端命令 ### 客户端管理 | 命令 | 说明 | |------|------| | `list`, `ls`, `clients` | 列出所有连接的客户端 | | `use ` | 选择指定 ID 的客户端 | | `info` | 显示当前客户端信息 | | `kill ` | 关闭指定客户端连接 | | `broadcast <命令>` | 向所有客户端广播命令 | ### 命令执行 | 命令 | 说明 | |------|------| | 直接输入命令 | 执行 PowerShell 命令 | | `ps <命令>` | 显式执行 PowerShell 命令 | | `cmd <命令>` | 执行 CMD 命令 | ### 系统命令 | 命令 | 说明 | |------|------| | `help`, `?` | 显示帮助 | | `clear`, `cls` | 清屏 | | `status`, `server` | 显示服务端信息 | | `exit`, `quit` | 关闭服务端 | ## 使用示例 ### 场景 1:基本命令执行 ```bash # 服务端操作 PS-Server> list # 查看连接的客户端 📋 已连接的客户端列表: [1] 192.168.1.5:54321 (连接时间: 2024/1/15 10:30:25) PS-Server> use 1 # 选择客户端 1 ✅ 已选择客户端 [1] PS-Shell[1]> Get-Process # 执行 PowerShell 命令 📥 客户端 [1] 执行结果: Name Id ---- -- ApplicationFrameHost 14552 backgroundTaskHost 13896 ... ``` ### 场景 2:广播命令 ```bash PS-Server> broadcast "whoami" # 向所有客户端发送命令 📢 广播命令到所有客户端: whoami ✓ 客户端 [1] ✓ 客户端 [2] ✓ 客户端 [3] ``` ### 场景 3:CMD 命令 ```bash PS-Shell[1]> cmd ipconfig # 执行 CMD 命令 ``` ## 加密通信 系统使用 **AES-256-GCM 认证加密算法** 对所有传输数据进行加密: ### 加密特性 - **算法**: AES-256-GCM( Galois/Counter Mode) - **密钥长度**: 256 位 - **IV 长度**: 16 字节(随机生成) - **认证标签**: 16 字节(确保数据完整性) - **安全性**: 提供机密性和完整性双重保护 ### 加密流程 ``` 发送方: 明文 JSON -> AES-256-GCM 加密 -> Base64 编码 -> 网络传输 ↓ 随机 IV + 认证标签 + 密文 接收方: 网络数据 -> Base64 解码 -> AES-256-GCM 解密 -> 明文 JSON ↓ 验证认证标签确保数据未被篡改 ``` ### 密钥配置 #### 方法 1:环境变量(推荐) ```powershell # PowerShell $env:SHELL_SECRET_KEY="your-secure-random-key-here" npm run server # Linux/macOS export SHELL_SECRET_KEY="your-secure-random-key-here" npm run server ``` #### 方法 2:生成随机密钥 ```typescript import { CryptoManager } from './src/crypto'; const key = CryptoManager.generateKey(); console.log(key); // Base64 编码的 32 字节密钥 ``` #### 方法 3:修改配置文件(不推荐用于生产) 编辑 `src/config.ts`: ```typescript export function getSecretKey(): string { return process.env.SHELL_SECRET_KEY || 'your-default-key-here'; } ``` **⚠️ 重要**: 服务端和客户端必须使用相同的密钥才能正常通信! ## 安全性特性 ### 1. 命令注入防护 - 使用 `execFile` 替代 `exec`,避免 shell 注入 - 命令参数以数组形式传递,不经过 shell 解析 ### 2. 命令验证 - **黑名单过滤**: 阻止危险命令(format, del /f /s /q 等) - **长度限制**: 命令最大 4096 字符 - **多命令检测**: 阻止使用 `;`, `&&`, `||` 串联命令 - **字符清理**: 移除控制字符和 null 字节 ### 3. 连接安全 - 所有数据传输经过 AES-256-GCM 加密 - 认证标签确保数据完整性 - 随机 IV 防止重放攻击 ### 4. 资源管理 - 安全的 socket 关闭机制 - 5 秒超时强制关闭 - 防止资源泄露 ## 开发指南 ### 编译命令 ```bash # 编译所有 TypeScript npm run build # 监视模式编译(自动重新编译) npm run build:watch # 类型检查(不生成文件) npm run typecheck # 清理编译输出 npm run clean ``` ### 运行命令 ```bash # 运行编译后的代码 npm run server npm run client # 开发模式(使用 ts-node,无需编译) npm run server:dev npm run client:dev ``` ### 代码检查 ```bash # 运行 ESLint npm run lint # 类型检查 npm run typecheck ``` ## 打包为 EXE ### 打包服务端 ```bash npm run build:server # 输出: dist/server.exe ``` ### 打包客户端 ```bash npm run build:client # 输出: dist/client.exe ``` ### 打包全部(编译 + 打包) ```bash npm run build:all ``` 打包后的文件位于 `dist/` 目录。 ## 实际应用场景 ### 场景 1:远程管理内网服务器 ```bash # 在公网服务器启动服务端 $env:SHELL_SECRET_KEY="secure-key-12345" npm run server # 在内网服务器运行客户端(连接到公网IP) $env:SHELL_SECRET_KEY="secure-key-12345" node dist/client/index.js 公网IP 4444 # 现在可以在公网服务器控制内网服务器 ``` ### 场景 2:批量管理多台机器 ```bash # 启动服务端 npm run server # 在多台机器上运行客户端(使用脚本批量部署) node dist/client/index.js 服务端IP 4444 # 使用 broadcast 命令批量执行 broadcast "Get-ComputerInfo" ``` ## 技术细节 ### 通信协议 数据以 **加密 JSON** 格式传输,每条消息以换行符 `\n` 结尾: **服务端 -> 客户端:** ```json { "type": "command", "command": "Get-Process", "timestamp": "2024-01-15T10:30:00.000Z" } ``` **加密后格式:** ```json { "iv": "base64-encoded-iv", "authTag": "base64-encoded-tag", "data": "base64-encoded-ciphertext" } ``` **客户端 -> 服务端:** ```json { "type": "result", "command": "Get-Process", "data": "...", "executionTime": 150, "timestamp": "2024-01-15T10:30:00.150Z" } ``` ### 自动重连机制 - 连接断开时,客户端会等待 5 秒后自动重连 - 重连次数无限制,直到连接成功或手动退出 ### 命令执行 - 使用 PowerShell 执行命令(execFile 方式,防止注入) - 支持 60 秒超时 - 支持 10MB 输出缓冲区 - 命令验证和黑名单过滤 ### 类型系统 完整的 TypeScript 类型定义: ```typescript interface Message { type: 'welcome' | 'command' | 'result' | 'error' | 'info' | 'kill'; timestamp?: string; } interface SystemInfo { hostname: string; platform: string; release: string; arch: string; cpus: number; totalMemory: string; uptime: string; } interface ClientInfo { socket: Socket; connectTime: Date; systemInfo: SystemInfo | null; } interface ExecutionResult { stdout: string; stderr: string | null; executionTime: number; } ``` ## 故障排除 ### 连接被拒绝 ``` [!] 无法连接到服务端 127.0.0.1:4444 ``` - 检查服务端是否已启动 - 检查防火墙设置 - 检查端口是否正确 ### 解密失败 ``` 解密失败: 解密失败: Unsupported state or unable to authenticate data ``` - 检查服务端和客户端密钥是否一致 - 确保使用相同的环境变量 `SHELL_SECRET_KEY` ### 命令执行失败 - 检查客户端是否有 PowerShell 执行权限 - 检查命令语法是否正确 - 查看客户端控制台获取详细错误信息 - 检查命令是否被黑名单拦截 ### 编译错误 ```bash # 确保已安装依赖 npm install # 清理并重新编译 npm run clean npm run build ``` ## 安全提示 ⚠️ **重要提示**: 1. **合法使用**: 此工具仅用于合法的管理和测试目的 2. **密钥管理**: - 生产环境务必使用强密钥 - 使用环境变量 `SHELL_SECRET_KEY` 配置密钥 - 定期更换密钥 - 不要将密钥硬编码在代码中 3. **网络隔离**: 建议使用防火墙限制访问IP 4. **命令限制**: 系统已内置命令黑名单,可根据需要调整 5. **加密算法**: 使用 AES-256-GCM,提供认证加密 6. **输入验证**: 所有命令都经过验证和清理 ## 更新日志 ### v1.1.0 - 安全性重大升级 - ✅ **加密算法升级**: RC4 → AES-256-GCM(认证加密) - ✅ **命令注入防护**: 使用 execFile 替代 exec - ✅ **命令验证**: 添加黑名单过滤和输入验证 - ✅ **密钥管理**: 支持环境变量配置密钥 - ✅ **错误处理**: 统一错误处理机制 - ✅ **资源管理**: 完善 socket 关闭处理 - ✅ **类型定义**: 补充缺失的类型定义 - ✅ **常量管理**: 统一配置文件管理 ## 许可证 MIT License