TI-2026-009 โ "The Twin-libssh Operator" โ One Operator, Two Scanner Families, 1,650 Nodes, 44 Days
03a80b21โฆ + af8223acโฆ); cross-family infrastructure overlap (two pivot IPs operating in both clusters) and a byte-identical 8-command post-success recon block prove they share an operator and codebase. The operator deploys non-malicious sentinel sha256 payloads (including SHA-256("Hello World!\n")) to verify the download primitive โ pre-deployment behavior. The malware-delivery phase has not been triggered against this honeypot. Campaign window 2026-03-28 โ 2026-05-03 (ongoing).Between 2026-03-28 and 2026-05-03 (still running as this dossier publishes) the Cowrie SSH honeypot captured two parallel SSH brute-force scanner families with distinct HASSH fingerprints. At first they look like two unrelated botnets. They are not. They are two libssh-version variants of the same scanner, controlled by one operator, running on 1,650+ distributed nodes across at least 80 ASNs and 5 continents. The attribution rests on three independent cross-family signals: (1) two infrastructure pivot IPs that appear in both clusters with identical behavior, (2) a byte-deterministic 8-command post-success recon sequence shared across both families, and (3) two non-malicious sentinel sha256 payloads downloaded after authentication โ used to verify the operator's download primitive before any real malware is delivered.
This is a pre-deployment posture. We are observing scanner-development traffic. When the sentinel sha256 changes to actual malware, the campaign goes live. Until then, the dossier documents the toolkit fingerprint precisely enough that defenders can detect the operator before the deployment phase.
HASSH is the MD5 hash of the SSH client's KEX-algorithm preference list โ a deterministic toolkit fingerprint that varies by SSH library version. Our honeypot's session-fingerprint table groups every connection by HASSH. Two clusters dominate the dataset:
| Family | HASSH | Banner | IPs | Sessions | First seen |
|---|---|---|---|---|---|
| A | 03a80b21afa810682a776a7d42e5e6fb |
SSH-2.0-libssh_0.11.1 |
1,262 | 34,418 | 2026-03-28 |
| B | af8223ac9914f509afdadfaf5f7ee94e |
SSH-2.0-libssh_0.12.0 |
388 | 10,190 | 2026-04-21 |
The HASSHes differ because the libssh 0.11โ0.12 release re-ordered KEX algorithms. Everything else about the toolkits is identical โ including the post-authentication behavior, which makes attribution unambiguous.
1. Cross-family pivot IPs
Two IPs appear in both HASSH families with identical post-authentication behavior:
91.99.110.230โ Hetzner DE, AS24940. Ran identical 8-command recon across both Family A and Family B sessions. Downloaded the same sha256 sentinel in both contexts.94.232.41.236โ RocketCloud (RU/KG), AS64439. Top attacker in both families' top-10 (by login-attempt volume). Same target dictionary, same session pattern.
Two independent infrastructure pivots is enough on its own to rule out coincidence. One node could be a false-positive cross-overlap. Two nodes running both libssh versions, on completely different ASNs and continents, with identical behavior โ that's tooling reuse, not coincidence.
2. Byte-identical 8-command recon block
For every authenticated session in either family, the operator's tool runs exactly this 8-command sequence in this order โ no deviation, no interactive activity follows:
whoami which ls w uname -m uname -a uname top lscpu | grep Model
Sessions average 1.5โ3 seconds. No chmod +x, no crontab, no ~/.ssh/authorized_keys writes. This is a behavioral fingerprint stronger than HASSH itself: the network fingerprint changes every time libssh ships a new release; the command sequence does not change unless the operator rebuilds their tool.
3. Shared sentinel payloads
Two sha256 hashes are downloaded across both families immediately after authentication. Neither is malware:
| sha256 | Hosts seen | Identification |
|---|---|---|
a8460f446be540410004b1a8db4083773fa46f7fe76fa84219c93daa1669f8f2 |
32 | Sentinel test payload |
01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b |
26 | SHA-256 of "Hello World!\n" โ universal smoke-test fixture |
Operators use sentinel downloads to verify their exfil channel works (does wget reach the C2? is outbound HTTP open? is there a captive-portal blocking traffic?) before shipping the second-stage payload. The fact that we see "Hello World!" being downloaded โ a literal CI/CD test fixture โ and nothing else means we are observing the operator's pre-deployment checkout, not the actual campaign. When the sentinel sha256 flips to an unknown blob, the campaign has gone live.
Both families share the same target list and password dictionary (sample of 600 of 1,650 member IPs):
rootโ 11,446 attemptsubuntuโ 1,351userโ 452testโ 419adminโ 389
123456โ 461123โ 2101234โ 12112345678โ 10312345โ 80passwordโ 53P@ssw0rdโ 31
Top 10 passwords account for ~70% of all attempts. No targeted credential-stuffing, no leaked-database tests, no SSH-key auth attempts. Pure dictionary brute force against the standard root/ubuntu/admin trinity. This is not a sophisticated targeting operation โ it is reach maximization.
- AS132203 โ Tencent Cloud (CN/SG)
- AS8075 โ Microsoft Azure
- AS8560 โ IONOS (DE)
- AS4134 โ China Telecom
- AS8075 โ Microsoft Azure
- AS135377 โ UCloud Hong Kong
- AS8560 โ IONOS (DE)
- AS16276 โ OVH (FR)
- AS4766 โ Korea Telecom
The two families share 65 of their top-100 ASNs. The set is dominated by major commercial cloud providers โ Microsoft Azure, Tencent, UCloud, OVH, IONOS, Hetzner. This operator is renting and burning short-lived cloud-VPS instances at scale, not using a residential or compromised-IoT botnet. Different operational economics, different takedown profile.
Full live IOC bundle (1,650+ IPs, all observed sentinels, every HASSH attribution) is reproducible from the SOC platform โ see Methodology below for the live URLs. The samples here are illustrative of the campaign's spread.
| Family | IP | Attempts | CC | ASN | AS Org |
|---|---|---|---|---|---|
| A | 94.232.41.236 ๐ | 77 | KG | AS64439 | RocketCloud.ru, RU |
| A | 95.90.13.168 | 51 | DE | AS3209 | VODANET (Vodafone DE backbone) |
| A | 99.92.204.98 | 48 | US | AS7018 | AT&T Enterprises, US |
| A | 95.208.74.83 | 45 | DE | AS3209 | VODANET (Vodafone DE backbone) |
| A | 98.26.115.52 | 25 | US | AS11426 | Charter Communications |
| A | 94.156.221.46 | 25 | BG | AS34224 | NETERRA-AS, BG |
| A | 118.26.36.195 | 20 | HK | AS135377 | UCloud Hong Kong |
| A | 95.85.240.24 | 20 | CZ | AS214891 | CLOUDRIX, RU |
| A | 94.180.238.116 | 20 | RU | AS41668 | ERTH-KAZAN-AS, RU |
| B | 61.72.55.130 | 95 | KR | AS4766 | Korea Telecom |
| B | 80.253.31.232 | 91 | RU | AS39153 | SETEL-AS1 / TELEKONIKA, RU |
| B | 91.205.128.170 | 82 | RU | AS47895 | R-LINE-AS, RU |
| B | 62.3.56.187 | 80 | IQ | AS210513 | MASARAT-ALIRAQ, IQ |
| B | 94.232.41.236 ๐ | 77 | KG | AS64439 | RocketCloud.ru, RU |
| B | 72.253.251.7 | 77 | US | AS36149 | Hawaiian Telcom Services |
| B | 87.106.35.227 | 76 | DE | AS8560 | IONOS, DE |
| B | 62.193.106.227 | 55 | EG | AS36992 | ETISALAT-MISR, EG |
| B | 74.91.224.229 | 54 | US | AS31898 | Oracle Corporation, US |
| B | 91.99.110.230 ๐ | 52 | DE | AS24940 | HETZNER-AS, DE |
๐ = IP appears in both family clusters. Cross-family pivots are the strongest infrastructure-level attribution signal in the bundle.
Equally important to what they are doing:
- No persistence. No
chmod +x, nocrontab, norc.localedits, no systemd unit drops, no~/.ssh/authorized_keyswrites. Sessions average 1.5โ3 seconds. - No live malware deployment. The two sha256s observed are smoke-test fixtures, not malware. The operator is in a testing or pre-deployment posture.
- No targeted credentials. No SSH-key auth attempts. No certificate stuffing. Pure dictionary brute force against the universal root/ubuntu trinity.
- No lateral movement. No
ssh-keygen, no~/.ssh/authorized_keysreads, no~/.bash_historyexfil.
Interpretation: this is scanner-development traffic or a toolkit operator validating reach. They've built a 1,650-node distributed scanner using libssh (rather than OpenSSH or pure-Python paramiko) and they're stress-testing it. The real campaign โ when the sentinel sha256 changes to actual malware โ will signal go-live.
- HASSH-based blocklist at the SSH gateway. Block any inbound SSH session whose KEX-list MD5 matches either
03a80b21afa810682a776a7d42e5e6fboraf8223ac9914f509afdadfaf5f7ee94e. False-positive risk is low โ libssh is rare for interactive SSH; most legitimate clients are OpenSSH-based with different HASSHes. - Banner-string match.
SSH-2.0-libssh_0.11.1andSSH-2.0-libssh_0.12.0on inbound connections to your management plane should be flagged regardless of authentication outcome. - Recon-sequence regex on TTY/audit log. The 8-command sequence is byte-deterministic. The pattern
whoami; which ls; w; uname -m; uname -a; uname; top; lscpuwithin 2 seconds of a session opening is the strongest behavioral signal โ an order of magnitude harder for the operator to randomize than the network fingerprint. - DNS / outbound monitoring for sentinel exfil paths. Look for outbound HTTP/HTTPS to fresh infrastructure within seconds of a successful SSH auth โ the operator is testing exactly this primitive. The two sha256 fixtures are non-malicious, so don't use them as a malware indicator; instead detect the pattern of post-auth fetch.
All data is post-rebuild (commit 0d20547, 2026-05-02), so cowrie events from 2026-03-21 onward are complete (a previous 14-day backfill gap masked Family A's first three weeks). Fingerprint extraction (commit 360372f) populates session_fingerprints from cowrie's cowrie.client.kex events; HASSH itself is computed by cowrie, not derived. WHOIS / ASN / BGP-prefix attribution comes from Team Cymru bulk WHOIS over whois.cymru.com:43, no auth required.
Cluster expansion was performed entirely through SOC API endpoints โ /api/honeypot2/fingerprints, /similar, /ip/{ip}, /downloads, /timeline_bucket. No privileged DB access. The same intelligence is reproducible from any client with read access to the honeypot. Operators (and analysts) who want the full live IOC bundle can query the SOC platform at the URLs below โ the published JSON / CSV / AbuseIPDB-format bundles are regenerated on every request and reflect the current honeypot state.
GET /api/honeypot2/ioc?format=json&since_hours=999999&min_attempts=1GET /api/honeypot2/ioc?format=csv&since_hours=999999&min_attempts=1GET /api/honeypot2/ioc?format=abuseipdb&since_hours=999999&min_attempts=1(drops directly into AbuseIPDB bulk-report import)
/api/honeypot2/similar. Editorial principle: every claim in this dossier is reproducible from the SOC platform's public-facing endpoints. The sentinel sha256s are non-malicious test fixtures; their presence is evidence of pre-deployment posture, not of active compromise. The honeypot caught what it caught.
โ Update โ 2026-07-04: the twin became a triplet
Append-only enrichment; nothing above is altered. This dossier documented two parallel libssh scanner families under one operator. Continued tracking shows the same behavioural operator cluster (actor-39bc7b3c3ae5, which controls Family A / libssh 0.11.x, HASSH 03a80b21โฆ) subsequently ran a third libssh generation:
libssh 0.12.0 โ HASSH af8223ac9914f509, 607 IPs across 71 countries, first observed 2026-04-21 (within/just after this dossierโs 2026-03-28โ-05-03 window). The operator progresses through libssh releases (0.9.6 โ 0.11.x โ 0.12.0) while keeping the same credential dictionary and recon block โ a single hand upgrading its toolkit over time, not independent actors.
Cross-reference: TI-2026-026M (The 1,313 Machines) documents the libssh 0.11.x fleet in depth; the three-generation span is analysed there.
Added by platform-wide correctness audit, 2026-07-04. Source: live honeypot HASSH campaign records (actor cluster actor-39bc7b3c3ae5).