Exploitation and Obfuscated C2 in the Patch Window
An adversary has exploited a critical vulnerability in a public-facing web application during the window before patching and is using a multi-hop proxy to mask command-and-control traffic.
Based on research by Microsoft 2026-09-20 11 steps · 3 queries T1090.003 T1190
Brief
The Remediation Gap
The recent MSRC article, "The patch window is collapsing" (https://azure.microsoft.com/en-us/blog/the-patch-window-is-collapsing-why-security-needs-a-new-control-plane/), highlights a critical shift: the time between a vulnerability being known and being weaponized is shrinking. When patching takes weeks but exploits arrive in days, organizations need a way to find intruders who are already inside. This hunt addresses that gap by focusing on internet-exposed systems that are confirmed vulnerable.
Hunt Flow
The first step identifies the attack surface. A query scans the vulnerability inventory for high-severity findings on internet-facing hosts where an exploit already exists. This narrows the scope from every server to only those at immediate risk of compromise.
Next, an automated agent evaluates the discovered vulnerabilities. It decides whether the exposure justifies the resource cost of deep behavioral queries. If the risk is confirmed, the hunt proceeds; otherwise, it closes to save analyst time.
The behavioral phase runs in parallel. One query monitors web server processes, such as IIS or Nginx, looking for any instance where they spawn a command shell like Bash or PowerShell. This is a common indicator of successful exploitation or web shell deployment.
Simultaneously, the hunt analyzes outbound network traffic. It looks for connections to ports commonly associated with proxies or Onion Router (Tor) nodes. The query uses stack-counting to find rare destinations, filtering out legitimate high-volume traffic to isolate potential C2 channels.
Finally, an agent correlates the vulnerability status with the behavioral signals. It weighs the presence of a known exploit against the execution and network evidence to provide a per-host verdict. This triage ensures that remediation focuses on confirmed intrusions rather than isolated, benign anomalies.
Blind Spots
Vulnerability data provides the starting point, but it may be stale. If a system was patched recently but the inventory has not updated, the hunt may target remediated hosts. Additionally, proxy ports like 8080 are often used by legitimate administrative tools. This can create noise that requires manual review to distinguish between a management proxy and an adversary's multi-hop C2.
Steps
-
Identify exploitable internet-facing assets
Query · scopingFind systems with critical vulnerabilities where an exploit is known to be available, providing the lead for behavioral analysis.
reads hb_vulnerability_findingsqlSELECT DISTINCT d.hostname AS device_hostname, v.cve_uid, v.severity, v.affected_package_name FROM hb_vulnerability_finding v JOIN hb_devices d ON v.device_uid = d.device_uid WHERE v.severity_id >= 4 AND v.is_exploit_available = 'TRUE' AND v.status != 'suppressed'What a hit looks like. A list of hostnames and their critical CVEs. Silence suggests no current high-risk exploitable surface in the vulnerability inventory.
-
Assess exposure risk
Agent triageEvaluate whether the scoped vulnerabilities represent a critical enough risk to proceed with expensive behavioral queries.
-
Gate on identified risk
DecisionEnsure expensive behavioral queries are only run when critical exposure is confirmed.
-
Web server shell spawning
Query · detection candidateIdentify web server processes spawning interactive shells, a hallmark of successful T1190 exploitation.
reads hb_process_activitysqlSELECT device_hostname, process_name, process_cmd_line, parent_process_name, time FROM hb_process_activity WHERE (LOWER(parent_process_name) LIKE '%w3wp.exe' OR LOWER(parent_process_name) LIKE '%httpd' OR LOWER(parent_process_name) LIKE '%nginx' OR LOWER(parent_process_name) LIKE '%apache2') AND (instr(',' || '{{shell_processes}}' || ',', ',' || LOWER(process_name) || ',') > 0 OR instr(',' || '{{shell_processes}}' || ',', ',' || replace(LOWER(process_name), rtrim(LOWER(process_name), replace(LOWER(process_name), '\', '')), '') || ',') > 0 OR instr(',' || '{{shell_processes}}' || ',', ',' || replace(LOWER(process_name), rtrim(LOWER(process_name), replace(LOWER(process_name), '/', '')), '') || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. A web server (w3wp, nginx, apache) spawning a shell process. This is high-confidence evidence of exploitation.
-
Rare outbound proxy connections
Query · baselineFind rare outbound connections to proxy or ORB ports from the scoped vulnerable hosts.
reads hb_network_connectionsqlSELECT dst_endpoint_ip, dst_endpoint_port, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_network_connection WHERE instr(',' || '{{proxy_ports}}' || ',', ',' || CAST(dst_endpoint_port AS TEXT) || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY dst_endpoint_ip, dst_endpoint_port HAVING host_count <= 3What a hit looks like. Proxy ports reached by a small number of hosts in the scoped environment. Silence suggests no obvious multi-hop C2 via standard proxy ports.
-
Triage behavior and exposure
Agent triageCorrelate the vulnerability context with process and network signals to identify confirmed intrusions.
-
Route based on behavioral triage
DecisionDirect the hunt to containment if malicious behavior is confirmed, or to manual review otherwise.
-
Isolate compromised web server
Response actionImmediately contain the host showing evidence of exploitation to prevent lateral movement.
-
Manual forensic review
Analyst taskReview the context of suspicious alerts to confirm or tune the behavioral queries.
-
Close out: No critical exposure
Analyst taskDocument that no critical exploitable vulnerability was found on internet-facing assets.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| Exploitation of Public-Facing Applications T1190 |
Yes | vulnerable-internet-assets |
| Post-Exploit Execution T1190 |
Yes | web-shell-execution |
| Multi-hop Proxy C2 T1090.003 |
Yes | proxy-traffic-prevalence |
Blind spots
- Needs Real-time vulnerability scanning. The hunt might target systems already remediated but not yet updated in the inventory. It would answer whether the vulnerability finding is current or represents a previously patched state.
- Needs Application layer protocol identification. Common ports like 8080 are frequently used for both proxies and legitimate internal services, creating false positives. It would answer whether traffic on proxy ports is legitimate administrative traffic or multi-hop C2.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
lookback_days | number | 14 | Days of history to examine for behavioral signals. |
proxy_ports | list[string] | 9001, 9050, 1080, 8080 | Ports commonly used by Tor or multi-hop proxy networks. |
scope_hosts | list[host] | — | Hostnames identified in the lead step; populate this to run behavioral queries on a specific scope. |
shell_processes | list[string] | cmd.exe, powershell.exe, sh, bash, zsh | Common shell binaries spawned by exploited web processes. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
| Network telemetry | network | network |
Source
---
analysis: A static rule for web shells is prone to noise from administrative activity.
This hunt adds the context of a confirmed vulnerable state and stack-counts outbound
proxy traffic to isolate rare C2 patterns that simple rules miss.
blind_spots:
- id: vulnerability-data-staleness
question: whether the vulnerability finding is current or represents a previously
patched state
requires: Real-time vulnerability scanning
risk: The hunt might target systems already remediated but not yet updated in the
inventory.
stage: initial-access-vulnerability-exploitation
- id: proxy-port-ambiguity
question: whether traffic on proxy ports is legitimate administrative traffic or
multi-hop C2
requires: Application layer protocol identification
risk: Common ports like 8080 are frequently used for both proxies and legitimate
internal services, creating false positives.
stage: c2-multi-hop-obfuscation
coverage:
- stage: initial-access-vulnerability-exploitation
status: covered
steps:
- vulnerable-internet-assets
- stage: execution-post-exploitation
status: covered
steps:
- web-shell-execution
- stage: c2-multi-hop-obfuscation
status: covered
steps:
- proxy-traffic-prevalence
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: promote-to-detection
justification: The collapsing patch window creates a period of elevated risk where
static rules are insufficient; hunting for behavioral indicators of exploitation
on vulnerable assets provides a necessary adaptive control.
methodology: model-assisted
trigger: intel-report
hypothesis: An adversary has exploited a critical vulnerability in a public-facing
web application during the window before patching and is using a multi-hop proxy
to mask command-and-control traffic.
labels:
- hunt
- attack.t1190
- attack.t1090.003
name: Exploitation and Obfuscated C2 in the Patch Window
parameters:
lookback_days:
default: '14'
description: Days of history to examine for behavioral signals.
from:
kind: manual
observed: '2024-05-22'
ref: Default setting
type: number
proxy_ports:
default:
- '9001'
- '9050'
- '1080'
- '8080'
description: Ports commonly used by Tor or multi-hop proxy networks.
from:
kind: article
observed: '2024-05-22'
ref: T1090.003 common ports
type: list[string]
scope_hosts:
default: []
description: Hostnames identified in the lead step; populate this to run behavioral
queries on a specific scope.
from:
kind: manual
observed: '2024-05-22'
ref: Analyst input from lead step
type: list[host]
shell_processes:
default:
- cmd.exe
- powershell.exe
- sh
- bash
- zsh
description: Common shell binaries spawned by exploited web processes.
from:
kind: article
observed: '2024-05-22'
ref: Standard T1190 artifacts
type: list[string]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://azure.microsoft.com/en-us/blog/the-patch-window-is-collapsing-why-security-needs-a-new-control-plane/
gates:
- dry-run
- lint
model: hb_google/gemini-3-flash-preview
rationale: Start with internet-facing assets identified by vulnerability scans. Priority
is given to high-severity findings where an exploit is known to be available.
references:
- name: 'MSRC Blog: The patch window is collapsing'
url: https://azure.microsoft.com/en-us/blog/the-patch-window-is-collapsing-why-security-needs-a-new-control-plane/
related:
- hunt: container-vulnerability-exploitation
reason: This hunt focuses on traditional web servers; containers require distinct
logic on hb_software_inventory.
relation: out-of-scope-alternative
scenario:
stages:
- name: Exploitation of Public-Facing Applications
observables:
- HTTP requests targeting specific disclosed CVEs
- Anomalous HTTP/2 connection patterns (concurrent stream limits, request constraints)
- Automated vulnerability scanning from external IP addresses
- Rapid exploitation following public PoC disclosure
slug: initial-access-vulnerability-exploitation
tactic: initial-access
techniques:
- T1190
- name: Post-Exploit Execution
observables:
- Web server processes (e.g., w3wp.exe, httpd) spawning shell processes (cmd.exe,
bash)
- In-memory execution or fileless code delivery
- Process spawning with unexpected integrity levels
slug: execution-post-exploitation
tactic: execution
techniques:
- T1190
- name: Multi-hop Proxy C2
observables:
- Outbound connections to Tor exit nodes
- Communication with Operational Relay Box (ORB) networks
- DNS lookups for .onion or proxy-related domains
- Encrypted C2 traffic traversing multiple proxy layers
slug: c2-multi-hop-obfuscation
tactic: command-and-control
techniques:
- T1090.003
summary: Adversaries leverage the shrinking window between vulnerability disclosure
and patch deployment to exploit public-facing applications at internet scale.
These campaigns often involve rapid, AI-assisted weaponization followed by command-and-control
traffic routed through multi-hop proxies like Tor or ORB networks to obfuscate
the origin of the attack.
severity: medium
targets:
analyst:
name: Tier-2 analyst
role: analyst
endpoint:
category: endpoint
name: Endpoint telemetry (hb_ surfaces)
telemetry:
- endpoint
hunter:
agent: true
name: Hunt agent
network:
category: network
name: Network telemetry
telemetry:
- network
tlp: clear
type: investigation
---
# Exploitation and Obfuscated C2 in the Patch Window
As the time between vulnerability disclosure and weaponization collapses, organizations face elevated risk during the remediation gap. This gated hunt first identifies internet-exposed systems with high-severity exploitable vulnerabilities. If the exposure is confirmed, the hunt fans out to identify behavioral artifacts: web server processes spawning command shells and rare outbound connections to proxy infrastructure. An agent then triages these signals together to identify active intrusions that bypassed initial network controls.
## vulnerable-internet-assets
<!-- Identify exploitable internet-facing assets -->
Find systems with critical vulnerabilities where an exploit is known to be available, providing the lead for behavioral analysis.
```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hostnames and their critical CVEs. Silence suggests no current
high-risk exploitable surface in the vulnerability inventory.
reads:
- device_uid
- cve_uid
- severity
- severity_id
- is_exploit_available
- status
- hostname
silence: not_evidence_of_absence
source: hb_vulnerability_finding
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT DISTINCT d.hostname AS device_hostname, v.cve_uid, v.severity, v.affected_package_name FROM hb_vulnerability_finding v JOIN hb_devices d ON v.device_uid = d.device_uid WHERE v.severity_id >= 4 AND v.is_exploit_available = 'TRUE' AND v.status != 'suppressed'
```
## assess-exposure
<!-- Assess exposure risk -->
```agent target=hunter
cite: required
context:
- vulnerable-internet-assets
max_iterations: 3
objective: Determine if any discovered vulnerability on internet-facing hosts represents
an immediate risk that warrants behavioral monitoring.
success_criteria: A verdict citing specific vulnerable hosts that require follow-up.
tools:
- endpoint
- network
```
## gate-on-exposure
<!-- Gate on identified risk -->
if~: "the assess-exposure verdict confirms at least one high-risk vulnerable host is present" (confidence: high, judge=hunter)
then: → behavior-fan-out
indeterminate: → manual-review
unavailable: → manual-review (blind_spot: vulnerability-data-staleness)
else: → no-exposure-close-out
## behavior-fan-out
<!-- Analyze behavior on vulnerable assets -->
parallel:
- → web-shell-execution
- → proxy-traffic-prevalence
join: → triage-behavior
## web-shell-execution
<!-- Web server shell spawning -->
Identify web server processes spawning interactive shells, a hallmark of successful T1190 exploitation.
```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts, shell_processes=shell_processes)
~~~yaml
expected: A web server (w3wp, nginx, apache) spawning a shell process. This is high-confidence
evidence of exploitation.
reads:
- device_hostname
- process_name
- process_cmd_line
- parent_process_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, process_name, process_cmd_line, parent_process_name, time FROM hb_process_activity WHERE (LOWER(parent_process_name) LIKE '%w3wp.exe' OR LOWER(parent_process_name) LIKE '%httpd' OR LOWER(parent_process_name) LIKE '%nginx' OR LOWER(parent_process_name) LIKE '%apache2') AND (instr(',' || '{{shell_processes}}' || ',', ',' || LOWER(process_name) || ',') > 0 OR instr(',' || '{{shell_processes}}' || ',', ',' || replace(LOWER(process_name), rtrim(LOWER(process_name), replace(LOWER(process_name), '\', '')), '') || ',') > 0 OR instr(',' || '{{shell_processes}}' || ',', ',' || replace(LOWER(process_name), rtrim(LOWER(process_name), replace(LOWER(process_name), '/', '')), '') || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## proxy-traffic-prevalence
<!-- Rare outbound proxy connections -->
Find rare outbound connections to proxy or ORB ports from the scoped vulnerable hosts.
```sqlite target=network role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts, proxy_ports=proxy_ports)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: Proxy ports reached by a small number of hosts in the scoped environment.
Silence suggests no obvious multi-hop C2 via standard proxy ports.
prevalence:
by: device_hostname
key:
- dst_endpoint_ip
- dst_endpoint_port
rare_below: 3
reads:
- dst_endpoint_ip
- dst_endpoint_port
- device_hostname
- time
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT dst_endpoint_ip, dst_endpoint_port, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_network_connection WHERE instr(',' || '{{proxy_ports}}' || ',', ',' || CAST(dst_endpoint_port AS TEXT) || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY dst_endpoint_ip, dst_endpoint_port HAVING host_count <= 3
```
## triage-behavior
<!-- Triage behavior and exposure -->
```agent target=hunter
cite: required
context:
- assess-exposure
- web-shell-execution
- proxy-traffic-prevalence
max_iterations: 5
objective: Determine if any host shows evidence of post-exploitation execution or
rare outbound proxy communication within the context of known vulnerabilities.
success_criteria: A per-host verdict (malicious | suspicious | benign) citing specific
process or network rows.
tools:
- endpoint
- network
```
## route-on-verdict
<!-- Route based on behavioral triage -->
if~: "the triage-behavior verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-and-remediate
indeterminate: → manual-review
unavailable: → manual-review (blind_spot: proxy-port-ambiguity)
else: → manual-review
## isolate-and-remediate
<!-- Isolate compromised web server -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the identified host using the endpoint agent. Collect process memory and web server logs for forensic analysis before patching.
```
→ manual-review
## manual-review
<!-- Manual forensic review -->
```manual target=analyst
Examine the command lines of spawned shells. Verify if outbound proxy connections are related to administrative tools or known C2 frameworks.
```
→ end
## no-exposure-close-out
<!-- Close out: No critical exposure -->
```manual target=analyst
Record the negative result. Note that while no exploitable vulnerabilities were identified today, the patch window remains a critical gap for future disclosures.
```
→ end
Run it
Take this hunt into your environment.
Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.
Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.