
Enumere e ataque o Active Directory com persistência de sessão LDAP, abuso de ACL, Kerberoasting/ASREProasting, shadow credentials, RBCD e NTLM relay.
Instalação | Uso Básico | Ofuscação | Módulos | Registro de Logs | Regras Definidas pelo Usuário | MCP | Plugins | Agradecimentos
PowerView.py é uma alternativa ao incrível script original PowerView.ps1. A maioria dos módulos usados no PowerView está disponível aqui (algumas das flags foram alteradas). O objetivo principal é obter uma sessão interativa sem ter que autenticar repetidamente no ldap.
https://github.com/aniqfakhrul/powerview.py/wiki/Installation-Guide
[!NOTE] Observe que algumas das funções kerberos ainda não estão funcionando bem, mas ainda fará a maior parte do trabalho. O uso detalhado pode ser encontrado na seção Wiki
* Manter conexão persistente
> [!TIP]
> A persistência de conexão está desativada por padrão. As sessões LDAP expiram após inatividade. Use `--keepalive-interval` para enviar consultas periódicas que mantêm o estado da sessão.
* Iniciar interface web```
powerview range.net/lowpriv:[email protected] --web [--web-host 0.0.0.0] [--web-port 3000] [--web-auth user:password1234]

--use-sign-and-seal e --use-channel-binding só estão disponíveis se você instalar a biblioteca ldap3 diretamente deste branch```
powerview range.net/lowpriv:[email protected] [--use-channel-binding | --use-sign-and-seal | --use-simple-auth]* Init com schannel. A flag `--pfx` aceita arquivo de certificado no formato pfx.
> [!NOTE]
> o powerview tentará carregar o certificado sem senha na primeira tentativa. Se falhar, ele solicitará a senha. Portanto, nenhum parâmetro de senha é necessário.```
powerview 10.10.10.10 --pfx administrator.pfx

* Especificar atributos de pesquisa```
Get-DomainUser -Properties samaccountname,description
* Contar resultados```
Get-DomainUser -Count
* Formatar a saída em uma tabela.```
Get-DomainUser -Properties samaccountname,memberof -TableView
Get-DomainUser -Properties samaccountname,memberof -TableView [csv,md,html,latex]
Set-DomainObject -Identity "adminuser" -Set 'servicePrincipalname=@/path/to/local/file' Set-DomainObject -Identity "adminuser" -Append 'servicePrincipalname=@/path/to/local/file'
* Modo relay```
powerview 10.10.10.10 --relay [--relay-host] [--relay-port] [--use-ldap | --use-ldaps]

[!NOTE]
Esta demonstração mostra que a autenticação forçada foi feita usandoprinterbug.py. Você pode usar outros métodos que forcem a autenticação HTTP.
O PowerView usa ldapx-py para ofuscar consultas LDAP e parâmetros relacionados, variando padrões observáveis enquanto preserva a intenção da consulta.
* Ative via CLI (códigos de cadeia personalizados)```
powerview range.net/lowpriv:[email protected] --obfuscate CZXANDR
[!TIP] Alterne
Obfuscatenas Configurações. Isso se aplica a consultas subsequentes da sessão ativa.
O que é ofuscado
Cadeias padrão (ao usar --obfuscate sem valor)
| Alvo | Cadeia | Técnicas |
|---|---|---|
| Filter | CZNDR | Case, Zeros, aNR, De Morgan, Reorder |
| BaseDN |
Execute ldapx codes --all para ver todos os códigos de ofuscação disponíveis.
[!NOTE] Os resultados são funcionalmente equivalentes na maioria dos casos, mas expansões por aproximação/curinga podem ampliar as correspondências. Alguns códigos (G, O, S) podem não ser compatíveis com ldap3 - use com cautela.
[!WARNING] Ofuscação excessiva pode ser rejeitada por servidores rigorosos ou ferramentas intermediárias. Use apenas quando necessário.
PV > Add-ADComputer Get-ADObject Get-EventLogChannel Login-As Set-ADObject Add-ADUser Get-CA Get-EventLogPublisher Logoff-Session Set-ADObjectDN Add-CATemplate Get-CATemplate Get-ExchangeDatabase Reboot-Computer Set-CATemplate Add-CATemplateAcl Get-DMSA Get-ExchangeMailbox Remove-ADComputer Set-DomainCATemplate Add-DMSA Get-Domain Get-ExchangeServer Remove-ADObject Set-DomainComputerPassword Add-DomainCATemplate Get-DomainCA Get-GMSA Remove-ADUser Set-DomainDNSRecord Add-DomainCATemplateAcl Get-DomainCATemplate Get-GPOLocalGroup Remove-CATemplate Set-DomainObject Add-DomainComputer Get-DomainComputer Get-GPOSettings Remove-DMSA Set-DomainObjectDN Add-DomainDMSA Get-DomainController Get-LocalUser Remove-DomainCATemplate Set-DomainObjectOwner Add-DomainDNSRecord Get-DomainDMSA Get-NamedPipes Remove-DomainComputer Set-DomainRBCD Add-DomainGMSA Get-DomainDNSRecord Get-NetComputerInfo Remove-DomainDMSA Set-DomainUserPassword Add-DomainGPO Get-DomainDNSZone Get-NetLoggedOn Remove-DomainDNSRecord Set-NetService Add-DomainGroup Get-DomainForeignGroupMember Get-NetProcess Remove-DomainGMSA Set-ObjectOwner Add-DomainGroupMember Get-DomainForeignUser Get-NetService Remove-DomainGroupMember Set-RBCD Add-DomainObjectAcl Get-DomainGMSA Get-NetSession Remove-DomainObject Set-ShadowCred Add-DomainOU Get-DomainGPO Get-NetShare Remove-DomainObjectAcl Set-ShadowCredential Add-DomainUser Get-DomainGPOLocalGroup Get-NetTerminalSession Remove-DomainOU Shutdown-Computer Add-GMSA Get-DomainGPOSettings Get-ObjectAcl Remove-DomainUser Start-NetService Add-GPLink Get-DomainGroup Get-ObjectOwner Remove-GMSA Stop-Computer Add-GPO Get-DomainGroupMember Get-RBCD Remove-GPLink Stop-NetProcess Add-GroupMember Get-DomainObject Get-RegLoggedOn Remove-GroupMember Stop-NetService Add-NetService Get-DomainObjectAcl Get-SCCM Remove-NetService Unlock-ADAccount Add-ObjectAcl Get-DomainObjectOwner Get-ShadowCred Remove-NetSession clear Add-OU Get-DomainOU Get-ShadowCredential Remove-NetTerminalSession exit Clear-Cache Get-DomainRBCD Get-TrustKey Remove-ObjectAcl get_pool_stats ConvertFrom-SID Get-DomainSCCM Get-WDS Remove-OU history ConvertFrom-UACValue Get-DomainTrust Invoke-ASREPRoast Remove-ShadowCred taskkill Disable-DomainDNSRecord Get-DomainTrustKey Invoke-DFSCoerce Remove-ShadowCredential tasklist Get-DomainTrustMapping Find-ForeignGroup Get-DomainUser Invoke-Kerberoast Restart-Computer Find-ForeignUser Get-DomainWDS Invoke-MessageBox Restore-ADObject Find-LocalAdminAccess Get-EventLog Invoke-PrinterBug Restore-DomainObject
### Funções de Domínio/LDAP
| Module | Alias | Description |
| ------ | ----- | ---- |
|Get-DomainUser||Consulta todos os usuários ou objetos de usuário específicos no AD|
|Get-DomainComputer||Consulta todos os computadores ou objetos de computador específicos no AD|
|Get-DomainGroup||Consulta todos os grupos ou objetos de grupo específicos no AD|
|Get-DomainGroupMember||Consulta os membros de um grupo de domínio específico|
|Get-DomainOU||Consulta todas as UOs ou objetos de UO específicos no AD|
|Get-Domain||Consulta informações do domínio|
|Get-DomainController||Consulta controladores de domínio disponíveis|
|Get-DomainDNSRecord||Consulta registros disponíveis. Ele percorre recursivamente todas as zonas DNS se -ZoneName não for especificado|
|Get-DomainDNSZone||Consulta zonas DNS disponíveis no domínio|
|Get-DomainObject|Get-ADObject|Consulta todos ou objetos de domínio especificados no AD|
|Get-DomainObjectAcl|Get-ObjectAcl|Consulta ACLs para o objeto de AD especificado|
|Get-DomainSCCM|Get-SCCM|Consulta SCCM|
|Get-DomainRBCD|Get-RBCD|Encontra contas configuradas para delegação restrita baseada em recurso|
|Get-DomainObjectOwner|Get-ObjectOwner|Consulta o proprietário do objeto de AD|
|Get-DomainGMSA|Get-GMSA|Consulta contas de serviço gerenciadas de grupo (gMSA) e recupera seus blobs de senha|
|Get-DomainDMSA|Get-GDSA|Consulta contas de serviço gerenciadas delegadas (dMSA)|
|Remove-DomainGMSA|Remove-GMSA|Exclui uma conta de serviço gerenciada de grupo (GMSA) existente do domínio|
|Remove-DomainDMSA|Remove-DMSA|Exclui uma conta de serviço gerenciada delegada (dMSA) existente do domínio|
|Remove-DomainDNSRecord||Remove o registro DNS do domínio|
|Remove-DomainComputer|Remove-ADComputer|Remove o computador do domínio|
|Remove-DomainGroupMember|Remove-GroupMember|Remove membro de um grupo de domínio específico|
|Remove-DomainOU|Remove-OU|Remove UOs ou objetos de UO específicos no AD|
|Remove-DomainObjectAcl|Remove-ObjectAcl|Remove ACLs para o objeto de AD especificado|
|Remove-DomainObject|Remove-ADObject|Remove o objeto de domínio especificado|
|Remove-DomainUser|Remove-ADUser|Remove o usuário de domínio especificado no AD|
|Set-DomainDNSRecord||Define o registro DNS do domínio|
|Set-DomainUserPassword||Define a senha para o usuário de domínio especificado|
|Set-DomainComputerPassword||Define a senha para o computador de domínio especificado|
|Set-DomainObject|Set-ADObject|Define para objetos de domínio especificados no AD|
|Set-DomainObjectDN|Set-ADObjectDN|Modifica o atributo distinguishedName do objeto, bem como altera a UO|
|Set-DomainObjectOwner|Set-ObjectOwner|Define o proprietário do objeto de AD|
|Set-ShadowCredential|Set-ShadowCred|Gerencia msDS-KeyCredentialLink (Shadow Credentials) para um objeto de domínio|
|Get-ShadowCredential|Get-ShadowCred|Lista shadow credentials (msDS-KeyCredentialLink) para um objeto de domínio ou todos os objetos|
|Remove-ShadowCredential|Remove-ShadowCred|Remove shadow credentials por DeviceId ou limpa todas de um objeto de domínio|
|Add-DomainDNSRecord||Adiciona registro DNS do domínio|
|Disable-DomainDNSRecord||Desabilita o registro DNS apontando para um endereço inválido|
|Add-DomainGMSA|Add-GMSA|Cria uma nova conta de serviço gerenciada de grupo (gMSA) no domínio|
|Add-DomainDMSA|Add-GMSA|Cria uma nova conta de serviço gerenciada delegada (dMSA) no domínio|
|Add-DomainUser|Add-ADUser|Adiciona novo usuário de domínio no AD|
|Add-DomainComputer|Add-ADComputer|Adiciona novo computador de domínio no AD|
|Add-DomainGroupMember|Add-GroupMember|Adiciona novo membro no grupo de domínio especificado no AD|
|Add-DomainOU|Add-OU|Adiciona novo objeto de UO no AD|
|Add-DomainGPO|Add-GPO|Adiciona novo objeto de GPO no AD|
|Add-DomainObjectAcl|Add-ObjectAcl|Os direitos suportados até agora são All, DCsync, RBCD, ShadowCred, WriteMembers|
|Clear-Cache||Limpa o cache|
### Funções de GPO
| Module | Alias | Description |
| ------ | ----- | ---- |
|Get-DomainGPO|| Consulta objetos de política de grupo do domínio |
|Get-DomainGPOLocalGroup|Get-GPOLocalGroup|Consulta todos os GPOs em um domínio que modificam associações de grupos locais por meio de `Restricted Groups` ou `Group Policy preferences`|
|Add-GPLink||Cria um novo vínculo de GPO para uma UO|
|Remove-GPLink||Remove o vínculo de GPO de uma UO|
### Funções de Enumeração de Computadores
| Module | Alias | Description |
| ------ | ----- | ---- |
|Get-NetSession||[MS-SRVS] Consulta informações de sessão para o computador local ou remoto|
|Get-NetShare||Consulta compartilhamentos abertos no computador local ou remoto|
|Get-NetLoggedOn||[MS-WKST] Consulta usuários conectados no computador local ou remoto|
|Get-EventLog||[MS-EVEN6] Consulta logs de eventos do Windows de um computador remoto via RPC|
|Get-EventLogChannel||[MS-EVEN6] Lista canais de log de eventos em um computador remoto com detecção de produtos de segurança|
|Get-EventLogPublisher||[MS-EVEN6] Lista publicadores de log de eventos em um computador remoto com detecção de produtos de segurança|
|Get-NetService||[MS-SCMR] Consulta serviços em execução no computador local ou remoto|
|Stop-NetService||[MS-SCMR] Interrompe um serviço específico no computador local ou remoto|
|Get-NetProcess|tasklist|[MS-TSTS] Consulta processos em execução no computador local ou remoto|
|Stop-NetProcess|taskkill|[MS-TSTS] Encerra um processo específico no computador local ou remoto|
|Get-NetTerminalSession||[MS-TSTS] Consulta sessões de terminal ativas no computador local ou remoto|
|Remove-NetTerminalSession||[MS-TSTS] Encerra uma sessão de terminal específica no computador local ou remoto|
|Stop-Computer|Shutdown-Computer|[MS-TSTS] Desliga um computador remoto|
|Restart-Computer|Reboot-Computer|[MS-TSTS] Reinicia um computador remoto|
### Funções de ADCS
| Module | Alias | Description |
| ------ | ----- | ---- |
|Get-DomainCATemplate|Get-CATemplate|Consulta modelos de CA disponíveis. Suporta filtragem para template vulnerável|
|Get-DomainCA|Get-CA|Consulta a Autoridade de Certificação (CA)|
|Remove-DomainCATemplate|Remove-CATemplate|Remove o modelo de CA de domínio especificado|
|Set-DomainCATemplate|Set-CATemplate|Modifica os atributos do objeto de domínio de um modelo de CA|
|Add-DomainCATemplate|Add-CATemplate|Adiciona novo modelo de CA de domínio|
|Add-DomainCATemplateAcl|Add-CATemplateAcl|Adiciona ACL a um modelo de certificado. Os direitos suportados até agora são All, Enroll, Write|
### Funções do Exchange
| Module | Alias | Description |
| ------ | ----- | ----------- |
|Get-ExchangeServer|Get-Exchange|Recupera a lista de servidores Exchange disponíveis no domínio|
### Funções de Confiança de Domínio
| Module | Alias | Description |
| ------ | ----- | ---- |
|Get-DomainTrust||Consulta todas as relações de confiança do domínio|
|Get-DomainTrustMapping||Mapeia recursivamente todas as relações de confiança alcançáveis a partir do domínio atual. Entra em cada parceiro de confiança e achata os resultados com as colunas `SourceName` / `TargetName` (espelha o `Get-DomainTrustMapping` do PowerView.ps1). Use `-NoRecurse` para limitar ao domínio inicial.|
|Get-DomainForeignUser|Find-ForeignUser|Consulta usuários que estão em grupo fora do domínio do usuário|
|Get-DomainForeignGroupMember|Find-ForeignGroup|Consulta grupos com usuários fora do domínio do grupo e procura membros estrangeiros|
### Funções Diversas
| Module | Alias | Description |
| ------ | ----- | ---- |
|ConvertFrom-SID||Converte um identificador de segurança (SID) fornecido em nome de usuário/grupo|
|ConvertFrom-UACValue||Converte um valor inteiro de UAC em formato legível|
|Get-NamedPipes||Lista os Named Pipes de um computador específico|
|Invoke-DFSCoerce||Coage a autenticação da conta de máquina via MS-DFSNM NetrDfsRemoveStdRoot()|
|Invoke-Kerberoast||Solicita o ticket Kerberos para um nome de principal de serviço (SPN) especificado|
|Invoke-PrinterBug||Aciona a função MS-RPRN RpcRemoteFindFirstPrinterChangeNotificationEx para forçar um servidor a autenticar em uma máquina especificada|
|Unlock-ADAccount||Desbloqueia contas de domínio modificando o atributo lockoutTime|
|Find-LocalAdminAccess||Encontra computadores no domínio local onde o usuário atual tem acesso de Administrador Local|
### Registro de Logs
Nunca deixaremos de registrar logs para manter o controle das ações realizadas. Por padrão, o powerview cria uma pasta `.powerview` no diretório pessoal do usuário atual _(~)_. Cada arquivo de log é gerado com base na data atual.
Exemplo de caminho: `/root/.powerview/logs/bionic.local/2024-02-13.log`
### Detecção de Vulnerabilidades
O PowerView.py inclui um sistema integrado de detecção de vulnerabilidades que identifica automaticamente problemas comuns de segurança do Active Directory. Ao consultar objetos, as vulnerabilidades serão exibidas na saída:```
vulnerabilities: [VULN-026] Domain with high machine account quota (allows users to add computer accounts) (MEDIUM)
[VULN-029] Domain with weak minimum password length policy (less than 8 characters) (HIGH)
Você pode definir regras personalizadas de detecção de vulnerabilidades modificando o arquivo vulns.json localizado no diretório de armazenamento do PowerView (~/.powerview/vulns.json).
Cada regra de vulnerabilidade tem a seguinte estrutura:```json "rule_name": { "description": "Human-readable description of the vulnerability", "rules": [ { "attribute": "attributeName", "condition": "condition_type", "value": "value_to_check" }, { "attribute": "anotherAttribute", "condition": "another_condition", "value": "another_value" } ], "exclusions": [ { "attribute": "attributeName", "condition": "condition_type", "value": "value_to_exclude" } ], "severity": "low|medium|high|critical", "id": "VULN-XXX", "rule_operator": "AND|OR", "exclusion_operator": "AND|OR", "details": "Optional detailed explanation of the vulnerability and remediation steps" }
**Rule Components:**
- **rules**: Lista de condições que devem ser atendidas para que a vulnerabilidade seja detectada
- **exclusions**: Lista de condições que, se atendidas, excluirão um objeto da detecção mesmo que ele corresponda às regras
- **rule_operator**: Como combinar múltiplas regras (padrão: "OR")
- "AND": Todas as regras devem corresponder
- "OR": Qualquer regra pode corresponder
- **exclusion_operator**: Como combinar múltiplas exclusões (padrão: "OR")
- "OR": Qualquer exclusão pode corresponder para excluir o objeto
- "AND": Todas as exclusões devem corresponder para excluir o objeto
- **negate**: Booleano opcional (True/False) que pode ser adicionado a qualquer regra para inverter o seu resultado
**Supported Conditions:**
| Condição | Descrição |
| --------- | ----------- |
| `exists` | O atributo existe |
| `not_exists` | O atributo não existe |
| `equals` | Correspondência exata (sem diferenciar maiúsculas de minúsculas) |
| `not_equals` | Não é uma correspondência exata |
| `contains` | Correspondência de substring (sem diferenciar maiúsculas de minúsculas) |
| `not_contains` | Nenhuma correspondência de substring |
| `startswith` | Começa com string (sem diferenciar maiúsculas de minúsculas) |
| `endswith` | Termina com string (sem diferenciar maiúsculas de minúsculas) |
| `older_than` | A data é mais antiga que o número de dias especificado |
| `newer_than` | A data é mais recente que o número de dias especificado |
| `greater_than` | O valor numérico é maior que o especificado |
| `less_than` | O valor numérico é menor que o especificado |
| `greater_than_or_equal` | O valor numérico é maior ou igual ao especificado |
| `less_than_or_equal` | O valor numérico é menor ou igual ao especificado |
| `has_flag` | O flag de bit está definido em um valor numérico |
| `missing_flag` | O flag de bit não está definido em um valor numérico |
| `any_flag_set` | Qualquer um dos flags especificados está definido |
| `all_flags_set` | Todos os flags especificados estão definidos |
**Multiple Values:**
Você pode especificar múltiplos valores para uma condição usando:
1. String separada por pipe: `"value": "value1|value2|value3"`
2. Formato de lista: `"value": ["value1", "value2", "value3"]`
**Exemplo de Regra:**```json
"weak_password_policy": {
"description": "Domain with weak minimum password length policy (less than 8 characters)",
"rules": [
{
"attribute": "objectClass",
"condition": "contains",
"value": "domainDNS"
},
{
"attribute": "minPwdLength",
"condition": "less_than",
"value": 8
}
],
"exclusions": [],
"severity": "high",
"id": "VULN-029",
"rule_operator": "AND"
}
[!note] Isso não está incluído na instalação base do projeto. Você pode executar
pip3 install .[mcp] or pip3 install powerview[mcp]para incluir as funcionalidades do MCP.
Isso habilita o servidor Model Context Protocol, permitindo que agentes de IA interajam com as funcionalidades do PowerView por meio de uma interface padronizada via transporte Streamable HTTP. Consulte a documentação do MCP para mais detalhes.
O servidor MCP expõe a maior parte da funcionalidade do PowerView por meio de uma interface de ferramenta padronizada. Isso inclui a capacidade de:
- Consultar e enumerar objetos do Active Directory (usuários, computadores, grupos, OUs)
- Recuperar informações sobre relações de confiança de domínio, GPOs e associações de grupo
- Procurar vulnerabilidades de segurança e configurações incorretas
- ...
#### Claude Desktop
O Claude Desktop ainda não suporta transporte baseado em HTTP [Github](https://github.com/orgs/modelcontextprotocol/discussions/16). Talvez você queira usar [mcp-proxy](https://github.com/sparfenyuk/mcp-proxy).
* Instale `mcp-proxy````bash
# Option 1: With uv (recommended)
uv tool install mcp-proxy
# Option 2: With pipx (alternative)
pipx install mcp-proxy
#### Cursor
Você pode modificar isso nas configurações do Cursor, no botão de opções MCP.
>[!tip]
>Ative o modo YOLO para habilitar o modo autônomo, assim você não precisa clicar no botão "Run Tool" cada vez. Leia mais [aqui](https://docs.cursor.com/chat/agent#yolo-mode)```json
{
"mcpServers": {
"Powerview": {
"url": "http://127.0.0.1:5000/powerview"
}
}
}
[!warning] Ao usar MCP com modelos de IA públicos (como Claude, GPT, etc.), seus dados do Active Directory podem ser transmitidos e registrados por esses serviços de acordo com suas políticas de tratamento de dados. Esteja atento à exposição de informações confidenciais ao usar essas ferramentas. Não somos responsáveis por qualquer vazamento de dados ou implicações de segurança resultantes da conexão do PowerView a serviços de IA de terceiros. Auto-hospedado FTW!
O PowerView suporta um sistema de plugins baseado em decoradores que permite adicionar novos comandos e criar hooks antes/depois de comandos existentes.
┌────────────────────────────────┐
│ Plugin Loader │
│ Scans directories on startup │
└──────────────┬─────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ builtin/ plugins │ │ ~/.powerview/ │
│ │ │ plugins/ │
│ dehashed.py │ │ │
│ highlight.py │ │ my_plugin.py │
│ recon.py │ │ ... │
└───────────────────┘ └───────────────────┘
│ │
└───────────────┬───────────────┘
▼
┌──────────────────────┐
│ Sanity Validation │
│ Check signatures & │
│ required decorators │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ Plugin Registry │
│ │
│ commands: {} │
│ before_hooks: {} │
│ after_hooks: {} │
└──────────┬───────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ Command Execution Flow │
│ │
│ User Input: "Get-DomainUser -Identity admin" │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ @before hooks │ │
│ │ (modify args) │ │
│ └───────────┬────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ Core command OR │ │
│ │ @command plugin │ │
│ └───────────┬────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ @after hooks │ │
│ │ (modify results) │ │
│ └───────────┬────────────┘ │
│ │ │
│ ▼ │
│ Format & Display │
└─────────────────────────────────────────────────┘
Plugins são arquivos `.py` únicos descobertos automaticamente a partir de dois caminhos:
| Caminho | Finalidade |
|------|---------|
| `powerview/plugins/builtin/` | Acompanha o pacote |
| `~/.powerview/plugins/` | Plugins gerenciados pelo usuário |
#### Plugins Integrados
| Plugin | Comandos | Hooks | Descrição |
|--------|----------|-------|-------------|
| Recon | `Invoke-DomainRecon` | — | Resumo de reconhecimento de domínio em um único comando |
| Highlight | — | `after:Get-DomainUser` | Destaca senhas encontradas em descrições de usuários |
#### Gerenciamento de Plugins```
Get-Plugin # List all plugins with status
Enable-Plugin -Name <plugin_name> # Enable a disabled plugin
Disable-Plugin -Name <plugin_name> # Disable a plugin at runtime
Crie um arquivo .py em ~/.powerview/plugins/. Os plugins usam três decoradores: @command para registrar novos comandos, @before para executar lógica antes de um comando existente e @after para executar lógica depois.```python
from powerview.plugins import command, before, after, PowerviewPlugin
plugin = PowerviewPlugin( name="CustomEnum", description="Custom enumeration helpers", author="yourname", version="1.0", )
@command("Get-DomainAdminUser", args=["-Identity", "-Properties", "-SearchBase"], description="Find users with adminCount=1") def get_domainadminuser(pv, args=None, identity=None, properties=None, searchbase=None): results = pv.get_domainuser( identity=identity or "*", properties=properties or ["sAMAccountName", "adminCount", "memberOf", "description"], searchbase=searchbase, ) if results: return [r for r in results if str(r.get("attributes", r).get("adminCount", "")) == "1"] return results
@before("Get-DomainUser", priority=10) def inject_enabled_filter(pv, args): """Automatically filter out disabled accounts.""" if not hasattr(args, 'ldapfilter') or not args.ldapfilter: args.ldapfilter = "(!(userAccountControl:1.2.840.113556.1.4.803:=2))" return args
@after("Get-DomainUser", priority=20) def add_password_age(pv, args, results): """Enrich results with password age.""" from datetime import datetime, timezone if not results: return results for entry in results: attrs = entry.get("attributes", entry) pwdlast = attrs.get("pwdLastSet") if isinstance(pwdlast, datetime): if pwdlast.tzinfo is None: pwdlast = pwdlast.replace(tzinfo=timezone.utc) age = (datetime.now(timezone.utc) - pwdlast).days attrs["PasswordAge"] = f"{age} days" return results
**Decoradores:**
| Decorador | Assinatura | Descrição |
|-----------|-----------|-------------|
| `@command(name, args, description)` | `func(pv, args=None, **kwargs)` | Registra um novo comando verbo-substantivo |
| `@before(command_name, priority)` | `func(pv, args)` | Executa antes de um comando. Retorna os argumentos modificados ou `None` |
| `@after(command_name, priority)` | `func(pv, args, results)` | Executa depois de um comando. Retorna os resultados modificados ou `None` |
> [!NOTE]
> `@before` e `@after` aceitam um único nome de comando ou uma lista (ex.: `@after(["Get-DomainUser", "Get-DomainComputer"])`). Valores de prioridade menores são executados primeiro.
**Definições avançadas de argumentos:**
Os argumentos de plugins podem ser strings simples (`"-Identity"`) ou dicionários para um controle mais refinado:```python
@command("Get-CustomThing", args=[
"-Identity",
{"name": "-Days", "type": int, "default": 90, "help": "Threshold in days"},
{"name": "-Verbose", "action": "store_true", "help": "Show details"},
])
[!TIP] Todos os comandos de plugins recebem automaticamente os sinalizadores
-OutFile,-TableViewe-SortBy.
CX |
| Case, heX encoding |
| Attributes | CR | Case, Reorder |