7145e8299053bea02c520460f9a379711ed4455318d434fd5785981295a3a4f4connectwise: 7145e8 — Self-contained MSI-based ScreenConnect client installer
Executive Summary
A 5.6 MB PE32 (MSI installer bundle) embedding the full ConnectWise ScreenConnect client stack — signed with a valid ConnectWise, LLC Authenticode certificate via DigiCert. Unlike the newer ClickOnce bootstrapper sibling (81adbf9a), this sample uses a custom C++ wrapper (DotNetRunner) to load the embedded .NET Framework 2.0 assemblies out of its .rsrc section, with a hardcoded C2 endpoint (134.122.4.2:8041) baked into an embedded app.config. No CAPE detonation available (no Windows guest); static-only analysis.
What It Is
- Format: PE32 executable (GUI), Intel 80386, 5 sections ^[file.txt]
- Size: 5,641,504 bytes
- Compile time: Fri Nov 18 20:10:20 2022 UTC ^[pefile.txt:34]
- Linker: MSVC 14.33 (Visual Studio 2019/2022, linker 14.33) ^[exiftool.json:18]
- PDB path:
C:\Users\jmorgan\Source\cwcontrol\Custom\DotNetRunner\Release\DotNetRunner.pdb^[strings.txt:125] ^[rabin2-info.txt:13] - Language: C/C++ native wrapper bootstrapping embedded .NET 2.0 assemblies (CIL runtime loaded via
mscoree!CorBindToRuntimeEx) ^[rabin2-info.txt:19] ^[pefile.txt:239] - Signed: Valid Authenticode signature by ConnectWise, LLC (Tampa, Florida), issued by DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1 ^[binwalk.txt:30-46] ^[rabin2-info.txt:29]
- Subsystem: Windows GUI (
asInvokerexecution level from embedded manifest) ^[rabin2-info.txt:34] - Guard flags:
/DYNAMICBASE,/NXCOMPAT, Terminal Server aware; no CFG ^[pefile.txt:73] - No packing, no obfuscation, no anti-debug, no VM checks. Evasion is the signature itself.^[triage.json]
OpenCTI labels: connectwise, exe, urlhaus ^[triage.json:7-11].
How It Works
Stage 1 — Native C++ Bootstrap
entry0 is standard MSVC CRT startup (security-cookie init, TLS callback dispatch) that calls main at 0x401140 ^[rabin2-info.txt]. The wrapper:
- Loads
mscoree.dllviaLoadLibraryW. - Resolves
CorBindToRuntimeExto spin up the CLR 2.0 runtime ^[pefile.txt:239]. - Enumerates named resources in the
.rsrcsection and loads the embedded assemblies reflectively.
Stage 2 — Embedded .NET Assemblies in .rsrc
The .rsrc section contains five named resource entries (all LANG_NEUTRAL):
| Resource Name | Offset | Size | Content |
|---|---|---|---|
SCREENCONNECT.CORE |
0x163D4 | 0x86800 | Core assembly (ScreenConnect.Core.dll) ^[pefile.txt:354] |
SCREENCONNECT.WINDOWS |
0x9CBD4 | 0x1A6200 | Windows-specific assembly ^[pefile.txt:374] |
SCREENCONNECT.WINDOWSINSTALLER |
0x242DD4 | 0x1AC00 | Installer assembly ^[pefile.txt:394] |
[_ENTRYPOINT] |
0x25D9D4 | 0x2EE318 | Likely compressed / encrypted payload stub or entrypoint assembly ^[pefile.txt:414] |
[_RESOLVER] |
0x54BCEC | 0x1600 | Certificate / timestamp resource ^[pefile.txt:434] |
This is structurally the full ScreenConnect client installer — not a minimal bootstrapper. The _ENTRYPOINT resource (3 MB) is likely the MSI payload or a compressed cabinet.
Stage 3 — Hardcoded C2 Configuration
An embedded app.config (extracted from offset 0x54D2EC, size 0x188) contains the C2 endpoint:
<value>?h=134.122.4.2&p=8041&k=BgIAAACkAABSU0ExAAgAAAEAAQCpRFw9...</value>
``` ^[strings.txt:21148]
Parameters:
- `h=134.122.4.2` — C2 relay host ^[strings.txt:20622]
- `p=8041` — listener port ^[strings.txt:20622]
- `k=` — base64-wrapped RSA public key / session key for ScreenConnect pairing ^[strings.txt:20622]
**Same C2 infrastructure as sibling `81adbf9a`** — shared IP, port, and key blob format. The divergence is deployment mechanism: this sample embeds the full installer and runs it via a .NET loader; `81adbf9a` delegates to ClickOnce/dfshim.
### Stage 4 — Windows Installer (MSI) Artifacts
Binwalk additionally finds two Cabinet archives (`0x26194C` and `0x41B74C`) and MSI descriptor strings inside the `_ENTRYPOINT` resource ^[binwalk.txt:23-25]. The strings table includes:
- `InstallExecuteSequence`, `InstallUISequence`, `LaunchCondition`
- `ProductCode {B292C5EA-BF5F-4280-B056-1670FB10BB1D}`
- `ProductVersion 25.2.4.9229`
- `Manufacturer ScreenConnect Software`
- `ProgramFilesFolder`, `INSTALLLOCATION`
- Service installation entries for `ScreenConnect.ClientService.exe` ^[strings.txt:20275-20277]
- Registry keys for `SafeBoot\Network\[SERVICE_NAME]`, `Lsa\Authentication Packages`, `Credential Providers` ^[strings.txt:20277]
This binary is a **self-extracting MSI bundle** — the native wrapper unpacks and runs the embedded Windows Installer package, which installs ScreenConnect as a system service and registers credential-provider and LSA authentication-package DLLs.
## Decompiled Behavior
**`entry0`** (`0x004014ad`): Standard MSVC CRT `__tmainCRTStartup` — initializes security cookie, runs `__initterm` dynamic initializers, calls `main` at `0x401140`. ^[r2:entry0]
**`main`**: Not fully decompiled due to the .NET runtime indirection. The native side is a thin loader; actual logic lives in the embedded CIL assemblies. What we can observe:
- No direct socket API imports (no `WinINet`, `WinHTTP`, no `WSAStartup`).
- No Crypt32 imports (unlike `81adbf9a`). Certificate trust is handled by the MSI engine during installation, not by this wrapper.
- No anti-debug or anti-VM code paths. The binary trusts the MSI/UAC elevation model and the valid Authenticode signature for evasion.
## C2 Infrastructure
| Indicator | Value | Notes |
|---|---|---|
| **IP** | `134.122.4.2` | C2 host, hard-coded in app.config ^[strings.txt:20622] |
| **Port** | `8041` | Listener port ^[strings.txt:20622] |
| **Key blob** | `BgIAAACkAABSU0ExAAgAA...` | RSA public key / session key ^[strings.txt:20622] |
| **Product** | `ScreenConnect` (v25.2.4.9229) | Version string in resources ^[strings.txt:5153] |
| **Certificate CN** | `ConnectWise, LLC` | Valid DigiCert-issued code-signing cert ^[rabin2-info.txt:29] |
Static-only; no observed DNS or secondary C2.
## Interesting Tidbits
- **Valid signer with attacker-controlled C2.** The binary carries a legitimate ConnectWise Authenticode signature (DigiCert chain). Either a stolen certificate or a compromised build artifact. Once installed via MSI UAC elevation, it registers services and credential providers under a trusted vendor name. ^[strings.txt:5097]
- **Full installer vs. bootstrapper.** This sample (`7145e8`, 5.6 MB, Nov 2022) predates the ClickOnce runner style (`81adbf9a`, 305 KB, Apr 2025) by ~2.5 years. The attacker evolved from bundling the full MSI to a minimal ClickOnce wrapper that stages from the network. See [connectwise](/intel/families/connectwise.html) entity page for the family timeline.
- **PDB leak reveals developer identity.** `C:\Users\jmorgan\Source\cwcontrol\Custom\DotNetRunner\Release\DotNetRunner.pdb` and `C:\Users\jmorgan\Source\cwcontrol\Custom\DotNetRunner\DotNetResolver\obj\Debug\DotNetResolver.pdb` point to a ConnectWise internal developer (`jmorgan`) working on a custom .NET runner project inside the `cwcontrol` repository. ^[strings.txt:125] ^[strings.txt:20429]
- **No obfuscation, no packer.** Strings, imports, PDB, and C2 configuration are all plaintext. Evasion relies entirely on the valid signature and the legitimate tool chain. ^[triage.json]
- **Embedded MSI with SafeBoot service.** The MSI payload registers a service that survives Safe Mode (Network) via `System\CurrentControlSet\Control\SafeBoot\Network\[SERVICE_NAME]` ^[strings.txt:20277]. Persistence across Safe Mode is deliberate.
- **LSA Authentication Package injection.** The MSI writes to `SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages`, inserting `ScreenConnect.WindowsAuthenticationPackage.dll` into the LSA process. This is a credential-grabbing / logon-notification hook. ^[strings.txt:20277]
- **Windows Credential Provider registration.** Also registers a custom credential provider (`CLSID\[CREDENTIAL_PROVIDER_CLASS_ID]\InprocServer32` → `ScreenConnect.WindowsCredentialProvider.dll`), which can harvest logon credentials at the interactive login screen. ^[strings.txt:20277]
## How To Mess With It (Homelab Replication)
**Goal:** Reproduce a native C++ wrapper that loads embedded .NET assemblies from PE resources and passes a hard-coded app.config to the CLR.
**Toolchain:** Visual Studio 2019/2022, C++ project targeting x86, CLR hosting via `mscoree`.
**Steps:**
1. Create a new C++ Win32 project.
2. Add your .NET assemblies (DLLs) as RCData resources with string names.
3. At runtime: `CorBindToRuntimeEx(L"v2.0.50727", NULL, STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN, &pCLRMetaHost)`.
4. Use `ICLRRuntimeHost::ExecuteInDefaultAppDomain` or load assemblies via `Assembly::Load` from resource bytes.
5. Write an `app.config` with `<applicationSettings>` containing your C2 parameters.
6. Optionally sign the wrapper with any Authenticode cert from a test CA.
**Verification:** Run on a Windows VM with ProcMon. You should see mscoree.dll loaded, resources extracted to memory, then .NET JIT activity. The process tree will show your wrapper spawning the embedded installer or RAT.
## Deployable Signatures
### YARA rule
```yara
rule connectwise_dotnetrunner_msi_bundle {
meta:
description = "ConnectWise DotNetRunner MSI installer bundle with embedded ScreenConnect"
author = "triage"
date = "2026-06-15"
sha256 = "7145e8299053bea02c520460f9a379711ed4455318d434fd5785981295a3a4f4"
strings:
$pdb = "DotNetRunner.pdb" ascii wide
$pdb2 = "DotNetResolver.pdb" ascii wide
$core = "ScreenConnect.Core" wide
$windows = "ScreenConnect.Windows" wide
$installer = "ScreenConnect.WindowsInstaller" wide
$product = "ScreenConnect Software" wide
$version = "25.2.4.9229" wide
$entry = "[_ENTRYPOINT]" wide
$resolver = "[_RESOLVER]" wide
$c2_ip = "134.122.4.2" ascii
$c2_port = "8041" ascii
$product_code = "{B292C5EA-BF5F-4280-B056-1670FB10BB1D}" wide
condition:
uint16(0) == 0x5A4D and
($pdb or $pdb2) and
($core or $windows or $installer) and
($c2_ip or $product_code)
}
Sigma rule
title: ConnectWise ScreenConnect MSI installer bundle execution
status: experimental
description: Detects execution of the ConnectWise DotNetRunner MSI bundle embedding hardcoded C2.
logsource:
category: process_creation
product: windows
detection:
selection:
- CommandLine|contains:
- 'ScreenConnect.WindowsClient.exe'
- 'ScreenConnect.ClientService.exe'
- ParentImage|endswith:
- 'ScreenConnect.ClientInstallerRunner.exe'
- Image|endswith:
- 'ScreenConnect.ClientInstallerRunner.exe'
selection_registry:
- TargetObject|contains:
- 'ScreenConnect.WindowsAuthenticationPackage.dll'
- 'ScreenConnect.WindowsCredentialProvider.dll'
- EventType: SetValue
condition: selection or selection_registry
falsepositives:
- Legitimate ConnectWise ScreenConnect deployments within an enterprise.
level: medium
IOC list
| Type | Value |
|---|---|
| SHA-256 | 7145e8299053bea02c520460f9a379711ed4455318d434fd5785981295a3a4f4 |
| SHA-1 | b6978a757f7342839347eaf585473da8660a6996 (.text section) |
| MD5 | d9fa6da0baf4b869720be833223490cb (.text section) |
| File size | 5,641,504 bytes |
| Compile time | 2022-11-18 20:10:20 UTC |
| C2 IP | 134.122.4.2 |
| C2 Port | 8041 |
| Product version | 25.2.4.9229 |
| Product code | {B292C5EA-BF5F-4280-B056-1670FB10BB1D} |
| Certificate CN | ConnectWise, LLC |
| Certificate issuer | DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1 |
| Service name pattern | ScreenConnect.ClientService (runtime-resolved) |
| Registry key (persistence) | SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages |
| Registry key (SafeBoot) | System\CurrentControlSet\Control\SafeBoot\Network\[SERVICE_NAME] |
| Registry key (Credential Provider) | SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\[GUID] |
Behavioral fingerprint
This binary is a native PE32 wrapper that loads mscoree.dll and initializes the CLR 2.0 runtime via CorBindToRuntimeEx. It extracts multiple large RCData resources named SCREENCONNECT.CORE, SCREENCONNECT.WINDOWS, and SCREENCONNECT.WINDOWSINSTALLER from its .rsrc section, then passes control to embedded CIL assemblies. The wrapper contains no direct network imports — all C2 configuration is read from an embedded app.config (XML) that specifies an IP (134.122.4.2), port (8041), and RSA session key. Post-installation, the MSI payload registers a Windows service (SafeBoot network compatible), an LSA authentication package DLL, and a Windows credential provider DLL. The binary is signed with a valid DigiCert-issued Authenticode certificate in the name of ConnectWise, LLC.
Detection Signatures
| Capability | ATT&CK ID | Evidence |
|---|---|---|
| Native + .NET runtime bootstrap | — | CorBindToRuntimeEx + RCData resource loading ^[pefile.txt:239] |
| Embedded MSI installer execution | T1204.002 | Cabinet archives + MSI sequence tables ^[binwalk.txt:23-25] |
| Remote access software abuse | T1219 | ScreenConnect client components embedded ^[strings.txt:13773-13784] |
| Ingress tool transfer | T1105 | Hard-coded C2 endpoint in app.config ^[strings.txt:21148] |
| Service persistence | T1543.003 | MSI ServiceInstall + SafeBoot\Network registry ^[strings.txt:20277] |
| LSASS credential access | T1003.001 | LSA Authentication Package registration ^[strings.txt:20277] |
| Credential Provider abuse | T1056.001 | Custom credential provider DLL registration ^[strings.txt:20277] |
| Valid account / signed binary | T1078 | Authenticode-signed by ConnectWise, LLC ^[rabin2-info.txt:29] |
| Boot or Logon Autostart Execution | T1547.012 | Credential provider registration at install time ^[strings.txt:20277] |
References
- SHA-256:
7145e8299053bea02c520460f9a379711ed4455318d434fd5785981295a3a4f4 - Source: OpenCTI / abuse.ch urlhaus payloads
- Family entity page: connectwise
- Sibling analysis: raw/analyses/81adbf9a/report.md
- Concept page: legitimate-remote-access-tool-abuse
- Technique page: clickonce-certificate-trust-bootstrap (sibling uses this; this sample predates it)
Provenance
file.txt— file(1) outputexiftool.json— ExifTool PE metadatapefile.txt— pefile library dumpstrings.txt— strings(1) extractionbinwalk.txt— Binwalk embedded-artifact scanrabin2-info.txt— radare2 binary header summarytriage.json— triage pipeline metadatadynamic-analysis.md— CAPE status: skipped (no Windows guest available)- radare2 decompilation of
entry0at0x4014ad - Manual DER certificate extraction from
IMAGE_DIRECTORY_ENTRY_SECURITYat offset0x54A600
Tools: ExifTool 12.76, pefile, radare2 5.x, binwalk, strings, openssl pkcs7