LSN โ€” Local Sovereign Network

TI-2026-095H โ€” The Seven: Exploit Breadth and the Toolkit Families Behind the Web Attacks

Classification: HIGH ยท Forensic threat intelligence ยท Web-threats vector ยท Series: Below the Noise Floor

The previous seven letters each held up one campaign. This one steps back and asks a single question of all of them at once: when an IP throws an exploit at us, how many other exploits does it throw? The answer is sharper than folklore expects. Out of 318 web attackers, two-thirds throw exactly one. Ninety-nine throw two. Seven throw three. None throws four. And the moment you look at which exploits the versatile few combine, the anonymous mass resolves into something clean: not a spectrum of skill, but three separate toolkits, each run by its own operators, that never touch each other's tools. This is the map under the series.

1. One Question, Asked of Everyone

Every earlier letter was a portrait: the /dev/tcp dropper, the tunnel scout, the Equifax ghost, the config vultures, the roll call, the siege. Each was one campaign, examined closely. But a portrait cannot tell you how the subjects relate โ€” whether the config vultures and the Struts2 fleet are the same people in different clothes, or genuinely different populations.

The web-threats CVE-correlation engine lets us ask the relational question directly. It records, per IP, every CVE that IP was seen targeting. So intersect the actor rosters of every web CVE โ€” eleven of them, from the 2005 XML-RPC RCE to the 2023 git flaw โ€” and you get, for each of 318 distinct attacker IPs, its full set of exploits. The breadth of that set, and the composition of it, is the subject of this letter.

It is a synthesis, not a campaign. There is no single fleet here. There is the shape of all of them.

2. The Power Law: Most Attackers Know One Trick

The first result is the distribution of breadth, and it is steep:

Exploits thrownNumber of IPsShare
1 CVE21267%
2 CVEs9931%
3 CVEs72%
4+ CVEs00%

Two-thirds of the population throws exactly one exploit. Not a repertoire โ€” a single canned request, fired at everyone, forever. Another third throws two. And the entire "versatile" tail of the internet's web-attack traffic against this estate is seven addresses, each of which stops at three.

This cuts against the intuition of the omnivorous scanner that "throws everything." The overwhelming majority of web attackers are single-purpose tools: one exploit, one payload, run at scale by an operator who found something that works and does only that. The generalist is not the rule; the generalist barely exists.

There is an immediate, useful corollary. Because most IPs are single-exploit specialists, the one exploit you observe from an IP is, most of the time, its whole repertoire. When you see an IP POST to xmlrpc.php, you have โ€” two times in three โ€” seen everything it will ever do. And the rare IP that shows you a second, or a third, is by that fact disproportionately worth your attention.

3. The Sharper Result: Breadth Never Leaves the Family

The distribution alone is interesting. The composition is the finding.

Look at who the versatile IPs combine, and the overlap graph does not form one connected blob of shared tooling. It forms three separate components โ€” three toolkit families โ€” and no IP bridges them.

Family one โ€” WordPress / xmlrpc / PHP-legacy. All seven of the triple-polyglots live here. Their exploit sets are drawn from CVE-2005-1921 (XML-RPC RCE), CVE-2007-1893, CVE-2010-0397 (PHP xmlrpc DoS), and CVE-2017-5487 (WordPress user enumeration):

This family is offshore-weighted (BeGet, the /24 cluster, the ColocaTel Seychelles anchor from 095F), wears browser user-agents, and persists for weeks. It runs the full WordPress kit โ€” read the register, find xmlrpc, POST the amplified brute-force. And it never, once, throws Struts2 or PHPUnit.

Family two โ€” the RCE-sweep. The Struts2 + Spring-actuator pair (CVE-2017-5638 + CVE-2018-1273). These are the one-node-per-host cloud fleets of the Equifax-ghost (095D, DigitalOcean) and config-vultures (095E, Google Cloud) letters: 142.93.143.8 (turn.shuffle-on.com), 167.172.232.142 (lsn-wifi), 167.99.181.249 (mail.sonatural.life) and their kin, each throwing both the Struts OGNL RCE and the actuator secret-sweep, each partitioning the estate one node per subdomain. And they never throw WordPress or PHPUnit.

Family three โ€” PHP-RCE. The PHPUnit + Laravel + ThinkPHP trio (CVE-2017-9841 / 2021-3129 / 2018-20062) โ€” the weaponizers of 095C, the only CVEs the entity graph promoted to first-class targets edges. Their heaviest node, 209.182.216.63 (Kamatera, 10,920 hits), throws two of the three. And they never throw xmlrpc or Struts2.

Three families. Overlap inside each; zero overlap between. A WordPress operator is never a Struts2 operator. A Struts2 fleet never reaches for PHPUnit. The versatility that exists is entirely intra-family.

4. What the Structure Means

That disjointness is not what you would see if the web-attack population were one big pool of scanners rotating through a shared exploit database. If it were, breadth would smear across families โ€” you would find IPs that throw a WordPress probe and a Struts payload and a PHPUnit POST, because a generic scanner does not care which framework it is hitting. Instead the boundaries are clean. The exploits an IP combines are always from one toolkit, never mixed.

The honest reading is that these are three distinct operator ecosystems, each with its own tooling, its own hosting posture, and its own target logic:

Exploit breadth, in other words, is not a measure of an attacker's skill. It is a signature of their toolkit membership. And because the families are disjoint and internally coherent, that signature is a cheap, reliable attribution primitive: an IP's exploit set names its family, and its family predicts the rest of its kit and its likely next move โ€” better than any single request ever could.

5. The Series, Resolved Into a Taxonomy

This is why the letter closes the arc. The seven case studies were not seven unrelated curiosities; they were samples from three populations, and the breadth graph proves the populations are real and separate:

The campaigns did not overlap because the operators do not overlap. Struts2 fleets and WordPress swarms hit the same estate in the same months and never shared a single IP, because they are different people running different tools for different ends. The individual dossiers showed what each did; this one shows that they are genuinely three, not one โ€” and gives the population a map.

6. The Counter-Narrative

Steelman: "This is an artefact of your dictionary. You only correlate eleven CVEs; of course breadth looks small and families look clean โ€” you're not measuring the attackers, you're measuring your own signature set. And 'seven' is a rounding error."

The objection is fair on its face and the finding survives it, with caveats stated:

What is not claimed: that the three families are the only web-attacker toolkits (they are the ones resolvable in this CVE set); that no operator anywhere bridges them (only that none did against this estate in this window); or named attribution for any family (the anchors are hosting postures and toolkits, not people).

Confidence: HIGH that exploit breadth across the 318-IP, 11-CVE population is a steep power law and that breadth clusters into three disjoint toolkit families with no cross-family IP; MEDIUM on the interpretation that these are three fully separate operator ecosystems rather than partly-shared tooling.

7. Defence Response

8. A Note on Method

Built entirely through the web-threats MCP layer, with no direct database access โ€” the per-CVE actors endpoint (wt_cve_actors / GET /api/web-threats/cves/{cve}) fetched for eleven CVEs and intersected on source IP to build the exploit set of each of the 318 attackers. The breadth distribution and the family structure fall straight out of that intersection โ€” the same cross-CVE correlation that proved the 095Fโ†’095G link, generalised to the whole population. This letter is the reason the per-CVE endpoint was worth building: it turns a pile of single-campaign observations into a taxonomy.

9. Investigation Metadata

FieldValue
Dossier IDTI-2026-095H
SeriesBelow the Noise Floor (part 8 โ€” synthesis)
Population318 distinct web-attacker IPs across 11 CVEs
Breadth212 threw 1 CVE ยท 99 threw 2 ยท 7 threw 3 ยท 0 threw 4+
Families (disjoint)WordPress/xmlrpc (all 7 triples) ยท RCE-sweep (Struts2+actuator) ยท PHP-RCE (PHPUnit/Laravel/ThinkPHP)
Key findingBreadth clusters into three toolkit families and NEVER crosses them โ€” exploit set = family membership
Notable IPs5.101.157.130 (BeGet, WP-family triple) ยท 209.182.216.63 (Kamatera, PHP-RCE, 10,920 hits) ยท 142.93.143.8 (DO, RCE-sweep) ยท 146.19.78.227 / 157.22.126.251 (the 095Fโ†’095G link, WP-family)
Maps toPHP-RCE=095C ยท RCE-sweep=095D/E ยท WordPress/xmlrpc=095F/G
MethodBuilt entirely via the web-threats MCP layer (11-CVE roster intersection) โ€” no direct SQL
ConfidenceHIGH (power law + disjoint families); MEDIUM (three-separate-ecosystems interpretation)

Cristian Liศ™neanu ยท shuffle-on.com ยท Threat Intelligence

โš  Personal capacity. Research published independently โ€” not reflecting employer views. Derived from passive observation of attacks against personal infrastructure. Full disclaimer โ†’
โ† Previous Below the Noise Floor โ€” 8 / 8 Next โ†’