
PowerShell reconstruido en C# para fines de Red Teaming
NoPowerShell es una herramienta implementada en C# que permite ejecutar comandos similares a los de PowerShell permaneciendo invisible a cualquier mecanismo de registro de PowerShell. Este binario compatible con .NET Framework 2 puede cargarse en Cobalt Strike para ejecutar comandos en memoria. No se utiliza System.Management.Automation.dll; solo bibliotecas nativas de .NET. Un caso de uso alternativo para NoPowerShell es lanzarlo como DLL mediante rundll32.exe en un entorno restringido: rundll32 NoPowerShell.dll,main.
Este proyecto facilita que cualquiera pueda ampliar su funcionalidad con solo unas pocas líneas de código C#. Para más información, consulte CONTRIBUTING.md.
Los binarios más recientes están disponibles en la página de Releases. La rama MASTER no se actualiza con mucha regularidad; el código y los cmdlets más recientes están disponibles en la rama DEV. Para poner en marcha tus habilidades con NoPowerShell, asegúrate de revisar también la Cheatsheet de cmdlets.



NoPowerShell está desarrollado para usarse con el comando execute-assembly de Cobalt Strike o en un entorno restringido mediante rundll32.exe.
Razones para usar NoPowerShell:
ping en lugar de Test-NetConnection)powerpick o powershell, sí lo están en nps (por ejemplo, cmdlets del módulo ActiveDirectory)Consulta CHEATSHEET.md.
Usa el comando execute-assembly de Cobalt Strike para lanzar NoPowerShell.exe. Por ejemplo: execute-assembly /path/to/NoPowerShell.exe Get-Command.
Opcionalmente, NoPowerShell.cna puede usarse para añadir el alias nps a Cobalt Strike.
bofnet_initbofnet_load /path/to/NoPowerShell.dllbofnet_execute NoPowerShell.Program Get-CommandEste fork permite ejecutar ejecutables .NET normales
bofnet_initbofnet_load /path/to/NoPowerShell.exebofnet_executeassembly NoPowerShell Get-CommandNoPowerShell.dll (arrastra con el botón derecho -> Crear accesos directos aquí)rundll32 al nombre del archivo y añadiendo ,mainrundll32 C:\Path\to\NoPowerShell.dll,mainAl usar NoPowerShell desde cmd.exe o PowerShell, debes escapar el carácter de tubería (|) con un acento circunflejo (^) o un backtick (`), respectivamente, por ejemplo:
ls ^| select Namels `| select Name[System.Security.Principal.WindowsIdentity]::GetCurrent().NameLos autores de cmdlets adicionales de NoPowerShell se añaden a la siguiente tabla. Además, la tabla enumera los comandos que la comunidad ha solicitado añadir. ¡Juntos podemos desarrollar un potente kit de herramientas NoPowerShell!
| Cmdlet | Contribuido por | GitHub | Descripción | |
|---|---|---|---|---|
Asegúrate también de consultar la Cheatsheet para ver ejemplos de cómo usar estos cmdlets.
Varios cmdlets de NoPowerShell y NoPowerShell DLL incluyen código creado por otros desarrolladores.
Escrito por Arris Huijgen (@bitsadmin - https://github.com/bitsadmin/)
| Cmdlet | Descripción |
|---|
| Invoke-Command | Ejecuta un comando en una máquina remota mediante PSRemoting (que en ese caso, por supuesto, se registrará) |
| * | Más comandos *-Item* |
| Search-ADAccount | |
| Get-ADPrincipalGroupMembership | |
| Get-ADOrganizationalUnits | |
| * | Más comandos del módulo ActiveDirectory de PowerShell |
| * | Utilidades de Sysinternals como pipelist y sdelete |
| Cmdlet | Módulo | Notas |
|---|
| Get-ADUser | ActiveDirectory | |
| Get-ADObject | ActiveDirectory | |
| Get-ADReplicationSubnet | ActiveDirectory | |
| Get-ADGroup | ActiveDirectory | |
| Get-ADGroupMember | ActiveDirectory | |
| Get-ADComputer | ActiveDirectory | |
| Get-ADDomainController | ActiveDirectory | |
| Get-ADTrust | ActiveDirectory | |
| Copy-Acl | Additional | |
| Get-RemoteSmbShare | Additional | |
| Resolve-AdiDnsName | Additional | |
| Get-Whoami | Additional | |
| Get-WinStation | Additional | |
| Compress-Archive | Archive | Requiere .NET 4.5+ |
| Expand-Archive | Archive | Requiere .NET 4.5+ |
| Get-Help | Core | |
| Get-Command | Core | |
| Where-Object | Core | |
| Resolve-DnsName | DnsClient | |
| Get-LocalGroupMember | LocalAccounts | |
| Get-LocalGroup | LocalAccounts | |
| Set-Clipboard | Management | |
| Get-PSDrive | Management | |
| Get-HotFix | Management | |
| Stop-Process | Management | |
| Get-ChildItem | Management | |
| Copy-Item | Management | |
| Invoke-WmiMethod | Management | |
| Remove-Item | Management | |
| Get-ItemPropertyValue | Management | |
| Get-ItemProperty | Management | |
| Get-ComputerInfo | Management | |
| Get-DnsClientCache | Management | |
| Get-Process | Management | |
| Get-WmiObject | Management | |
| Get-Clipboard | Management | |
| Get-Content | Management | |
| Test-NetConnection | NetTCPIP | |
| Get-NetTCPConnection | NetTCPIP | |
| Get-NetNeighbor | NetTCPIP | Sin soporte para IPv6 todavía |
| Get-NetRoute | NetTCPIP | |
| Get-NetIPAddress | NetTCPIP | |
| Get-Service | NoPowerShell.Commands | |
| Get-LocalUser | NoPowerShell.Commands | |
| Get-WinEvent | NoPowerShell.Commands | |
| New-Shortcut | NoPowerShell.Commands | |
| Get-Acl | Security | |
| Get-SmbMapping | SmbShare | |
| Get-SmbShare | SmbShare | |
| Invoke-Sqlcmd | SQLPS | |
| Get-FileHash | Utility | |
| ConvertFrom-SddlString | Utility | |
| Sort-Object | Utility | |
| Measure-Object | Utility | |
| Invoke-WebRequest | Utility | |
| Select-Object | Utility | |
| Out-File | Utility | |
| Format-Table | Utility | |
| Format-List | Utility | |
| Export-Csv | Utility | |
| ConvertTo-Csv | Utility | |
| Write-Output | Utility |
| Quién | Sitio web | Notas |
|---|
| Contributors of pinvoke.net | https://www.pinvoke.net/ | Varios cmdlets utilizan fragmentos de pinvoke |
| Michael Conrad | https://github.com/MichaCo/ | Partes del cmdlet Resolve-Dns se basan en el código del proyecto DnsClient.Net |
| Rex Logan | https://stackoverflow.com/a/1148861 | La mayor parte del código del cmdlet Get-NetNeighbor proviene de su publicación en StackOverflow |
| PowerShell developers | https://github.com/PowerShell/ | El código de NoPowerShell DLL se basa en gran medida en el código que maneja la entrada de consola de PowerShell |
| Benjamin Delpy | https://github.com/gentilkiwi/ | El código de Get-WinStation está inspirado en el código del comando ts::sessions de Mimikatz |
| Dan Ports | https://github.com/danports/ | El código de marshalling de Get-Winstation está parcialmente copiado del proyecto Cassia |
| Mazdak | https://www.codeproject.com/Articles/2937/Getting-local-groups-and-member-names-in-C | Llamadas a funciones nativas para el cmdlet Get-LocalGroupMember |
| Rex Logan | https://stackoverflow.com/a/1148861 | Código del cmdlet Get-NetNeighbor |