
PowerShell reconstruído em C# para fins de Red Teaming
NoPowerShell é uma ferramenta implementada em C# que suporta a execução de comandos semelhantes aos do PowerShell, permanecendo invisível para qualquer mecanismo de log do PowerShell. Este binário compatível com .NET Framework 2 pode ser carregado no Cobalt Strike para executar comandos em memória. Nenhuma System.Management.Automation.dll é usada; apenas bibliotecas .NET nativas. Um caso de uso alternativo para o NoPowerShell é executá-lo como uma DLL via rundll32.exe em um ambiente restrito: rundll32 NoPowerShell.dll,main.
Este projeto facilita para todos a extensão de sua funcionalidade usando apenas algumas linhas de código C#. Para mais informações, consulte CONTRIBUTING.md.
Os binários mais recentes estão disponíveis na página de Releases. O branch MASTER não é atualizado com muita regularidade; o código e os cmdlets mais recentes estão disponíveis no branch DEV. Para dar o pontapé inicial em suas habilidades com o NoPowerShell, não deixe de conferir também o Cheatsheet de cmdlets.



O NoPowerShell foi desenvolvido para ser usado com o comando execute-assembly do Cobalt Strike ou em um ambiente restrito usando rundll32.exe.
Motivos para usar o NoPowerShell:
ping em vez de Test-NetConnection)powerpick ou powershell, eles estão disponíveis no nps (por exemplo, cmdlets do módulo ActiveDirectory)Consulte CHEATSHEET.md.
Use o comando execute-assembly do Cobalt Strike para iniciar o NoPowerShell.exe. Por exemplo, execute-assembly /path/to/NoPowerShell.exe Get-Command.
Opcionalmente, o NoPowerShell.cna pode ser usado para adicionar o alias nps ao Cobalt Strike.
bofnet_initbofnet_load /path/to/NoPowerShell.dllbofnet_execute NoPowerShell.Program Get-CommandEste fork permite executar executáveis .NET comuns
bofnet_initbofnet_load /path/to/NoPowerShell.exebofnet_executeassembly NoPowerShell Get-CommandNoPowerShell.dll (arraste usando o botão direito -> Create shortcuts here)rundll32 e acrescentando ,mainrundll32 C:\Path\to\NoPowerShell.dll,mainAo usar o NoPowerShell a partir do cmd.exe ou do PowerShell, você precisa escapar o caractere pipe (|) com um acento circunflexo (^) ou um acento grave (`), respectivamente, por exemplo:
ls ^| select Namels `| select Name[System.Security.Principal.WindowsIdentity]::GetCurrent().NameOs autores de cmdlets NoPowerShell adicionais são adicionados à tabela abaixo. Além disso, a tabela lista comandos que a comunidade solicitou que fossem adicionados. Juntos, podemos desenvolver um poderoso kit de ferramentas NoPowerShell!
| Cmdlet | Contribuído por | GitHub | Descrição | |
|---|---|---|---|---|
Não deixe também de conferir o Cheatsheet para exemplos de como usar esses cmdlets.
Diversos cmdlets do NoPowerShell e a DLL NoPowerShell incluem código criado por outros desenvolvedores.
Autor: Arris Huijgen (@bitsadmin - https://github.com/bitsadmin/)
| Cmdlet | Descrição |
|---|
| Invoke-Command | Usando PSRemoting, execute um comando em uma máquina remota (que, nesse caso, é claro, será registrado em log) |
| * | Mais comandos *-Item* |
| Search-ADAccount | |
| Get-ADPrincipalGroupMembership | |
| Get-ADOrganizationalUnits | |
| * | Mais comandos do módulo PowerShell ActiveDirectory |
| * | Utilitários Sysinternals como pipelist e sdelete |
| Cmdlet | Módulo | Observações |
|---|
| 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 | Requer .NET 4.5+ |
| Expand-Archive | Archive | Requer .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 | Ainda sem suporte para IPv6 |
| 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 |
| Quem | Site | Observações |
|---|
| Colaboradores do pinvoke.net | https://www.pinvoke.net/ | Diversos cmdlets usam trechos do pinvoke |
| Michael Conrad | https://github.com/MichaCo/ | Partes do cmdlet Resolve-Dns são baseadas no código do projeto DnsClient.Net |
| Rex Logan | https://stackoverflow.com/a/1148861 | A maior parte do código do cmdlet Get-NetNeighbor é originada da publicação dele no StackOverflow |
| Desenvolvedores do PowerShell | https://github.com/PowerShell/ | O código da DLL NoPowerShell é amplamente baseado no código que trata a entrada de console do PowerShell |
| Benjamin Delpy | https://github.com/gentilkiwi/ | O código do Get-WinStation é inspirado no código do comando ts::sessions do Mimikatz |
| Dan Ports | https://github.com/danports/ | O código de marshalling do Get-WinStation é parcialmente copiado do projeto Cassia |
| Mazdak | https://www.codeproject.com/Articles/2937/Getting-local-groups-and-member-names-in-C | Chamadas de funções nativas para o cmdlet Get-LocalGroupMember |
| Rex Logan | https://stackoverflow.com/a/1148861 | Código do cmdlet Get-NetNeighbor |