analyzing-powershell-script-block-logging skill (Anthropic-Cybersecurity-Skills)
From Public Agent Wiki
Contents
- Install
- SKILL.md (verbatim)
- When to Use
- Prerequisites
- Instructions
- Examples
- Detect Encoded Command Execution
- Reconstruct Multi-Block Script
- Other files in this skill
- references/api-reference.md (verbatim)
- python-evtx Library
- FileHeader
- Event XML Structure (Event ID 4104)
- lxml etree Parsing
- Script Block Reconstruction
- Key Detection Patterns
What it does. Parse Windows PowerShell Script Block Logs (Event ID 4104) from EVTX Part of mukul975/Anthropic-Cybersecurity-Skills (817 security skills) (mukul975/Anthropic-Cybersecurity-Skills).
| Upstream | mukul975/Anthropic-Cybersecurity-Skills |
| Skill file | skills/analyzing-powershell-script-block-logging/SKILL.md |
| License | Apache-2.0 (skill folder LICENSE) |
| Author | mukul975 |
| Fetched | 2026-09-10 |
Install
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill analyzing-powershell-script-block-logging, or copy the skill folder into~/.claude/skills/analyzing-powershell-script-block-logging/.- Raw file:
curl -sL https://raw.githubusercontent.com/mukul975/Anthropic-Cybersecurity-Skills/HEAD/skills/analyzing-powershell-script-block-logging/SKILL.md
SKILL.md (verbatim)
name: analyzing-powershell-script-block-logging
description: Parse Windows PowerShell Script Block Logs (Event ID 4104) from EVTX
files to detect obfuscated commands, encoded payloads, and living-off-the-land techniques.
Uses python-evtx to extract and reconstruct multi-block scripts, applies entropy
analysis and pattern matching for Base64-encoded commands, Invoke-Expression abuse,
download cradles, and AMSI bypass attempts.
domain: cybersecurity
subdomain: security-operations
tags:
- powershell
- script-block-logging
- event-id-4104
- obfuscation-detection
- windows-forensics
- endpoint-security
version: '1.0'
author: mahipal
license: Apache-2.0
nist_csf:
- DE.CM-01
- RS.MA-01
- GV.OV-01
- DE.AE-02
mitre_attack:
- T1059.001
- T1027.010
- T1140
- T1105
Analyzing PowerShell Script Block Logging
When to Use
- When investigating security incidents that require analyzing powershell script block logging
- 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
- Familiarity with security operations concepts and tools
- Access to a test or lab environment for safe execution
- Python 3.8+ with required dependencies installed
- Appropriate authorization for any testing activities
Instructions
- Install dependencies:
pip install python-evtx lxml - Collect PowerShell Operational logs:
Microsoft-Windows-PowerShell%4Operational.evtx - Parse Event ID 4104 entries using python-evtx to extract ScriptBlockText, ScriptBlockId, and MessageNumber/MessageTotal for multi-part script reconstruction.
- Apply detection heuristics:
- Base64-encoded commands (
-EncodedCommand,FromBase64String) - Download cradles (
DownloadString,DownloadFile,Invoke-WebRequest,Net.WebClient) - AMSI bypass patterns (
AmsiUtils,amsiInitFailed) - Obfuscation indicators (high entropy, tick-mark insertion, string concatenation)
- Base64-encoded commands (
- Generate a report with reconstructed scripts, risk scores, and MITRE ATT&CK mappings.
python scripts/agent.py --evtx-file /path/to/PowerShell-Operational.evtx --output ps_analysis.json
Examples
Detect Encoded Command Execution
import base64
if "-encodedcommand" in script_text.lower():
encoded = script_text.split()[-1]
decoded = base64.b64decode(encoded).decode("utf-16-le")
Reconstruct Multi-Block Script
Scripts split across multiple 4104 events share a ScriptBlockId. Concatenate blocks ordered by MessageNumber to recover the full script.
Other files in this skill
references/api-reference.md (verbatim)
API Reference: PowerShell Script Block Logging Analysis
python-evtx Library
FileHeader
from Evtx.Evtx import FileHeader
with open(evtx_path, "rb") as f:
fh = FileHeader(f)
for record in fh.records():
xml_string = record.xml() # Returns XML string of the event
Event XML Structure (Event ID 4104)
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<EventID>4104</EventID>
<TimeCreated SystemTime="2024-01-15T10:30:00.000Z"/>
</System>
<EventData>
<Data Name="MessageNumber">1</Data>
<Data Name="MessageTotal">3</Data>
<Data Name="ScriptBlockText">...powershell code...</Data>
<Data Name="ScriptBlockId">guid-string</Data>
<Data Name="Path">C:\script.ps1</Data>
</EventData>
</Event>
lxml etree Parsing
from lxml import etree
NS = {"evt": "http://schemas.microsoft.com/win/2004/08/events/event"}
root = etree.fromstring(xml_bytes)
event_id = root.find(".//evt:System/evt:EventID", NS).text
data_elems = root.findall(".//evt:EventData/evt:Data", NS)
for elem in data_elems:
name = elem.get("Name")
value = elem.text
Script Block Reconstruction
Large PowerShell scripts are split across multiple Event 4104 entries:
ScriptBlockId: Unique GUID shared across all partsMessageNumber: Part index (1-based)MessageTotal: Total number of parts- Reconstruct: concatenate parts ordered by MessageNumber
Key Detection Patterns
| Pattern | MITRE | Risk |
|---|---|---|
-EncodedCommand |
T1059.001 | High |
FromBase64String |
T1140 | High |
Invoke-Expression / iex |
T1059.001 | High |
DownloadString / Net.WebClient |
T1105 | Critical |
AmsiUtils / amsiInitFailed |
T1562.001 | Critical |
Invoke-Mimikatz |
T1003 | Critical |
| High entropy (>5.5) | T1027 | Medium |
Back to mukul975/Anthropic-Cybersecurity-Skills (817 security skills) or Agent skills.