Analyzing PowerShell Script Block Logging

Parse Windows PowerShell Script Block Logs (Event ID 4104) from EVTX files to detect obfuscated commands, encoded

Analyzing PowerShell Script Block Logging

PowerShell is an essential administrative tool in Windows environments, but its flexibility and power also make it a frequent vector for cyber attacks. Attackers often abuse PowerShell to execute malicious code, download payloads, and evade detection using obfuscation techniques. To counter these threats, Windows provides Script Block Logging - a feature that records complete blocks of PowerShell code as they are executed, including those that are obfuscated or encoded. The "Analyzing PowerShell Script Block Logging" skill focuses on extracting, reconstructing, and analyzing these logs to detect suspicious activity and uncover attacker tradecraft.

What Is This Skill?

This skill enables security analysts and incident responders to parse Windows PowerShell Script Block logs (specifically Event ID 4104) from EVTX files. It leverages the python-evtx library to extract and reconstruct multi-block scripts from PowerShell's Operational event logs. Additionally, it applies entropy analysis and pattern matching to identify signs of malicious activity, such as:

  • Obfuscated or encoded commands (for example, Base64-encoded scripts)
  • Use of living-off-the-land techniques (abuse of built-in tools)
  • Download cradles (commands that download and execute code)
  • Attempts to bypass the Antimalware Scan Interface (AMSI)
  • Execution of code via Invoke-Expression and similar functions

By automating these analyses, the skill supports faster and more accurate detection of PowerShell-based attacks.

Why Use It?

PowerShell Script Block Logging captures the actual code run by PowerShell - regardless of how it was entered or obfuscated. This is crucial because attackers often hide their actions using encoding, variable concatenation, or dynamic execution. Simple command-line logging or process monitoring may miss these actions, but Script Block Logging reveals the underlying intent.

By parsing and analyzing Event ID 4104 logs, defenders gain:

  • Visibility: See the true script content, even if the original command was obfuscated or encoded.
  • Detection: Identify malicious behaviors like AMSI bypasses, download cradles, and suspicious code execution patterns.
  • Attribution: Reconstruct attack timelines and techniques for incident response and threat hunting.
  • Coverage Validation: Ensure that security monitoring tools are capturing relevant PowerShell activity.

The "Analyzing PowerShell Script Block Logging" skill automates the extraction and analysis process, making it practical for use in real-world security operations centers (SOCs) and investigations.

How to Use It

1. Prepare Your

Environment

  • Ensure you have Python 3.8 or higher.

  • Install required libraries with the following command:

    pip install python-evtx lxml

2. Collect PowerShell Operational

Logs

Export the Microsoft-Windows-PowerShell/Operational log from the target system. This log is typically stored as Microsoft-Windows-PowerShell%4Operational.evtx.

3. Parse Event ID 4104

Entries

Use the skill's Python script to extract and analyze Script Block logs:

from Evtx.Evtx import Evtx
import re
import base64

def extract_script_blocks(evtx_path):
    with Evtx(evtx_path) as log:
        for record in log.records():
            xml = record.xml()
            if '<EventID>4104</EventID>' in xml:
                # Extract the script block text
                match = re.search(r'<Data Name="ScriptBlockText">(.*?)</Data>', xml, re.DOTALL)
                if match:
                    script_block = match.group(1)
                    yield script_block

def detect_base64(script_block):
    # Simple base64 detection for encoded payloads
    pattern = r'([A-Za-z0-9+/=]{20,})'
    matches = re.findall(pattern, script_block)
    decoded_candidates = []
    for m in matches:
        try:
            decoded = base64.b64decode(m).decode('utf-8')
            decoded_candidates.append(decoded)
        except Exception:
            pass
    return decoded_candidates

evtx_file = "Microsoft-Windows-PowerShell%4Operational.evtx"
for script in extract_script_blocks(evtx_file):
    print("[*] Script Block:", script)
    b64_hits = detect_base64(script)
    if b64_hits:
        print("[!] Possible Base64 Encoded Payloads Detected:")
        for decoded in b64_hits:
            print(decoded)

This example demonstrates basic extraction and detection of Base64-encoded payloads. You can expand the analysis with:

  • Entropy analysis for obfuscation detection
  • Pattern matching for known AMSI bypasses (e.g., AmsiUtils, Reflection.Assembly)
  • Regex for identifying download cradles (e.g., Invoke-WebRequest, Invoke-Expression)

4. Interpret

Results

  • Investigate any scripts with high entropy or encoded sections
  • Flag use of suspicious functions (e.g., Invoke-Expression, IEX)
  • Examine download or execution cradles for evidence of remote code execution
  • Look for known AMSI bypass patterns

5. Incorporate Findings into Detection

Rules

Use the patterns and insights discovered to enhance SIEM rules, EDR detections, or threat hunting queries.

When to Use It

This skill is applicable in several scenarios:

  • Incident Response: When investigating compromised endpoints with suspicious PowerShell activity.
  • Threat Hunting: While proactively searching for advanced attacker behaviors in historical PowerShell logs.
  • Security Monitoring Validation: To test and validate that security controls are capturing relevant script activity.
  • Detection Engineering: When building detection rules for PowerShell-based threats.

Important Notes

  • Authorization: Only analyze logs from systems where you have explicit permission.
  • Data Volume: Script Block logs can be voluminous in active environments. Consider filtering by time or user.
  • Log Retention: Ensure that Script Block Logging is enabled and logs are retained long enough for investigation.
  • Limitations: Attackers may attempt to disable or tamper with logging. Cross-reference with other data sources.
  • Continuous Improvement: Update pattern matching and detection logic as attacker techniques evolve.

By leveraging PowerShell Script Block Logging and this analysis skill, defenders can significantly enhance their ability to detect and respond to advanced threats that leverage PowerShell as an attack vector.