
PowerShell reconstruit en C# à des fins de Red Teaming
NoPowerShell est un outil implémenté en C# qui permet d'exécuter des commandes de type PowerShell tout en restant invisible pour les mécanismes de journalisation de PowerShell. Ce binaire compatible .NET Framework 2 peut être chargé dans Cobalt Strike pour exécuter des commandes en mémoire. Aucune System.Management.Automation.dll n'est utilisée ; seules les bibliothèques .NET natives. Une autre utilisation de NoPowerShell est de le lancer en tant que DLL via rundll32.exe dans un environnement restreint : rundll32 NoPowerShell.dll,main.
Ce projet permet à chacun d'étendre facilement ses fonctionnalités en utilisant seulement quelques lignes de code C#. Pour plus d'informations, consultez CONTRIBUTING.md.
Les derniers binaires sont disponibles sur la page Releases. La branche MASTER n'est pas mise à jour très régulièrement ; le code et les cmdlets les plus récents sont disponibles dans la branche DEV. Pour démarrer avec NoPowerShell, assurez-vous également de consulter l'Aide-mémoire des cmdlets.



NoPowerShell est développé pour être utilisé avec la commande execute-assembly de Cobalt Strike ou dans un environnement restreint à l'aide de rundll32.exe.
Raisons d'utiliser NoPowerShell :
ping au lieu de Test-NetConnection)powerpick ou powershell, elles le sont dans nps (par exemple les cmdlets du module ActiveDirectory)Voir CHEATSHEET.md.
Utilisez la commande execute-assembly de Cobalt Strike pour lancer NoPowerShell.exe. Par exemple execute-assembly /path/to/NoPowerShell.exe Get-Command.
Optionnellement, NoPowerShell.cna peut être utilisé pour ajouter l'alias nps à Cobalt Strike.
bofnet_initbofnet_load /path/to/NoPowerShell.dllbofnet_execute NoPowerShell.Program Get-CommandCe fork permet d'exécuter des exécutables .NET standard
bofnet_initbofnet_load /path/to/NoPowerShell.exebofnet_executeassembly NoPowerShell Get-CommandNoPowerShell.dll (glissez avec le clic droit -> Créer des raccourcis ici)rundll32 et en ajoutant ,mainrundll32 C:\Path\to\NoPowerShell.dll,mainLorsque vous utilisez NoPowerShell depuis cmd.exe ou PowerShell, vous devez échapper le caractère pipe (|) respectivement avec un accent circonflexe (^) ou un backtick (`), par exemple :
ls ^| select Namels `| select Name[System.Security.Principal.WindowsIdentity]::GetCurrent().NameLes auteurs de cmdlets NoPowerShell supplémentaires sont ajoutés au tableau ci-dessous. De plus, le tableau liste les commandes que la communauté demande d'ajouter. Ensemble, nous pouvons développer une boîte à outils NoPowerShell puissante !
| Cmdlet | Contribué par | GitHub | Description | |
|---|---|---|---|---|
Assurez-vous également de consulter l'Aide-mémoire pour des exemples d'utilisation de ces cmdlets.
Plusieurs cmdlets NoPowerShell et la DLL NoPowerShell incluent du code créé par d'autres développeurs.
Auteur : Arris Huijgen (@bitsadmin - https://github.com/bitsadmin/)
| Cmdlet | Description |
|---|
| Invoke-Command | Exécuter une commande sur une machine distante via PSRemoting (ce qui sera bien sûr journalisé dans ce cas) |
| * | D'autres commandes *-Item* |
| Search-ADAccount | |
| Get-ADPrincipalGroupMembership | |
| Get-ADOrganizationalUnits | |
| * | D'autres commandes du module PowerShell ActiveDirectory |
| * | Des utilitaires Sysinternals comme pipelist et sdelete |
| Cmdlet | Module | Notes |
|---|
| 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 | Nécessite .NET 4.5+ |
| Expand-Archive | Archive | Nécessite .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 | Pas encore de prise en charge 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 |
| Qui | Site web | Notes |
|---|
| Contributeurs de pinvoke.net | https://www.pinvoke.net/ | Plusieurs cmdlets utilisent des extraits de pinvoke |
| Michael Conrad | https://github.com/MichaCo/ | Des parties de la cmdlet Resolve-Dns sont basées sur le code du projet DnsClient.Net |
| Rex Logan | https://stackoverflow.com/a/1148861 | La majeure partie du code de la cmdlet Get-NetNeighbor provient de son post StackOverflow |
| Développeurs de PowerShell | https://github.com/PowerShell/ | Le code de la DLL NoPowerShell est en grande partie basé sur le code gérant l'entrée console de PowerShell |
| Benjamin Delpy | https://github.com/gentilkiwi/ | Le code de Get-WinStation est inspiré du code de la commande ts::sessions de Mimikatz |
| Dan Ports | https://github.com/danports/ | Le code de marshalling de Get-Winstation est partiellement copié du projet Cassia |
| Mazdak | https://www.codeproject.com/Articles/2937/Getting-local-groups-and-member-names-in-C | Les appels de fonctions natives pour la cmdlet Get-LocalGroupMember |
| Rex Logan | https://stackoverflow.com/a/1148861 | Code de la cmdlet Get-NetNeighbor |