当前位置:首页 > 焦点

metasploit渗透攻击模块功能是什么

Metasploit里那个叫exploit的渗透模块,干的攻击功事就一件:把漏洞变成能实际打进去的代码。你扫到一个目标跑着有漏洞的模块Samba服务,知道CVE编号,渗透但知道漏洞不等于能利用——中间差的攻击功那一步,就是模块exploit模块填上的。

打个比方。渗透漏洞像门锁有缺陷,攻击功exploit模块就是模块根据这个缺陷配出来的钥匙。它知道该往目标发什么包、渗透包里塞什么数据、攻击功偏移量填多少、模块返回地址覆盖成什么值。渗透这些细节全靠模块里的攻击功代码写死了。你只需要set RHOSTS、模块set PAYLOAD,敲个run,剩下的它自己走。

拿经典的MS17-010举例。永恒之蓝这个漏洞,exploit模块在 exploit/windows/smb/ms17_010_eternalblue。它做的事情很具体:先跟目标的SMB服务握手,发一堆精心构造的SMB包触发缓冲区溢出,覆盖内核里的执行流,然后跳转到payload。整个过程中,模块要处理SMB协议版本协商、Grooming堆布局、内核shellcode注入。这些东西写错一个字节,目标直接蓝屏,攻击失败。

但exploit模块不负责payload本身。它只管“怎么打进去”,打进去之后干什么,是payload模块的事。这是Metasploit的模块化设计——exploit和payload分开,同一个exploit可以搭配不同的payload。你想弹个meterpreter shell,选一个;想只加个用户,换一个。exploit模块不关心这些,它只确保自己能稳定地把控制权劫持过来。

这里有个容易搞混的点。很多人以为exploit模块就是“攻击脚本”,其实它更像一个适配层。同一个漏洞,目标系统版本不同、补丁级别不同、甚至语言版本不同,exploit模块内部都要做条件判断。比如Windows 7 x64和Windows Server 2008 R2 x64,同样是MS17-010,内核偏移不一样,模块里得分别处理。你run的时候它自动检测,检测失败就报错退出,不会硬打。

实际用的时候,exploit模块的check功能值得单独说。不少模块支持check,发几个探测包看看目标到底有没有这个漏洞,不实际利用。这比直接run安全得多——你不想因为打了一个不存在的漏洞把生产环境搞崩。check返回vulnerable,再run;返回safe,换目标。我见过太多人跳过check直接exploit,结果把测试机打蓝屏,还得重装。

另外,exploit模块里还藏着一些“脏活”。比如编码器(encoder)的选择、NOP sled的生成、坏字符规避。目标程序对某些字节敏感,payload里不能出现这些字节,模块得自动编码绕过。这些逻辑都在exploit模块内部完成,用户基本感知不到,但少了这层处理,payload根本跑不起来。

说个具体场景。你拿到一个内网目标,跑着JBoss。搜一下 search jboss,出来一堆exploit模块。你选 jboss_maindeployer,set好参数,run。模块会先上传一个war包到目标,然后触发部署,部署过程中执行payload。整个过程模块帮你处理了HTTP请求构造、文件上传路径、部署时序。你要自己写,得啃半天JBoss的部署机制。

所以exploit模块的核心价值就一句话:把漏洞利用的复杂度封装起来,让攻击者只需要关心目标是谁、打哪个漏洞、打完做什么。中间那些协议细节、内存布局、编码绕过,模块作者已经替你踩过坑了。

当然,模块不是万能的。目标环境稍微变一点,比如开了DEP、ASLR没关干净、或者装了某个杀软,exploit可能就失效。这时候你得去读模块源码,看它怎么构造攻击链,然后自己改。Metasploit的exploit模块是Ruby写的,读起来不算难,但改起来需要对漏洞本身有理解。这也是为什么真正做渗透的人,迟早都要啃模块源码——工具帮你走99步,最后那1步得自己来。

分享到: