
레드 팀 목적을 위해 C#으로 재구축된 PowerShell
NoPowerShell은 C#으로 구현된 도구로, PowerShell과 유사한 명령을 실행하면서도 PowerShell 로깅 메커니즘에 탐지되지 않도록 지원합니다. 이 .NET Framework 2 호환 바이너리는 Cobalt Strike에 로드하여 메모리 내에서 명령을 실행할 수 있습니다. System.Management.Automation.dll은 사용되지 않으며, 네이티브 .NET 라이브러리만 사용됩니다. NoPowerShell의 또 다른 사용 사례는 제한된 환경에서 rundll32.exe를 통해 DLL로 실행하는 것입니다: rundll32 NoPowerShell.dll,main.
이 프로젝트는 몇 줄의 C# 코드만으로 누구나 기능을 쉽게 확장할 수 있게 해줍니다. 자세한 내용은 CONTRIBUTING.md를 참조하세요.
최신 바이너리는 Releases 페이지에서 다운로드할 수 있습니다. MASTER 브랜치는 매우 정기적으로 업데이트되지 않습니다. 최신 코드와 cmdlet은 DEV 브랜치에서 확인할 수 있습니다. NoPowerShell 기술을 빠르게 익히려면 cmdlet Cheatsheet도 확인하세요.



NoPowerShell은 Cobalt Strike의 execute-assembly 명령이나 rundll32.exe를 사용하는 제한된 환경에서 사용하도록 개발되었습니다.
NoPowerShell을 사용해야 하는 이유:
Test-NetConnection 대신 ping)powerpick 또는 powershell을 통해 cmdlet을 사용할 수 없는 경우에도 nps에서는 사용할 수 있습니다 (예: ActiveDirectory 모듈의 cmdlet)CHEATSHEET.md를 참조하세요.
Cobalt Strike의 execute-assembly 명령을 사용하여 NoPowerShell.exe를 실행합니다. 예: execute-assembly /path/to/NoPowerShell.exe Get-Command.
선택적으로 NoPowerShell.cna를 사용하여 Cobalt Strike에 nps 별칭을 추가할 수 있습니다.
bofnet_initbofnet_load /path/to/NoPowerShell.dllbofnet_execute NoPowerShell.Program Get-Command이 포크는 일반 .NET 실행 파일을 실행할 수 있게 해줍니다.
bofnet_initbofnet_load /path/to/NoPowerShell.exebofnet_executeassembly NoPowerShell Get-CommandNoPowerShell.dll 파일에 대한 새 바로 가기를 만듭니다 (마우스 오른쪽 버튼으로 끌어서 -> 여기에 바로 가기 만들기)rundll32를 붙이고 ,main을 추가하도록 바로 가기를 업데이트합니다.rundll32 C:\Path\to\NoPowerShell.dll,main처럼 보입니다.cmd.exe 또는 PowerShell에서 NoPowerShell을 사용할 때는 파이프 문자(|)를 각각 캐럿(^) 또는 백틱(`)으로 이스케이프해야 합니다. 예:
ls ^| select Namels `| select Name[System.Security.Principal.WindowsIdentity]::GetCurrent().Name추가 NoPowerShell cmdlet의 작성자는 아래 표에 추가됩니다. 또한 이 표에는 커뮤니티에서 추가를 요청한 명령도 나열됩니다. 함께 강력한 NoPowerShell 툴킷을 개발할 수 있습니다!
| Cmdlet | 기여자 | GitHub | 설명 | |
|---|---|---|---|---|
이 cmdlet 사용 예제는 Cheatsheet에서도 확인하세요.
여러 NoPowerShell cmdlet과 NoPowerShell DLL에는 다른 개발자가 작성한 코드가 포함되어 있습니다.
제작: Arris Huijgen (@bitsadmin - https://github.com/bitsadmin/)
| Cmdlet | 설명 |
|---|
| Invoke-Command | PSRemoting을 사용하여 원격 컴퓨터에서 명령을 실행합니다 (이 경우 당연히 기록됩니다) |
| * | 더 많은 *-Item* 명령 |
| Search-ADAccount | |
| Get-ADPrincipalGroupMembership | |
| Get-ADOrganizationalUnits | |
| * | ActiveDirectory PowerShell 모듈의 명령 추가 |
| * | pipelist 및 sdelete와 같은 Sysinternals 유틸리티 |
| Cmdlet | 모듈 | 비고 |
|---|
| 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 | .NET 4.5+ 필요 |
| Expand-Archive | Archive | .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 | 아직 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 |
| 작성자 | 웹사이트 | 비고 |
|---|
| pinvoke.net 기여자 | https://www.pinvoke.net/ | 여러 cmdlet이 pinvoke의 코드 조각을 사용합니다 |
| Michael Conrad | https://github.com/MichaCo/ | Resolve-Dns cmdlet의 일부는 DnsClient.Net 프로젝트의 코드를 기반으로 합니다 |
| Rex Logan | https://stackoverflow.com/a/1148861 | Get-NetNeighbor cmdlet의 대부분의 코드는 그의 StackOverflow 게시물에서 비롯되었습니다 |
| PowerShell 개발자 | https://github.com/PowerShell/ | NoPowerShell DLL의 코드는 대부분 PowerShell의 콘솔 입력을 처리하는 코드를 기반으로 합니다 |
| Benjamin Delpy | https://github.com/gentilkiwi/ | Get-WinStation의 코드는 Mimikatz의 ts::sessions 명령 코드에서 영감을 받았습니다 |
| Dan Ports | https://github.com/danports/ | Get-Winstation의 마샬링 코드는 Cassia 프로젝트에서 부분적으로 복사되었습니다 |
| Mazdak | https://www.codeproject.com/Articles/2937/Getting-local-groups-and-member-names-in-C | Get-LocalGroupMember cmdlet에 대한 네이티브 함수 호출 |
| Rex Logan | https://stackoverflow.com/a/1148861 | Get-NetNeighbor cmdlet의 코드 |