用于 Microsoft Defender for Endpoint 实时响应的跨平台交互式 Shell。
| 功能 | 详情 |
|---|---|
| 平台 | PowerShell Core 7.0+(Windows、Linux、macOS) |
| API 模式 | 内部(门户,近实时)和官方(公共,无状态) |
| 执行 | 任意命令 + 25 个原生 LR 命令 |
| 认证 | 7 种认证方法,统一菜单,自动刷新 |
| 许可证 | MIT |
LaraC2 Shell 通过两个独立的 API 路径连接到 MDE 实时响应——内部门户 API(持久会话,延迟约 2-5 秒)和官方公共 API(每命令,延迟约 20-60 秒)。它自动上传执行器存根,透明处理速率限制,并提供完整的 REPL,支持机器管理、库管理和内置帮助系统。
| 文档 | 用途 |
|---|---|
| 用户指南 | 分步设置、认证和操作 |
| 命令参考 | 所有命令、路由、批处理、Tab 补全 |
| 错误参考 | HTTP 状态码、Shell 错误、认证错误、修复方法 |
| 性能对比 | 内部与官方 API 的延迟、吞吐量、限制 |
| 架构 | 内部结构、认证链、端点、文件布局 |
| 贡献指南 | 如何贡献、测试、提交 PR |
| 安全策略 | 如何私下报告漏洞 |
| 参考资料 | 先前工作、相关研究、致谢 |
| 免责声明 | 授权、致谢 |
connect 命令重新认证multi 命令,支持名称模式过滤和限制前 N 个结果Machine.LiveResponse + Library.Manage 权限的 MDE 应用注册(官方模式)git clone https://github.com/akefallonitis/larac2shell.git cd larac2shell pwsh -File shell/Invoke-MDEShell.ps1
就这样。Shell在首次启动时提供一个统一的7种认证方式菜单——选择一种,进行认证,选择一台机器,然后你就进入了REPL。无需配置文件,无需标志,无需任何设置。```
Select API mode:
Internal API (security.microsoft.com — near real-time, ~2-5s/cmd)
1 Credentials + MFA username + password, TOTP/push/SMS [auto-refresh]
2 Software passkey FIDO2/WebAuthn JSON key file [auto-refresh]
3 ESTS cookie ESTSAUTHPERSISTENT from browser (~24hr)
4 Temporary Access Pass one-time admin-issued code
5 Direct sccauth + XSRF cookies from browser DevTools (~1hr)
Official API (api.securitycenter.microsoft.com — CI/CD ready, ~20-60s/cmd)
6 Device code browser login (interactive)
7 Client credentials app registration with client secret
Auth method (1-7):
选择1-5设置内部模式,6-7设置官方模式。你可以稍后在不重启的情况下切换模式——请参阅下面的**内联切换模式**。
[INT myhost C:]> mode Current mode: Internal API Switch with: 'mode internal' or 'mode official'.
[INT myhost C:]> mode official [Mode] Switching from Internal API to official... (auth menu for official mode opens) [Mode] Now in official mode. Run 'machines' to list targets or 'connect <name|id>' to select one.
`mode <target>` 断开任何当前 LR 会话,清除旧的身份验证状态,并重新为目标模式运行身份验证流程。完成后,您已在新模式下通过身份验证,且未选择任何机器 — 运行 `machines` 列出机器,或运行 `connect <name|id>` 直接跳转到目标。无需重启。
### CLI 快捷方式(可选)
用于脚本编写或当您希望跳过统一菜单时:```powershell
# Pre-select the mode (narrows the auth menu to 1-5 or 6-7)
pwsh -File shell/Invoke-MDEShell.ps1 -Mode internal
pwsh -File shell/Invoke-MDEShell.ps1 -Mode official
# Pre-select a machine (skips the picker)
pwsh -File shell/Invoke-MDEShell.ps1 -Machine myhost
# Software passkey path (internal mode)
pwsh -File shell/Invoke-MDEShell.ps1 -PasskeyPath ./keys/passkey.json
# Non-interactive single command (exits with remote command's exit code)
pwsh -File shell/Invoke-MDEShell.ps1 -Machine myhost -Command 'whoami'
仅用于一种场景:使用客户端密钥的官方模式,且非交互式。所有其他认证方法都会以交互方式提示你,并且不会在磁盘上存储任何内容。如果你不需要无人值守的客户端凭证认证,可以完全跳过这一部分。```powershell Copy-Item shell/config/shell-config.example.json shell/config/shell-config.json
pwsh -File shell/Invoke-MDEShell.ps1 -Config shell/config/shell-config.json
配置模式(除`official.tenantId` + `official.clientId`(使用客户端凭据时)外,所有字段均为可选):
| 区域 | 字段 | 描述 |
|---------|-------|-------------|
| `official` | `tenantId` | Azure AD 租户 ID |
| `official` | `clientId` | 应用注册客户端 ID |
| `official` | `clientSecret` | 客户端密码(省略并设置 `useDeviceCode: true` 以使用设备代码) |
| `official` | `useDeviceCode` | 设为 `true` 以使用设备代码流代替客户端凭据 |
| `defaults` | `defaultMachine` | 启动时预选机器(名称子串或 ID 前缀) |
| `defaults` | `commandTimeoutSeconds` | 客户端超时上限。`0` 表示由服务器决定(最长 1800 秒)。 |
| `defaults` | `pollIntervalOfficial` | 官方 API 轮询间隔,单位为秒(默认 2) |
| `defaults` | `pollIntervalInternal` | 内部 API 轮询间隔,单位为秒(默认 1) |
**安全性**:对包含 `clientSecret` 的任何配置文件限制文件系统权限。`clientSecret` 从不通过命令行接受——仅通过配置文件。所有内部模式凭据(用户名、密码、TOTP 密钥、cookie)均以交互方式提示,且从不持久化到磁盘。
---
## 认证方法
Shell 在启动时提供一个统一的 7 方法认证菜单。模式(内部/官方)由选择决定。
| # | 模式 | 方法 | 方式 | 自动刷新 |
|---|------|--------|-----|--------------|
| 1 | 内部 | 凭据 + TOTP | 交互式提示 | 是(静默)——仅当提供了 TOTP 密钥时。使用推送/SMS MFA 时,会话无法自动刷新。 |
| 2 | 内部 | 软件通行密钥 | `-PasskeyPath` 参数或提示 | 是(静默) |
| 3 | 内部 | ESTS cookie | 交互式提示 | 否(约 24 小时) |
| 4 | 内部 | 临时访问通行证 | 交互式提示 | 否(一次性) |
| 5 | 内部 | 直接 sccauth + XSRF | 交互式提示 | 否(约 1 小时)——XSRF 自动刷新不适用;Shell 不会自动刷新直接提供的 cookie。 |
| 6 | 官方 | 设备代码 | 浏览器登录 | 否(约 1 小时) |
| 7 | 官方 | 客户端凭据 | 配置文件 | 是(静默) |
`connect` 命令在会话过期时重新认证,使用最初选择的相同方法。没有自动刷新的方法会再次以交互方式提示。
**内存中凭据处理**:对于方法 1,提供的密码和 TOTP 密钥在 Shell 进程生命周期内保留在内存中(作为纯字符串,位于 `$script:Int_ReauthParams` 中),以便无人值守地静默重新认证。这些字符串对象位于 PowerShell 运行空间中;它们不会被序列化到磁盘或通过命令行传递。如果这种暴露对你的威胁模型不可接受,请使用方法 2(通行密钥/HSM)或方法 7(客户端凭据)。
---
## Shell 命令
### Shell 控制
| 命令 | 描述 |
|---------|-------------|
| `help [command]` | 显示帮助(可选指定命令) |
| `help commands` | 列出所有本机 LR 命令及其描述 |
| `status` | 显示连接状态、认证状态、机器信息 |
| `config` | 显示 Live Response 配置 |
| `connect [name\|id]` | 重新认证(如果过期)并选择机器 |
| `disconnect` | 断开当前 LR 会话并清除机器 |
| `multi [options] <cmd>` | 在多个机器上运行命令(`-top N`、`-filter pattern`) |
| `session [list]` | 显示当前会话信息或所有缓存的会话 |
| `mode` | 显示当前 API 模式 |
| `mode internal\|official` | 内联切换 API 模式——断开当前会话,拆除旧认证状态,并重新运行目标模式的认证菜单。之后使用 `machines` 或 `connect` 继续 |
| `exit` / `quit` / `q` | 退出 Shell |
### 机器管理
| 命令 | 描述 |
|---------|-------------|
| `machines [refresh]` | 列出机器并选择一台(refresh = 强制重新加载) |
| `connect [name\|id]` | 按名称子串或 ID 前缀连接到机器 |
### 原生 Live Response 命令(共 25 个)