metasploit模块移植/开发--初识篇

阅读量    63975 | 评论 3

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

前言

说起metasploit(MSF)大家肯定都不陌生,它是一款开源的功能非常强大的安全工具,无论是专业黑客还是网络安全从业者都会经常使用该工具做一些攻击、安全验证的工作。相信大家都不陌生也都能熟练操作,但是您真的“熟练”操作了吗?本菜将分成多篇文章将手把手的带领大家一起学习MSF模块开发/移植工作。(本菜也在同步学习中,如以下文章中有哪里写的不对,烦请各位大佬多担待多斧正!)

 

准备工作/环境

Ruby语言 (#毋庸质疑MSF是ruby语言开发的)
Metasploit
顺手的编辑器

 

Ruby初识

Ruby语言是metasploit的核心,想要学习好MSF模块编写必须要会Ruby,下面我们简单的介绍一些基本命令操作,如果您学习过python、perl等脚本语言的话可能会比较简单。

跟python一样,ruby也是有命令行交互的,输入命令”irb” 即进入命令行交互操作,下面我们做一个简单的 + – x % 操作练练手,如图

现在我们定义一个字符串看一下,如图:

下面我们定义一个函数方法,如图:

下面我们介绍2个函数,分别是split函数和squeeze函数

要介绍的还有很多如正则表达式、循环等等,本篇不是编程文章,小伙伴们需要线下继续学习 (http://www.runoob.com/ruby/ruby-tutorial.html)

 

MSF介绍

这里不是介绍MSF的使用,这里我们介绍metasploit的一些基本库和模块所在的位置以及基本功能:

上图中可以看到最重要的REX库文件在/lib目录下,这个库处理来几乎所有的核心功能,如设置网络套字节,网络连接等等基本功能。
/lib目录下还有一个msf/目录

上图中可以看到该下有/base、/core 2个重要的目录,/core目录下包含了所有对应不同操作和功能的库文件;/base目录下可以找到渗透测试、攻击载荷、后渗透攻击模块等等其他模块的核心库文件。

 

实战模块分析

说了这么多下面我们开始实战分析个模块,学习一下套路,毕竟在人家的地盘还得按照人家的规矩来办事。

  1. /modules/auxiliary/scanner/http/http_version.rb 分析

上图中 第1-4行为注释,第6行“require ‘rex/proto/http’“表示引入REX库下面所有HTTP协议方法,如下图中所有的模块都可以被调取使用

接下来的“Msf::Auxilary”定义了该代码为辅助模块;
第11行代码表示引入 lib/msf/core/exploit/http/client.rb,该库文件里包含来大量请求,连接的方法。
第12行代码表示引入 /lib/msf/core/auxiliary/wmapmodule.rb,该库文件主要是一款基于metasploit通用开发的web应用扫描框架。
第14行代码表示引入 /lib/msf/core/auxiliary/http/scanner.rb,该库文件主要是用于基础的扫描操作。

上图第18行代码开始为一些模块/漏洞名词介绍,该代码编写者名字等信息,最后用一个end结束。

最后这段代码才是正在做事干活的,
第31行代码处定义了一个方法“run_host”来作为与所需主机的连接。
如果连接成功,就进行到了connect方法,用于与目标服务器建立一个HTTP连接,这个方法在 /lib/msf/core/auxiliary/http/scanner.rb 被定义。运行到第33行使用‘send_request_raw()’函数来发送GET请求并传递为‘res’变量(注:send_request_raw()函数在lib/msf/core/exploit/http/client.rb被定义,代码如下图)

如果连接成功,进行到来第35行代码,使用一个“http_fingerprint”方法来记录和过滤吊一些信息(如:set-cookie,powered-by等),该方法在/lib/msf/core/exploit/http/client.rb 内689行定义,如图

接着我们再把经过过滤的响应信息赋值给”res”变量。下面就是对这些数据进行简单的输出打印,最后一行 “rescue ::Timeout::Error, ::Errno::EPIPE” 就是表示如果模块超时/异常时,抛出错误信息。

最后我们运行一下这个模块,看看会输出什么信息

通过上图可以看到,我们加载模块后输入“info”,看到输出的一些介绍就算我们在代码中18行处的内容,下面我们执行该模块

可以看到输入的内容格式对应的是第36行代码:“ print_good(“#{ip}:#{rport} #{fp}”) if fp”。

本章内容可能比较简单,是为了后面文章的铺垫。本菜将持续更新,希望大家多多支持!谢谢您的观看,如哪里写的不对,请各位大佬斧正!

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多