slatterysec.com/reports/2026/08/2026-08-16_2026-08-20-honeypot-report.html
sensors 8 up last session 4m ago 24h captures 312 unique src 87

slattery@sec:~/reports$ cat 2026-08-16_2026-08-20-honeypot-report.md

HONEYPOT REPORT  //  2026-08-16 – 2026-08-20

2026-08-16 – 2026-08-20 — SSH, Telnet + Web Honeypot Report

period   2026-08-16 – 2026-08-20
sensors   Cowrie SSH/telnet + web deception panel
host   VPS · containerized
SSH TELNET WEB 22,818 TOKEN HITS FLUTTER BOTNET KEY ROTATION
SSH + TELNET SESSIONS
40,580
5 days
UNIQUE SOURCES
1,581
shell sensor
AUTH ATTEMPTS
52,107
6,522 succeeded
TOKEN HITS
22,818
84 distinct consumers
DECOY RETRIEVALS
3,585
56 sources
PUBKEY OFFERS
64
0 in the July baseline

SSH and telnet volume by day

4,864
08-16
6,714
08-17
7,858
08-18
14,750
08-19
6,394
08-20

Executive summary

A single fabricated AWS key, planted in a fake .env file, was used 22,818 times by 84 distinct sources over four days. That is the whole story of this period, and it is a different story from the one the first alert suggested.

The credential did not simply leak into one operator's hands. Sorting the consumers by which API calls they made produces seven distinct behavioural groups, each wanting something different from the same key:

objectivesourceshitswhat they called
Spam capability2622,342GetSendQuota, ListIdentities, GetSMSAttributes
Account profiling2234GetAccount, GetContactInformation, DescribeOrganization
LLM abuse19170ListFoundationModels, Converse, InvokeModel
Identity check5194GetCallerIdentity only
Compute hijack541RunInstances, CreateSecurityGroup, DescribeImages
Recon531ListUsers, ListRoles, SimulatePrincipalPolicy
Persistence26CreateUser, CreateGroup, CreatePolicy
One credential, seven markets. Stolen keys are not consumed by whoever steals them. They circulate, and each buyer tests for the one capability they care about — bulk email, model inference, compute, or a foothold. The key was worthless in every case; none of these accounts exist. The consumers had no way to know that without asking, and asking is what the honeytoken records.

The dominant consumer by four orders of magnitude is 192.253.248.142 (AS213790, Kerkrade NL), which made 21,931 calls — 94% of all activity — almost entirely ses:GetSendQuota. That API returns how many emails an account may send per day. It is the single number that determines whether a compromised account is worth anything to a spam operation.

It ran for 99 consecutive hours without a gap, averaging 230 calls per hour, and it has not stopped. More interesting: it re-fetched the source .env file from the web sensor 3,248 times during the same window. It is not working from a stored copy. Every check re-reads the credential from the origin, which means the operator treats the source URL as the record rather than the key itself.

Two consumer groups are worth separating from the noise. Nineteen sources went after Bedrock, calling ListFoundationModels to enumerate available models before attempting Converse or InvokeModel. And a cluster of 24 hits arrived from 24 different US consumer mobile addresses — T-Mobile, AT&T, Verizon, Charter — inside 41 minutes, all calling GetAccount, all with the same Boto3 user-agent down to the kernel version. One tool, distributed across residential mobile IPs, presumably to avoid the rate-limiting a single address would attract.

On the shell sensor, the PUBKEY signal fired 64 times having fired zero times in eight days of July baseline. Two separate causes, described below, and one of them is the return of a key first seen in July.

Notable sessions — honeytoken

2026-08-18 → 08-22 SES CHECKER 192.253.248.142
94% of all token activity from one host: a sustained SES send-quota check that has run without interruption for over four days.
hits: 21,931 — 20,638 GetSendQuota, 1,293 GetCallerIdentity
rate: 230/h sustained, active in all 99 hours of the window
decoy fetches: 3,248 — re-reads the source .env rather than caching the key
client: aws-cli/1.45.46, Botocore 1.43.46, Python 3.10.12, Linux 5.15.0-187 (Ubuntu 22.04)
network: AS213790 Limited Network LTD, Kerkrade NL, ASN domain btcloud.ro, hosting
fingerprint: the Botocore m/ field reorders on every call — each request is a freshly spawned CLI process, consistent with a shell loop over a credential file
2026-08-22 16:28 → 17:09 MOBILE FANOUT 24 US consumer addresses
Twenty-four hits from twenty-four different mobile carrier IPs in 41 minutes, all running the same tool.
carriers: T-Mobile (17), AT&T (4), Verizon (2), Charter (1)
event: GetAccount on all but three
user-agent: Boto3/1.43.40 Botocore/1.43.42, Python 3.10.12, Linux 5.15.0-46 — byte-identical across all 24
assessment: one operator distributing calls across residential mobile addresses; a single source making the same 24 calls would be trivially rate-limited
2026-08-18 → 08-22 MODEL ACCESS 19 sources
A distinct group enumerating Bedrock model availability before attempting inference.
sequence: ListFoundationModels (63) → GetUseCaseForModelAccess (6) → Converse (10) / InvokeModel (1)
clients: Boto3 on Windows 10, 11 and Windows-on-ARM; one Go-http-client; 22 hits with no user-agent at all
note: the enumerate-then-invoke ordering is the same shape as the single Bedrock consumer observed in the previous period, now at scale

Notable sessions — SSH and telnet

2026-08-15 → 08-18 KEY ROTATION 139.19.117.129
Sixty sessions on a strict hourly schedule, each offering a freshly generated public key as root, running no commands and disconnecting.
distinct keys: 59 across 60 sessions — a new keypair per attempt
interval: exactly 60.0 minutes between offers
client: SSH-2.0-Go on every session
commands: none — not one session issued a command
assessment: not brute force; a new key cannot be guessed. Reads as an availability or reachability monitor that generates a throwaway key each cycle
2026-08-15 → 08-18 RETURNING KEY 4 Tor exit nodes
The public key first recorded in July reappeared, offered from four different Tor exits over four days.
fingerprint: d4:98:c4:f3:12:ef:3e:29:38:34:62:21:fd:99:ec:ef
sources: 139.19.117.129, 185.220.101.128, 192.42.116.100, 192.42.116.107
client: OpenSSH_10.4 and OpenSSH_10.5
behaviour: offer key as root → fail → fall back to password → succeed → run nothing → disconnect
note: unchanged from July. Somebody is still checking whether this key opens this host
2026-08-16 → 08-20 NAMED BOTNET vps.atlas101.us.kg:7768
A downloader carrying its own name and author comments, with the most thorough persistence routine captured to date.
self-identifies: # Flutter Botnet — Downloader + Persistence
c2: base64-encoded in the script: dnBzLmF0bGFzMTAxLnVzLmtnOjc3Njg= → vps.atlas101.us.kg:7768
fallback chain: HTTP → TFTP → FTP, then memfd_create execution to avoid touching disk
architectures: 11 — x86_64, x86, arm, arm7, arm8, mips, mipsel, ppc, sparc, sh4, m68k
persistence: cron @reboot and */5, /etc/rc.local, a systemd unit named bot.service, and a watchdog loop respawning every 30s
2026-08-16 → 08-20 TAGGED MINER captured sample
A 971 KB Go binary that installs XMRig from its official GitHub release and tags the worker with the operator's own name.
miner: xmrig 6.18.0, fetched from github.com/xmrig/xmrig releases
pool: rx.unmineable.com:3333
worker tag: XMR:%s.Milan-Bot-%s
note: using the upstream signed release rather than a repacked binary; the only custom code is the installer and the worker naming

What the decoys are actually catching

3,585 config-file retrievals from 56 sources this period, against zero in the six days before the decoys existed. The distribution is lopsided in the same way the token activity is: 3,384 of them are /.env, and 3,248 of those are the SES checker re-reading its own source.

Excluding that host leaves roughly 340 retrievals from 55 sources — about 70 per day from genuinely distinct actors. That is the honest measure of how often an exposed .env is picked up on a host nobody has any reason to target.

The credential-chain detector — a planted password from a decoy file being reused on the login form — has still never fired. Automation will scrape a config file and monetise an AWS key within seconds, but nothing has yet read a database password out of the same file and tried it somewhere else. The two behaviours are cleanly separated in the data.

Indicators

Honeytoken consumers by objective

sourceobjectivehitsnetwork
192.253.248.142spam capability21,931AS213790 Limited Network LTD, NL
185.177.72.3identity check188AS211590 Bucklog SARL, FR
74.0.32.57persistence + spam118AS399486, GB
179.61.227.59broad recon87AS399486, FR
91.92.40.175spam capability50AS197170 TechTies Inc., NL
80.87.206.148persistence47AS16276 OVH SAS, FR
34.96.49.34spam capability39Google Cloud, US
34.140.252.27LLM abuse4Google Cloud, US

TechTies Inc. also hosts the coordinated SSH brute-force quota group observed since July.

Payload hosts

hostservesretrievals
2.26.136.128twget.sh — STC/TOASTER Mirai fork109
185.93.89.72/wget, also scans the sensor itself57
5.182.210.174/ok plus six-hex rotating filenames31
vps.atlas101.us.kg:7768Flutter Botnet, 11 architectures4
176.65.139.228:6677Exodus.sh and an 11-arch /bins/ tree4

Busiest shell sources

sourcesessionsnote
164.92.115.225,073single highest talker
92.204.128.1492,973
92.204.138.1422,738
208.109.189.591,731
45.153.34.137773quota group — unchanged since July
91.92.42.10773quota group
45.156.87.34773quota group

Payload hashes

sha256what it is
6b2c65448b82ed4002ae3f37c35ad6721c6f65e299241ba724db6c1422ddacde
virustotal →
Flutter Botnet downloader — 11 arch, HTTP/TFTP/FTP fallback, memfd exec, 4-way persistence
156ee410363b67810416d16a797225ffbaa01cf80daeaff346dabf199f75cbed
virustotal →
Go dropper — installs upstream XMRig 6.18.0, worker tag Milan-Bot
367fcbdb9f0699342d143b1123db176c38b95b1ccee2a80286a58ef69dbe38da
virustotal →
Redtail stager — 20 rotating six-hex filenames from a single host
3f3bf218089d1488617d37f8a5116bb2791eb39ce06a1b5bc9a4cdfe5e94dd39
virustotal →
UPX-packed RISC-V ELF — 1.7 MB
6d1fe6ab3cd04ca5d1ab790339ee2b6577553bc042af3b7587ece0c195267c9b
virustotal →
Linux.MulDrop.14 — 2017 Raspberry Pi worm, still unmodified
94f2e4d8d4436874785cd14e6e6d403507b8750852f7f2040352069a75da4c00
virustotal →
sshd — Go worm, PAM credential theft, dual miner, Discord C2

MITRE ATT&CK mapping

IDtechniqueobserved as
T1078.004Valid Accounts: Cloud AccountsOne planted key exercised 22,818 times by 84 sources across seven distinct objectives
T1580Cloud Infrastructure DiscoveryDescribeInstances, DescribeVpcs, DescribeImages, ListClusters from five sources
T1526Cloud Service DiscoveryListFoundationModels and GetUseCaseForModelAccess preceding inference attempts
T1136.003Create Account: Cloud AccountCreateUser, CreateGroup, CreatePolicy from two sources attempting a foothold
T1069.003Permission Groups Discovery: Cloud GroupsSimulatePrincipalPolicy, ListAttachedUserPolicies, ListRoles
T1496Resource HijackingSES quota checks at 230/h; Bedrock inference attempts; XMRig installed from upstream release and tagged Milan-Bot
T1090.002Proxy: External Proxy24 hits from 24 US mobile carrier addresses in 41 minutes running one identical client
T1552.001Unsecured Credentials: Credentials In Files3,585 config decoy retrievals from 56 sources; the top consumer re-fetches the source rather than caching
T1547.006Boot or Logon Autostart: Kernel Modules and ExtensionsFlutter Botnet installs cron, rc.local, a systemd unit and a 30-second watchdog
T1620Reflective Code Loadingmemfd_create execution in the Flutter downloader to avoid writing to disk
T1027.002Obfuscated Files: Software PackingUPX-packed RISC-V ELF; base64-encoded C2 address in the Flutter script
T1021.004Remote Services: SSH59 distinct throwaway public keys offered on a strict hourly schedule from a single host