Metasploit之你可能不知道的黑魔法
时间:2018-06-22
原创: Yale 合天智汇
前言
本系列文章以metaploit官方文档https://www.offensive-security.com/metasploit-unleashed/为蓝本,将一些平常使用比较少又是有价值的部分进行翻译并修改,图中涉及截图均为译者实际操作,如有问题可与译者交流。
0x01 制作我们自己的模块module
我们将会使用ruby编写我们自己的第一个模块。
没学过ruby?ruby语法很简单,不要紧的。我们这次只是做一个启蒙的作用,不会涉及高深的语法知识。主要的目的在于了解metasploit的体系结构,module的框架,以及编写一个能够输出helloworld的module并成功能够在metasploit中成功使用
在我们深入研究模块构建和开发之前,先来看一下当前的一些模块。这些文件可以用来作为我们的基础,便于重新组合使用,或制作自己的自定义模块。
因此首先我们切换到这个目录下
上图中我们看到了很多熟悉的老朋友~~如mysq,mssql,smtp,smb,android等等
接下来我们拿mssql开刀编写一个简单的小程序。
首先我们切换到/usr/share/metasploit-framework/modules/auxiliary/scanner/mssql,然后在我们的home目录下创建符合metasploit要求的文件夹目录结构来存储我们自定义的模块。按照metasploit所要求的结构来进行创建的好处就是Metasploit会自动查找这个文件夹结构,所以我们的模块不需要额外的步骤进行目录切换,搜索等来进行利用。
我们来创建目录结构:
然后复制一个已经存在的mssql的模块到我们自定义的模块
接下来我们切换到我们刚才创建的目录去
使用vim来编辑我们的模块
这些代码便是我们前面复制的mssql_ping.rb的代码。我们将会在此基础上来定制自己的模块。
第6行说明我们的这个模块是一个辅助模块(auxiliartymodule)
第7行说明是拥有远程mssql权限时使用
第8行说明可以被用作sql扫描器
第11行是初始化的主要部分
第13行是exploit的名字
我们自行修改为Test
第14行是epxloit的描述
我们修改为justfor fun
第15行是作者
我们修改为Yale
第16行是标准,我们不需要修改
可以看到19行有参数的选项,我们不需要去指定
第22行定义了主函数
第24行是函数的开始
我们可以之后的函数体的内容都给修改了
改成puts“hello world”
意为输出helloworld
最后的代码被修改成这样子
先按下ESC然后输入:wq保存
接下来我们启动metasploit
然后搜索我们的模块
结果中的第一个就是我们刚才编写的模块
我们按照其他模块一样的用法来使用就可以了
看到rhosts还没有被设置,我们来设置下
这里rhosts的参数我们可以随意填写
执行攻击和后恶意看到成功输出了helloworld
说明我们自己编写的模块是可以成功使用的
0x02 编写meterpreter脚本
我们来写自己的meterpreter脚本,同样从Helloworld开始
这样子我们就可以在拿到meterpreter之后运行查看结果了
确实输出了helloworld,我们在此基础上再增加其他的API调用,比如error,line
有没有这很像我们学习C语言时的print,scanf标准输入输出之类的。
实际上,status,error,line在向运行脚本的用户提供信息时都有不同的用途(最直观的我们可以看到status输出的字符串前面是蓝色的[-],而error输出的字符串前面有是红色的[-],line则是直接输出),如下图的运行结果所示
现在,helloworld已经会了,我们继续深入下去。
我们在下一个脚本里创建一个函数来打印出信息,并增加异常处理机制
函数的大概框架是这样子的
使用函数,使得我们的代码模块化,并且具有复用性。
而错误处理可以帮助我们对脚本进行错误排查。
我们接下来使用我们前面在helloworld里使用过的API调用,构建下面这样子的函数
我们来分析下编写的这个函数
我们定义了一个名为“getinfo”的函数,它接收我们通过session这个局部变量传入的参数。
这个变量有一些方法被我们调用来提取系统和用户信息,之后我们把方法的结果打印出来。
这是程序正常运行时的功能,如过碰到了错误,我们还有错误处理程序,它会返回我们可能遇到的错误信息。
函数已经写好了,我们在上图代码下面加入getinfo(client)进行调用就可以了。
然后我们在meterpreter中运行,从它的输出中可以看到返回了一些基本信息。
现在,我们能写打印helloworld的脚本,也能写搜集信息的脚本,接下来我们看看能够执行命令的脚本该怎么写。
同样,我们也是需要前面提到的那个框架,需要创建一个函数。
大概的框架如下图所示。
我们分析一下这个函数:
首先我们定义了需要接收两个参数的函数,其中第二个参数是一个数组。同时我们设置了超时机制,这样函数即使不能成功执行也不会一直挂在我们的会话上。接下来我们设置了一个foreach的循环,这个循环根据传递给函数的数组来运行,这个函数将会遍历数组中的项,并且在靶机上通过cmd执行,然后打印出命令执行后的信息。
在函数的最后,我们同样加上了错误处理机制来捕获任何有可能在函数执行时出现的问题。
函数体分析好之后,接下来我们在代码中加入数组(数组里就是我们想要执行的命令)。
最后,加上list_exec(client,commands)进行函数调用即可。
最终的代码是这样的:
我们同样在meterpretet执行(下面的三张图片分别是执行三个命令的回显):
首先,我们在实验中会先介绍一些用于编写Meterpreter的API调用,并使用其中一些API调用来编写我们自己的meterpreter脚本
接下来我们在Meterpreter中进入IRB的shell来查看API的调用的具体情况
注:IRBSHELL可以直接运行API调用,并查看调用返回的内容
Meterpreter中输入irb便进入了irbshell
我们将从收集关于目标的信息开始。让我们获取目标主机的机器名。具体的API调用是“client.sys.config.sysinfo”
从上图中我们看到返回了一系列的值。如果我们想知道返回的值的类型,我们可以使用类对象来了解返回的内容
可以看到我们得到了一个散列HASH,所以可以通过它的键调用这个散列的元素。假设我们只想要OS版本
那么可以如下输入:
获取其上正在运行会话的进程的PID
搜集网络配置和主机环境的信息
我们也可以使用相同的API调用来获得接口列表以及配置信息
可以看到对象的类型是数组
我们可以通过这个对象的数组进行迭代来获取每个接口的输出
未完待续,敬请期待
(注:本文属于合天原创投稿奖励,未经允许,禁止转载!)