TaHiTI · Targeted Hunting integrating Threat Intelligence · Stop searching, start hunting · opening post of a weekly TaHiTI series · HackForLab cyber threat intelligence · hunt methodology cover

Stop Searching, Start Hunting: A TaHiTI Hunt-Program Walkthrough Against This Week’s Threat Surface

● METHODOLOGY · TLP:CLEAR · APPLIED WALKTHROUGH · JUL 20-26, 2026 DATASET

77,118 unique indicators. 155 clusters. 25 attributed APT clusters running in parallel this cycle — the widest concurrent APT footprint of the year. This is not a list of things to block. It is a hunt-program-scale challenge that no ad-hoc query survives.

TaHiTITargeted Hunting integrating Threat Intelligence — is the framework that turns a threat surface this wide into a queue of executable hunts, a backlog of scored hypotheses, and a shipping-cadence for detection content. Developed by the Dutch Financial Community in 2018, it is the discipline that separates hunt programs that scale from hunt teams that burn out.

This post is a walkthrough. We take the live intelligence from this week, categorise the adversary surface into eight hunt-program buckets, generate fifteen ABLE-scored hypotheses across those buckets, execute two hunt sprints end-to-end (three MUST-hunts + three SHOULD-hunts), and ship six detection-engineering handoffs. TaHiTI theory is present but demoted — the point of this post is application.

Written for the working threat hunter, the SOC senior moving into hunting, and the detection engineer whose queue never empties. Vendor-neutral. Program-first. Operator-grade.

THE INTEL FEED THIS WALKTHROUGH RUNS ON

Every indicator in this post — every subnet anchor, every hash cluster, every category count — comes from the same threat-intelligence feed the HuntIntel operator console exposes. Category-tagged, ATT&CK-mapped, confidence-scored, ready for hunt-time enrichment.

Open HuntIntel →

01 · TaHiTI in 60 seconds

The framework is small on purpose. Six steps in three phases, with threat intelligence flowing as continuous input beneath. If you can hold this diagram in your head, you can operate a TaHiTI program.

// THE FRAMEWORK · 3 PHASES · 6 STEPS · CONTINUOUS TI INPUT
01
INITIATE
01Formulate initial hypothesis
02Store in hunt backlog
02
HUNT
03Define hunt scope + queries
04Execute + iterate
03
FINALIZE
05Document findings
06Handoff + improve
▬▬▬ THREAT INTELLIGENCE ▬▬▬

Continuous input across every phase. Feeds initial hypothesis (Step 01), scopes execution (Step 03), enriches findings (Step 05). If a hunt does not touch threat intelligence at all three points, it is not TaHiTI.

Three phases, briefly

  • Initiate — a signal (threat intelligence, incident retro, red-team output, analyst intuition) becomes an ABLE-scored hypothesis stored in the hunt backlog.
  • Hunt — the hypothesis is scoped, converted to a query cascade, and executed until it is confirmed, refuted, or promoted to a follow-up.
  • Finalize — the outcome becomes documented findings, detection-engineering tickets, or awareness bulletins. Nothing is lost.

ABLE is the hypothesis-quality standard: every hypothesis must name an Actor, a Behavior, a Location, and expected Evidence. A hypothesis that scores less than 4/4 is not backlog-ready.

That is the entire framework. The rest of this post is what happens when you apply it to the intelligence that landed on your desk this week.


02 · The adversary surface — eight hunt-program categories

77,118 unique indicators across 155 clusters is not a hunt plan. It is raw material. Before we can hunt, we must categorise. TaHiTI programs categorise the adversary surface into buckets that map to hunt-program planning — each bucket ends up with its own hypothesis, its own scope, its own priority. Below is how the current week’s dataset decomposes.

# Adversary category IOC footprint Data signal Priority Sprint
C·1 Polymorphic loader operators

Two families producing hash surge at build-farm scale
~15,000 hashes Loader-tier hash volume MUST Sprint 1
C·2 ICS/OT PLC-targeted campaign

Active external probing of internet-facing programmable logic controllers
26 IOCs · 3 subnet anchors OT-protocol port signal MUST Sprint 1
C·3 DPRK-adjacent double-track

Cryptocurrency-focused APT + IT-worker infiltration operating in parallel
147 IOCs combined Collaboration-platform lookalike DNS + HR-pipeline anomalies MUST Sprint 1
C·4 Novel delivery vector — SVG-embedded scripts

Script payloads inside image files, bypasses attachment scanners
25 IOCs Mail-gateway MIME + endpoint file-write SHOULD Sprint 2
C·5 Drive-by fake-update malware campaign

Compromised sites injecting fake browser-update prompts
143 IOCs Web-proxy download-from-non-corporate signal SHOULD Sprint 2
C·6 Regional APT clusters

Russian-aligned + Middle East + tracked-cluster group operating concurrently
~500 IOCs across 20 clusters Subnet-anchor first-seen contact SHOULD Sprint 2
C·7 Commodity RAT and info-stealer clusters

Multiple commodity families with C2 infrastructure this cycle
~250 IOCs across 8 families Beacon regularity + newly-registered destination COULD Sprint 3+
C·8 Phishing-kit infrastructure

Broad domain-infrastructure phishing operation
1,700+ IOCs DNS + mail-flow domain-matching COULD Sprint 3+

How to read this table

Priority is a TaHiTI-native scoring call, not a threat-severity rating. MUST-hunt categories combine high adversary tier, active exploitation risk, and strategic-vertical impact. SHOULD-hunt categories are important-but-not-urgent — work them if capacity allows. COULD-hunt categories represent broad-and-noisy signal that yields more from detection content than from a bespoke hunt.

Sprint assignment is a capacity-planning call. A single hunter with 12 hours per week can execute 2-3 hunts. A team of three can execute 8-10. Categories drop into Sprint 1 (this week), Sprint 2 (next week if MUST-hunts confirm), or Sprint 3+ (backlog). Nothing is skipped — the backlog is the durable state.

The categorisation itself is the hunt program. A hunt team that cannot describe its adversary surface in eight buckets does not have a program — it has a query list. The bucket structure is what makes the backlog prioritisable, the retro loop meaningful, and the metrics comparable across weeks.

03 · The hunt backlog — 15 ABLE-scored hypotheses from this week’s intelligence

Every category above produces one or two hypotheses. Below is the full backlog. All fifteen have been ABLE-scored (Actor, Behavior, Location, Evidence) and priority-tagged. The priority is the hunt-program-planning call, not a threat-severity rating. Effort estimates are hunter-hours end-to-end.

ID Cat. Hypothesis (ABLE-form) ABLE Priority Effort Data
H·01 C·1 [A] Polymorphic loader-family operators (~15k hash surge from two families) [B] browser-or-document-reader process spawns downloaded binary that beacons outbound within 60s [L] workstation endpoints [E] EDR process-create + network-connect events correlated within 60s to non-corporate destination on web ports 4/4 MUST 4h EDR + TI
H·02 C·1 [A] Loader operators as above [B] deliver the loader via mail attachment that user opens from a shared-document-preview lure [L] mail flow + endpoint file-write [E] mail-flow entries with attachment MIME suggesting document-preview, joined to endpoint file-write of executable payload within 15 minutes 4/4 MUST 3h Mail + EDR
H·03 C·2 [A] External adversary from PLC-targeted subnet anchors (185.82.73.0/24, 175.110.121.0/24, 88.80.150.0/24) [B] probes internet-facing PLCs using OT-protocol packets (Modbus TCP/502, EtherNet/IP/44818, DNP3/20000) [L] perimeter firewall + OT DMZ [E] firewall entries matching source-subnet + OT-destination-port 4/4 MUST 2h FW + OT flow
H·04 C·2 [A] Same PLC-focused actor [B] initiates OT-protocol traffic from a compromised internal host to internet-external PLC or OT-vendor destination [L] internal OT segment + egress [E] netflow records with OT-protocol port, source = internal OT-segment IP, destination = external 4/4 MUST 2h OT netflow
H·05 C·3 [A] DPRK-adjacent cryptocurrency-focused cluster (subnet anchor 45.61.163.0/24) [B] uses lookalike collaboration-platform domain naming for fake meeting-join lures [L] DNS logs from developer, engineering, and finance subnets [E] DNS queries matching lookalike-domain regex from host with role tag dev, eng, or finance 4/4 MUST 3h DNS + roles
H·06 C·3 [A] DPRK-adjacent IT-worker infiltration operator [B] applies to remote-work positions using fabricated identity, interviews from IPs geo-inconsistent with claimed residence [L] HR applicant-tracking system + interview logs [E] ATS records where interview IP geolocation, VPN indicator, or claimed-residence country mismatch by any two criteria 4/4 MUST 6h HR + BG
H·07 C·4 [A] Any operator using SVG-script delivery vector (25 IOCs this cycle) [B] delivers SVG attachment containing embedded JavaScript, executes on browser render [L] mail gateway + endpoint file-write [E] mail-flow entries with MIME image/svg+xml AND content-inspection flags “script” or “javascript:” substring in body 4/4 SHOULD 3h Mail + EDR
H·08 C·5 [A] Drive-by fake-update operator (143 IOCs) [B] compromises legitimate-looking sites to inject fake browser-update download prompts [L] web proxy + endpoint download folder [E] proxy log where user browsed legitimate-looking site then downloaded an update payload from non-corporate domain within same session 4/4 SHOULD 4h Proxy + EDR
H·09 C·6 [A] Russian-aligned APT cluster active this cycle [B] initiates first-seen contact from an internal host to a subnet-anchor known-active this week [L] netflow + threat-intel enrichment [E] netflow record where destination CIDR matches attributed subnet-anchor list and (host, destination) pair is first-seen within last 90 days 4/4 SHOULD 2h Netflow + TI
H·10 C·6 [A] Middle East regional operations cluster (33 IOCs, all 4 primary types) [B] establishes C2 channel via newly-registered domain resolved to attributed IP [L] DNS + netflow [E] DNS query to domain with registration age < 30d resolving to IP in attributed range, from any workstation 4/4 SHOULD 3h DNS + TI
H·11 C·6 [A] Tracked-cluster group (identifiers this cycle) [B] reuses infrastructure across multiple concurrent operations (subnet reuse pattern) [L] netflow [E] more than two distinct hosts in our environment making outbound to the same attributed /24 within 24h 4/4 SHOULD 2h Netflow
H·12 C·7 [A] Commodity RAT operator (multiple families this cycle) [B] beacons out on a regular interval (jitter within tight window) to a newly-registered destination [L] netflow + DNS [E] repeated outbound flows from same (host, destination) pair with inter-flow interval variance under 10% and destination-domain age under 30d 4/4 COULD 4h Netflow + TI
H·13 C·7 [A] Info-stealer family (multiple families this cycle) [B] exfiltrates browser credential store to attacker-controlled destination [L] EDR file-read + network egress [E] EDR file-read on browser credential-store path, followed within 5 minutes by outbound POST with payload size > 100 KB 4/4 COULD 4h EDR + netflow
H·14 C·8 [A] Phishing-kit operator (broad domain infrastructure, 1,700+ IOCs) [B] hosts credential-collection pages on newly-registered domains, users navigate from email links [L] mail-flow link-inspection + DNS [E] mail-flow entries with link matching attributed domain-list, joined to DNS query from recipient host within 24h 4/4 COULD 3h Mail + DNS
H·15 C·8 [A] Same phishing-kit operator [B] collects credentials via HTTP POST to attacker-controlled endpoint from user-input event [L] proxy + endpoint form-submit event [E] proxy log with POST to attributed domain-list from a workstation, within 30 seconds of endpoint form-submit event 4/4 COULD 3h Proxy + EDR

Fifteen hypotheses. Six MUST, five SHOULD, four COULD. Total effort: 48 hunter-hours. Two hunters at 20 hours per week each clears the MUST tier by Wednesday, the SHOULD tier by Friday, and starts the COULD tier the following Monday. That is a realistic weekly hunt-program rhythm.


04 · Sprint 1 — executing the three MUST-hunts

Monday morning, the hunt team pulls the three MUST-hunts (H·01, H·03, H·05) off the top of the backlog. Total estimated effort: nine hunter-hours. Two hunters splitting the load can clear the sprint by Tuesday evening. Below is what actually happens.

// HUNT · H·01 · POLYMORPHIC LOADER CHAIN

Sprint 1 · Hunt 01 — Polymorphic loader chain end-to-end

Category C·1 · MUST-priority · 4 hunter-hours estimated · Owner: Sr. Threat Hunter

STEP 03 · SCOPE (locked before first query)
Data: EDR process-create · EDR network-connect · DNS · TI enrichment table
Window: last 30 days
Coverage: all managed workstation endpoints (2,180 hosts)
Stop: 4h consumed OR 5 confirmed TPs OR 200 candidates cleared with 0 TPs
Q·01 · BROAD SWEEP · browser or doc-reader parent → downloaded binary
FROM edr_process_create AS pc
WHERE pc.parent_image IN ('<browser-A>','<browser-B>','<browser-C>',
                          '<mail-client>','<word-processor>',
                          '<spreadsheet>','<presentation>',
                          '<pdf-reader>')
  AND pc.image_path REGEXP '(Downloads|Temp|AppData/Local/Temp)/'
  AND pc.image_extension IN ('exe','dll','scr','bat','app')
  AND pc.event_time >= NOW() - INTERVAL 30 DAY
Result: 8,412 events — too noisy. Iterate with allowlist.
Q·01B · filter allowlisted signers
... [Q01] ...
  AND (pc.image_signer_subject IS NULL
       OR pc.image_signer_subject NOT IN (allowlisted_signers))
  AND pc.image_signature_status != 'valid_trusted'
Result: 1,247 events. Correlate to network.
Q·02 · correlate to outbound web within 60s
FROM edr_process_create AS pc
JOIN edr_network_connect AS nc
  ON nc.host = pc.host
  AND nc.parent_process_sha256 = pc.image_sha256
  AND nc.event_time BETWEEN pc.event_time
                        AND pc.event_time + INTERVAL 60 SECOND
WHERE ... [Q01B conditions] ...
  AND nc.dest_port IN (80, 443, 8080, 8443)
  AND nc.dest_ip NOT IN CIDR('10.0.0.0/8','172.16.0.0/12','192.168.0.0/16')
  AND nc.dest_ip NOT IN (allowlisted_corporate_egress)
Result: 89 correlated events across 41 hosts.
Q·03 · enrich with TI first-seen + domain-age
FROM [Q02 result] AS ev
LEFT JOIN threat_intel AS ti ON ti.value IN (ev.dest_ip, ev.dest_domain)
WHERE ti.first_seen_in_env >= NOW() - INTERVAL 7 DAY
   OR ti.domain_registration_age < INTERVAL 30 DAY
   OR ti.category IN ('malware','c2','loader')
Result: 11 high-confidence candidates. Triage.
Δ · OUTCOME
11 candidates → 3 confirmed TPs on 3 workstations. Payload hash matched this cycle’s polymorphic loader surge. Domains first-seen within 7 days, registration age < 14 days. Root cause: shared-document-preview email lure.

Hypothesis: CONFIRMED · IR ticket for 3 hosts · Sigma rule pattern promoted to Step 06 handoff · H·02 (same actor, different vector) escalated to Sprint 1.

// HUNT · H·03 · ICS/OT PLC PROBING

Sprint 1 · Hunt 02 — External PLC-probing across three subnet anchors

Category C·2 · MUST-priority · 2 hunter-hours estimated · Owner: OT-adjacent SOC lead

STEP 03 · SCOPE
Data: perimeter firewall accept/deny · OT DMZ netflow
Window: last 60 days
Coverage: all internet-facing perimeter interfaces + OT DMZ boundary
Stop: confirm any successful connection OR clear 100% of subnet-anchor probe attempts
Q·01 · probe attempts from three subnet anchors on OT ports
FROM perimeter_firewall
WHERE source_ip IN CIDR('185.82.73.0/24',
                        '175.110.121.0/24',
                        '88.80.150.0/24')
  AND destination_port IN (502, 44818, 20000,
                           34962, 34963, 34964)
  AND event_time >= NOW() - INTERVAL 60 DAY
| PROJECT source_ip, destination_ip, destination_port, action, event_time
Result: 47 probe attempts. All 47 are DENY. Good news — but only if the perimeter policy is actually enforcing.
Q·02 · verify no accept from these subnets on OT ports
FROM perimeter_firewall
WHERE source_ip IN CIDR('185.82.73.0/24',
                        '175.110.121.0/24',
                        '88.80.150.0/24')
  AND destination_port IN (502, 44818, 20000, 34962, 34963, 34964)
  AND action = 'accept'
Result: 0 rows. Perimeter is holding.
Q·03 · the deeper concern — is any internal host reaching out on OT ports?
FROM ot_dmz_netflow
WHERE destination_port IN (502, 44818, 20000, 34962, 34963, 34964)
  AND source_ip IN (internal_corporate_ranges)
  AND destination_ip NOT IN (known_ot_vendor_ranges)
| PROJECT source_ip, destination_ip, destination_port, bytes, event_time
Result: 0 rows. No unexpected internal-out OT-protocol traffic.
Δ · OUTCOME
Hypothesis: REFUTED for actual compromise. But the 47 probe attempts confirm the campaign is actively targeting us — the perimeter is holding. Findings:

· Perimeter block rules are validated (0 accepts on OT ports from the three anchors)
· No internal-out OT-protocol traffic to unexpected destinations
· Detection engineering ticket: promote a real-time alert on any accept from the three subnet anchors on any OT-protocol port (currently only in log-and-deny; alert should page)
· Retro: extend hypothesis library with H·04 (internal-out OT egress) as an ongoing baseline hunt every 60 days

// HUNT · H·05 · DPRK COLLABORATION-PLATFORM LURE

Sprint 1 · Hunt 03 — DPRK-adjacent lookalike-domain contact

Category C·3 · MUST-priority · 3 hunter-hours estimated · Owner: hunt team lead + TI analyst

STEP 03 · SCOPE
Data: DNS query logs · host-role tagging table · TI subnet-anchor list
Window: last 14 days (targeted — recent-campaign signal)
Coverage: hosts tagged dev, eng, finance, c-suite (highest-value targets for this cluster’s lure)
Stop: 3h consumed OR any confirmed lookalike-domain contact
Q·01 · lookalike-pattern DNS queries from high-value roles
FROM dns_query AS dq
JOIN host_role_tag AS ht ON ht.host = dq.source_host
WHERE ht.role_tag IN ('dev','eng','finance','c-suite')
  AND (
       dq.query_name REGEXP '^[a-z0-9]{2,10}\.(video-conf|meet|zoom-like|join|call)[^.]*\.(sbs|xyz|link|top|shop)$'
    OR dq.query_name REGEXP '.*(meeting|conference|videocall).*\.[a-z]{2,6}$'
        AND dq.query_name NOT IN (allowlisted_meeting_domains)
      )
  AND dq.query_time >= NOW() - INTERVAL 14 DAY
Result: 14 candidate queries across 9 hosts.
Q·02 · cross-check destination IP against attributed subnet anchor
FROM dns_resolution AS dr
WHERE dr.query_name IN [Q01 candidate list]
  AND dr.resolved_ip IN CIDR('45.61.163.0/24')
| PROJECT dr.query_name, dr.resolved_ip, dr.first_seen
Result: 2 queries resolving to the attributed /24. High confidence.
Q·03 · did the user then navigate?
FROM proxy_log AS pl
WHERE pl.destination_domain IN [Q02 confirmed list]
  AND pl.event_time >= [Q02 dns_time]
  AND pl.event_time <= [Q02 dns_time] + INTERVAL 10 MINUTE
| PROJECT pl.source_host, pl.destination_domain, pl.url_path, pl.status_code
Result: 1 host navigated. Downloaded an .msi installer claiming to be a “video conference plugin.”
Δ · OUTCOME
Hypothesis: CONFIRMED · one user in the finance role tag downloaded the payload · IR ticket for immediate containment + credential rotation for that user · downstream: brief cryptocurrency-adjacent teams on the specific lure pattern · Sigma rule pattern promoted (lookalike-domain regex + high-value role tag).

This is the highest-yield hunt of Sprint 1. One TP with severe potential impact, caught 4 days after the campaign IOCs first surfaced in the feed. That is a full week ahead of when a signature-based tool would have caught it.

End of Sprint 1

Three MUST-hunts executed. Two CONFIRMED (H·01 loader chain, H·05 DPRK lookalike domain), one REFUTED (H·03 ICS/OT probing — perimeter held, but 47 attributed probe attempts confirmed the campaign is active against us). Four IR tickets opened. Two Sigma-rule patterns promoted to Step 06 handoff. One user-awareness bulletin drafted for cryptocurrency-adjacent teams. One backlog escalation (H·02 loader delivery vector). Retro noted the ICS/OT hypothesis should recur every 60 days as a baseline hunt.

Notice what did not happen. No hunter said “let’s go hunt something,” no query returned “nothing found,” no analyst wasted eight hours in a scroll-through-alerts trance. Every hour spent was against a specific hypothesis with a defined stopping condition and a downstream handoff. That is the difference TaHiTI makes.

05 · Sprint 2 — three SHOULD-hunts (briefer walkthrough)

Sprint 2 begins Wednesday. The SHOULD-hunts do not warrant the same query-cascade depth as Sprint 1 (that is why they are SHOULD-tier), but they follow the same structure — scope, execute, iterate, close.

Hunt 04 — H·07 · SVG-embedded script delivery

Category C·4 · 3h · Mail-gateway + endpoint file-write. Query the mail gateway for the last 30 days for any attachment with MIME image/svg+xml where content-inspection flagged <script or javascript: substrings. Join to endpoint file-writes of .svg files to browser cache folders within 5 minutes of mail-delivery. Result: 6 candidate deliveries, 0 with subsequent endpoint activity (users did not preview) — hypothesis REFUTED for compromise, but the 6 delivered attachments confirm the campaign is testing our defences. Handoff: mail-gateway policy update to block (not just log) SVG attachments with embedded script content. Sigma rule promoted.

Hunt 05 — H·08 · Drive-by fake-update chain

Category C·5 · 4h · Web proxy + EDR download folder. Query the proxy for user sessions where a browse to a benign-category site was followed within 5 minutes by a download from a different, non-corporate domain claiming to be a browser or plugin update. Enrich with domain-age filter (registration < 30d). Result: 3 suspicious sessions, all cleared as false positives (legitimate but obscure SaaS onboarding flow — added to allowlist). Hypothesis REFUTED, allowlist improved. Handoff: web-proxy rule to flag downloads from newly-registered domains for user-visible confirmation.

Hunt 06 — H·09 · Regional APT subnet-anchor first-seen contact

Category C·6 · 2h · Netflow + TI enrichment. Query netflow for any internal host reaching an IP in the attributed subnet-anchor list where the (host, destination) pair was first-seen within the last 90 days. Enrich with attributed-cluster metadata from TI. Result: 5 candidate flows, 3 confirmed as false-positive (research team testing external services in the same CIDR block), 2 flagged for follow-up — opened as sub-hunts for the following week. Hypothesis DEFERRED pending investigation. Handoff: a targeted watch for the specific hosts flagged, escalation to sub-hunts for the next backlog cycle.

End of Sprint 2

Three SHOULD-hunts executed. All REFUTED for direct compromise, but each produced a downstream artefact: a policy update, an allowlist improvement, and two follow-up sub-hunts. This is what a healthy SHOULD-tier week looks like — the hunts do not confirm active infection, but they harden the environment and refine the backlog. The team ends the week with more capacity, not less.

06 · Detection engineering handoffs — six Sigma rules ship

Sprint 1 and Sprint 2 together produce six handoffs to detection engineering. Every confirmed and every well-scoped-refuted hunt yields at least one production artefact. This is the loop that compounds — each week’s hunts become the next week’s detection content, permanently improving coverage without permanently consuming hunter time.

Sigma Source hunt What it detects Severity Status Deploy
LDR-01 H·01 CONFIRMED Loader chain — browser/document parent → downloaded binary → 60s outbound web Medium Ready Real-time
LDR-02 H·01 + TI Loader chain enriched with TI (first-seen destination + registration age) High Ready Real-time (direct-to-queue)
OT-01 H·03 REFUTED-hardened OT-protocol traffic to/from attributed subnet anchors, or internal OT egress to non-vendor Critical Ready Real-time (page-on-fire)
DNS-01 H·05 CONFIRMED Lookalike-domain DNS from high-value role-tagged hosts High Ready Real-time
SVG-01 H·07 REFUTED-hardened SVG attachment with embedded script content at mail gateway High In review Blocking policy + alert
NET-01 H·09 DEFERRED First-seen (host, attributed-subnet) pair over 90-day window Medium Baseline Weekly report + alert on high-confidence anchors

Two Sigma rules ready to deploy today

Sigma LDR-01 · loader chain (universal, medium severity)

title: Loader Chain — Browser-or-Doc Parent Spawns Unsigned Binary from Downloads with 60s Outbound
id: 7f3c2a8e-6b45-4930-a681-3f9b5c2e8d10
status: experimental
description: |
  Detects the universal loader chain — browser or document-reader process
  spawns a binary from Downloads/Temp with no valid trusted signature, which
  then makes outbound web connection to non-corporate destination within 60s.
  Ships from HackForLab hunt H·01 CONFIRMED (3 TPs).
references:
  - https://hackforlab.com/tahiti-threat-hunting-framework-series-part-1/
author: HackForLab Threat Hunt Program
date: 2026/07/30
tags:
  - attack.execution
  - attack.t1204
  - attack.command_and_control
  - attack.t1105
  - attack.t1071.001
logsource:
  product: correlation
detection:
  s1_downloaded_binary:
    ProcessCreateEventID: any
    # Substitute your environment's actual process names
    ParentImage|endswith:
      - '\<browser-A>.exe'
      - '\<browser-B>.exe'
      - '\<mail-client>.exe'
      - '\<word-processor>.exe'
      - '\<spreadsheet>.exe'
      - '\<pdf-reader>.exe'
    Image|contains:
      - '\Downloads\'
      - '\Temp\'
      - '\AppData\Local\Temp\'
    ImageSignatureStatus|not:
      - 'valid_trusted'
  s2_outbound_web:
    DestinationPort: [80, 443, 8080, 8443]
    DestinationIp|expand: '%non_corporate_destinations%'
  condition: s1_downloaded_binary and s2_outbound_web within 60s
falsepositives:
  - Legitimate installers from allowlisted publishers (maintain signer allowlist)
level: medium

Sigma OT-01 · PLC-targeted subnet + OT-protocol egress (critical severity)

title: OT-Protocol Traffic to or from Attributed Subnet Anchors (ICS/OT)
id: 8d1a4b6f-5c92-4670-a881-3f9c7d5b2a40
status: experimental
description: |
  Detects any perimeter connection to or from three concentrated subnet
  anchors attributed to active PLC-targeted campaign, or internal OT-protocol
  egress to non-vendor destinations. Ships from HackForLab hunt H·03.
references:
  - https://hackforlab.com/tahiti-threat-hunting-framework-series-part-1/
author: HackForLab Threat Hunt Program
date: 2026/07/30
tags:
  - attack.command_and_control
  - attack.t1071
  - ics.t0819
  - ics.t0866
logsource:
  category: network_connection
detection:
  ot_subnet_anchors:
    DestinationIp|cidr:
      - '185.82.73.0/24'
      - '175.110.121.0/24'
      - '88.80.150.0/24'
  ot_protocol_egress:
    DestinationPort:
      - 502    # Modbus TCP
      - 44818  # EtherNet/IP
      - 20000  # DNP3
      - 34962  # Profinet
      - 34963  # Profinet
      - 34964  # Profinet
    DestinationIp|expand: '%external_destinations%'
  condition: ot_subnet_anchors or ot_protocol_egress
falsepositives:
  - Legitimate OT vendor remote-support (allowlist by known-good IPs)
level: critical

Handoff discipline is what makes TaHiTI a program instead of an activity. A hunt that confirms but never becomes a Sigma rule leaves no institutional memory. A hunt that refutes but never updates the allowlist or the mail-gateway policy leaves no operational improvement. Every hunt outputs at least one downstream artefact — that is a program-level requirement, not a hunter preference.


07 · Scaling TaHiTI when 25 APTs are concurrent

Twenty-five attributed APT clusters running in parallel is more adversary surface than any single hunter, or any small team, can chase in a single week. The temptation is to try — run twenty-five little hunts, one per cluster, spread thin, generate no findings, retreat exhausted. TaHiTI programs resist that temptation with three disciplines.

Discipline 1 · Ruthless prioritisation

Of 25 attributed APT clusters this cycle, only 3-6 are MUST-hunt for any given organisation. The MUST tier is defined by your adversary-tier + your asset value + your exploitation risk. A cryptocurrency-adjacent finance team hunts DPRK-adjacent clusters MUST; a heavy-industry utility hunts ICS/OT-focused clusters MUST; a research organisation hunts intellectual-property-focused clusters MUST. The rest is SHOULD or COULD.

The MUST tier is not a “most severe” ranking. It is a “most likely to matter to us this week” ranking. Twenty-two of twenty-five clusters this week did not make our MUST tier. That is correct.

Discipline 2 · Defer, do not ignore

The 22 non-MUST clusters do not disappear. They enter the backlog as SHOULD or COULD hypotheses. Every week the backlog is re-scored. A cluster that stays in the field for three weeks and gains fresh IOCs may promote from COULD to SHOULD. A cluster whose IOCs age out with no fresh signal retires quietly at 90 days.

The backlog is the durable state that lets a small team hunt a wide adversary surface. Without a backlog, every week the team either over-commits (25 shallow hunts) or under-commits (3 hunts, 22 forgotten). With a backlog, the coverage compounds over time.

Discipline 3 · Detection engineering compounds

Every confirmed hunt that ships a Sigma rule removes that hypothesis from the backlog going forward. Next week we no longer need to hunt the loader chain by hand — Sigma LDR-01 catches it in real time. The hunter cycles freed up move to the next-tier hypotheses. Over three months, a TaHiTI program that ships 4-6 Sigma rules per week converts what would be an infinite backlog into a stable one.

This is why the Sprint 3-and-beyond COULD-tier is not a “we never get to it” graveyard — it is the reservoir the program pulls from as detection engineering absorbs the MUST and SHOULD tiers over time.

The scaling answer. A team of two hunters running TaHiTI against a 25-APT surface can produce four production Sigma rules per week, defer sixteen hypotheses to a healthy backlog, and reduce the MUST-tier by one hypothesis every fortnight through detection-engineering absorption. That is a program that scales.

08 · The weekly cadence — making this repeatable

TaHiTI at program-scale runs on a weekly rhythm. Below is the cadence a working team of two hunters plus one part-time detection engineer maintains against the kind of adversary surface described above.

Day Activity Detail
Sunday PM (30 min) Intel review + backlog update Hunt lead reviews the previous week’s threat-intelligence feeds, weekly advisories, incident retros. New hypotheses ABLE-scored and added to the backlog. Priorities re-sorted for the week.
Monday AM (60 min) Sprint kickoff Hunt team pulls MUST-hunts off the top of the backlog. Scope locked (data sources, time windows, coverage, stopping conditions) for each. Ownership assigned.
Monday-Tuesday Sprint 1 execution (MUST-hunts) The 3-4 MUST-hunts are executed end-to-end. Findings documented as hunts complete. IR tickets opened immediately on confirmed TPs.
Wednesday-Thursday Sprint 2 execution (SHOULD-hunts) The next 3-4 SHOULD-hunts are executed. Depth is less than Sprint 1 — SHOULD is important-not-urgent.
Friday AM Detection-engineering handoff meeting (45 min) Hunt team + detection engineer walk through the week’s hunt outputs. Sigma rules drafted, promoted, deployed. Backlog updated with any follow-up sub-hunts.
Friday PM Retro (30 min) What worked, what did not, what data source was missing, what allowlist rule needs updating. Findings documents finalised. Metrics updated for the week.

Total weekly hunter-hours: ~24 (two hunters at 12 hours each). Weekly detection-engineering time: ~4 hours. Weekly hunt-lead overhead: ~3 hours. That is a working TaHiTI program at operational scale — not a research project, not a heroic effort, a sustainable weekly rhythm.

09 · What good looks like — four-week metric benchmark

Four weeks into a TaHiTI program running the weekly cadence above, a healthy dashboard shows the following. If your program lands close to these numbers, you are at L2 (TaHiTI-basic) with a trajectory to L3 (TaHiTI-integrated) within the following quarter.

Metric Week 1 Week 4 Healthy range
Hypotheses sourced 15 18-22 15-25 per week
Hunts executed 6 6-8 6-10 per week
Hypothesis confirmation rate 2/6 = 33% 2-3 / 8 25-45%
Sigma rules shipped 2 3-5 3-6 per week (declining as coverage matures)
Backlog size (open + deferred) 12 28-35 Growing but not exploding; retires at 90 days
Backlog age P50 3 days 10-15 days < 30 days
MUST-tier absorbed by detection engineering 0 3-5 hypotheses now covered by production rules Retire MUST when Sigma covers
Mean time to hypothesis (MTTH) 72h < 48h < 48h from intel release to backlog entry

What NOT to measure. Number of queries run. Number of alerts triaged. Time spent in the SIEM. These are vanity metrics — they reward activity, not outcome. The metrics above reward hunt yield and detection compounding, which are the only two things that make a hunt program better next month than it was this month.

10 · Frequently asked questions

Can a one-person hunt team run this cadence?

Yes — scaled down. A single senior analyst at 12 hours per week can pull the top 3 MUST-hunts, execute two of them, ship one Sigma rule, and update the backlog. Skip the SHOULD tier. Skip the retro (or roll it into the Sunday intel review). The core discipline — ABLE-scored hypotheses, backlog engineering, detection handoff — still applies. Volume drops; discipline does not.

What if we don’t have EDR? Can we still run TaHiTI?

Yes. TaHiTI is data-source agnostic. If you have SIEM logs (firewall, proxy, DNS, mail), you can hunt against a smaller set of hypotheses — the ones that require network telemetry rather than process telemetry. H·03, H·05, H·09, H·10, H·14 in the backlog above are all network-first. H·01 and H·13 are the ones that require EDR. Start with the network-first hypotheses; the program still delivers value.

The 25-APT figure — is that this week specific or a typical week?

Above baseline. Historical week-over-week in this catalogue: 8-15 attributed APT clusters is typical. 25 is the highest concurrent APT footprint year-to-date. Your program should scale down to typical weeks — but the discipline of ABLE + backlog + sprint + handoff is unchanged. The only variable is how many hypotheses land in the MUST tier that week.

How do we source hypotheses if we don’t subscribe to paid threat intelligence?

Weekly public threat advisories (like the HackForLab archive), ISAC bulletins for your sector, and post-incident retros produce enough hypothesis flow for a starting program. Paid TI adds volume and freshness but is not a gatekeeper. The HuntIntel operator console exposes the same feed the advisories are drawn from, category-tagged and confidence-scored, free to open.

What happens when a MUST-hunt confirms — who does the IR?

Hunt team hands off to IR immediately, with the hunt query attached so IR can re-run it for scope expansion. Hunter does not conduct the IR — that is a specialisation and TaHiTI is not an IR framework. But the hunt team owns the post-IR retro contribution: what should have caught this earlier? That retro item becomes the next detection-engineering ticket.

Should the hunt backlog be public within the organisation?

Within security, yes — hunt team, detection engineering, IR leads, TI analysts, SOC seniors. Wider than that, no. The backlog contains hypotheses about active adversary campaigns; exposing it beyond the security function risks tipping off insiders (in the case of insider-threat hypotheses) or generating noise (in the case of high-uncertainty hypotheses that turn out to be false positives).

How does TaHiTI integrate with an existing ATT&CK coverage map?

Directly. Every ABLE hypothesis maps to one or more ATT&CK techniques (the Behavior dimension). Every Sigma rule produced from a confirmed hunt ships with its ATT&CK tags. The coverage map grows organically as the hunt program produces detections. Over three months, the ATT&CK coverage delta becomes one of the strongest program-maturity signals.

What’s the single biggest failure mode we should watch for?

Skipping Phase 3. Programs run Phase 1 (hypotheses) and Phase 2 (hunts) enthusiastically, then never do the Phase 3 handoff — no documentation, no detection engineering, no retro. The program feels productive but generates no compounding value. If your hunt team has run twelve hunts in the last quarter and shipped zero Sigma rules, Phase 3 is broken. Fix Phase 3 first; everything else follows.

// WEEKLY TaHiTI · BOOKMARK FOR NEW PARTS

This walkthrough runs against the intelligence surfaced in the Jul 20-26 Weekly Threat Advisory. Every backlog hypothesis, every subnet anchor, every category count — all anchored to that feed.

Open HuntIntel →

Core Working Areas :- Threat Intelligence, Digital Forensics, Incident Response, Fraud Investigation, Web Application Security Technical Certifications :- Computer Hacking Forensics Investigator | Certified Ethical Hacker | Certified Cyber crime investigator | Certified Professional Hacker | Certified Professional Forensics Analyst | Redhat certified Engineer | Cisco Certified Network Associates | Certified Firewall Solutions | Certified Network Monitoring Solution | Certified Proxy Solutions

Leave a Reply

Your email address will not be published. Required fields are marked *

Enter Captcha Here : *

Reload Image