
PowerShell in C# für Red-Teaming-Zwecke neu aufgebaut
# NoPowerShell NoPowerShell ist ein in C# implementiertes Tool, das die Ausführung PowerShell-ähnlicher Befehle unterstützt, während es für sämtliche PowerShell-Protokollierungsmechanismen unsichtbar bleibt. Diese mit .NET Framework 2 kompatible Binärdatei kann in Cobalt Strike geladen werden, um Befehle im Speicher auszuführen. Es wird keine `System.Management.Automation.dll` verwendet; nur native .NET-Bibliotheken. Ein alternativer Anwendungsfall für NoPowerShell besteht darin, es als DLL über `rundll32.exe` in einer eingeschränkten Umgebung zu starten: `rundll32 NoPowerShell.dll,main`. Dieses Projekt ermöglicht es jedem, seine Funktionalität mit nur wenigen Zeilen C#-Code zu erweitern. Weitere Informationen findest du in [CONTRIBUTING.md](https://github.com/bitsadmin/nopowershell/blob/master/CONTRIBUTING.md). Die neuesten Binärdateien sind auf der [Releases](https://github.com/bitsadmin/nopowershell/releases)-Seite verfügbar. Der MASTER-Zweig wird nicht sehr regelmäßig aktualisiert; der neueste Code und die neuesten Cmdlets sind im [DEV](https://github.com/bitsadmin/nopowershell/tree/dev)-Zweig verfügbar. Um schnell mit NoPowerShell durchzustarten, schau dir auch unbedingt den Cmdlet-[Cheatsheet](https://github.com/bitsadmin/nopowershell/blob/master/CHEATSHEET.md) an. # Screenshots ## Ausführung in Cobalt Strike  ## Beispielausführung von Befehlen  ## Rundll32-Version  # Warum NoPowerShell NoPowerShell wurde für die Verwendung mit dem `execute-assembly`-Befehl von Cobalt Strike oder in einer eingeschränkten Umgebung mit `rundll32.exe` entwickelt. Gründe für die Verwendung von NoPowerShell: - Führt ziemlich unauffällig aus - Leistungsstarke Funktionalität - Stellt die Cmdlets bereit, die du bereits aus PowerShell kennst, sodass du kein weiteres Tool erlernen musst - Falls du mit PowerShell noch nicht sehr vertraut bist, stehen auch die cmd.exe-Aliasse zur Verfügung (z. B. `ping` anstelle von `Test-NetConnection`) - Falls Cmdlets über `powerpick` oder `powershell` nicht verfügbar sind, sind sie in `nps` _doch_ verfügbar (z. B. Cmdlets aus dem ActiveDirectory-Modul) - Mit nur wenigen Zeilen C# leicht erweiterbar # Verwendung ## Beispiele Siehe [CHEATSHEET.md](https://github.com/bitsadmin/nopowershell/blob/master/CHEATSHEET.md). ## Verwendung in Cobalt Strike über execute-assembly Verwende den `execute-assembly`-Befehl von Cobalt Strike, um die `NoPowerShell.exe` zu starten. Zum Beispiel `execute-assembly /path/to/NoPowerShell.exe Get-Command`. Optional kann `NoPowerShell.cna` verwendet werden, um den `nps`-Alias zu Cobalt Strike hinzuzufügen. ## Verwendung in Cobalt Strike über BOF.NET 1. Installiere die BOF.NET-BOF von https://github.com/CCob/BOF.NET 2. Lade die BOF.NET-Laufzeitumgebung: `bofnet_init` 3. Lade das NoPowerShell-Modul: `bofnet_load /path/to/NoPowerShell.dll` 4. Führe NoPowerShell-Cmdlets aus: `bofnet_execute NoPowerShell.Program Get-Command` ## Verwendung in Cobalt Strike mit @williamknows' BOF.NET-Fork Dieser Fork ermöglicht die Ausführung regulärer .NET-Executables 1. Besorge und kompiliere den Fork von @williamknows von BOF.NET von https://github.com/williamknows/BOF.NET 2. Lade die BOF.NET-Laufzeitumgebung: `bofnet_init` 3. Lade das NoPowerShell-Modul: `bofnet_load /path/to/NoPowerShell.exe` 4. Führe NoPowerShell-Cmdlets aus: `bofnet_executeassembly NoPowerShell Get-Command` ## Start über rundll32 1. Erstelle eine neue Verknüpfung zur Datei `NoPowerShell.dll` (Ziehen mit Rechtsklick -> Hier Verknüpfungen erstellen) 2. Aktualisiere die Verknüpfung, indem du den Dateinamen mit `rundll32` präfixierst und `,main` anhängst 3. Die Verknüpfung sieht dann wie folgt aus: `rundll32 C:\Path\to\NoPowerShell.dll,main` 4. Doppelklicke auf die Verknüpfung ## Hinweis Bei Verwendung von NoPowerShell über `cmd.exe` oder PowerShell musst du das Pipe-Zeichen (`|`) entsprechend mit einem Caret (`^`) oder einem Backtick (`` ` ``) escapen, z. B.: - cmd.exe: `ls ^| select Name` - PowerShell: ```ls `| select Name``` # Bekannte Probleme - Pipe-Zeichen müssen von Leerzeichen umgeben sein - TLS 1.1+ wird von .NET Framework 2 nicht unterstützt, daher führt jede Website, die es erzwingt, zu einem Verbindungsfehler # Verbesserungen - Die oben genannten Probleme beheben - Unterstützung für Parametergruppen - Unterstützung für .NET-Code in der Befehlszeile hinzufügen, z. B.: `[System.Security.Principal.WindowsIdentity]::GetCurrent().Name` # Angefragte NoPowerShell-Cmdlets | Cmdlet | Beschreibung | | - | - | | Invoke-Command | Führt über PSRemoting einen Befehl auf einem entfernten Computer aus (wobei der Befehl in diesem Fall natürlich protokolliert wird) | | * | Weitere \*-Item\*-Befehle | | Search-ADAccount | | | Get-ADPrincipalGroupMembership | | | Get-ADOrganizationalUnits | | | * | Weitere Befehle aus dem PowerShell-Modul `ActiveDirectory` | | * | Sysinternals-Dienstprogramme wie `pipelist` und `sdelete` | # Beigetragene NoPowerShell-Cmdlets Autoren zusätzlicher NoPowerShell-Cmdlets werden in der folgenden Tabelle aufgeführt. Darüber hinaus listet die Tabelle Befehle auf, die von der Community zum Hinzufügen angefragt wurden. Gemeinsam können wir ein leistungsstarkes NoPowerShell-Toolkit entwickeln! | Cmdlet | Beigetragen von | GitHub | Twitter | Beschreibung | | - | - | - | - | - | | | | | | | # Enthaltene NoPowerShell-Cmdlets | Cmdlet | Modul | Anmerkungen | | - | - | - | | 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 | Erfordert .NET 4.5+ | | Expand-Archive | Archive | Erfordert .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 | Noch keine IPv6-Unterstützung | | 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 | | Schau dir auch unbedingt den [Cheatsheet](https://github.com/bitsadmin/nopowershell/blob/master/CHEATSHEET.md) an, um Beispiele für die Verwendung dieser Cmdlets zu finden. # Danksagungen Verschiedene NoPowerShell-Cmdlets und die NoPowerShell-DLL enthalten Code, der von anderen Entwicklern erstellt wurde. | Wer | Website | Anmerkungen | | - | - | - | | Mitwirkende von pinvoke.net | https://www.pinvoke.net/ | Verschiedene Cmdlets verwenden Codeausschnitte von pinvoke | | Michael Conrad | https://github.com/MichaCo/ | Teile des Resolve-Dns-Cmdlets basieren auf dem Code des DnsClient.Net-Projekts | | Rex Logan | https://stackoverflow.com/a/1148861 | Der meiste Code des Get-NetNeighbor-Cmdlets stammt aus seinem StackOverflow-Beitrag | | PowerShell-Entwickler | https://github.com/PowerShell/ | Der Code der NoPowerShell-DLL basiert weitgehend auf dem Code, der die Konsoleneingabe von PowerShell verarbeitet | | Benjamin Delpy | https://github.com/gentilkiwi/ | Der Code von Get-WinStation ist vom Code des Mimikatz-Befehls ts::sessions inspiriert | | Dan Ports | https://github.com/danports/ | Der Marshalling-Code von Get-Winstation wurde teilweise aus dem Cassia-Projekt kopiert | | Mazdak | https://www.codeproject.com/Articles/2937/Getting-local-groups-and-member-names-in-C | Native Funktionsaufrufe für das Get-LocalGroupMember-Cmdlet | | Rex Logan | https://stackoverflow.com/a/1148861 | Code des Get-NetNeighbor-Cmdlets | **Verfasst von Arris Huijgen ([@bitsadmin](https://x.com/bitsadmin/) - https://github.com/bitsadmin/)**