我正在分析一个 metasploit 漏洞利用,我试图找出第 358 行的payload
inpayload.encoded
来自哪里。我是利用开发的新手,但基本的编程规则说payload
应该在调用任何函数之前对其进行初始化。我没有看到payload
被初始化为任何值。第 56 行有一个Payload
,但它的第一个字母是大写字母,所以这是不同的(Ruby 区分大小写)。这意味着payload
可能是从某个类继承的。但是,如果它继承自某个类,为什么要对其进行编码?为什么不在其中填充一个新值?特别是,我正在寻找payload
编码所采用的值是什么。如果有人能帮助我理解这一点,那将是一个很大的帮助。万分感谢!
2 回答
所以,它是 Ruby,exploit 类派生自Msf::Exploit::Remote
,而那个派生自msf/core
. 浏览一下代码进入lib/msf/core.rb
,看看它需要 from core/payload
。打开那个文件:
https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/payload.rb
第 179 行,payload
定义了一个函数,您可以看到它从return module_info['Payload'] ? module_info['Payload']['Payload'] : nil
回到最初的利用,我们看到它是用一个module_info
函数和这个值初始化的:
'Payload' =>
{
'Space' => 4096,
# NOTE: \xff are avoided here so we can control the number of them being sent.
'BadChars' => "\x09\x0a\x0b\x0c\x0d\x20\xff",
'DisableNops' => 'True',
},
更多的探索给了我们这个lib/msf/base/simple/payload.rb
:
payload._import_extra_options(opts)
framework = payload.framework
# Generate the payload
e = EncodedPayload.create(payload,
我们在 中找到EncodedPayload
,lib/msf/core/encoded_payload.rb
并看到它调用了generate
方法,这就是设置encoded
方法的原因。在该文件中多浏览一下,我们就找到了encode
生成该文件的方法。编码器是从“兼容编码器”列表中提取的,这些列表显然是从平台提取的(参见https://github.com/rapid7/metasploit-framework/blob/f0fd2f05983083d84d635d8689237151663902e5/lib/msf/core/payload.rb#L413)
长话短说,有效载荷来自BadChars
上面,并且使用依赖于平台的编码器进行编码。
我没有像 A. Wilson 那样详细地查看代码。但是当我在 MetaSploit 中运行漏洞利用而不使用选择任何有效负载(可用的有效负载可以通过show payloads
命令查看)时,它会在利用之前显示被选择的有效负载是reverse handler
(我猜是默认有效负载)。查看 metasploit 的文件夹告诉我这个处理程序的代码可以在/opt/metasplot/apps/pro/msf3/lib/msf/core/handler