Skip to main content

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.exewscript.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.vbswscript 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,並在工作設定中勾選「以最高權限執行」和「隱藏執行」。這樣工作會在背景執行,不會有可見視窗。
  • 設定步驟:
  1. 開啟 Task Scheduler。
  2. 建立基本工作或建立工作。
  3. 在「動作」頁籤中,設定程式為 powershell.exe
  4. 在「引數」欄位中,填入 -WindowStyle Hidden -Command "..."-File "C:\path\to\script.ps1"
  5. 在「一般」頁籤中,可以選擇執行時使用的使用者帳戶,並勾選「隱藏」。

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