(一)Metasploit 使用简介

Metasploit Framework 是非常优秀的开源渗透测试框架。

Metasploit 渗透测试框架包含3功能模块:

  1. msfupdate用于软件更新,建议使用前先进行更新,可以更新最新的漏洞库和利用代码。
  2. msfconsole 是整个框架中最受欢迎的模块,所有的功能都可以在该模块下运行。
  3. msfweb 是Metasploit framework的web组件支持多用户,是Metasploit图形化接口。

msfconsole

msfconsole是MSF中最主要最常用的功能组件,使用集成化的使用方法,可以使用MSF中的所有命令和模块,支持很多其它接口方式不支持的功能。

msfconsole主要有以下特点:

使用流程

metasploit检测漏洞(十大黑客工具之Metasploit)(1)

help命令

和其它基于命令行的程序一样,使用?或者help可以显示MSF所支持的命令,如下为MSF内置的全部命令。

show命令

在msfconsole中键入show,系统会显示Metasploit的所有模块,若想显示某一类型的模块可以加入模块名称,最常用的主要有一下三个:

search命令

search 命令是最常用的命令之一,用于查找各种exploit、payload、auxiliary等,命令支持基于正则表达式的模糊查询。如下为查找ms08-067实例:

info命令

info用于显示特殊模块的详细信息,显示内容包括该模块的选项、目标及其它信息。以下是使用info命令显示ms08-067实例:

use命令

use命令用于使用特殊的模块,如利用程序、shellcode或辅助模块等。以ms08-067为例,模块名称必须包含完整的路径,可以通过search命令搜索,以下还演示了show options、show targets命令的使用。

conect 命令

connect命令可以连接到远程主机,连接方式和nc、telnet相同,可以指定端口,如下为connect命令演示:

set命令

set命令用于当前使用模块的选项和设置参数。

set payload xxx/xxx z设置溢出代码

set encoder xxx/xxx 设置利用程序编码方式

set target xxx 设置目标类型

set xxx xxx 设置参数

check命令

部分exploit支持check命令,该命令用于检测目标系统是否存在漏洞,而不是进行溢出操作。如下:说明目标系统不存在漏洞

设置全局变量

Metasploit 支持设置全局变量并可以进行存储,下次登录时直接使用。设置全局变量使用setg命令,unsetg撤销全局变量,save用于保存全局变量。如下所示:

exploit/run命令

设置好各个参数后,可以使用exploit命令执行溢出操作,当使用了自定义auxiliary参数时,需要用run命令执行操作。

resource命令

resource命令可以加载资源文件,并按顺序执行文件中的命令。

irb命令

运行irb命令,进入irb脚本模式,可以执行命令创建脚本。

(二)安装

[root@k8s-master p3]# curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb [root@k8s-master p3]# ./msfinstall [root@k8s-master p3]# chmod 755 msfinstall [root@k8s-master p3]# msfconsole -v Framework Version: 5.0.25-dev-

(三)使用

msfconsole

metasploit检测漏洞(十大黑客工具之Metasploit)(2)

?或者 help

metasploit检测漏洞(十大黑客工具之Metasploit)(3)

show exploits 用于展示Metaploit目录中所有可用的漏洞利用代码和攻击载荷。

metasploit检测漏洞(十大黑客工具之Metasploit)(4)

info exploit/windows/wins/ms04_045_wins

metasploit检测漏洞(十大黑客工具之Metasploit)(5)

use exploit/windows/wins/ms04_045_wins

metasploit检测漏洞(十大黑客工具之Metasploit)(6)

set RHOST 192.168.1.250 设置目标 set RPORT 36568 设置端口 set PAYLOAD generic/shell_bind_tcp 设置使用的shellcode exploit 执行攻击

(四)Metasploit攻击方法分类

使用的版本共有:

exploits总的来说共分为两类溢出(exploit)攻击方法,即主动溢出和被动溢出

在所有的exploit中,针对windows平台的最多,比其它所有平台的总和还要多。

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用程序中广泛存在。利用缓冲区溢出可民导致程序运行失败、系统死机、重新启动等后,也可以利用其获得非授权指令,甚至系统特权,进而进行各种非法的操作。

在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出。缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

随便往缓冲区中填东西造成它溢出一般只会出现"分段错误"(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。

缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似"exec(sh)"的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

1. 在程序的地址空间里安排适当的代码。

2. 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。

每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。

函数指针可以用来定位任何地址空间。例如:"void (* foo)()"声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在linux系统下的superprobe程序。

在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定"setjmp(buffer)",用"longjmp(buffer)"来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么"longjmp(buffer)"实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。

在metasploit中溢出模块(Exploit)共分为13种,分别是:ais、bsdi、dialup、freebsd、hpux、irix、linux、multi、netware、osx、solaris、unix、windows。其中windows下面的最多。

辅助(Auxiliary)模块共分为13种,分别是admin、client、crawler、dos、fuzzers、gather、pdf、scanner、server、sniffer、spoof、sqli、voip。

加载(payload)模块共分为13种,分别是aix、bsd、bsdi、cmd、generic、java、linux、netware、osx、php、solaris、tty、windows。

(五)Metasploit架构

Metasploit Framework并不止具有exploit(溢出)收集功能,它使你专注于创建自己的溢出模块或者二次开发。很少的一部分用汇编和C语言实现,其余均由ruby实现。总体架构如图9所示:

metasploit检测漏洞(十大黑客工具之Metasploit)(7)

(六)Metasploit二次开发方法

Metasploit中的类和方法具有很好的可读性,并且采用了元编程的思想,使得进行二次开发更加方便快捷。简单的说一个程序能够产生另一个程序,就是元编程。ruby、python等均可方便的采用元编程思想。metasploit中前四个字母正好是meta,猜测其是Metaprogramming的含义。

Metasploit中所有的模块都从Msf::Module中继承,并且所有的模块有一个共享的API库。

在Metasploit中修改的exploit、payload等模块时,直接找到相应的文件修改并保存,重新启动console即可看到自己修改后的模块的效果。

在metasploit当中增加exploit、auxiliary等模块时,最快捷的方法是仿照现有的模块方式、使用metasploit中提供的协议(比如使用metasploit中的socket方法,而不使用ruby中的socket方法,meterpreter对socket进行的封装和扩展功能,使用起来更加方便,增加了代理、ssh等特征)。模块写好后放在相应的目录,重新启动console即可看到自己所增加的模块部分。

下面是一些攻击经常使用的模块的位置。

auxiliary模块位于/msf3/modules/auxiliary/下。 Exploits模块位于/msf3/modules/exploits/下。 Payloads模块位于/msf3/modules/payloads/下。 Nops模块位于/msf3/modules/nops下。 Encoders模块位于/msf3/modules/encoders/下。

另外在core部分也有一些exploit、aux等,其作用是为上述的攻击部分提供基础,被上述模块调用。在windows或是在linux中都使用上述方法进行二次开发。后面会详细的介绍新增一个exploit的方法和过程。

(七)安全软件常用检测方法

1 基于事务发生的时间戳,时间

2 发现可疑文件时,寻找其它具有类似MAC地址的文件,位置

3 根据文件扩展名和签名,文件特征

4 对于系统内文件创建MD5校验,内容

5 查找相应的关键字,关键字

6 对文件的内容进行行为分析,行为分析。安全软件预先知道大量的病毒指令序列,可对文件内容进行检测,如果发现匹配的序列就发出警告。

7 检查当前的进程、端口、文件系统等,状态检查

8 在文件写入磁盘时进行检测。

(八)Metasploit反检测方法

针对安全软件常用的检测方法,metasploit当中集成了一些反检测的方法。还有一些相应的建议。

1 在metasploit中使用了meterpreter方法提供一些实用的API。但是meterpreter整个运行在内存当中;但它并不创建新的进程;并且使用了加密的通信方法;并且能够有效的消除入侵证据。整个过程大约在1秒内完成。避免了一些安全软件对于进程的检测。

2 内置了27种encode模块,可对metasploit中的exploit进行编码(encode),以避免反病毒软件检测。27 种encode如下:

Name Rank Description ---- ---- ----------- cmd/generic_sh good Generic Shell Variable Substitution Command Encoder cmd/ifs low Generic ${IFS} Substitution Command Encoder cmd/printf_php_mq good printf(1) via PHP magic_quotes Utility Command Encoder generic/none normal The "none" Encoder mipsbe/longxor normal XOR Encoder mipsle/longxor normal XOR Encoder php/base64 great PHP Base64 encoder ppc/longxor normal PPC LongXOR Encoder ppc/longxor_tag normal PPC LongXOR Encoder sparc/longxor_tag normal SPARC DWORD XOR Encoder x64/xor normal XOR Encoder x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder x86/avoid_utf8_tolower manual Avoid UTF8/tolower x86/call4_dword_xor normal Call 4 Dword XOR Encoder x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder x86/context_stat manual stat(2)-based Context Keyed Payload Encoder x86/context_time manual time(2)-based Context Keyed Payload Encoder x86/countdown normal Single-byte XOR Countdown Encoder x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder x86/nonalpha low Non-Alpha Encoder x86/nonupper low Non-Upper Encoder x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder x86/single_static_bit manual Single Static Bit x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder

很多反病毒软件是基于签名(signature-based)技术来进行病毒检测的,metasploit可以使用相应的payload将签名更改,从而达到反检测的目的。比如对一个软件采用多种编码方法以应对安全软件的检测,比如"ABC"这三个字母对于某个漏洞而言具有攻击性,编码时对每个字母采用不同的编码方式以逃避安全软件的检测。

3 内置日志删除模块,可以删除相应的事务日志,以避免检测。

4 metasploit framework中集成了timestomp(用于修改文件时间戳)、slacker(用于隐藏文件)、SAM Juicer(meterpreter的一部分,用于从SAM中转储哈希)、伪造MAC地址等工具用于消除入侵证据。

5 避免使用一些明显具有木马或病毒含义的名子或关键字,如"灰鸽子"等肯定会引起安全软件的注意。

6 所开发的模块尽量放在目标机多个存储位置,以避免所有的模块被安全软件一次清除

7 攻击安全软件,使安全软件失效,目前还未开发。

(九)一般攻击的过程

1 获得EIP。IP是指令寄存器,存放当前指令的下一条指令的地址,CPU该执行哪条指令就是通过IP来指示的。EIP为32位机的指令寄存器,存放的是相对地址,也就是基于段基址的偏移值。CPU的ESP寄存器存放当前线程的栈顶指针,EBP存放当前线程的栈底指针。

2插入shellcode。Shellcode实际上是一段代码或填充数据,用来发送到服务器利用特定的漏洞的代码,一般可以获取权限。另外,shellcode一般是作为数据发送给受攻击服务的。Shellcode是溢出程序或病毒的核心。主要针对没有打补丁的主机有作用。Shellcode一般用C语言或汇编语言编写,C语言编写较快,汇编语言便于控制shellcode的生成。一个shellcode只能为特定的平台所使用,不能供多个溢出程序、操作系统使用。

Shellcode即可以是本地的也可以是远程的。本地shellcode主要是一名攻击者为了获取本地计算机权限,例如一段缓冲区溢出程序成功执行后可以获得一定的权限。

远程shellcode主要是一名攻击者为了获得本地网络或互联网上另一台主机的控制权限,如果成功后攻击者可以通过网络获得目标主机的控制权限。如果它可以连接攻击者和被攻击者,称为反向连接shellcode。如果它通过绑定一个相应的端口来进行控制,称之为bindshell。第三种shellcode非常特殊,它在目标机上创建一个可以让攻击者重复利用的连接,而这个连接是建立在目标机现有的连接之上,并不创建新的连接。这种shellcode最难创建也最不容易被检测。

3反向连接shell

即将目标主机当做服务,攻击者机器作为客户端。

4 添加用户或其它

(十)恶意软件分类

1 特洛伊木马(Trojan horse)潜茂在其它有用的软件中实施恶意操作的指令。通常将编写程序时就已经安装的恶意指令称为特洛伊木马,在程序编写完后加入的恶意代码称为病毒。

2 病毒(virus) 在执行之后能将自身植入到其它程序中的指令。病毒安装在其它程序的方式:替换任意指令,比如在X处的指令替换成跳转到内存的其他某个地方Y,然后在Y处执行病毒代码,然后在病毒代码后加入口令,使病毒代码执行完后跳到X 1处。

  1. 蠕虫(worm)能自我复制并通过网络将自己安装在其他计算机上的程序。
  2. 陷门(trapdoor)故意在程序中加入未开放的入口,经常用于调试程序,也可以作为安全漏洞使用。
  3. 逻辑炸弹(logic bomb)在未来根据特定条件启动的恶意指令,比如在特定的时间启动。
  4. 僵尸(zombie) 在其他计算机上安装的恶意代码,可通过远程控制这种代码的方式实施攻击,由于攻击来自其它主机,这种方式更难追踪。攻击者经常安装大量的僵尸以制造大量的网络流量。
(十一)exploits详细解析之proftp_telnet_iac.rb

Metasploit中的exploit部分设计目标是提供一个开发exploit简单方法,提供了大量的库,并且使用了ruby中的Mix-in(糅和或混合插入)方法实现多重继承,以便于让二次开发人员能够快速的进行二次开发。

所有的exploit都具有类似的结构,每一个exploit开始都有一个initialize;其次定义了check方法,此方法并不是必须的;最后定义了exploit方法。

在initialize方法中,含有本exploit的描述信息(作者、漏洞溢出方法描述)、使用选项(设定主机IP、端口号等)和shellcode部分。

Check方法并不是必须的,主要是检查目标机的情况,比如目标机是否易受攻击,本溢出方法是否适合攻击目标机等。检查完后返回一些已经预定义好的值(后面的注释为自我理解,可能不够准确),如下:

CheckCode::Safe 目标机安全,攻击可能无效 CheckCode::Detected 目标机提供了相应的服务 CheckCode::Appears 目标机已经被感染 CheckCode::Vulnerable 目标机易受攻击 CheckCode::Unsupported 本exploit对目标机不可用

Exploit方法主要是连接到目标主机,执行shellcode等。

将其直接放在msf3\modules\exploits\windows\imap\目录下,再查找一次。

仍然是没有找到,重新console,然后再进行查找。

在上图中可以看到,已经查找到了新增加的exploit。下面看是否能使用,对其使用use,然后查看其选项。

然后设定目标IP(本例中设定了自己建立的虚拟机)并进行check,因为虚拟机中并没有安装相应的服务,所以check的时候失败。

(十二)使用场景

1、情报搜集

(1) 信息搜索

nslookup与dig域名查询

(2) 主机探测与端口扫描

Nmap进行主机探测

nmap -sn 192.168.1.0/24

(ICMP包探测,Ping扫描,适合内网,外网容易被防火墙过滤掉)

nmap -Pn -sn 192.168.1.0/24

(UDP包探测,适合Internet环境,功能类似于metasploit的udp_sweep模块)

nmap的端口扫描功能

nmap -sV -Pn 192.168.1.2

metasploit检测漏洞(十大黑客工具之Metasploit)(8)

(3) 服务扫描与查点

SSH服务扫描

SSH服务口令猜测(此模块需要自己设置或者导入USERNAME或者PASS_FILE文件作为猜测的依据)

metasploit检测漏洞(十大黑客工具之Metasploit)(9)

metasploit检测漏洞(十大黑客工具之Metasploit)(10)

2、web漏洞扫描

流程:

3、生成恶意攻击脚本

流程:

,