You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/windows-hardening/av-bypass.md
+67-1Lines changed: 67 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -121,6 +121,69 @@ Both our shellcode (encoded with [SGN](https://github.com/EgeBalci/sgn)) and the
121
121
> [!TIP]
122
122
> I **highly recommend** you watch [S3cur3Th1sSh1t's twitch VOD](https://www.twitch.tv/videos/1644171543) about DLL Sideloading and also [ippsec's video](https://www.youtube.com/watch?v=3eROsG_WNpE) to learn more about what we've discussed more in-depth.
Windows PE modules can export functions that are actually "forwarders": instead of pointing to code, the export entry contains an ASCII string of the form `TargetDll.TargetFunc`. When a caller resolves the export, the Windows loader will:
127
+
128
+
- Load `TargetDll` if not already loaded
129
+
- Resolve `TargetFunc` from it
130
+
131
+
Key behaviors to understand:
132
+
- If `TargetDll` is a KnownDLL, it is supplied from the protected KnownDLLs namespace (e.g., ntdll, kernelbase, ole32).
133
+
- If `TargetDll` is not a KnownDLL, the normal DLL search order is used, which includes the directory of the module that is doing the forward resolution.
134
+
135
+
This enables an indirect sideloading primitive: find a signed DLL that exports a function forwarded to a non-KnownDLL module name, then co-locate that signed DLL with an attacker-controlled DLL named exactly as the forwarded target module. When the forwarded export is invoked, the loader resolves the forward and loads your DLL from the same directory, executing your DllMain.
`NCRYPTPROV.dll` is not a KnownDLL, so it is resolved via normal search order.
144
+
145
+
PoC (copy-paste):
146
+
1) Copy the signed system DLL to a writable folder
147
+
```
148
+
copy C:\Windows\System32\keyiso.dll C:\test\
149
+
```
150
+
2) Drop a malicious `NCRYPTPROV.dll` in the same folder. A minimal DllMain is enough to get code execution; you do not need to implement the forwarded function to trigger DllMain.
- rundll32 (signed) loads the side-by-side `keyiso.dll` (signed)
169
+
- While resolving `KeyIsoSetAuditingInterface`, the loader follows the forward to `NCRYPTPROV.SetAuditingInterface`
170
+
- The loader then loads `NCRYPTPROV.dll` from `C:\test` and executes its `DllMain`
171
+
- If `SetAuditingInterface` is not implemented, you'll get a "missing API" error only after `DllMain` has already run
172
+
173
+
Hunting tips:
174
+
- Focus on forwarded exports where the target module is not a KnownDLL. KnownDLLs are listed under `HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs`.
175
+
- You can enumerate forwarded exports with tooling such as:
176
+
```
177
+
dumpbin /exports C:\Windows\System32\keyiso.dll
178
+
# forwarders appear with a forwarder string e.g., NCRYPTPROV.SetAuditingInterface
179
+
```
180
+
- See the Windows 11 forwarder inventory to search for candidates: https://hexacorn.com/d/apis_fwd.txt
181
+
182
+
Detection/defense ideas:
183
+
- Monitor LOLBins (e.g., rundll32.exe) loading signed DLLs from non-system paths, followed by loading non-KnownDLLs with the same base name from that directory
184
+
- Alert on process/module chains like: `rundll32.exe` → non-system `keyiso.dll` → `NCRYPTPROV.dll` under user-writable paths
185
+
- Enforce code integrity policies (WDAC/AppLocker) and deny write+execute in application directories
186
+
124
187
## [**Freeze**](https://github.com/optiv/Freeze)
125
188
126
189
`Freeze is a payload toolkit for bypassing EDRs using suspended processes, direct syscalls, and alternative execution methods`
@@ -834,6 +897,9 @@ References for PPL and tooling
834
897
-[Unit42 – New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/)
835
898
-[Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html)
836
899
-[Check Point Research – Before ToolShell: Exploring Storm-2603’s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/)
0 commit comments