Red Team - 不開啟 Powershell 執行 powershell.exe
多種方法可以間接執行 PowerShell 命令或腳本。
通常是透過其他 Windows 程序來呼叫 powershell.exe
並利用其參數來隱藏視窗,或是利用能執行腳本的環境。
1. 使用 cmd.exe
搭配 -WindowStyle Hidden
參數:
- 你可以在命令提示字元 (
cmd.exe
) 或批次檔 (.bat
,.cmd
) 中呼叫powershell.exe
,並使用-WindowStyle Hidden
參數來執行命令,這樣 PowerShell 視窗就不會顯示出來。 - 範例:
cmd.exe /c powershell.exe -WindowStyle Hidden -Command "Get-Process | Out-File C:\temp\processes.txt"
或者直接在 cmd
裡執行:
powershell.exe -WindowStyle Hidden -EncodedCommand <Base64EncodedCommand>
(-EncodedCommand
用於執行 Base64 編碼後的命令,避免特殊字元問題)。
2. 使用 start
命令的 /B
選項 (在 cmd.exe
中):
start /B
會在目前的cmd
視窗中啟動應用程式,且不建立新視窗。雖然powershell.exe
本身可能還是會嘗試建立視窗,但結合-WindowStyle Hidden
更可靠。單獨使用start /B
可能不足以完全隱藏。- 範例:
start /B powershell.exe -WindowStyle Hidden -Command "..."
3. 使用 Windows Script Host (cscript.exe
或 wscript.exe
):
- 可以編寫 VBScript 或 JScript 腳本,利用
WScript.Shell
物件的Run
方法來執行 PowerShell,並且可以指定視窗樣式為隱藏 (參數0
)。 - 範例 (VBScript,
run_hidden.vbs
):
Set objShell = CreateObject("WScript.Shell")
command = "powershell.exe -WindowStyle Hidden -Command ""& { Get-Date | Out-File C:\temp\current_date.txt }"""
objShell.Run command, 0, True ' 0 = Hidden Window, True = Wait for command to complete
Set objShell = Nothing
- 執行:
cscript //nologo run_hidden.vbs
或wscript run_hidden.vbs
(wscript 預設不會顯示主控台視窗)
4. 使用 mshta.exe
:
mshta.exe
可以執行 HTML Applications (.hta) 或直接執行 VBScript/JScript。類似於 WSH,可以在腳本中使用WScript.Shell
或其他 COM 物件來間接、隱藏地執行 PowerShell。- 範例 (直接在
cmd
中執行):
mshta.exe vbscript:Execute("Set objShell = CreateObject(""WScript.Shell""): objShell.Run ""powershell.exe -WindowStyle Hidden -Command """"& { Get-Service | Out-File C:\temp\services.txt }"""""", 0, True: window.close")
5. 使用工作排程器 (Task Scheduler):
- 可以建立一個排程工作,設定其執行
powershell.exe
,並在工作設定中勾選「以最高權限執行」和「隱藏執行」。這樣工作會在背景執行,不會有可見視窗。 - 設定步驟:
- 開啟 Task Scheduler。
- 建立基本工作或建立工作。
- 在「動作」頁籤中,設定程式為
powershell.exe
。 - 在「引數」欄位中,填入
-WindowStyle Hidden -Command "..."
或-File "C:\path\to\script.ps1"
。 - 在「一般」頁籤中,可以選擇執行時使用的使用者帳戶,並勾選「隱藏」。
6. 使用 wmic.exe
:
wmic
可以用來執行程序。雖然它本身是在命令列執行,但可以用來啟動其他程序,結合-WindowStyle Hidden
也能達到目的。- 範例:
wmic process call create "powershell.exe -WindowStyle Hidden -Command \"Get-ChildItem C:\ | Out-File C:\temp\root_dir.txt\""
(注意引號的跳脫)
7. 透過其他程式語言呼叫:
- 像是 C#, Python, Go 等程式語言都可以呼叫外部程序。它們通常有選項可以控制子程序的視窗是否顯示。
- 範例 (Python):
import subprocess
import os
cmd = ['powershell.exe', '-WindowStyle', 'Hidden', '-Command', 'Get-Process > C:\\temp\\py_processes.txt']
# Hide the console window on Windows
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE # Use 0 for SW_HIDE
subprocess.run(cmd, startupinfo=startupinfo, shell=False) # shell=False is safer
8. 透過 Office VBA 巨集:
- 在 Word、Excel 等 Office 文件中的 VBA 巨集可以使用
Shell
函數或WScript.Shell
物件來隱藏地執行 PowerShell。這是惡意軟體常用的手法。 - 範例 (VBA):
Sub RunHiddenPS()
Dim shell As Object
Set shell = CreateObject("WScript.Shell")
Dim command As String
command = "powershell.exe -WindowStyle Hidden -Command ""& { Write-Output 'Hello from VBA' | Out-File C:\temp\vba_output.txt }"""
shell.Run command, 0, True ' 0 = Hidden Window
Set shell = Nothing
End Sub