DoHFind is a Windows Volatility 3 extension/plugin that helps investigators identify DNS over HTTPS (DoH) activity in memory and surface artifacts relevant to Command and Control (C2) analysis.
DoH-based C2 is attractive to adversaries because it can look like normal encrypted web traffic while quietly carrying DNS command channels. In real investigations, that can mean:
- Missed DNS-layer detections
- Reduced domain-level visibility
- Delayed understanding of malware staging/exfiltration behavior
Modern malware and C2 frameworks increasingly abuse DoH because it blends DNS traffic into normal HTTPS (443/tcp) and bypasses many traditional DNS controls.
Classic DNS visibility relies on UDP/TCP 53 telemetry from enterprise resolvers. DoH changes this model:
- DNS queries are encapsulated in HTTPS requests (often to public resolvers like Google or Cloudflare).
- Domain resolution activity may not appear in normal enterprise DNS logs.
- Security teams may only see encrypted outbound HTTPS to a trusted resolver domain/IP.
From an incident response perspective, memory can still contain highly valuable traces:
- DoH request URLs (
/resolve?name=...,/dns-query?dns=...) - HTTP headers (
application/dns-message) - JSON response fragments (
"Answer","Question","Status") - Decoded domains and resolved IPs
- Encoded high-entropy labels used in DNS-based exfiltration
DoHFind was built to bridge this visibility gap during triage and deep investigation.
DoHFind performs a two-phase workflow:
- Network triage via
netscan
- Identifies processes with connections involving port
443. - Associates candidate PIDs with remote addresses.
- Focuses memory scanning on likely HTTPS-active processes (unless
--scan-allis used).
- Process memory artifact extraction
- Walks each target process VAD region.
- Searches for DoH request/response indicators.
- Extracts investigation-ready data fields (domain, detail, context).
python vol.py -f <memory_image> windows.dohfindThis scans only processes that netscan associates with port 443 activity.
python vol.py -f <memory_image> windows.dohfind --pid 1234 5678python vol.py -f <memory_image> windows.dohfind --scan-allUse this when:
netscancoverage is incomplete for the memory image- You suspect historical artifacts in memory without active 443 objects
python vol.py -f <memory_image> windows.dohfind --include-corruptThis may increase coverage in damaged/smeared memory but can also add noise.
- Run
windows.infoandwindows.pslistto baseline image quality and process inventory. - Run
windows.netscanto understand active/recoverable network artifacts. - Run
windows.dohfindto extract DoH-focused process memory evidence. - Pivot by
PIDandDomaininto complementary plugins (cmdline,dlllist,handles,malfind, etc.). - Correlate extracted domains/IPs with external intelligence and timeline data.
DoHFind provides forensic leads, not final attribution. Treat hits as evidence candidates:
- Validate suspicious domains/IPs against expected enterprise traffic.
- Compare repeated findings across multiple memory regions and processes.
- Correlate with endpoint logs, proxy logs, EDR telemetry, and timeline context.
Potential false positives can occur when generic strings (for example https, dns, or JSON fragments) appear in unrelated buffers.
The plugin currently reports the following artifact types:
DoH JSON API Request- Examples:
GET /resolve?name=<domain>&type=A
- Examples:
DoH RFC8484 GET Request- Example:
/dns-query?dns=<base64url> - Attempts to decode DNS wire payload into a queried domain name
- Example:
DoH Resolver Hostname- Known resolver domains (Google, Cloudflare, Quad9, OpenDNS, etc.)
DoH Content-Typeapplication/dns-message,application/dns-json
DoH JSON Response- Extracts
name,data, andtypewhere available
- Extracts
DoH JSON Question- Standalone question block with corroborating JSON context
DoH Resolver IP- Known resolver IP near DoH/HTTPS context in memory
DNS Exfiltration- High-entropy long labels near DoH markers (potential tunneling/exfil pattern)
- This plugin depends on standard Volatility 3 Windows plugin ecosystem components (notably
pslistandnetscan). - In many environments,
netscanavailability requirespefile. - If
netscancannot load, install missing dependencies and re-run.
Example dependency install:
pip install pefile