LSN โ€” Local Sovereign Network

๐Ÿชž HIGH โ€” The lone scanner is a myth. What hits the door is a census of fleets.

TI-2026-047C โ€” The Botnet Census

TI-2026-047C ยท Series: ๐Ÿชž The Glass Cage (Letter C) ยท TLP:WHITE
How coordinated web fleets betray themselves through three statistical fingerprints โ€” shared time, shared identity, and shared toolkits โ€” and what the patterns say when you read between the lines.

๐Ÿ“‹ The Short Version

  • 36 web campaigns at the LSN ingress total roughly 88,000 requests โ€” and they sort into three signatures of coordination.
  • Time โ€” 23 temporal bursts (19,450 reqs): Google Cloud harvests credentials, Azure uploads shells, on a near-daily clock.
  • Identity โ€” 4 empty-user-agent clusters (38,800 reqs): the Azure botnet, 33,451 requests from its US fleet alone.
  • Toolkit โ€” 9 shared-path clusters (29,633 reqs): groups requesting identical path dictionaries.
  • The headline: a 7-IP cluster spanning Amazon and Google shares the same 170-path .env dictionary. One operator. Two clouds.
  • Read between the lines and the dictionary โ€” not the IP โ€” turns out to be the attacker's true name.

An IP address is a disguise an attacker changes daily. A 170-line target list is a habit they cannot put down.

๐Ÿ”ญ How You Count a Crowd

Look at a single web-server log line and you see one IP asking for one file. Zoom out across a fortnight and tens of thousands of those lines, and something else appears: rhythm, repetition, and rehearsal.

A lone, opportunistic scanner is mostly a fiction at internet scale. What actually arrives at a well-instrumented door is a population โ€” and populations have demographics. The web-threats platform takes the census three ways, because coordination hides in three different places:

  • In time โ€” when many IPs from one network fire in a tight window, that is a schedule, and schedules imply a scheduler.
  • In identity โ€” when many IPs share an unusual trait (no user-agent at all), that shared trait is a shared client.
  • In toolkit โ€” when many IPs request the exact same unusual paths, they are reading from the same script.
23temporal-burst campaigns ยท 19,450 reqs
4empty-UA clusters ยท 38,800 reqs
9shared-path clusters ยท 29,633 reqs

Three lenses, one subject. Each catches coordination the others miss; together they turn an anonymous flood into a roster of distinct, repeat operators.

โฑ๏ธ Fingerprint One โ€” Coordination in Time

A human visits a website whenever they happen to think of it. A fleet visits when its controller tells it to โ€” and that produces a burst: a spike of requests from one network, sharing one intent, packed into a narrow window.

The 23 temporal-burst campaigns we recorded do not scatter randomly. They split with almost suspicious tidiness by provider and purpose:

NetworkWhat it does in its burstsRepresentative days (requests)
Google Cloud (AS396982)credential_harvest, api_enum06-08 (1,203) ยท 06-09 (1,634) ยท 06-10 (1,620) ยท 06-11 (1,470)
Microsoft Azure (AS8075)shell_upload, cms_detect06-12 (1,098) ยท 06-14 (562) ยท 06-25 (1,127) ยท 06-26 (941)

Day after day, Google's slice of the fleet goes looking for secrets and API surface; Azure's slice goes looking for places to drop and find webshells. The cadence is too regular, and the intent too cleanly separated, to be the sum of independent decisions.

๐Ÿ” Reading between the lines โ€” a near-daily burst cadence is the signature of cron, not curiosity. Someone scripted these to run on a timer. And the clean split โ€” Google for reconnaissance, Azure for exploitation โ€” hints at one of two things: either a single operation staged across two clouds (harvest first, weaponise second), or two distinct operator communities that each defaulted to a different hyperscaler's free tier. Either reading points away from "random internet noise" and toward planned, recurring operations with a calendar.

Takeaway โ€” rhythm is intent made visible. The burst detector turns a timestamp column into an org chart.

๐Ÿ•ณ๏ธ Fingerprint Two โ€” Coordination in Identity

Every legitimate web client announces itself. Your browser sends a long, specific User-Agent. Googlebot says it is Googlebot. Even most clumsy scanners send something. So when a large group of IPs sends nothing at all โ€” an empty user-agent โ€” that silence is not anonymity. It is a uniform.

The Azure empty-UA botnet is the clearest example in the census:

33,451requests ยท US fleet
3,234requests ยท GB fleet
2,115requests ยท SG + BR fleets

Nearly 39,000 requests, all from Microsoft AS8075, all wearing the same non-disguise. The empty header does not make a single node harder to attribute โ€” it makes the whole fleet trivial to group. They might as well have signed their work.

๐Ÿ” Reading between the lines โ€” an operator who genuinely wanted to hide would forge a plausible browser string; it costs one line of code. The decision to send nothing tells you stealth is not the priority โ€” throughput is. This is a volume business. The bet is that out of tens of thousands of requests, enough servers will be misconfigured that getting caught on the rest simply does not matter. They are not sneaking past the guard; they are walking past in numbers too large to stop one at a time.

Takeaway โ€” the empty user-agent is a confession, not a cloak. Uniform absence is as good a cluster key as a shared password.

๐Ÿงฐ Fingerprint Three โ€” Coordination in Toolkit

The first two fingerprints prove a fleet exists. The third proves who is holding the leash โ€” because nothing ties scattered IPs together as tightly as the discovery that they are all reading from the same page.

A "shared-exploit cluster" is a group of IPs that request the same unusual set of paths. One server getting asked for /.env.docker is background noise. Seven servers on two different clouds getting asked for the identical 170-path list, in the same window, is a fingerprint with almost no innocent explanation.

๐Ÿ† The smoking gun: one operator, two clouds 7 IPs ยท 170 paths

Seven IPs โ€” some on Amazon (AS16509), some on Google (AS396982) โ€” request the same 170-entry .env dictionary, an almost comically exhaustive sweep of every way a secrets file might be named:

.env.backup.env.old.env.bak.env.ci.env.dev.env.dist.env.docker.env.example.env.json.env.live.env.local.env.sample.env.preprod.env.prod.env.production.env.remote.env.saveโ€ฆ170 total

Two cloud providers do not independently invent the same 170-line list. This is one operator who deliberately spread a single toolkit across Amazon and Google โ€” members include 13.60.181.236 and 18.171.154.93.

๐Ÿ‘ป The webshell botnet 62 IPs ยท 13,260 reqs

The largest cluster: 62 Azure IPs across Singapore, Britain, the US and Brazil sharing a three-path check for whether a backdoor already exists:

/wp-content/plugins/hellopress/wp_filemanager.phpthis_is_a_new_hello_world.php/x.php/wefile.php/155.php/mac.php/ops.php/crgio.php/.well-known/about.php

The same odd filenames โ€” this_is_a_new_hello_world.php chief among them โ€” appear on dozens of unrelated IPs in four countries. That is not coincidence; it is the serial number of a single kit.

๐Ÿดโ€โ˜ ๏ธ Bulletproof meets backbone 19 IPs ยท 8 ASNs

A 19-IP cluster spans eight networks across Germany, the UAE, the US, Romania and the Netherlands โ€” and pointedly mixes ColoCrossing (an abuse-tolerant US host) with M247 (the Macquarie-owned backbone of 047B). Their shared dictionary reaches past .env into source control and cloud identity:

/.git/config/.git/HEAD/actuator/env/appsettings.json/api/config/google-credentials.json/credentials.json/account.json/secrets.json

One operator, renting cheap bulletproof persistence and reputable backbone space at the same time, from the same script.

๐Ÿงฉ The framework-aware harvester 30 IPs ยท incl. Amazon

A 30-IP cluster (across SG/ID/US/RO/NL, including Amazon AS16509) carries a dictionary that knows your stack: /laravel/.env, /app/.env, /backend/.env, /api/.env, /.aws/credentials, /google-services.json. It is not guessing; it is built by someone who has seen a hundred real deployments.

๐Ÿ” Reading between the lines โ€” the dictionaries are the most honest thing in the entire dataset. IPs rotate hourly, ASNs are rented by the week, user-agents are forged or omitted at will โ€” but the path list is stable, specific, and shared. The dictionary is the real identity. Track the kit, not the node, and the fog of rotating infrastructure clears: you stop chasing 118 IP addresses and start watching four or five toolkits.

๐Ÿง  Reading Between the Lines

The raw counts are the proof. The interpretation is the point. Four things the census quietly tells us:

1. Multi-cloud is a resilience strategy, not an accident

When one operator's dictionary shows up on Amazon and Google at once, the motive is obvious in hindsight: if either provider bans the nodes, the fleet keeps running on the other. Spreading across two "reputable" pools also launders the traffic โ€” defenders who allowlist "trusted cloud" let both halves through. The cloud duopoly's good name is the camouflage.

2. The operators are anchored to nothing โ€” and that is the finding

Run the institutional-anchor pass and the hosts resolve cleanly to listed corporations (Microsoft, Alphabet, Amazon, Macquarie-owned M247). The operators resolve to nothing โ€” no registrant, no named group, only shared dictionaries and rented compute. In this corpus, the absence of an anchor is itself diagnostic: it marks a commodity criminal market, not a state actor with a flag to defend.

3. Recon and exploitation may be different shifts of the same job

The clean Google-harvests / Azure-uploads split, repeated daily, reads like a pipeline: one stage finds the secrets, a later stage plants the shells. Whether that is one crew with two tools or two crews trading access downstream, the staging is real โ€” and it is exactly the two-phase kill chain documented across 047A and 047B.

4. Volume has replaced stealth as the business model

Empty user-agents, recycled filenames, 170-path brute dictionaries fired at 36,000 requests an hour โ€” none of this is subtle. It does not need to be. When compute is near-free via trials and stolen cards, the rational strategy is to ask everyone for everything and harvest the fraction that answers. Quiet tradecraft is for targets; this is dragnet economics.

The fleets are loud on purpose. In a numbers game, being caught on the 9,000 servers that are patched costs nothing if the 1,000 that aren't pay out.

๐ŸŒ The Global Frame

None of this is bespoke to one honeypot. The dictionaries are a match for the documented global economy:

  • Sysdig's EMERALDWHALE scanned 500M+ IPs for /.git/config and Laravel .env files, lifting 15,000+ cloud credentials โ€” the same target classes as our 170-path and git/config clusters, at planetary scale.
  • The DOJ GRU/Sandworm indictment describes leasing infrastructure "from resellers rather than ... directly from hosting companies" and spreading across providers โ€” the nation-state version of the multi-cloud, multi-ASN distribution we measured.
  • CrowdStrike GTR 2024: cloud intrusions up 75% year-on-year, shifting to identity-based techniques โ€” the macro trend these fleets are the foot soldiers of.

What the LSN door sees at the scale of tens of thousands of requests is the same machinery that runs at the scale of hundreds of millions. The census is a core sample of the whole seam.

โ“ The Questions

Who is this?
A handful of operators, not a hundred scanners. The shared dictionaries collapse 118+ IPs into a few toolkits under central control.

Why did it attack?
Secrets and shells โ€” .env files, .git/config, cloud-credential JSON, webshell presence. Initial access, harvested wholesale.

Who does it claim to be?
Often nobody โ€” empty user-agents. When it bothers, a generic browser. The honesty is in the path list, which it cannot fake away.

Whom is it related to?
Itself, across clouds. Amazon and Google nodes in one cluster; ColoCrossing and M247 in another. The toolkit is the kinship.

Where is the money?
Downstream โ€” resale and extortion of harvested credentials (EMERALDWHALE). Upstream, the compute is near-free via trials, so margins are pure.

What is the official anchor? [INST]
Blue-chip at the top (Microsoft, Alphabet, Amazon, Macquarie/M247), nothing in the middle. The operator layer is deliberately anchorless.

What if it is more than it appears?
The daily recon-then-exploit rhythm suggests a supply chain, not a smash-and-grab: someone may be harvesting access on Google and selling or staging it for the Azure shell-droppers. The census shows the shifts; the handoff between them is the next thing to find.

โš–๏ธ Verdict

Counted three ways, the web siege resolves from an anonymous flood into a small roster of coordinated fleets. They betray themselves by sharing a clock, sharing a blank identity, and โ€” most damningly โ€” sharing a toolkit specific enough to fingerprint across two cloud providers and five countries.

The most important lesson is a shift of gaze: stop counting IP addresses and start counting dictionaries. The address is a disposable mask; the 170-line target list is the face underneath. Once you watch the kit instead of the node, a hundred-headed flood becomes a handful of nameable, trackable operators โ€” anchored to nothing but the script they cannot stop reading from.

They change their address every day and their target list never. So we learned to read the target list.

Series: ๐Ÿชž The Glass Cage ยท Letter: C ยท Classification: TLP:WHITE

Data sources: LSN web-threats campaign detector (36 campaigns: temporal_burst / empty_ua_asn_cluster / shared_exploit_paths) ยท Traefik access logs ยท CrowdSec L7 ยท Qdrant web_threats_campaigns. External: Sysdig EMERALDWHALE; DOJ GRU/Sandworm indictment; CrowdStrike GTR 2024.

Investigation: TI-2026-047C ยท 6 actors ยท 10 evidence ยท 8 findings ยท 8 connections ยท 7 infrastructure records

โš  Personal capacity. Research published independently โ€” not reflecting employer views. Derived from passive observation of attacks against personal infrastructure. Full disclaimer โ†’
โ† Previous The Glass Cage โ€” 3 / 6 Next โ†’