← Glossary

Threat Intel Concepts

IOC (Indicator of Compromise)

Also: Indicator of Compromise · indicators of compromise · IOCs · defanging · defanged URL · hxxp

In one sentence

An IOC is a piece of forensic evidence — a file hash, an IP address, a domain, a registry key, a mutex — whose presence on a system or in traffic indicates that a known intrusion has occurred.

Why it matters

IOCs are the currency of incident response and threat intelligence. A vendor report, a CERT advisory or a colleague's e-mail says "we saw evil-cdn[.]example and SHA-256 3a7f…"; you search your logs and endpoints for the same values, and either you are clean or you have a second incident. The whole sharing ecosystem — STIX/TAXII, MISP, ISACs, the blocklists your firewall pulls — exists to move these values from the first victim to everyone else faster than the attacker moves.

Their weakness is the flip side: an IOC describes one past instance of an attack. Change the hash by recompiling, the IP by renting a new VPS, and the indicator is dead. That is the point of David Bianco's Pyramid of Pain: hash values (trivial for the attacker to change) at the bottom, then IP addresses (easy), domain names (simple), network and host artefacts (annoying), tools (challenging) and at the top TTPs (tough) — behaviours the attacker cannot change without changing how they work. Detections built on the top of the pyramid outlive the campaign.

Kinds of indicator, and defanging

Atomic indicators stand alone: IPv4/IPv6 addresses, domains, URLs, e-mail addresses, file hashes (MD5, SHA-1, SHA-256), file names and paths, registry keys, mutex names, certificate fingerprints. Computed indicators are derived from data (a fuzzy hash, a JA3/JA4 TLS fingerprint, a YARA match). Behavioural indicators are patterns of the first two — at which point they shade into IOAs.

Every IOC needs context to be useful: where it was seen, when, in which campaign, how confident the source is, and a TLP (Traffic Light Protocol) marking saying who may see it — TLP:CLEAR, GREEN, AMBER, AMBER+STRICT, RED. An IP address that was malicious last Tuesday and is a shared cloud load balancer today is the classic false positive; expiry dates matter.

Defanging is the convention for writing indicators so that they cannot be accidentally clicked, auto-linked or fetched by a mail client, a chat tool or a ticketing system's link preview: http://evil.example.com/x becomes hxxp://evil[.]example[.]com/x, 203.0.113.7 becomes 203[.]0[.]113[.]7, user@evil.example becomes user[@]evil[.]example. Refanging reverses it before the value goes into a search or a blocklist. Reports and tickets should carry defanged values; tooling should refang on input.

Try it yourself hands-on

A partner's SOC sends you a plain-text list after a phishing wave:

hxxps://login-portal-example[.]com/auth
203[.]0[.]113[.]66
198.51.100.23
invoice-2026-09.zip  sha256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
billing[@]login-portal-example[.]com
  1. Paste the block into the IOC Pivoting Tool. It extracts and refangs every indicator, types them (URL, domain, IP, hash, e-mail) and lets you attach each to an incident and to the systems where you looked. Search your own logs for each value; record hits as relationships in the case.
  2. Found the domain in your proxy logs from two workstations? Add those systems to the case. The tool's pivot view now shows the partner's IOC, your two hosts and the incident as one graph — that is the artefact for the incident report.
  3. Export as STIX 2.1 from the same page (or via the STIX 2.1 Formatter for a plain list): each indicator gets a stable id and a TLP marking, so the bundle can go to your MISP instance or back to the partner without anyone retyping values.
  4. Writing it up for a wider audience? Run the final list through the IOC Defanger before it goes into e-mail or the ticket; the tool reports how many URLs, IPs and e-mails it defanged so you can spot one it missed. If the report will leave the company, the Log Redactor scrubs your own internal hostnames and users from the surrounding log lines first.

Common misreadings

  • Presence ≠ compromise. A DNS lookup of a bad domain by a security scanner, a hash of a legitimate tool the attacker also uses (PsExec), an IP shared by a CDN: verify before declaring.
  • IOCs age. Feeds without expiry produce blocklists that grow forever and block last year's cloud IPs. Prefer sources that carry valid_from/valid_until.
  • Your own IOCs are personal data. Attacker e-mail addresses and IPs fall under the GDPR; sharing them for security is lawful, keeping them forever is not.