TI-2026-047C โ The Botnet Census
๐ 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
.envdictionary. 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.
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:
| Network | What it does in its bursts | Representative days (requests) |
|---|---|---|
| Google Cloud (AS396982) | credential_harvest, api_enum | 06-08 (1,203) ยท 06-09 (1,634) ยท 06-10 (1,620) ยท 06-11 (1,470) |
| Microsoft Azure (AS8075) | shell_upload, cms_detect | 06-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.
๐ณ๏ธ 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:
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.
๐งฐ 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:
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:
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:
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 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 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/configand Laravel.envfiles, 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.
๐ Related
- TI-2026-047A โ The Login Page That Watched Back (the .env harvest, up close)
- TI-2026-047B โ The Repeat Offenders (the four-layer confirmation)
- TI-2026-046A โ The .env Harvesters ยท TI-2026-032A โ The Buffalo Server Farm (ColoCrossing)
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