工具分享

Metasploit module开发入门篇

0x00 概述


Metasploit——渗透测试神器,相信大家应该都用过或听过,drops里也有很多白帽子写过相关的文章,介绍如何使用Metasploit。使用过Metasploit的同学应该知道,Metasploit Framework是高度模块化的,即框架是由多个module组成,我们除了可以使用已有的 module,还可以自行编写module来满足自己的需求,模块化使得框架具有很好的可扩展性,这也是为什么Metasploit Framework这么受欢迎的原因之一。

看了看drops之前的文章,好像没人写过关于如何编写 Metasploit Module,刚好最近在捣鼓Metasploit,顺便复习下快遗忘的ruby,记录下自己学习的过程。

因为是入门篇,所以这里以一个非常简单WordPress Plugin的任意文件读取漏洞作为例子,搭建环境,编写自己的Auxiliary module(辅助模块),然后测试验证,介绍编写自己的 module的步骤和方法。

文中如果有说的不对或不准确的地方,欢迎大家指出~

0x01 漏洞环境


漏洞环境是一个WordPress 插件imdb-widget 1.0.8版本的任意文件读取漏洞,缺陷代码存在于pic.php,代码:

PoC:

因为 Content-Type 被设置成了 image/jpeg,所以访问后需要点击另存为文本文件,然后打开就可以获取到文件内容

可以参考WordPress Plugin IMDb Profile Widget 1.0.8 - Local File Inclusion

0x02 环境搭建


环境搭建包括两部分

Metasploit

这里使用 Kali 2.0,自带Metasploit,比较方便,下载Prebuilt Kali Linux VirtualBox Images,导入VirtualBox就可以用,这里就不细说了

WordPress 插件漏洞环境

这里使用docker来搭建,操作系统为 Ubuntu 14.04,docker的安装大家可以 google下

拉取 WordPress image

拉取 Mysql image

拉取过程可能会比较慢,可以装个Shadow(socks)和proxychains,再proxychains docker pull

启动 mysql container

启动 wordpress container

访问

根据页面提示Install就行

接着登录后台

下载插件imdb-widget有漏洞的1.0.8版本,点击左边导航栏的 插件 - 安装插件 - 上传插件,选择刚才下载的zip包,点现在安装 - 启用插件

然后点击 外观 - 小工具,把左边的 IMDb Profile 拖到 挂件区域的第一个位置,点开设置User id,随便填一个如ur1,Show 随便勾选几个,点保存。主页刷新就可以看到了

测试漏洞,执行如下命令,就可以看到 /etc/passwd 的内容

0x03 编写Module


编写之前先简单介绍一些概念相关的东西

Metasploit中的 Module Tree 分为两种,Primary Module TreeUser-Specified Module Tree,前者用于放框架自带的module,后者用于放自己写的module.

Primary Module Tree在目录 /usr/share/metasploit-framework/modules/

User-Specified Module Tree 在 ~/.msf7/modules/(官网写的是~/.msf4/modules/)

Module的分类包括6种:

根据官网的介绍,翻译过来大概意思是:

auxiliary:辅助模块,不带有payload的exploit,比如一些扫描模块

payloads:远程运行的代码,比如反弹shell的代码

exploits:带有payload的exploit

encoders:用于对payload进行编码

nops:保持paload大小的一致性

post: 获取权限后,用于后续渗透阶段的模块

因为任意读取漏洞是用于获取信息的,并不能直接获取系统权限,即不带有 payload ,因此我们要编写的module是属于auxiliary分类下的。

编写之前,我们来分析下任意文件读取漏洞auxiliary module需要完成的功能,简单来说:

  1. 检查插件版本,看是否为存在漏洞的版本,如果不是,则返回invulnerable,如果是或不确定,比如获取不到版本信息,则执行2
  2. 向存在漏洞的页面发送http请求,获取某个指定文件的内容,如果获取成功,则保存文件到本地。如果获取失败,有两种可能性,一是插件不存在漏洞,对应前面获取不到版本信息的情况;二是文件不存在或文件的权限问题;需要根据返回做相应处理

注:这里检查插件是否存在,应该由另一个module来完成,这里只负责检测插件是否存在漏洞

分析完后,就得开始写module了,那么这里有两种方法:

  1. 找一个auxiliary module的代码skeleton,然后一点点自己写;
  2. 找一个类似的已经写好的module,在它的基础上改写;

这里推荐第二种,比较适合我这种新手,有参考,写起来也容易些,那么如何找到可以参考的module呢?莫慌~

打开msfconsole,因为是文件读取,可以先search wordpress然后再找 read 关键词,在msfconsole中执行

找到如下几个module

这里选择auxiliary/scanner/http/wp_dukapress_file_read,具体文件位于/usr/share/metasploit-framework/modules/auxiliary/scanner/http/wp_dukapress_file_read.rb

代码如下:

看到这一堆代码,一般人都会有点晕,不知道从那里下手,莫慌,问google,搜索metasploit write module,搜索结果第三个,How to get started with writing an exploit,里面有一些module结构的说明. 这里对照着给了代码加了些注释:

弄懂大概结构后,我们根据前面的分析,编写自己的module,完成后的代码如下

可以看到,改动的地方并不是很多。

因此我们并不需要弄懂所有的类和方法,也可以写出自己的module。

代码中发送http请求部分可以参考:How to Send an HTTP Request Using HTTPClient

0x04 测试Module


前面提到,msf有专门的目录~/.msf7/modules/来存放自己编写的module,这里对照着auxiliary/scanner/http/wp_dukapress_file_read,创建目录

将代码保存~/.msf7/modules/auxiliary/scanner/http/目录下,文件名为wp_imdb_profile_widget_file_read.rb,重启msfconsole,加载自定义module,执行

查看下插件是否已经被load

对前面的漏洞环境进行测试,这里wordpress的ip为192.168.1.191

成功读取到/etc/passwd,测试成功~

0x05 结论


文章主要介绍的是如何去编写module的方法,有的地方可能写的不是很详细。总结来说就是: 在接触一个新的东西时,参考别人已经写好的东西,然后修修改改,是一种很好快速入门的方法。

(0)

本文由 安全周 作者:SecJack 发表,转载请注明来源!

关键词:

热评文章

发表评论