
Un arsenal de PowerShell para chicos y chicas de seguridad.
[!IMPORTANT]
Este repositorio ahora está archivado. Aunque fue un viaje divertido, creo que PSArmoury ha superado su utilidad.
PowerShell Armoury está diseñado para pentesters, miembros de equipos de "inserte-color-aquí" y todos aquellos que utilizan una variedad de herramientas de PowerShell durante sus compromisos. Permite descargar y almacenar todos tus scripts favoritos de PowerShell en un único archivo ofuscado.
No tienes que preocuparte por actualizar Rubeus, PowerView, ... manualmente. Solo crea un archivo de configuración una vez o usa el predeterminado incluido con la herramienta. De ahora en adelante, solo tienes que ejecutar "New-PSArmoury" antes de dirigirte al próximo compromiso.
Además, PSArmoury ofusca tu código y viene con un bypass de AMSI incluido. El diseño modular debería facilitarte cambiar el código de evasión u ofuscación en caso de que haya una detección.
La versión actual de PSArmoury favorece un diseño modular.
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
El código se divide en un script generador principal llamado New-PSArmoury.ps1, que es el que ejecutas. El código para evasión, ofuscación y desofuscación se almacena en archivos .ps1 separados en el directorio modules. Estos archivos separados son invocados por el script principal y deberían facilitarte cambiar funciones específicas (como un bypass de AMSI).
Además del directorio modules, también está el directorio utilities. Aquí encontrarás scripts independientes que pueden ser útiles en escenarios específicos.
La ruta predeterminada del directorio modules es .\modules, donde el punto se refiere al directorio de trabajo actual de tu shell. Puedes cambiar la ruta del directorio modules usando el argumento -ModulesDirectory de New-PSArmoury.
Sin embargo, los nombres de los archivos de script en sí están codificados en el script principal y siempre se espera que sean:
Echemos un vistazo más de cerca a estos dos.
Este script debe contener el código destinado a evadir lo que sea que pretendas evadir. Por defecto, contiene un conocido bypass de AMSI (gracias amsi.fail). Ten en cuenta que:
Este script debe contener el código utilizado para ofuscación y desofuscación. El obfuscation.ps1 predeterminado utiliza cifrado RC2. Ejemplos listos para usar:
Ten en cuenta que TEMPLATE_obfuscation_empty.ps1 realmente no hace nada en absoluto y sirve como plantilla para que construyas tu propia función.
Si quieres usar alguno de ellos, simplemente renómbralo a "obfuscation.ps1" y elimina el archivo predeterminado.
Si deseas crear una versión personalizada, ten en cuenta lo siguiente con respecto a la ofuscación:
Y asegúrate de recordar estas cosas en términos de desofuscación:
El directorio utilities contiene scripts independientes útiles.
El archivo de configuración debe ser un json válido que consista en un solo array con uno o más objetos, donde cada objeto se interpreta como una única fuente de script. Cada objeto tiene los siguientes atributos
Name (Mandatory)
Un nombre de tu elección para identificar el script incluido en este objeto. Está pensado como referencia para ti mismo.
URL (Mandatory)
La ubicación para obtener el contenido del script. Puede ser una URL a un recurso web (https://) o una ruta local (C:) o un recurso de red (\...). La URL se introduce en Net.Webclient o en Get-Item de PowerShell respectivamente. Así que básicamente cualquier formato que uno de esos dos pueda manejar por defecto debería funcionar.
Type (Mandatory)
Esto da una pista sobre la ubicación del script al creador del armory. Hay tres tipos válidos:
FileInclusionFilter (Optional)
Solo se interpretará en un objeto de tipo "GitHub". Se comparará con el operador de comparación "like" de PowerShell contra el nombre completo del archivo, así que ten en cuenta que debes incluir los comodines tú mismo. No olvides incluir un asterisco (*) si quieres coincidir con parte de un nombre de archivo. "*.ps1" significa todos los archivos que terminan en ".ps1", pero ".ps1" solo significa ".ps1".
FileExclusionFilter (Optional)
Como el InclusionFilter pero obviamente al revés. La exclusión tiene prioridad.
Consulta la ayuda incorporada de PowerShell (man -full New-PSArmoury) para más detalles.
-Path
La ruta a tu nuevo archivo armory. El valor predeterminado es ".\MyArmoury.ps1"
-FromFile
Carga tus scripts de PowerShell directamente desde una carpeta o archivo local y no tienes que proporcionar un archivo de configuración.
-Config
La ruta a tu archivo de configuración JSON. Echa un vistazo al ejemplo que viene con este script para ideas.
-ModulesDirectory
La ruta al directorio modules. El valor predeterminado es ".\modules". Si se usa ModulesDirectory, entonces los parámetros EvasionPath y ObfuscationPath no se pueden usar.
-EvasionPath
La ruta al script de evasión. Si se usan EvasionPath y ObfuscationPath, entonces el parámetro ModulesDirectory no se puede usar.
-ObfuscationPath
La ruta al script de ofuscación. Si se usan EvasionPath y ObfuscationPath, entonces el parámetro ModulesDirectory no se puede usar.
-ValidateOnly
Usa esto junto con "-Config" para permitir que el script valide la sintaxis básica de tu archivo de configuración JSON sin ejecutarlo.
-GithubCredentials
Pasa el nombre de usuario de GitHub y el token de acceso como un objeto de credencial para que el script no lo solicite. Útil si creas un armory repetidamente para pruebas.
Úsalo así:
$c = get-credential
New-PSArmoury -GithubCredentials $c
Debes proporcionar un nombre de usuario de GitHub válido así como un token de acceso personal, para que el script pueda usar correctamente la API de GitHub. No uses nombre de usuario/contraseña ya que esto no funcionará de todos modos si tienes MFA habilitado (y deberías habilitar MFA). Además, acceder a la API con nombre de usuario/contraseña básico está obsoleto.
Sigue esta guía para crear un token de acceso personal.
Ten en cuenta: el único permiso que necesitamos en el token de acceso es public_repo en la sección repo.
Esto se debe a que solo necesitas el token para que GitHub no nos bloquee si analizas repositorios más grandes (como PowerSploit) en busca de archivos .ps1 para incluir.
Si deseas crear un armory con la configuración predeterminada (nota: esto no ofuscará en absoluto además de la codificación base64), entonces simplemente ejecuta lo siguiente.
. .\New-PSArmoury.ps1
New-PSArmoury
Esto creará un archivo .ps1 llamado "MyArmoury.ps1" en el directorio de trabajo actual usando
Puedes cargar el armory en tu sesión actual usando
cat -raw .\MyArmoury.ps1 | iex
Cargar tu armory invoca los siguientes pasos:
Después de eso, todo el código de PowerShell que pusiste en el armory estará disponible. Simplemente invoca los cmdlets como de costumbre, así:
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
Si sucede que no recuerdas lo que pusiste dentro del armory, simplemente cárgalo y llama al inventario :-)
Get-PSArmoury
Inicia New-PSArmoury con los parámetros -EvasionPath y -ObfuscationPath de la siguiente manera:
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
Nota: en este caso, se agregarán todos los archivos .ps1 en la carpeta ya que enviamos una ruta de carpeta. Si enviamos la ruta a un solo archivo, entonces solo se procesará ese archivo.
New-PSArmoury -FromFile C:\myscriptfolder