查看原文
其他

网络攻击之后期利用:后门

计算机与网络安全 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:16004488


微信公众号:计算机与网络安全

ID:Computer-network

攻击者杀链的最后阶段是“命令、控制、通讯”阶段,在此期间,攻击者依赖一个与被入侵系统的持续连接,保证他们能继续控制被入侵系统。


为了实现高效运行,攻击者必须能够保持持久交互(interactive persistence)——他们必须与被攻击系统保持双向通信(交互),与被入侵的系统保持长期的交互而不被发现(持久性)。这种类型的连接需求的原因如下:


  • 可能检测到网络入侵,被入侵的系统可能识别并打补丁。

  • 一些攻击只能使用一次,因为漏洞是间歇性的,渗透攻击可能导致系统失效,或者因为攻击改变了系统,漏洞表现为不可用。

  • 由于各种原因,攻击者可能需要多次返回到相同的目标。

  • 当目标被攻破,不可能立即就知道目标的利用价值。

用来维持持久交互的工具,在经典的术语里,简称为后门(backdoor)或者恶意软件(rootkit)。但是,自动化的恶意软件和人为攻击已经使传统标签的意义变得模糊。与之相反,这种打算在被入侵系统上停留较长时间的恶意软件,被称为持久代理(persistent agents)。

这些持久代理为攻击者和测试者执行许多功能,主要包括如下功能:

  • 允许上传的额外工具支持新的攻击,特别是对位于同一网络的系统。

  • 便于从被入侵的系统和网络中外泄数据。

  • 允许攻击者和被入侵系统重新连接,通常通过加密信道来避免探测。众所周知,持久代理在被入侵系统的停留时间超过一年。

  • 采用反取证技术来避免被发现,包括在目标文件系统或系统内存中隐藏,使用强认证和加密技术。

一、破解现有的系统和应用程序文件进行远程访问


最好的持久代理无须隐藏,因为它是被入侵系统现有文件结构的一部分,攻击者只需添加某些功能,将常规的系统文件和应用程序转变为持久代理。这种方法几乎从未被安全控制机制(比如,入侵检测系统)发现。


(一)启用远程服务


作为维护远程接入的一种技术,是用Metasploit框架来启用Windows平台的Telnet服务,并用它来提供持久性。


攻破目标系统的第一步是获得meterpreter会话(迁移会话以确保一个稳定的shell),然后提升访问权限。随后,获得本地命令shell,使用如下命令来访问目标系统:

当执行时,该命令创建一个交互命令shell(-i),该shell充当隐藏的进程(-H)。


使用shell命令提示符,创建一个新用户账户。当创建新用户账户来确保持久性时,许多攻击者使用如下两部分策略:


  • 当攻击被发现时,使用能吸引注意力的名字创建账户(例如:Leet7737)。

  • 创建一个账户,例如Service_Account,该账户看起来是正常系统功能的一部分,使用如下命令:

当新用户账户已经创建成功时,退出Windows命令shell。为了开启Telnet,在meterpreter提示符后执行如下命令:

上述命令的执行结果,显示在下图中。


运行gettelnet–e命令

上图显示脚本在被入侵系统中,创建了一个持久的Telnet服务。为了访问它,需要用Telnet协议连接目标系统的IP地址,提供创建用户账户时输入的用户名和密码,如下图所示。


运行Telent服务

Telnet服务将一直继续下去,直到被删除。不幸的是,使用Telnet时存在一些限制:容易被检测到(因为凭据是以明文传输的),并且功能仅仅存在于命令行模式中。


但是,如果你需要有一个GUI来访问被入侵系统中的某些应用程序时,你该怎么办呢?


(二)启用远程Windows终端服务


确保远程接入,一种最可靠的技术是持续开启Windows终端服务,也就是众所周知的远程桌面协议(Remote Desktop Protocol,RDP)。这样做,需要有管理员的权限和目标操作系统的版本号。


例如,如果目标操作系统是Windows 7,使用meterpreter获得一个目标系统交互命令shell,之后输入以下命令行来修改注册表:

为了确保RDP协议能够通过客户端的防火墙,需使用如下命令添加一条规则:

现在,使用如下命令开启RDP服务:

这样启动的RDP服务没有持久性,使用如下命令,确保计算机每次开启时都能启动RDP服务:

启动RDP服务过程并不十分复杂,但是应该照本宣科来减少出错的可能性,特别是对系统注册表进行操作时。幸运的是,meterpreter框架是使用GETGUI脚本来自动开启RDP服务。


当从meterpreter命令提示符运行命令时,在下图中所显示的命令行能够创建用户名和密码,从登录界面隐藏账户,并且对注册表进行必要的更改来保持持久性。下图显示了用来创建貌似合法且带有简单密码的账户的用户名,比如Service Account。


在meterpreter提示符下创建账户

为了连接到入侵系统的远程桌面,使用Kali的rdesktop程序。


(三)启用远程虚拟网络计算


如果系统中包含可以被入侵的应用程序(特别是远程接入程序),攻击者很有可能利用这些弱点来攻击系统,比如:


  • 攻击者很可能从注册表中为某些程序提取远程接入密码。VNC程序在注册表中存放密码,这些密码可以通过手动提取注册表项,或者通过执行应用程序得到,比如NirSoft的VNCPassView程序。

  • 不同版本的VNC包含了不同的漏洞,可以利用这些来入侵应用程序,从而远程接入目标系统。如果用户安装了最新版本,攻击者可能会卸载该版本,并在该位置上安装旧版本。由于版本功能的相似性,用户可能注意不到这些改变,但是攻击者可以利用老版本发现的漏洞来绕过身份认证,以此来保持在后期渗透攻击阶段的接入。

Metasploit能够利用VNCINJECT模块,把VNC直接注入到被攻击系统中。


在下图中,VNC作为有效载荷,取代常规的reverse_TCP shell。


VNC取代reverse_TCP shell

这种攻击不需要任何认证。如果你在测试一个客户的网站,确保所有被证实的漏洞应用已经从被攻击系统中移除。否则,你相当于创建了一个会被其他攻击者发现,并利用的接入点。


二、使用持久代理


传统意义上,前门(front door)为合法的用户提供认证接入,而攻击者会在被攻击的系统上植入一个后门,后门程序允许攻击者返回被攻破系统,获得服务和数据。


不幸的是,经典的后门程序提供有限的交互,它不是为了能够在被攻破系统上停留较长时间而设计的。传统后门最显著的缺点是:一旦这个后门被发现移除后,攻击者只能重复攻击过程来攻破系统,而这是非常困难的,因为预警系统的管理员会对网络和资源进行防护。


Kali现在以持久代理为重点,如果使用得当,很难发现持久代理。我们将回顾第一个令人敬佩的工具Netcat。


使用Netcat作为持久代理


Netcat利用“原始”的TCP和UDP数据包,支持从网络连接中读数据、写数据。与Telnet或者FTP服务形成的数据包不同,Netcat的数据包不具有包头和其他特殊信道信息。这简化了通信,并考虑了适应大部分通信信道。


最新的稳定版本由Hobbit在1996年发行,它保持了和以往一样的强大功能。它经常被称为TCP/IP瑞士军刀(TCP/IP Swiss army knife)。Netcat可以完成许多功能,主要列举如下:


  • 端口扫描。

  • 提取用来识别服务的标志。

  • 端口重定向和代理。

  • 文件转移和网上聊天,包括支持数据取证和远程备份。

  • 在被攻破系统上,作为后门或者持久交互代理。

基于这点,我们将重点关注利用Netcat在被攻破系统上创建一个持久shell。尽管随后的例子是用Windows作为目标平台,但它在基于UNIX系统的平台上也发挥同样的功能。


我们将保留可执行文件的名字——nc.exe,在使用前,普遍对其重新命名,以最小化其被探测到的可能性。即使它已经被重命名,通常也会被反病毒软件发现;许多攻击者会修改或者移除Netcat源代码中的不需要的元素,并在使用前重新编译;这样的变化能够改变反病毒软件用来识别应用的签名,比如Netcat,这会使反病毒软件对其不可见。


Netcat存储在Kali的/usr/share/windows-binaries库中。从内部meterpreter输入如下的命令,可以上传到被攻破系统中:

上述命令执行的结果,如下图所示。

你无须专门把Netcat放在system32文件夹中;但是,由于此文件夹中文件的数量和文件类型的多样性,这是隐藏在感染系统文件的最佳位置。


当在客户端进行渗透测试时,我们发现在一台服务器上有6个独立的Netcat实例。有两个是被两个不同的系统管理员安装,用以支持网络管理,其他4个实例是被外部攻击者安装,直到渗透测试开始都没有被发现。因此,要经常检查目标机器上是否安装Netcat。


如果没有meterpreter连接,需要用简单文件传输协议(Trivial File TransferProtocol,TFTP)来传输文件。


接着,用如下命令配置注册表,使系统开始运行,并启动Netcat;确保监听端口444(或者你选择的其他任何长期不被使用的端口):

用如下queryval命令来确认已成功修改注册表:

使用netsh命令,打开一个连接到本地防火墙的端口,用来确保被入侵系统能够远程连接到Netcat。重要的是要知道目标的操作系统信息。Windows Vista、Windows Server 2008和最新版本使用netsh advfirewall firewall命令行环境,而之前的操作系统使用netsh firewall。


为了增加端口到本地防火墙,需要在meterpreter提示符后输入shell命令,然后使用适当的命令规则。当对规则进行命名时,比如svchostpassthrough,名字应该暗示此规则对系统的正常运行有重要作用。示例命令显示如下。

用如下命令确认修改已成功:

下图显示了上述命令执行的结果:

增加端口连接

当端口规则确定后,确保重启选项启动。在meterpreter提示符后输入如下命令:

在交互式Windows shell中输入如下命令:

为了远程接入被入侵系统,在命令提示符下输入nc,表示连接的详细程度(参数-v表示报告基本信息,参数-vv表示报告更多详细的信息),然后输入目标的IP地址和端口号,如下图所示。

使用nc命令

不幸的是,在使用Netcat时存在一些限制:没有认证机制,对传输的数据没有加密,几乎能够被所有的反病毒软件检测到。


可以用cryptcat来加密,cryptcat是Netcat的变体。在攻击者与被入侵系统的传输中,它运用Twofish算法加密数据。Twofish加密算法是由Bruce Schneier提出的一种高级对称分组加密算法,可以为加密的数据提供强有力的保护。


使用cryptcat,确保有一个准备好的监听者,并配置强壮的密码,使用如下命令进行配置:

接下来,上传cryptcat到被入侵的系统,使用如下命令进行配置,使其连接到监听者的IP地址:

不幸的是,大多数的反病毒软件能检测到Netcat和它的变体。可以用16进制编辑器对Netcat源代码进行编辑,使其不能被检测到;这将有助于避免触发反病毒软件的签名匹配行为,但是,这可能是一个漫长的试错过程。更有效的方法是利用Metasploit框架的持久性机制的优势。


三、使用Metasploit框架保持持久性


Metasploit的meterpreter包含几个脚本,支持与被入侵系统保持持久性的脚本。我们将讨论其中两个脚本,可以植入入侵系统作为后门的两个脚本:metsvc和persistence。


(一)使用metsvc脚本


metsvc脚本是meterpreter的网络服务封装器,可以作为一种Windows服务或者在命令行程序中运行。它通常被作为后门,用来与被入侵系统保持通信。


为了使用metsvc,首先应攻破该系统,然后将meterpreter迁移到explorer.exe进程中,获得更稳定的shell。


通过调用run命令,执行metsvc代理如下图所示。可以看到,它创建了一个临时安装的目录,上传三个文件(metsrv.dll、metsvc-server.exe和metsvc.exe),随后启动metsvc。


运行metsvc

为了与持久metsvc代理交互,攻击者打开Metasploit框架,选择use exploit/multi/handler的windows/metsvc_bind_tcp作为有效载荷,如下图所示,同时设置其他参数(IP地址和端口)。


运行windows/metsvc_bind_tcp等命令

执行exploit命令后,在两个系统中直接打开一个会话,它允许提升权限,并实现其他从命令行启动的功能。exploit命令执行的结果如下图所示。


运行exploit

metsvc脚本不需要认证,一旦代理被植入,任何人可以远程接入到被入侵系统。大多数攻击者不会不修改源代码就使用,例如,需要认证或者确保一些方法可以过滤远程连接。


更重要的是,这不是一个隐蔽攻击。任何试图列举运行进程的命令,例如,在meterpreter提示符后输入ps,就可以识别metsvc服务;事实上,从Temp目录执行的命令是最可疑的。在下图中,Temp文件夹中带有随机名字(CvjrsZWOMK)的目录,这是系统被入侵的明显标志。

发现随机文件目录

对Temp文件夹进行简单检查,会发现存在三个恶意文件,如下图所示。但是,在手动检查前,它们通常已经被反病毒软件标记。


发现恶意文件

(二)使用persistence脚本


获得持久性,更有效的方法是在meterpreter提示符后输入persistence脚本。


在系统被入侵后,迁移命令已经从最初的shell转移到一个更安全的服务,攻击者可以通过在meterpreter命令提示符后调用persistence脚本。


使用命令中的-h参数,可以识别创建可持续后门的可用选项,如下图所示。


运行persistence脚本

如下图所示,我们已经配置persistence为当系统开启时自动启动,并且试图连接监听者,频率为每10秒一次。监听者作为远程系统(-r),可以通过特定的IP地址和端口被识别。此外,我们可以选择使用-U选项,它可以在用户登录系统时启动persistence。


使用persistence脚本

请注意,persistence使用的是随机端口444;攻击者必须验证本地防火墙的配置,确保端口开启,或者使用reg命令来开启该端口。与大多数Metasploit模块一样,任何长期没有使用的端口都可以选择。


persistence脚本位于临时目录中的一个VBS文件中,自然,你可以用-L选项来选择不同的位置。该脚本还把此文件加入到注册表的本地自动运行部分。


因为persistence脚本没有经过认证,所有人都可以使用它访问被入侵系统;当发现或者渗透测试完成后,它应该从被入侵系统中立即删除。可以通过如下resource命令来删除脚本和确认资源文件的位置已被清理。

四、使用Metasploit框架创建一个独立持久代理


Metasploit框架可以用来创建独立的可执行文件,它可以保留在被入侵的系统中,并允许交互通信。独立包装的优点在于,它可以提前准备和测试用以确认连接,可以编码来绕过本地反病毒软件。


在Kali中,在命令提示符后启动msfconsole,来创建一个简单独立的代理。


使用msfpayload创建持久代理。在如下图所示的例子中,使用reverse_tcp shell来配置代理。它将连接到本地主机192.168.43.130的4444端口,代理名为attack1.exe,使用win32可执行程序模板。


使用reverse_tcp shell配置代理

独立执行的代理仅仅工作在没有安装反病毒软件的被入侵系统上,或者是用适当的meterpreter命令使反病毒软件失效的环境上。为了绕开反病毒软件,后门必须编码。在编码载荷时,有不同的选项,如下图所示。


编码载荷的不同选项

可以通过show encoders命令来查看可用选项。


Metasploit使用近30种不同的编码器,默认情况下,如果没有指定编码器,Metasploit会选择最合适的编码器。


shikata_ga_nai是一个好的并且通用的编码器。此编码器对4个字节的密钥采用多态XOR添加反馈进行编码,并且它是被Metasploit评为“优秀”的唯一一款编码器。


我们使用如下命令来编码之前准备好的attack.exe代理:

使用shikata_ga_nai协议,对attack.exe代理进行五次编码。每一次都是对上一次结果的重新编码,这样就更难侦测到。但是,可执行文件的大小也在增加。


全部有效载荷都可以直接从Kali命令行直接创建。它不仅可以被编码,而且我们可以配置编码模式来避免某些字符。例如,当编码一个持久代理时,应避免如下的字符,因为它们可能被发现,从而导致攻击失败。

  • \x00代表0字节地址

  • \xa0代表换行

  • \xad代表回车

使用如下命令来创建多次编码载荷:

你可以编码msfpayload到现有的可执行文件中。修改的可执行文件和持久代理都能工作。为了绑定持久代理到可执行文件,比如计算器(calc.exe),首先复制适当的calc.exe文件到位于/usr/share/metasploit-framework/data/templates的Metasploit模板文件夹中。当模板就位时,使用如下命令:

代理可以被放置到目标系统上,重命名为calc.exe,取代原来的计算器,随后执行。


不幸的是,几乎所有Metasploit编码的可执行文件都能被客户的反病毒软件检测到。这归因于渗透测试者提交加密的载荷到网站,比如VirusTotal(www.virustotal.com)。然而,可以创建一个可执行文件,然后用Veil-Evasion进行加密,具体内容请参见往期文章《渗透测试之漏洞利用》


五、重定向端口来绕过网络控制


我们已经研究了远程控制接入被攻击系统,犹如受害者和攻击者之间的机器有一个直接的联系。但是,这些连接经常被控制,或者被网络设备(如防火墙)封锁。攻击者可以使用端口重定向来绕过这些控制,这是一种指定系统,通过监听已定义的端口和转发原始数据包到特定的第二位置。


Kali提供一些支持端口重定向的工具,包括nc、cryptcat、socat、ssh、fpipe和Metasploit的meterpreter。


(一)示例1:简单端口重定向


简单端口重定向可能会被用到。比如,如果你已经攻破了处于网络边缘的一个系统,它位于非军事区(Demilitarized Zone,DMZ),并且需要与远程位置的内部系统进行通信。


在DMZ的受攻击系统上,用如下命令来配置Netcat实例,监听传入的命令,并且转发到目标上。

该命令将调用Netcat(nc)来监听(-l)传入的流量,执行(-e)流量的转移动作到目标的444端口。端口并不固定,无论是监听/转发主机还是目标主机,端口不必相同。


如果缺少关于目标内部网络的完整信息,可以尝试如下命令:

命令设置了本地(攻击者)Netcat实例,来监听(-l)指定端口。然后指示Netcat同每一个新的连接(-c)创建一个新的进程。


这个简单的例子允许外部直接连接到网络。但是,它不允许双向数据连接,这需要一些其他工具。


(二)示例2:双向端口重定向


考虑三个单独的Windows数据系统:

  • 攻击者

  • 转发器

  • 目标

为了用Netcat开启一个双向通信信道,我们不得不使用命名管道。命名管道,也称为FIFO,是一种创建内部进程通信的方法;这使我们能够把它作为对象进行处理,使得当发出命令时,管理更容易。在下面的攻击例子中,我们创建了一个名为everseto的命名管道来处理双向通信。


攻击者在本地系统上有Netcat实例,使用如下命令来监听端口6661:

转发器,一个被入侵的盒子,具有Netcat安装实例,可以监听传入的数据包,并将其转发到目标。使用如下命令进行配置,来监听端口6666:

在目标系统上,输入如下命令来创建命名管道:

随后,配置Netcat本地实例,使用命名管道来建立跨越转发系统到攻击者的双向通信,命令如下:

可以用socat来获得同样的双向数据流,它被设计为实施这种类型的连接。此例子的命令可以从目标系统执行,命令如下:

六、结语


我们关注攻击者杀链的最后阶段——命令、控制和通信阶段。在此阶段中,攻击者使用持久代理与被入侵系统进行通信。

    微信公众号:计算机与网络安全

    ID:Computer-network

    【推荐书籍】

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存