← All hunts high TLP:CLEAR

D2IP Malware and Obfuscated HTTP Exfiltration

An adversary is using hard-coded IP addresses and malformed HTTP protocols to bypass DNS-based security controls, exfiltrate data, and proxy credential theft in real-time.

Based on research by Unit 42 2026-09-20 12 steps · 5 queries T1041 T1056.001 T1071.001 T1105 T1132.001 T1185 T1568

Brief

The Shift to DNS Bypass

Unit 42 recently published research titled "Almost Half of Malware Samples Communicate Direct to IP" (https://unit42.paloaltonetworks.com/malware-bypass-dns-direct-to-ip/). The study shows that 44% of malware samples now avoid DNS resolution to evade security controls. This tactic renders standard DNS-based filtering and reputation checks blind. Security teams that rely solely on domain monitoring to block threats miss a significant portion of active infections. This hunt addresses that gap by targeting the behavioral patterns that remain visible on the network and application layers.

How the Hunt Flows

The first phase scopes the environment using the hb_software_inventory surface. This step identifies active hosts and establishes a baseline for the search. An analyst uses this list to define the hunt scope or to focus on specific high-risk segments of the estate where exfiltration is most likely to occur.

The second phase targets the network plane. It uses the hb_network_connection surface to perform two parallel searches. One search matches outbound traffic against a list of known malicious C2 IP addresses identified in the Unit 42 research. The other search stacks outbound connections where the destination hostname is missing. Because legitimate software typically resolves a domain before connecting, a missing hostname indicates a direct-to-IP connection. The hunt filters for rare destinations seen on three or fewer hosts to remove common administrative traffic and focus on unique anomalies.

The third phase pivots to the application layer for corroboration. It uses the hb_http_activity surface to find malformed HTTP methods and suspicious URI paths. The hunt looks for the backslash-GET method, which is a definitive indicator of specific malware families attempting to bypass web application firewalls. It also monitors for unusually long URIs and specific paths like /churl and /fsave. These paths are associated with the Phorpiex and SectopRAT families for payload delivery and credential theft.

The final phase synthesizes the evidence. An automated agent evaluates hosts that appeared in both the network and application phases. It looks for the overlap: a host making rare direct-to-IP connections that also shows malformed HTTP behavior. This correlation allows an analyst to confirm a compromise with high confidence.

Blind Spots

This hunt has two primary blind spots. First, it relies on hb_http_activity for method and path visibility. If the adversary uses TLS encryption and the environment lacks a decrypted forward proxy, the specific HTTP headers remain hidden. Only the raw IP metadata from hb_network_connection remains available. Second, local DNS cache hits can skew results. If a host resolves a domain but the telemetry source only captures live network lookups, a connection might appear as a DNS bypass when it was actually a legitimate domain-based request.

How to Run the Hunt

This hunt exists as an open hunt.md playbook. You can import it into Huntbase or any runtime that supports the hunt.md format. The playbook contains all the logic to scope the environment, run the network and application queries, and synthesize the results into a final verdict. It is designed for periodic execution to identify malware that avoids your existing DNS-based security stack.

Steps

  1. Scope to managed endpoints

    Query · scoping

    Identify active hosts in the inventory to provide a baseline for the scope_hosts parameter.

    reads hb_software_inventorysql
    SELECT DISTINCT device_hostname FROM hb_software_inventory WHERE package_type IN ('deb', 'rpm', 'msi', 'pkg')

    What a hit looks like. A list of hostnames representing the managed estate. This step is for inventory reference.

  2. Match known C2 IP addresses

    Query · enrichment

    Identify any host directly contacting the IP addresses named in the research.

    reads hb_network_connectionsql
    SELECT device_hostname, process_name, dst_endpoint_ip, dst_endpoint_port, time FROM hb_network_connection WHERE instr(',' || '{{c2_ips}}' || ',', ',' || dst_endpoint_ip || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Connections to specific report IPs. Silence is expected if the adversary has rotated their infrastructure.

  3. Stack-count connections without DNS resolution

    Query · baseline

    Find rare outbound connections where the hostname is missing, indicating a D2IP bypass.

    reads hb_network_connectionsql
    SELECT dst_endpoint_ip, process_name, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_network_connection WHERE (dst_endpoint_hostname IS NULL OR dst_endpoint_hostname = '') AND direction = 'outbound' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY dst_endpoint_ip, process_name HAVING host_count <= 3 ORDER BY host_count ASC

    What a hit looks like. Small clusters of hosts talking to an IP that was never resolved via DNS. Benign tools (like internal admin scripts) will have high host counts.

  4. Evaluate early C2 and D2IP findings

    Agent triage

    Determine which hosts exhibit the most suspicious Direct-to-IP behavior to focus the follow-on application search.

  5. Detect malformed backslash-GET and long URIs

    Query · detection candidate

    Find the high-fidelity backslash-GET method and URIs with lengths (250-666) characteristic of exfiltration.

    reads hb_http_activitysql
    SELECT device_hostname, http_method, url_full, LENGTH(url_full) AS uri_len, time FROM hb_http_activity WHERE (http_method LIKE '%\GET%' OR LENGTH(url_full) BETWEEN 250 AND 666) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Requests using '\GET' or unusually long URIs. Benign tracking scripts may have long URIs, but the '\GET' string is a definitive malware indicator.

  6. Detect suspicious proxy and dropper endpoints

    Query · triage

    Find traffic to endpoints used by Phorpiex and SectopRAT for payload delivery and credential exfiltration.

    reads hb_http_activitysql
    SELECT device_hostname, url_path, url_hostname, time FROM hb_http_activity WHERE (instr(',' || '{{malicious_paths}}' || ',', ',' || LOWER(url_path) || ',') > 0 OR url_path LIKE '%/hiddenbin/%') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. Requests to /churl, /fsave, /st.exe, or hidden directories. Matching these on hosts that also show D2IP behavior confirms a high-confidence threat.

  7. Final synthesis and verdict

    Agent triage

    Correlate early stage network findings with the follow-on application signals to identify confirmed compromises.

  8. Route on verdict

    Decision

    Direct confirmed threats to containment and ambiguous cases to manual review.

  9. Isolate compromised host

    Response action

    Prevent further exfiltration of credentials and data.

  10. Analyst review and tuning

    Analyst task

    Review evidence for ambiguous findings and refine the D2IP baseline.

  11. Close out

    Analyst task

    Document findings and schedule the hunt for future execution.

Coverage

Scenario coverage

StageCoveredHow, or why not
D2IP Payload Delivery
T1105
Yes match-known-c2-ips, suspicious-proxy-endpoints
DNS-Bypass Command and Control
T1071.001 · T1568
Yes baseline-d2ip-connections, match-known-c2-ips
Obfuscated HTTP Exfiltration
T1041 · T1132.001
Yes malformed-backslash-get
In-Browser Proxy Credential Theft
T1185 · T1056.001
Yes suspicious-proxy-endpoints

Blind spots

  • Needs hb_http_activity from a decrypted forward proxy. Malware using TLS will hide its URI and HTTP method from the surface, leaving only raw IP destination metadata in hb_network_connection. It would answer whether encrypted HTTPS requests use the backslash-GET method or malicious paths.
  • Needs hb_dns_activity covering both live lookups and local cache hits. A host might appear to be performing D2IP if its local cache answered the query and the telemetry source only captures live network DNS traffic. It would answer whether a connection was truly D2IP or simply missed because the OS cache was used.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
c2_ipslist[ip]154.92.19.71, 178.16.54.109, 87.120.107.33, 194.76.227.94, 2.26.98.67, 62.60.179.230, 91.92.243.29, 103.245.236.146, 178.16.54.31, 206.189.229.43Known malicious destination IP addresses from the research.
lookback_daysnumber14Days of history to examine.
malicious_pathslist[string]/churl, /fsave, /new.php, /st.exeURI paths associated with Phorpiex and SectopRAT exfiltration and payload delivery.
scope_hostslist[host]Optional list of hostnames to focus the hunt; leave empty to scan the entire estate.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint
Network telemetrynetworknetwork
Web server / proxy logssiemnetwork

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A simple detection rule for the backslash-GET method or known IPs is easily
  bypassed by rotation. This hunt adds value by baselining Direct-to-IP behavior across
  the fleet, allowing an analyst to find unknown threats using the same behavioral
  profile.
blind_spots:
- id: incomplete-proxy-visibility
  question: whether encrypted HTTPS requests use the backslash-GET method or malicious
    paths
  requires: hb_http_activity from a decrypted forward proxy
  risk: Malware using TLS will hide its URI and HTTP method from the surface, leaving
    only raw IP destination metadata in hb_network_connection.
  stage: obfuscated-http-exfiltration
- id: dns-cache-hits
  question: whether a connection was truly D2IP or simply missed because the OS cache
    was used
  requires: hb_dns_activity covering both live lookups and local cache hits
  risk: A host might appear to be performing D2IP if its local cache answered the
    query and the telemetry source only captures live network DNS traffic.
  stage: dns-bypass-c2
coverage:
- stage: direct-to-ip-payload-delivery
  status: covered
  steps:
  - match-known-c2-ips
  - suspicious-proxy-endpoints
- stage: dns-bypass-c2
  status: covered
  steps:
  - baseline-d2ip-connections
  - match-known-c2-ips
- stage: obfuscated-http-exfiltration
  status: covered
  steps:
  - malformed-backslash-get
- stage: in-browser-proxy-theft
  status: covered
  steps:
  - suspicious-proxy-endpoints
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: keep-as-periodic-hunt
  justification: Nearly half of malware with C2 activity bypasses DNS entirely. This
    hunt correlates connection metadata (D2IP) with application indicators (malformed
    methods) to identify what standard DNS-based filtering misses.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An adversary is using hard-coded IP addresses and malformed HTTP protocols
  to bypass DNS-based security controls, exfiltrate data, and proxy credential theft
  in real-time.
labels:
- hunt
- attack.t1071.001
- attack.t1568
- attack.t1041
- attack.t1132.001
- attack.t1185
- attack.t1056.001
- attack.t1105
name: D2IP Malware and Obfuscated HTTP Exfiltration
parameters:
  c2_ips:
    default:
    - 154.92.19.71
    - 178.16.54.109
    - 87.120.107.33
    - 194.76.227.94
    - 2.26.98.67
    - 62.60.179.230
    - 91.92.243.29
    - 103.245.236.146
    - 178.16.54.31
    - 206.189.229.43
    description: Known malicious destination IP addresses from the research.
    from:
      kind: article
      observed: '2024-08-04'
      ref: unit42-d2ip-2024
    type: list[ip]
  lookback_days:
    default: '14'
    description: Days of history to examine.
    from:
      kind: manual
      observed: '2024-08-04'
      ref: standard-lookback
    type: number
  malicious_paths:
    default:
    - /churl
    - /fsave
    - /new.php
    - /st.exe
    description: URI paths associated with Phorpiex and SectopRAT exfiltration and
      payload delivery.
    from:
      kind: article
      observed: '2024-08-04'
      ref: unit42-d2ip-2024
    type: list[string]
  scope_hosts:
    default: []
    description: Optional list of hostnames to focus the hunt; leave empty to scan
      the entire estate.
    from:
      kind: manual
      observed: '2024-08-04'
      ref: analyst-defined
    type: list[host]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://unit42.paloaltonetworks.com/malware-bypass-dns-direct-to-ip/
    gates:
    - dry-run
    - lint
    - critic
    model: hb_google/gemini-3-flash-preview
rationale: Start with general endpoints. If high-fidelity malformed HTTP activity
  is detected, focus specifically on those hosts and expand the lookback to catch
  the original infection vector.
references:
- name: "Unit 42 \u2014 Almost Half of Malware Samples Communicate Direct to IP"
  url: https://unit42.paloaltonetworks.com/malware-bypass-dns-direct-to-ip/
related:
- hunt: standard-http-c2-path-hunting
  reason: This hunt focuses on connections that lack a preceding DNS resolution; standard
    hunts assume resolution exists.
  relation: out-of-scope-alternative
scenario:
  stages:
  - name: D2IP Payload Delivery
    observables:
    - /st.exe
    - /hiddenbin/
    - Wget/1.13.4
    - HTTP Range headers
    - 178.16.54.109
    - 2.26.98.67
    slug: direct-to-ip-payload-delivery
    tactic: execution
    techniques:
    - T1105
  - name: DNS-Bypass Command and Control
    observables:
    - wss://154.92.19.71:39989
    - 154.92.19.71
    - 87.120.107.33
    - 194.76.227.94
    - Hardcoded IP addresses in binary strings
    - TCP connections without prior DNS queries
    slug: dns-bypass-c2
    tactic: command-and-control
    techniques:
    - T1071.001
    - T1568
  - name: Obfuscated HTTP Exfiltration
    observables:
    - \GET method prefix
    - URI length 250-666 characters
    - Hex-like payload encoding
    - Rotating destination ports and IPs
    slug: obfuscated-http-exfiltration
    tactic: exfiltration
    techniques:
    - T1041
    - T1132.001
  - name: In-Browser Proxy Credential Theft
    observables:
    - /churl
    - /fsave
    - pcid
    - clid
    - 87.120.107.33
    - 194.76.227.94
    slug: in-browser-proxy-theft
    tactic: credential-access
    techniques:
    - T1185
    - T1056.001
  summary: Nearly half of modern malware samples bypass DNS-based defenses by using
    direct-to-IP (D2IP) communication for command-and-control and payload delivery.
    High-profile threats including Phorpiex, SectopRAT, and Mozi botnets utilize this
    technique to download components, exfiltrate credentials via in-browser proxies,
    and maintain P2P mesh networks while remaining invisible to DNS security layers.
severity: high
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
  web:
    category: siem
    name: Web server / proxy logs
    telemetry:
    - network
tlp: clear
type: investigation
---


# D2IP Malware and Obfuscated HTTP Exfiltration

This hunt identifies malware that avoids DNS resolution, rendering standard DNS-based filtering blind. It focuses on identifying Direct-to-IP (D2IP) connections, corroborating them with malformed HTTP signals like the backslash-GET method and long encoded URIs, and checking for specific browser-proxy endpoints used by SectopRAT for credential theft. It follows a phased approach to link network-level anomalies with application-layer evidence of exfiltration.

## scope-managed-endpoints
<!-- Scope to managed endpoints -->
Identify active hosts in the inventory to provide a baseline for the scope_hosts parameter.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hostnames representing the managed estate. This step is for inventory
  reference.
reads:
- device_hostname
- package_type
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT DISTINCT device_hostname FROM hb_software_inventory WHERE package_type IN ('deb', 'rpm', 'msi', 'pkg')
```

## early-parallel
<!-- Search for early stage C2 and D2IP behavior -->
parallel:
- → match-known-c2-ips
- → baseline-d2ip-connections
join: → early-stage-agent

## match-known-c2-ips
<!-- Match known C2 IP addresses -->
Identify any host directly contacting the IP addresses named in the research.

```sqlite target=network role=enrichment params=(c2_ips=c2_ips, scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: Connections to specific report IPs. Silence is expected if the adversary
  has rotated their infrastructure.
reads:
- device_hostname
- process_name
- dst_endpoint_ip
- dst_endpoint_port
- time
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, process_name, dst_endpoint_ip, dst_endpoint_port, time FROM hb_network_connection WHERE instr(',' || '{{c2_ips}}' || ',', ',' || dst_endpoint_ip || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## baseline-d2ip-connections
<!-- Stack-count connections without DNS resolution -->
Find rare outbound connections where the hostname is missing, indicating a D2IP bypass.

```sqlite target=network role=baseline params=(scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: Small clusters of hosts talking to an IP that was never resolved via DNS.
  Benign tools (like internal admin scripts) will have high host counts.
prevalence:
  by: device_hostname
  key:
  - dst_endpoint_ip
  - process_name
  rare_below: 3
reads:
- dst_endpoint_ip
- process_name
- device_hostname
- dst_endpoint_hostname
- direction
- time
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT dst_endpoint_ip, process_name, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_network_connection WHERE (dst_endpoint_hostname IS NULL OR dst_endpoint_hostname = '') AND direction = 'outbound' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY dst_endpoint_ip, process_name HAVING host_count <= 3 ORDER BY host_count ASC
```

## early-stage-agent
<!-- Evaluate early C2 and D2IP findings -->
```agent target=hunter
cite: required
context:
- match-known-c2-ips
- baseline-d2ip-connections
max_iterations: 3
objective: Identify hosts making rare or matched outbound connections that bypassed
  DNS resolution.
success_criteria: A verdict of suspicious or malicious for hosts with low-prevalence
  D2IP traffic.
tools:
- endpoint
- network
- web
```

## follow-on-parallel
<!-- Search for obfuscation and exfiltration -->
parallel:
- → malformed-backslash-get
- → suspicious-proxy-endpoints
join: → follow-on-agent

## malformed-backslash-get
<!-- Detect malformed backslash-GET and long URIs -->
Find the high-fidelity backslash-GET method and URIs with lengths (250-666) characteristic of exfiltration.

```sqlite target=web role=detection-candidate params=(scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: Requests using '\GET' or unusually long URIs. Benign tracking scripts may
  have long URIs, but the '\GET' string is a definitive malware indicator.
reads:
- device_hostname
- http_method
- url_full
- time
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, http_method, url_full, LENGTH(url_full) AS uri_len, time FROM hb_http_activity WHERE (http_method LIKE '%\GET%' OR LENGTH(url_full) BETWEEN 250 AND 666) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## suspicious-proxy-endpoints
<!-- Detect suspicious proxy and dropper endpoints -->
Find traffic to endpoints used by Phorpiex and SectopRAT for payload delivery and credential exfiltration.

```sqlite target=web role=triage params=(malicious_paths=malicious_paths, scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: Requests to /churl, /fsave, /st.exe, or hidden directories. Matching these
  on hosts that also show D2IP behavior confirms a high-confidence threat.
reads:
- device_hostname
- url_path
- url_hostname
- time
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, url_path, url_hostname, time FROM hb_http_activity WHERE (instr(',' || '{{malicious_paths}}' || ',', ',' || LOWER(url_path) || ',') > 0 OR url_path LIKE '%/hiddenbin/%') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## follow-on-agent
<!-- Final synthesis and verdict -->
```agent target=hunter
cite: required
context:
- early-stage-agent
- malformed-backslash-get
- suspicious-proxy-endpoints
max_iterations: 5
objective: Link D2IP connections from the first phase to malformed HTTP exfiltration
  or browser-proxy activity in the second phase.
success_criteria: A malicious verdict for any host where a D2IP network connection
  correlates with malformed HTTP methods or known-bad URIs.
tools:
- endpoint
- network
- web
```

## route-on-verdict
<!-- Route on verdict -->
if~: "the follow-on-agent verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: incomplete-proxy-visibility)
else: → close-out

## isolate-host
<!-- Isolate compromised host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host immediately. Collect the binary responsible for the network traffic and examine it for hard-coded IP strings. Revoke any browser session tokens used by the host during the lookback period.
```
→ analyst-review

## analyst-review
<!-- Analyst review and tuning -->
```manual target=analyst
Examine the context of the D2IP connections. If the destination is a cloud provider (AWS/Azure) and the URI contains long encoded strings, prioritize the investigation. Verify if the process is a legitimate browser or a standalone binary.
```
→ end

## close-out
<!-- Close out -->
```manual target=analyst
Record the results. If no malicious activity was found, ensure any newly discovered legitimate D2IP admin tools are noted for future exclusions.
```
→ 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, critic, then reviewed by a person.