Meltedd/VisualSploit
GitHub: Meltedd/VisualSploit
将 shellcode 注入 MSBuild 项目文件,利用 Visual Studio 设计时构建机制实现无需用户交互的无文件执行。
Stars: 8 | Forks: 1
# VisualSploit
将 MSBuild 项目文件武器化以运行嵌入的 shellcode。给定一个 `.csproj`、`.vbproj` 或 `Directory.Build.props/targets` 文件以及一段 shellcode,VisualSploit 会注入一个 loader,该 loader 会在项目被构建、还原或在 Visual Studio 中打开时触发。只需克隆一个含有后门的代码库并在 Visual Studio 中将其打开,就足以在无需用户交互的情况下运行 payload。
## 工作原理
MSBuild 允许项目声明内联任务(inline task),这是一段由 `RoslynCodeTaskFactory` 编译并在构建期间运行的 C# 代码:
```
```
`` 上的 `InitialTargets` 指定了在 MSBuild 评估项目时首先触发的目标(target)。
VisualSploit 会写入一个包含 shellcode 加载器的 ``,添加一个调用它的 ``,并将该目标追加到 `InitialTargets` 中。任何评估操作都会运行此目标,无论是 `dotnet build`、`dotnet restore`、Visual Studio 打开文件夹,还是 IDE 运行 MSBuild 提供 IntelliSense。Microsoft 将这些设计时构建(design-time builds)视为完全执行。
随后,生成的 C# 代码会执行以下操作:
1. 使用 XOR 解密嵌入的 payload。
2. 通过动态解析的 `VirtualAlloc` 分配一个 RWX(读写执行)内存页。
3. 通过 `CallWindowProcA` 调用 shellcode。
克隆下来的文件不带有 [MOTW](https://learn.microsoft.com/en-us/windows/win32/secauthz/mark-of-the-web)(标记来源于网络),因此 Visual Studio 的“信任此项目?”提示不会在执行 `git clone` 时触发。
## 目标文件
| 目标文件 | 触发条件 |
|-----------------------------|----------------------------------------------------------|
| `*.csproj` / `*.vbproj` | 项目被打开或构建时 |
| `Directory.Build.props` | 该目录或其子目录下的任何项目被打开或构建时 |
| `Directory.Build.targets` | 该目录或其子目录下的任何项目被构建时 |
`Directory.Build.props` 和 `.targets` 会被其下方的每个项目隐式导入,因此只需在代码库的根目录注入一个文件,就会危及整个子目录树。
## 用法
```
visualsploit [options]
-o, --output Write to a different path (default: in place)
-r, --rounds XOR rounds 1-5 (default 3)
-s, --seed RNG seed for reproducible output
--junk Interleave junk code to vary emitted bytes
--no-backup Skip .bak when writing over an existing file
```
Shellcode 可以是原始二进制文件或十六进制格式(空格、逗号和 `0x` 前缀将被忽略)。除非传递了 `--output` 参数,否则目标文件将被就地修改,并在同目录下保留原始文件的 `.bak` 备份。
```
# 注入到单个项目
visualsploit project.csproj shellcode.bin
# 攻陷 subtree 中的所有项目
visualsploit repo/Directory.Build.props shellcode.bin
# 夹杂 junk code 的可复现 output
visualsploit repo/Directory.Build.targets shellcode.bin --junk -s 42
```
## Shellcode 约束条件
- 架构位数必须与 MSBuild 主机匹配(x64 对应 x64,x86 对应 x86)。
- 必须是位置无关代码。loader 会在系统选择的地址上分配一个内存页,然后通过 `CallWindowProcA` 调用它,因此 shellcode 将作为 `WNDPROC(hWnd=0, Msg=0, wParam=0, lParam=0)` 运行。
- 该内存页被映射为 `PAGE_EXECUTE_READWRITE`,因此像反射式加载器(reflective loaders)或 metasploit `migrate` 这类自修改的 stager 无需额外的内存保护属性翻转即可运行。
## 构建
需要 .NET 10 SDK。
```
dotnet build -c Release
dotnet test
```
独立二进制文件:
```
dotnet publish -c Release -r --self-contained -p:PublishSingleFile=true
```
## 许可证
MIT。
标签:.csproj, DNS 反向解析, macOS, meg, MSBuild, OpenCanary, Shellcode, .vbproj, VirtualAlloc, Visual Studio, XOR解密, 中高交互蜜罐, 代理, 代码执行, 供应链攻击, 信息安全, 内联任务, 初始访问, 安全免杀, 开发者安全, 恶意软件开发, 技术调研, 数据展示, 无文件攻击, 横向移动, 红队, 编程规范