The Day 1 post covered a Mirai loader and a Perl IRC DDoS bot that came in over SSH and Telnet. The second pull from the sensors added something older and, honestly, more surprising: a WannaCry launcher delivered over SMB through DoublePulsar, nine years after the original outbreak.
The Mirai loader and the Perl bot from Day 1 also appear in this pull with identical hashes, so I won’t repeat that analysis here. Everything below is new material.
As before, every sample was analyzed statically. Nothing was executed, and no attacker host, distribution server, or C2 was contacted.
WannaCry, Delivered Through DoublePulsar#
The delivery session#
During the first collection window, a single source connected to the sensor’s SMB service on 445 and walked through the full MS17-010 sequence:
- SMB1 negotiate
- Session setup, with the client identifying itself as Windows 2000 (build 2195)
- Tree connect
- 1,289
Trans2 SESSION_SETUPpackets, carrying about 5.38 MB from the attacker to the sensor None of those packets contained a cleartextMZheader. That’s consistent with DoublePulsar, which pushes its payload in XOR-encoded chunks through theTrans2 SESSION_SETUPchannel after EternalBlue installs the backdoor. The honeypot’s DoublePulsar emulation reassembled and decoded the chunks into a complete DLL.
The source made three sessions in total. Three other SMB talkers in the same window ran between 23 and 44 sessions each, but their traffic topped out around 81 KB. That’s the profile of MS17-010 scanners that never delivered a payload.
The launcher DLL#
The delivered file is a 5.27 MB 32-bit DLL with a very small footprint of actual code:
- Export name
launcher.dll, with a single export:PlayGame - Imports limited to resource handling, file writing, and
CreateProcessA - Strings
C:\%s\%s,WINDOWS, andmssecsvc.exe - One 5 MB resource of type
W, ID 101 - Compile timestamp of May 11, 2017, one day before the global WannaCry outbreak
The logic is simple.
PlayGamepulls the embedded resource, writes it toC:\WINDOWS\mssecsvc.exe, and launches it. This is the well-documented x86 DoublePulsar stage of WannaCry, and every structural detail lines up with the May 2017 strain.
The embedded worm#
Carving the resource produced a 32-bit executable with the same size as the canonical WannaCry mssecsvc.exe, 3,723,264 bytes. The family indicators inside it are unambiguous:
- The original kill-switch domain
- Service name
mssecsvc2.0and droppertasksche.exe - The
WANACRY!marker, theWNcry@2ol7archive password, and thet.wnryandr.wnrycomponents - The
icacls . /grant Everyone:F /T /C /Qandattrib +h .commands - Two Bitcoin wallets that match publicly known WannaCry ransom addresses
- Imports from
WININET,WS2_32, andIPHLPAPIfor the kill-switch check and SMB propagationThe kill switch is still doing its job. This build checks the original kill-switch domain before detonating. That domain has been sinkholed since May 2017, so on a host with normal DNS and internet access the worm exits without encrypting anything. Hosts on isolated networks, or networks that block or fail to resolve that domain, don’t get that protection. If your DNS filtering policy sinkholes or blocks newly seen or “random-looking” domains, it’s worth confirming that this one still resolves.
This is significant because it’s almost certainly not an operator choosing to deploy WannaCry in 2026. The worm is self-propagating, and the most likely source is a Windows host that’s been infected for years, still running, and still scanning the internet for SMB. The kill switch prevents the ransomware from firing in most environments, but it doesn’t stop the propagation component that brought it to my sensor.
The carved payload’s hash didn’t turn up in the public write-ups I checked. The size, strings, wallets, and kill-switch domain all match the 2017 strain, so I’m treating it as WannaCry and pending a reputation lookup to confirm whether this exact byte image is already catalogued.
EternalBlue at Volume#
The second sensor didn’t receive a payload, but its SMB service had a busy day. In a single day it logged 14,165 SMB sessions, nearly all from two hosts:
| Source | Sessions | Largest session |
|---|---|---|
| Host A | 10,526 | 80 KB |
| Host B | 3,630 | 80 KB |
The 80 KB sessions have the same shape as the scanners on the first sensor: EternalBlue exploit attempts that never moved on to a DoublePulsar upload. Two hosts running the same exploit attempt thousands of times in a loop looks much more like infected machines on autopilot than an operator working a target.
Between the two sensors, the SMB picture is consistent. MS17-010 traffic is still a background constant on the internet, and at least some of it is coming from hosts that are themselves compromised.
An Attacker Staged an Outbound SSH Identity#
On the SSH side, one attacker left behind two small files that read more like tradecraft than malware.
The first was an unencrypted OpenSSH ed25519 private key with the comment dlr@sftp. The second was a 55-byte SSH client config that sets StrictHostKeyChecking no and UserKnownHostsFile /dev/null.
Both were written with the same one-line echo technique, with line breaks replaced by ; , which points to the same actor or the same tooling.
Put together, the most likely reading is that the attacker was preparing the “compromised” host to connect outbound to their own infrastructure. A pre-staged key lets the box SFTP or SSH out without a password, and the config ensures it never stops at a host-key prompt. That would support uploading collected data or pulling a later stage without any interactive step.
I haven’t correlated these files to a specific session’s source IP or credentials yet, so I’m not tying them to either of the Day 1 actors.
The public key and fingerprints derived from the dropped private key are useful for hunting in authorized_keys files and SSH auth logs:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO94S34m0hVkYFUhtWQe92S9Cp0yJp+7n8gw696Uf/LG dlr@sftp
SHA256:O/at8341SoPpKvTPvMsJSgjQm30md9VTS2it25sY0vg
MD5:26:41:89:c9:07:fb:ff:09:27:a2:cd:39:97:62:2b:62I’m not publishing the private key itself.
A Printer Probe, for Completeness#
The printer emulator on port 9100 recorded a 15-byte payload: the PJL Universal Exit Language header, <ESC>%-12345X@PJL. It’s a printer-discovery probe of the kind internet-wide scanners send to fingerprint devices. No print job and no malware, but it rounds out the picture of what reaches an exposed IP in a day.
Indicators of Compromise#
Source IP addresses are intentionally withheld. The SMB sources are almost certainly infected hosts rather than attacker-owned infrastructure, so publishing them would name victims without giving defenders anything a hash or domain doesn’t already provide. Sensor timestamps are also omitted.
Network#
| Indicator | Role |
|---|---|
iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea[.]com | WannaCry kill-switch domain (sinkholed) |
File hashes (SHA-256)#
| File | SHA-256 |
|---|---|
launcher.dll | c05e2dab77349cd639aa837e7e121710b8a0718d8fc93fb4cc6458ae90e5c597 |
mssecsvc.exe (carved, trimmed) | dbf3890b782ac04136c3336814eef97e3c0f4133f9592e882c131c179161b27b |
| Embedded resource (raw, 5 MB) | 4d9d4ec0ac2166d9a3e1023632b9cf98930742abe0e26a960e4e9e20dcb706d0 |
| Dropped ed25519 key | 0db4656687a425c47d19000db866db52c7e415dbfaf6b5c651adcb9275ab23ca |
| SSH client config fragment | ae8d459595257f2f22c9d1ff74c4fb8a91643fad7899b57556496716692b904e |
launcher.dll MD5: ae12bb54af31227017feffd9598a6f5e
Host and behavioral#
C:\WINDOWS\mssecsvc.exe, a service namedmssecsvc2.0, ortasksche.exe- DNS lookups for the kill-switch domain from internal hosts
- Inbound SMB sessions with a high count of
Trans2 SESSION_SETUPrequests - SSH key
SHA256:O/at8341SoPpKvTPvMsJSgjQm30md9VTS2it25sY0vg(dlr@sftp) in anyauthorized_keysfile or auth log - An
~/.ssh/configcontainingStrictHostKeyChecking noandUserKnownHostsFile /dev/nullon a server that shouldn’t need it
Detection Takeaways#
Kill-switch lookups are an infection signal. A DNS query for the WannaCry kill-switch domain from inside your network means something there is running the worm. It’s one of the cheapest high-fidelity detections available, and it still works.
DoublePulsar has a network shape. An unusually large number of Trans2 SESSION_SETUP requests in a single SMB session is the backdoor’s upload channel. Existing IDS signatures for DoublePulsar and EternalBlue are mature, and it’s worth confirming they’re enabled rather than retired as legacy.
SMBv1 should be off. Disabling SMBv1 removes the protocol EternalBlue depends on. If something in the environment still needs it, that host is a known exception that belongs on a segmentation and monitoring list.
Outbound SSH from servers is worth baselining. The staged key and config only matter if the host can reach the attacker’s server. Servers that never initiate outbound SSH are a good candidate for egress restrictions, and an unexpected outbound session on 22 is a useful alert.
Watch for client configs that disable host-key checking. Legitimate automation sometimes sets these options, but a new ~/.ssh/config with both of them on a production host is worth a look.
What’s Next#
The sensors stay up. Day 1 was SSH and Telnet commodity malware. Day 2 showed that the SMB surface is mostly catching worms that have been propagating on their own for years. I’ll keep pulling and sharing as long as there’s something new to report.
