一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;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
【推荐书籍】