
Um arsenal do PowerShell para caras e moças da segurança
[!IMPORTANT]
Este repositório agora está arquivado. Embora tenha sido uma jornada divertida, acho que o PSArmoury já não é mais útil.
O PowerShell Armoury foi criado para pentesters, membros de "equipes-de-inserir-cor-aqui" e todos os demais que utilizam uma variedade de ferramentas PowerShell durante seus engajamentos. Ele permite baixar e armazenar todos os seus scripts PowerShell favoritos em um único arquivo ofuscado.
Você não precisa se preocupar em atualizar Rubeus, PowerView, ... manualmente. Basta criar um arquivo de configuração uma vez ou usar o padrão incluído na ferramenta. A partir de agora, você só precisa executar "New-PSArmoury" antes de partir para o próximo engajamento. Além disso, o PSArmoury ofusca seu código e vem com um bypass AMSI incluído. O design modular deve facilitar a alteração do código de evasão ou ofuscação caso haja detecção sobre ele.
A versão atual do PSArmoury favorece um design modular.
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
O código é dividido em um script gerador principal chamado New-PSArmoury.ps1, que é o que você executa. O código para evasão, ofuscação e desofuscação é armazenado em arquivos .ps1 separados no diretório modules. Esses arquivos separados são invocados pelo script principal e devem facilitar a alteração de funções específicas (como um bypass AMSI).
Além do diretório modules, existe também o diretório utilities. Aqui você encontrará scripts independentes que podem ser úteis em cenários específicos.
O caminho padrão do diretório de módulos é .\modules, onde o ponto se refere ao diretório de trabalho atual do seu shell. Você pode alterar o caminho do diretório de módulos usando o argumento -ModulesDirectory do New-PSArmoury.
No entanto, os nomes dos próprios arquivos de script estão codificados no script principal e são sempre esperados como:
Vamos dar uma olhada mais de perto nesses dois.
Este script deve conter o código destinado a contornar o que quer que você pretenda contornar. Por padrão, ele contém um bypass AMSI bem conhecido (obrigado amsi.fail). Observe que:
Este script deve conter o código usado para ofuscação e desofuscação. O obfuscation.ps1 padrão usa criptografia RC2. Exemplos prontos para uso:
Observe que o TEMPLATE_obfuscation_empty.ps1 realmente não faz nada e serve como modelo para você construir sua própria função.
Se você quiser usar um deles, basta renomeá-lo para "obfuscation.ps1" e excluir o arquivo padrão.
Se você quiser criar uma versão personalizada, tenha em mente o seguinte sobre ofuscação:
E lembre-se destas coisas em termos de desofuscação:
O diretório utilities contém scripts independentes úteis.
O arquivo de configuração precisa ser um JSON válido que consiste em um único array com um ou mais objetos, onde cada objeto é interpretado como uma única fonte de script. Cada objeto possui os seguintes atributos
Name (Obrigatório)
Um nome de sua escolha para identificar o script incluído neste objeto. Isso serve apenas como referência para você.
URL (Obrigatório)
A localização para obter o conteúdo do script. Pode ser uma URL para um recurso web (https://) ou um caminho local (C:) ou um recurso de rede (\...). A URL é enviada para Net.Webclient ou Get-Item do PowerShell, respectivamente. Portanto, basicamente qualquer formato que um desses dois possa manipular por padrão deve funcionar.
Type (Obrigatório)
Isso dá uma dica sobre a localização do script para o criador do arsenal. Existem três tipos válidos:
FileInclusionFilter (Opcional)
Será interpretado apenas em um objeto do tipo "GitHub". Será comparado com o operador de comparação "like" do PowerShell em relação ao nome completo do arquivo, então lembre-se de que você precisa incluir os curingas você mesmo. Não se esqueça de incluir um asterisco () se quiser corresponder a parte de um nome de arquivo. ".ps1" significa todos os arquivos que terminam com ".ps1", mas ".ps1" significa apenas ".ps1".
Você não precisa incluir um filtro, mas se o fizer, terá que usá-lo. Um InclusionFilter vazio significa nenhum arquivo.
FileExclusionFilter (Opcional)
Como o InclusionFilter, mas obviamente ao contrário. A exclusão tem precedência.
Consulte a ajuda inline do PowerShell (man -full New-PSArmoury) para mais detalhes.
-Path
O caminho para o seu novo arquivo arsenal. O padrão é ".\MyArmoury.ps1"
-FromFile
Carregue seus scripts PowerShell diretamente de uma pasta ou arquivo local e você não precisa fornecer um arquivo de configuração.
-Config
O caminho para o seu arquivo de configuração JSON. Dê uma olhada no exemplo que acompanha este script para ideias.
-ModulesDirectory
O caminho para o diretório de módulos. O padrão é ".\modules". Se ModulesDirectory for usado, os parâmetros EvasionPath e ObfuscationPath não podem ser usados.
-EvasionPath
O caminho para o script de evasão. Se EvasionPath e ObfuscationPath forem usados, o parâmetro ModulesDirectory não pode ser usado.
-ObfuscationPath
O caminho para o script de ofuscação. Se EvasionPath e ObfuscationPath forem usados, o parâmetro ModulesDirectory não pode ser usado.
-ValidateOnly
Use isto junto com "-Config" para que o script valide a sintaxe básica do seu arquivo de configuração JSON sem executá-lo.
-GithubCredentials
Passe o nome de usuário e token de acesso do GitHub como um objeto de credencial para que o script não solicite. Útil se você criar um arsenal repetidamente para testes.
Use assim:
$c = get-credential
New-PSArmoury -GithubCredentials $c
Você deve fornecer um nome de usuário válido do GitHub, bem como um token de acesso pessoal, para que o script possa usar adequadamente a API do GitHub. Não use nome de usuário/senha, pois isso não funcionará de qualquer forma se você tiver MFA ativado (e você deve ativar o MFA). Além disso, acessar a API com nome de usuário/senha básico está obsoleto.
Siga este guia para criar um token de acesso pessoal.
Observe: a única permissão que precisamos no token de acesso é public_repo na seção repo.
Isso porque você só precisa do token para que o GitHub não nos bloqueie se você analisar repositórios maiores (como PowerSploit) em busca de arquivos .ps1 para incluir.
Se você deseja criar um arsenal com configurações padrão (observe: isso não ofuscará nada além da codificação base64), execute o seguinte.
. .\New-PSArmoury.ps1
New-PSArmoury
Isso criará um arquivo .ps1 chamado "MyArmoury.ps1" no diretório de trabalho atual usando
Você pode carregar o arsenal em sua sessão atual usando
cat -raw .\MyArmoury.ps1 | iex
Carregar seu arsenal invoca as seguintes etapas:
Depois disso, todo o código PowerShell que você colocou no arsenal estará disponível. Basta invocar os cmdlets como de costume, assim
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
Se acontecer de você não se lembrar do que colocou dentro do arsenal, basta carregá-lo e chamar o inventário :-)
Get-PSArmoury
Inicie o New-PSArmoury com os parâmetros -EvasionPath e -ObfuscationPath assim:
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
Observação: neste caso, todos os arquivos .ps1 na pasta serão adicionados, pois enviamos um caminho de pasta. Se enviarmos o caminho para um único arquivo, apenas esse arquivo será processado.
New-PSArmoury -FromFile C:\myscriptfolder