
PowerShell ricostruito in C# per scopi di Red Teaming
# NoPowerShell NoPowerShell è uno strumento implementato in C# che supporta l'esecuzione di comandi simili a quelli di PowerShell rimanendo invisibile a qualsiasi meccanismo di logging di PowerShell. Questo binario compatibile con .NET Framework 2 può essere caricato in Cobalt Strike per eseguire comandi in memoria. Non viene utilizzato `System.Management.Automation.dll`; solo librerie .NET native. Un caso d'uso alternativo per NoPowerShell è avviarlo come DLL tramite `rundll32.exe` in un ambiente ristretto: `rundll32 NoPowerShell.dll,main`. Questo progetto rende facile per chiunque estendere le sue funzionalità usando solo poche righe di codice C#. Per maggiori informazioni, vedere [CONTRIBUTING.md](https://github.com/bitsadmin/nopowershell/blob/master/CONTRIBUTING.md). Gli ultimi binari sono disponibili nella pagina [Releases](https://github.com/bitsadmin/nopowershell/releases). Il branch MASTER non viene aggiornato molto regolarmente; il codice e i cmdlet più recenti sono disponibili nel branch [DEV](https://github.com/bitsadmin/nopowershell/tree/dev). Per iniziare subito con NoPowerShell, assicurati di dare un'occhiata anche al [Cheatsheet](https://github.com/bitsadmin/nopowershell/blob/master/CHEATSHEET.md) dei cmdlet. # Schermate ## Esecuzione in Cobalt Strike  ## Esecuzione di esempio dei comandi  ## Versione Rundll32  # Perché NoPowerShell NoPowerShell è sviluppato per essere utilizzato con il comando `execute-assembly` di Cobalt Strike o in un ambiente ristretto tramite `rundll32.exe`. Motivi per usare NoPowerShell: - Esegue in modo piuttosto furtivo - Funzionalità potenti - Fornisce i cmdlet con cui hai già familiarità in PowerShell, quindi non c'è bisogno di imparare un altro strumento - Se non hai ancora molta familiarità con PowerShell, sono disponibili anche gli alias di cmd.exe (ad es. `ping` invece di `Test-NetConnection`) - Nel caso in cui tramite `powerpick` o `powershell` i cmdlet non siano disponibili, _lo sono_ in `nps` (ad es. cmdlet del modulo ActiveDirectory) - Facilmente estendibile con solo poche righe di C# # Utilizzo ## Esempi Vedi [CHEATSHEET.md](https://github.com/bitsadmin/nopowershell/blob/master/CHEATSHEET.md). ## Utilizzo in Cobalt Strike tramite execute-assembly Usa il comando `execute-assembly` di Cobalt Strike per avviare `NoPowerShell.exe`. Ad esempio `execute-assembly /path/to/NoPowerShell.exe Get-Command`. Opzionalmente, `NoPowerShell.cna` può essere usato per aggiungere l'alias `nps` a Cobalt Strike. ## Utilizzo in Cobalt Strike tramite BOF.NET 1. Installa il BOF BOF.NET da https://github.com/CCob/BOF.NET 2. Carica il runtime BOF.NET: `bofnet_init` 3. Carica il modulo NoPowerShell: `bofnet_load /path/to/NoPowerShell.dll` 4. Esegui i cmdlet NoPowerShell: `bofnet_execute NoPowerShell.Program Get-Command` ## Utilizzo in Cobalt Strike con il fork di @williamknows di BOF.NET Questo fork consente di eseguire eseguibili .NET normali. 1. Ottieni e compila il fork di BOF.NET di @williamknows da https://github.com/williamknows/BOF.NET 2. Carica il runtime BOF.NET: `bofnet_init` 3. Carica il modulo NoPowerShell: `bofnet_load /path/to/NoPowerShell.exe` 4. Esegui i cmdlet NoPowerShell: `bofnet_executeassembly NoPowerShell Get-Command` ## Avvio tramite rundll32 1. Crea un nuovo collegamento al file `NoPowerShell.dll` (trascina con il tasto destro -> Crea collegamenti qui) 2. Aggiorna il collegamento anteponendo al nome del file `rundll32` e aggiungendo `,main` 3. Il collegamento ora sarà simile a `rundll32 C:\Path\to\NoPowerShell.dll,main` 4. Fai doppio clic sul collegamento ## Nota Quando si usa NoPowerShell da `cmd.exe` o PowerShell, è necessario eseguire l'escaping del carattere pipe (`|`) rispettivamente con un accento circonflesso (`^`) o un backtick (`` ` ``), ad esempio: - cmd.exe: `ls ^| select Name` - PowerShell: ```ls `| select Name``` # Problemi noti - I caratteri pipe devono essere circondati da spazi - TLS 1.1+ non è supportato da .NET Framework 2, quindi qualsiasi sito che lo impone causerà un errore di connessione # Miglioramenti - Correggere i problemi di cui sopra - Supporto per gruppi di parametri - Aggiungere il supporto per codice .NET nella riga di comando, ad es.: `[System.Security.Principal.WindowsIdentity]::GetCurrent().Name` # Cmdlet NoPowerShell richiesti | Cmdlet | Descrizione | | - | - | | Invoke-Command | Utilizza PSRemoting per eseguire un comando su una macchina remota (che in tal caso verrà ovviamente registrato nei log) | | * | Altri comandi \*-Item\* | | Search-ADAccount | | | Get-ADPrincipalGroupMembership | | | Get-ADOrganizationalUnits | | | * | Altri comandi dal modulo PowerShell `ActiveDirectory` | | * | Utility Sysinternals come `pipelist` e `sdelete` | # Cmdlet NoPowerShell contribuiti Gli autori di ulteriori cmdlet NoPowerShell vengono aggiunti alla tabella seguente. Inoltre, la tabella elenca i comandi che la comunità ha richiesto di aggiungere. Insieme possiamo sviluppare un potente toolkit NoPowerShell! | Cmdlet | Contributo di | GitHub | Twitter | Descrizione | | - | - | - | - | - | | | | | | | # Cmdlet NoPowerShell inclusi | Cmdlet | Module | Note | | - | - | - | | 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 | Richiede .NET 4.5+ | | Expand-Archive | Archive | Richiede .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 | Non supporta ancora 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 | | Assicurati anche di consultare il [Cheatsheet](https://github.com/bitsadmin/nopowershell/blob/master/CHEATSHEET.md) per esempi su come usare questi cmdlet. # Ringraziamenti Diversi cmdlet di NoPowerShell e la DLL NoPowerShell includono codice creato da altri sviluppatori. | Chi | Sito web | Note | | - | - | - | | Contributori di pinvoke.net | https://www.pinvoke.net/ | Vari cmdlet usano frammenti di pinvoke | | Michael Conrad | https://github.com/MichaCo/ | Parti del cmdlet Resolve-Dns sono basate sul codice del progetto DnsClient.Net | | Rex Logan | https://stackoverflow.com/a/1148861 | La maggior parte del codice del cmdlet Get-NetNeighbor proviene dal suo post su StackOverflow | | Sviluppatori di PowerShell | https://github.com/PowerShell/ | Il codice della DLL NoPowerShell si basa in gran parte sul codice che gestisce l'input della console di PowerShell | | Benjamin Delpy | https://github.com/gentilkiwi/ | Il codice di Get-WinStation è ispirato al codice del comando ts::sessions di Mimikatz | | Dan Ports | https://github.com/danports/ | Il codice di marshalling di Get-Winstation è parzialmente copiato dal progetto Cassia | | Mazdak | https://www.codeproject.com/Articles/2937/Getting-local-groups-and-member-names-in-C | Chiamate a funzioni native per il cmdlet Get-LocalGroupMember | | Rex Logan | https://stackoverflow.com/a/1148861 | Codice del cmdlet Get-NetNeighbor | **Scritto da Arris Huijgen ([@bitsadmin](https://x.com/bitsadmin/) - https://github.com/bitsadmin/)**