Bat
這就是我們常用的Bat腳本,全名為批處理文件,腳本中就是我們在CMD中使用到的命令,這里提一個小問題:CMD的命令行執行命令的優先級是.bat > .exe
,那么假如我放一個cmd.bat在system32目錄下,那么優先執行的是cmd.bat,這里面的內容就變得不可描述起來了
VBscript
執行vbs就是常說的vbscript,是微軟為了方便自動化管理windows而推出的腳本語言,這里了解一下即可,不是文章重點。
一個小例子通過vbs操作WMI
Set wmi = GetObject("winmgmts:") Set collection = wmi.ExecQuery("select * from Win32_Process") For Each process in collection WScript.Echo process.getObjectText_ Next
Powershell
這就是我們的主角,在現在和未來一定是powershell占據主要地位(對於這一點搞Win多一點的朋友一定不會懷疑),首先我們來看一個簡單的例子
script.ps1: # 腳本內容 function test-conn { Test-Connection -Count 2 -ComputerName $args} # 載入腳本文件 .script.ps1 # 調用函數 test-conn localhost
Powershell執行策略
那么你可能會在調用腳本的時候出現報錯,這是powershell的安全執行策略,下面我們來了解一下執行策略:PowerShell 提供了 Restricted、AllSigned、RemoteSigned、Unrestricted、Bypass、Undefined 六種類型的執行策略簡單介紹各種策略如下:
那么我們如何繞過這些安全策略呢?下面提供幾種方法,網上還有很多的繞過方法,大家可以自行研究:
powershell的腳本調用方法:
如果腳本是直接寫的代碼而不是只定義了函數那么直接執行腳本.script.ps1即可powershell的腳本調用方法:
-
但是如果是載入里面的函數需要
.+空格+.script.ps1
-
或者使用Import-Module .script.ps1, 這樣才能直接使用腳本的函數
通過控制台執行Powershell
對於我們安全測試人員通常獲取到的一個Shell是CMD的, 那么我們想要盡可能少的操作就可以直接通過控制台來執行powershell的命令, 那么先來看一個簡單的例子
可以看到我們通過CMD界面執行了Powershell的代碼, 那么其實這樣的執行方式在真實的安全測試環境中利用更多, 下面是一個Powershell通過這種方式執行的所有可選的參數:
PowerShell[.exe] [-PSConsoleFile <file> | -Version <version>] [-EncodedCommand <Base64EncodedCommand>] [-ExecutionPolicy <ExecutionPolicy>] [-File <filePath> <args>] [-InputFormat {Text | XML}] [-NoExit] [-NoLogo] [-NonInteractive] [-NoProfile] [-OutputFormat {Text | XML}] [-Sta] [-WindowStyle <style>] [-Command { - | <script-block> [-args <arg-array>] | <string> [<CommandParameters>] } ] PowerShell[.exe] -Help | -? | /?
名稱 | 解釋 |
---|---|
-Command | 需要執行的代碼 |
-ExecutionPolicy | 設置默認的執行策略,一般使用Bypass |
-EncodedCommand | 執行Base64代碼 |
-File | 這是需要執行的腳本名 |
-NoExit | 執行完成命令之后不會立即退出,比如我們執行powerhsell whoami 執行完成之后會推出我們的PS會話,如果我們加上這個參數,運行完之后還是會繼續停留在PS的界面 |
-NoLogo | 不輸出PS的Banner信息 |
-Noninteractive | 不開啟交互式的會話 |
-NoProfile | 不使用當前用戶使用的配置文件 |
-Sta | 以單線程模式啟動ps |
-Version | 設置用什么版本去執行代碼 |
-WindowStyle | 設置Powershell的執行窗口,有下面的參數Normal, Minimized, Maximized, or Hidden |
最后舉一個執行Base64代碼的例子:
-
我們先試用上面一個表格提到的編碼代碼編碼命令
whoami
, 得到字符串:dwBoAG8AYQBtAGkACgA=
-
通過下面的命令來執行代碼
powershell -EncodedCommand dwBoAG8AYQBtAGkACgA=
那么這種需求在什么地方呢? 比如我們的代碼特別長或者會引起一起歧義的時候就需要我們使用這種方式去執行, 同時也是一個混淆的方式。