The ticket that pretends every listed address is the same problem
A shared abuse feed lights up at 09:14. The address sits on three lists: one tags it scanner, one tags it spam, and one tags it malware C2. Your edge firewall already dropped the inbound SYN flood. The ticket gets closed as perimeter noise. Six hours later, identity logs show a service account that talked to that same address over HTTPS from a jump host the week before the listing landed.
That sequence is the daily failure mode for IP-blocklist hunting. The match is treated as a single object with a single meaning. In live environments, the same address can sit in reconnaissance, staging, credential harvest, or command-and-control depending on which of your assets touched it and when. Category labels describe what someone else observed. Your hunt has to place the address on your kill chain.
Recent campaign reporting keeps forcing that point. The 0ktapus-style waves that hit large batches of firms leave phishing-kit and relay hosts on public feeds while live sessions and MFA-bypass artifacts remain inside tenants. AI-assisted OSINT and fraud tooling make first-contact infrastructure cheaper to rotate. Papercut-style swarm patterns compress the time between probe and exploitation, so a scanner label from Tuesday can be the wrong mental model by Thursday. Trusted AI and SaaS platforms show up as both delivery channels and exfil paths, which means a listed IP may be a shared edge that also serves legitimate traffic. H1 malware and vulnerability trend writeups keep showing short-lived VPS exits sitting next to ordinary cloud neighbors. None of that fits a one-label, one-playbook response.
What a match actually asks you to decide
Before you open a full incident, answer four questions from telemetry you already own:
- Direction: inbound only, outbound only, or both?
- Asset class: anonymous edge, authenticated user path, admin surface, or high-value server?
- Timing: first contact before listing, after listing, or both?
- Sibling signals: DNS names, TLS fingerprints, user agents, usernames, or process parents that travel with the IP?
Those four answers place the address on a kill-chain rung. Inbound SYN noise against a public web VIP with no auth traffic stays in reconnaissance hygiene. The same IP in outbound beaconing from a domain controller after a listing is post-compromise work. A hit that only appears in mail-gateway URL rewriting for a kit domain sits in initial access. Treating all three as “block and move on” leaves the interesting cases under-scoped.
A concrete placement matrix
Keep a one-page matrix in the SOC wiki. Rows are directions and asset classes; columns are pre-listing vs post-listing contact. Each cell names a playbook depth:
- Edge probe, post-listing only: confirm drop rules, sample payload if logged, check neighbor /24 for the same signature within 48 hours.
- Edge probe, pre-listing contact: rebuild the contact window, correlate usernames and URIs, check whether any probe graduated to auth attempts.
- User egress to listed host: pull proxy and EDR process tree, check for token theft and session reuse, pivot to related domains via passive DNS.
- Admin or identity egress: full hunt clock: privilege review, session revocation scope, and lateral-movement search across the same identity.
- Conflicting feed labels on one address: run the deeper playbook suggested by your telemetry, not the softest public tag.
When Brazilian government sites were turned into SEO weapons by a Chinese-speaking actor, investigators who trusted a single country or category tag chased the wrong continent. The same trap appears with IP feeds: the public tag is a hint, and your session graph is the decision surface.
Today: make the match produce a placement, not a close reason
Ship three operational changes before the shift ends.
- Require a kill-chain field on every blocklist ticket. Values: recon, delivery, credential access, C2/exfil, unknown. Analysts cannot close without choosing one and pasting the one log line that justified it.
- Auto-enrich direction and asset class. On match, join firewall, proxy, VPN, and identity logs for ±7 days around first and last contact. Surface inbound vs outbound counts and whether any destination was an admin path (SSH, RDP, hypervisor, IdP, cloud console).
- Split “drop confirmed” from “hunt complete.” Firewall drop is a control note. Hunt complete needs the placement field plus a recorded search for pre-listing contact from internal assets.
Implementation detail that pays off immediately: store the listing timestamp from the feed (or the first time your collector saw the address) next to your earliest internal sighting. If internal sighting precedes listing by days, default placement moves toward staging or C2 until proven otherwise. If listing precedes all internal sightings and contact is inbound-only to a public VIP, default stays recon.
For 0ktapus-like patterns, add a fast check on every phishing-kit or “malware” tagged address: did any corporate identity hit that host or its sibling domains, and do any of those identities still hold active SSO sessions? Password resets clear forms; session hunts clear access.
This week: wire playbooks to placement, and rehearse conflicting labels
Spend the week turning the matrix into runnable queries and one tabletop.
Build three query packs
- Recon pack: unique source IPs, targeted ports, URI diversity, and whether probes stopped at unauthenticated paths.
- Access pack: auth successes/failures, MFA outcomes, impossible-travel adjacent signals, and mailbox or SaaS rule changes for identities that touched the address or its domains.
- C2 pack: periodic outbound connections, low-jitter beacons, uncommon JA3/JA4 or SNI, and DNS that resolves the listed IP from internal resolvers before and after listing.
Run the packs in order of your placement field. Do not run the C2 pack as default busywork on scanner-only edge noise. Do run the access pack whenever the address shares infrastructure patterns with trusted AI or SaaS edges used in recent abuse reporting: shared hosting and platform front doors produce “benign ASN, hostile path” cases that category tags miss.
Tabletop the conflict case
Pick a real address that appeared on two feeds with different categories last month. Have one analyst place it using only feed tags, and another place it using only your logs with tags hidden. Compare outcomes. Most teams discover they have been letting soft labels shrink hunt scope. Rewrite the runbook so conflicting labels escalate to the deeper pack automatically.
Tune retention for the questions you ask
If you only keep three days of proxy logs, pre-listing contact hunts fail on short-lived VPS infrastructure that appears in current malware trend reporting. Aim for at least 14–30 days of edge, DNS, and auth logs for addresses that ever touch admin or identity systems. That retention decision is a hunt capability, not a compliance afterthought.
This quarter: measure placement quality and shrink time-to-rung
Quarter-scale work turns ad hoc craft into a controllable process.
- Define a placement accuracy metric. Sample closed blocklist tickets monthly. Score whether the kill-chain field matched what a senior hunter would choose from the same evidence. Target steady improvement, not perfection on day one.
- Track time-to-rung. Measure minutes from feed match to a documented placement decision. Separate that from time-to-containment. Fast wrong placement creates false closure; slow correct placement misses swarm-tempo campaigns.
- Add infrastructure pivots as standard depth for access and C2 placements. From the listed IP, pull passive DNS, certificate subjects, and historically co-hosted neighbors. Hunt those siblings against your egress and mail logs. This is how you catch the wave that already left the listed node for a clean address in the same campaign.
- Create a shared-infrastructure exception path. When the listed IP belongs to a major cloud, CDN, or AI platform edge, ban blanket deny as the default “hunt done” action. Require tenant-, host-, URL-, or token-scoped investigation instead. Governance pressure around AI use makes this operationally urgent: attackers abuse the same platforms your business blesses.
- Feed outcomes back into allow/deny design. Recon-only placements should tighten edge filters and honeypot coverage. Access and C2 placements should drive identity controls, EDR detections, and outbound policy. Blocking remains useful; it becomes a byproduct of placement rather than a substitute for it.
Worked scenario: one address, three rungs
Monday: a VPS address starts hitting your VPN portal with password sprays. Feed A lists it as scanner on Wednesday. Your ticket notes inbound drops and closes.
Thursday: Feed B relabels the same address as phishing infrastructure after another victim reports a kit. Your mail gateway logs show two employees fetched a URL that resolved to that IP on Tuesday—before your listing awareness. Placement should move from recon to delivery/credential access. The hunt pulls those identities’ SSO session lists, checks for new mailbox forwarding, and reviews whether the VPN sprays ever produced a success against a reused password.
Friday: EDR on a jump host shows scheduled curl traffic to the IP over port 443 with a custom SNI. Placement moves to C2. Containment expands from blocking the IP to isolating the host, rotating credentials that touched it, and pivoting to certificate and DNS siblings for the rest of the campaign.
Same address. Three placements. Three different depths. The feed was the trigger; the kill-chain field was the work.
Actionable takeaways operators can paste into the runbook
- Every blocklist match gets a kill-chain placement backed by one primary log citation.
- Pre-listing internal contact upgrades hunt depth automatically.
- Conflicting public categories escalate to the deeper local playbook.
- Shared cloud and AI platform edges require scoped hunts, not victory-lap blocks.
- Measure time-to-rung and placement accuracy monthly; adjust query packs from the misses.
- Use neighbor, DNS, and certificate pivots whenever placement reaches access or C2.
IP blocklists remain one of the fastest external interrupts a SOC receives. Their value shows up when the interrupt forces a precise question: where does this address sit on our kill chain right now? Teams that answer that question with direction, asset class, timing, and sibling signals turn noisy feeds into hunts that match how attackers actually move—through short-lived nodes, shared platforms, and stages that change faster than a single category tag can describe.