Understanding the Concept of Runbooks
Windows PowerShell Essentials: Building a Solid Foundation for Cybersecurity
PowerShell is one of the most powerful tools in the Windows ecosystem. For cybersecurity professionals—whether offensive or defensive—understanding how PowerShell works is essential. It provides access to the underlying system, processes, and configurations with just a few lines of code.
This article focuses on building a solid foundation, covering security-focused commands and principles that every cybersecurity expert must know.
Why PowerShell Matters in Security
PowerShell is built on .NET, offering deep system integration, automation, and scripting power. For defenders, it enables monitoring, auditing, and incident response. For red teamers or penetration testers, it's a post-exploitation powerhouse.
However, because of its power, PowerShell is also a favorite tool for attackers—making understanding it essential for defenders to detect and mitigate misuse.
Setting Up a Secure PowerShell Environment
Before diving into commands, make sure your environment is safe to experiment with.
1. Check Execution Policy
PowerShell's Execution Policy controls which scripts can run.
Get-ExecutionPolicyCommon options include:
Restricted- No scripts can run (default on most systems).RemoteSigned- Local scripts can run, downloaded scripts must be signed.Bypass- No restrictions (dangerous for production).
Set it safely for testing:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUserTip: Never set Unrestricted globally. Use -Scope Process or CurrentUser for testing.
Essential Commands for Security Professionals
These commands form the core toolkit for any PowerShell security workflow.
1. System Information and Reconnaissance
# Get OS and version info
Get-ComputerInfo | Select-Object CsName, WindowsProductName, WindowsVersion, OsArchitecture
# List installed updates (patch audit)
Get-HotFix | Sort-Object InstalledOn -Descending
# Enumerate network interfaces
Get-NetIPConfiguration
# Check running processes
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
# Enumerate services and their status
Get-Service | Where-Object {$_.Status -eq "Running"}Use case: These commands help defenders establish a baseline and attackers perform enumeration.
2. User and Access Control
# List all local users
Get-LocalUser
# List all local groups
Get-LocalGroup
# Check members of the Administrators group
Get-LocalGroupMember -Group "Administrators"Defender's insight: Regularly audit local admin groups to ensure no unauthorized accounts are added.
3. Event Logs and Audit Trails
Windows event logs are critical for incident response.
# Get the latest 20 security events
Get-EventLog -LogName Security -Newest 20
# Search for failed logon attempts
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
Select-Object TimeCreated, MessagePro tip: Use event IDs as indicators of compromise (IOCs). For example:
- 4624 - Successful logon
- 4625 - Failed logon
- 4688 - Process creation
4. Network and Firewall Auditing
# List all listening ports
Get-NetTCPConnection | Where-Object {$_.State -eq "Listen"}
# View firewall rules
Get-NetFirewallRule | Select-Object DisplayName, Enabled, Direction, Action
# Check allowed inbound ports
Get-NetFirewallPortFilter | Where-Object {$_.Protocol -eq "TCP"}Security use: Quickly identify unexpected open ports or misconfigured firewall rules.
5. Process and Malware Hunting
# Find processes with suspicious parent-child relationships
Get-WmiObject Win32_Process | Select-Object Name, ProcessId, ParentProcessId
# Detect unsigned executables
Get-ChildItem "C:\Program Files" -Recurse -ErrorAction SilentlyContinue |
Get-AuthenticodeSignature |
Where-Object {$_.Status -ne "Valid"}Usage: Great for detecting living-off-the-land binaries (LOLBins) or persistence attempts.
Security Hardening with PowerShell
Disable PowerShell Remoting (if not needed)
Disable-PSRemoting -ForceEnable PowerShell Script Block Logging
For better forensics visibility:
Set-ItemProperty "HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name EnableScriptBlockLogging -Value 1Check and clear PowerShell history
# View history
(Get-PSReadlineOption).HistorySavePath
# Clear history
Remove-Item (Get-PSReadlineOption).HistorySavePathBonus: Security-Focused Cmdlets to Remember
| Purpose | Cmdlet | Description |
|---|---|---|
| File hash verification | Get-FileHash | Verify file integrity |
| Process creation events | Get-WinEvent | Monitor suspicious activity |
| Signed script verification | Get-AuthenticodeSignature | Check code authenticity |
| Registry queries | Get-ItemProperty | Inspect registry for persistence |
| Network audit | Test-NetConnection | Test connectivity and ports |
Remember: Knowing PowerShell is not just about offense or defense — it's about control. The more you understand it, the better you can protect and secure Windows environments.